Este é um sistema de gerenciamento de participantes desenvolvido com NestJS e TypeORM, utilizando alguns conceitos de arquitetura limpa. O sistema é uma API com nível de maturidade 3 que faz o cadastro, consulta, atualização, remoção de participantes e calcula automaticamente a média final baseada nas notas dos semestres.
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 (Regras de Negócio)
│ ├── domain/ # 🏛️ Camada de Domínio
│ │ ├── entities/ # Entidades de Negócio
│ │ ├── repositories/ # Contratos 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
│ └── interceptors/ # Interceptadores (HATEOAS)
- NestJS - Framework Node.js progressivo
- TypeORM - ORM para TypeScript/JavaScript
- MySQL - Sistema de gerenciamento de banco de dados
- TypeScript - Superset tipado do JavaScript
- Class Validator - Validação de dados
- Class Transformer - Transformação de objetos
| 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) |
POST /participant
Content-Type: application/json
{
"fullName": "Índio medeiros",
"age": 30,
"firstSemesterGrade": 10,
"secondSemesterGrade": 5
}GET /participantGET /participant/1681b549-216e-461d-8e78-344496d471e1PATCH /participant/53ebca58-04d5-473b-a513-1b105ecd8f11
Content-Type: application/json
{
"fullName": "Chrislaine Souza"
}DELETE /participant/1681b549-216e-461d-8e78-344496d471e1{
"data": {
"id": "7210bd27-3831-4e93-9700-808f313f7aba",
"fullName": "Índio medeiros",
"age": 30,
"firstSemesterGrade": 10,
"secondSemesterGrade": 1,
"finalAverage": 5.5
},
"_links": [
{
"rel": "self",
"href": "http://localhost:3000/participant/7210bd27-3831-4e93-9700-808f313f7aba",
"method": "POST"
},
{
"rel": "get",
"href": "http://localhost:3000/participant/7210bd27-3831-4e93-9700-808f313f7aba",
"method": "GET"
},
{
"rel": "update",
"href": "http://localhost:3000/participant/7210bd27-3831-4e93-9700-808f313f7aba",
"method": "PATCH"
},
{
"rel": "delete",
"href": "http://localhost:3000/participant/7210bd27-3831-4e93-9700-808f313f7aba",
"method": "DELETE"
}
]
}- Node.js (versão 18 ou superior)
- MySQL (versão 8 ou superior)
- npm ou yarn
-
Clone o repositório
git clone <url-do-repositorio> cd br-generation-challenge
-
Instale as dependências
npm install
-
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)
- Crie um banco de dados MySQL com o nome
-
Configure as variáveis de ambiente Copie o arquivo
.env-examplepara.enve configure as variáveis:cp .env-example .env
Edite o arquivo
.envcom suas configurações:# 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
npm run start:devnpm run build
npm run start:prod| 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 |
- CreateParticipantUseCase - Criação de novos participantes
- FindAllParticipantsUseCase - Listagem de todos os participantes
- FindByIdParticipantUseCase - Busca de participante por ID
- UpdateParticipantUseCase - Atualização de dados do participante
- RemoveParticipantUseCase - Remoção de participantes
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
- 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
- Todos os campos são opcionais
- Mesmas validações dos campos correspondentes no CreateParticipantDto
O projeto inclui um arquivo client.rest com exemplos de requisições HTTP para testar a API:
@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-344496d471e1Desenvolvido como parte do desafio da Generation Brasil.