https://github.com/indiomedeiros/br-generation-challenge-api
Este é um sistema de gerenciamento de participantes desenvolvido com NestJS e TypeORM, utilizando alguns conceitos de arquitetura limpa. O sistema permite o cadastro, consulta, atualização e remoção de participantes, calculando automaticamente a média final baseada nas notas dos semestres.
https://github.com/indiomedeiros/br-generation-challenge-api
class-transformer class-validator clean-architecture clean-code ddd-patterns mysql2 nestjs solid typescript
Last synced: 10 months ago
JSON representation
Este é um sistema de gerenciamento de participantes desenvolvido com NestJS e TypeORM, utilizando alguns conceitos de arquitetura limpa. O sistema permite o cadastro, consulta, atualização e remoção de participantes, calculando automaticamente a média final baseada nas notas dos semestres.
- Host: GitHub
- URL: https://github.com/indiomedeiros/br-generation-challenge-api
- Owner: indiomedeiros
- Created: 2025-06-29T06:55:12.000Z (10 months ago)
- Default Branch: main
- Last Pushed: 2025-06-29T06:59:10.000Z (10 months ago)
- Last Synced: 2025-06-29T07:38:14.267Z (10 months ago)
- Topics: class-transformer, class-validator, clean-architecture, clean-code, ddd-patterns, mysql2, nestjs, solid, typescript
- Language: TypeScript
- Homepage:
- Size: 0 Bytes
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# BR Generation Challenge - Sistema de Gerenciamento de Participantes
## 📋 Sobre o Projeto
Este é um sistema de gerenciamento de participantes desenvolvido com **NestJS** e **TypeORM**, utilizando alguns conceitos de arquitetura limpa. O sistema permite o cadastro, consulta, atualização e remoção de participantes, calculando automaticamente a média final baseada nas notas dos semestres.
## 🏗️ Arquitetura
O projeto segue alguns princípios da **Clean Architecture** e **Domain-Driven Design (DDD)**, organizando o código em camadas:
```
src/
├── participant/
│ ├── application/ # Camada de Aplicação
│ │ ├── dto/ # Data Transfer Objects
│ │ └── usecases/ # Casos de Uso
│ ├── domain/ # Camada de Domínio
│ │ ├── entities/ # Entidades
│ │ ├── repositories/ # Interfaces de Repositórios
│ │ └── services/ # Serviços de Domínio
│ ├── infra/ # Camada de Infraestrutura
│ │ └── orm/ # Implementações ORM/Repositórios
│ └── presentation/ # Camada de Apresentação
│ └── controllers/ # Controladores HTTP
```
## 🚀 Tecnologias Utilizadas
- **[NestJS](https://nestjs.com/)** - Framework Node.js progressivo
- **[TypeORM](https://typeorm.io/)** - ORM para TypeScript/JavaScript
- **[MySQL](https://www.mysql.com/)** - Sistema de gerenciamento de banco de dados
- **[TypeScript](https://www.typescriptlang.org/)** - Superset tipado do JavaScript
- **[Class Validator](https://github.com/typestack/class-validator)** - Validação de dados
- **[Class Transformer](https://github.com/typestack/class-transformer)** - Transformação de objetos
## 📊 Funcionalidades
### Entidade Participant
| Campo | Tipo | Descrição |
| --------------------- | ------ | --------------------------------------- |
| `id` | UUID | Identificador único |
| `fullName` | String | Nome completo (3-50 caracteres) |
| `age` | Number | Idade (mínimo 18 anos e máximo 30) |
| `firstSemesterGrade` | Number | Nota do primeiro semestre (0-10) |
| `secondSemesterGrade` | Number | Nota do segundo semestre (0-10) |
| `finalAverage` | Number | Média final (calculada automaticamente) |
### Endpoints da API
#### 📝 Criar Participante
```http
POST /participant
Content-Type: application/json
{
"fullName": "Índio medeiros",
"age": 30,
"firstSemesterGrade": 10,
"secondSemesterGrade": 5
}
```
#### 📋 Listar Todos os Participantes
```http
GET /participant
```
#### 🔍 Buscar Participante por ID
```http
GET /participant/1681b549-216e-461d-8e78-344496d471e1
```
#### ✏️ Atualizar Participante
```http
PATCH /participant/53ebca58-04d5-473b-a513-1b105ecd8f11
Content-Type: application/json
{
"fullName": "Chrislaine Souza"
}
```
#### 🗑️ Remover Participante
```http
DELETE /participant/1681b549-216e-461d-8e78-344496d471e1
```
## 🛠️ Configuração e Instalação
### Pré-requisitos
- Node.js (versão 18 ou superior)
- MySQL (versão 8 ou superior)
- npm ou yarn
### Passos para Instalação
1. **Clone o repositório**
```bash
git clone
cd br-generation-challenge
```
2. **Instale as dependências**
```bash
npm install
```
3. **Configure o banco de dados**
- Crie um banco de dados MySQL com o nome `generation`
- Configure as variáveis de ambiente (veja seção abaixo)
4. **Configure as variáveis de ambiente**
Copie o arquivo `.env-example` para `.env` e configure as variáveis:
```bash
cp .env-example .env
```
Edite o arquivo `.env` com suas configurações:
```env
# APPLICATION CONFIG
PORT=3000
# Database connection type (mysql, postgres, sqlite, etc.)
DATABASE_TYPE=mysql
# Database server configuration
DATABASE_HOST=localhost
DATABASE_PORT=3306
# Database credentials
DATABASE_USERNAME=root
DATABASE_PASSWORD=sua_senha
# Database name for the application
DATABASE_DATABASE=generation
# TypeORM settings
DATABASE_AUTOLOADENTITIES=1
DATABASE_SYNCHRONIZE=0
```
## 🏃♂️ Executando o Projeto
### Desenvolvimento
```bash
npm run start:dev
```
### Produção
```bash
npm run build
npm run start:prod
```
## 📝 Scripts Disponíveis
| Script | Descrição |
| --------------------- | ------------------------------ |
| `npm run build` | Compila o projeto |
| `npm run start` | Inicia o servidor |
| `npm run start:dev` | Inicia em modo desenvolvimento |
| `npm run start:debug` | Inicia em modo debug |
| `npm run lint` | Executa o linter |
| `npm run format` | Formata o código |
## 🎯 Casos de Uso Implementados
1. **CreateParticipantUseCase** - Criação de novos participantes
2. **FindAllParticipantsUseCase** - Listagem de todos os participantes
3. **FindByIdParticipantUseCase** - Busca de participante por ID
4. **UpdateParticipantUseCase** - Atualização de dados do participante
5. **RemoveParticipantUseCase** - Remoção de participantes
## 🧮 Serviços de Domínio
### GradeCalculatorService
Responsável pelo cálculo da média final dos participantes:
- Calcula a média aritmética entre as notas dos dois semestres
- Fórmula: `(firstSemesterGrade + secondSemesterGrade) / 2`
## 🔍 Validações
### CreateParticipantDto
- **fullName**: String obrigatória, entre 3 e 50 caracteres
- **age**: Número obrigatório, mínimo 18 anos e máximo de 30 anos
- **firstSemesterGrade**: Número obrigatório, entre 0 e 10
- **secondSemesterGrade**: Número obrigatório, entre 0 e 10
### UpdateParticipantDto
- Todos os campos são opcionais
- Mesmas validações dos campos correspondentes no CreateParticipantDto
## 📋 Testes com client.rest
O projeto inclui um arquivo `client.rest` com exemplos de requisições HTTP para testar a API:
```http
@baseUrl = http://localhost:3000
### Create Participants
POST {{baseUrl}}/participant
Content-Type: application/json
{
"fullName": "Índio medeiros",
"age": 30,
"firstSemesterGrade": 10,
"secondSemesterGrade": 5
}
### Get All Participants
GET {{baseUrl}}/participant
### Get Participants by id
GET {{baseUrl}}/participant/1681b549-216e-461d-8e78-344496d471e1
### Update Participants by id
PATCH {{baseUrl}}/participant/53ebca58-04d5-473b-a513-1b105ecd8f11
Content-Type: application/json
{
"fullName": "Chrislaine Souza"
}
### Delete Participants by id
DELETE {{baseUrl}}/participant/1681b549-216e-461d-8e78-344496d471e1
```
---
Desenvolvido como parte do desafio da Generation Brasil.
---