API construída em Node.js + Express + TypeScript seguindo princípios de Clean Architecture, com Sequelize (SQLite) como banco de dados e Redis para cache, monitorado via RedisInsight.
+-------------------+
| Domain Layer |
|-------------------|
| Entidades |
| (Athlete, |
| Competition) |
+---------+---------+
|
v
+-------------------+
| Application Layer |
|-------------------|
| Casos de uso |
| (CreateAthlete, |
| ListCompetitions)|
+---------+---------+
|
v
+----------------------+
| Presentation Layer |
|----------------------|
| Controllers |
| (HTTP ↔ UseCases) |
+---------+------------+
|
v
+-------------------+
| Infra Layer |
|-------------------|
| Express (HTTP) |
| Sequelize (DB) |
| Redis (Cache) |
| Logger |
| RabbitMQ() |
+-------------------+
src/
├── app.ts
├── server.ts # Ponto de entrada da aplicação
├── config/
├── domain/ # Entidades do domínio (Atleta, Competição)
│ ├── entities/
│ └── repositories/
├── infra/ # Infraestrutura (DB, Redis, Logger, RabbitMQ)
│ ├── logger/
│ ├── middlware/ # Sanitização de dados
│ ├── rabbitmq/ # Filas
│ ├── redis/ # Cache
│ ├── repositories/ # Implementa chamadas ao banco
│ └── sequelize/
├── presentation/ # Traduz o “mundo externo” para os casos de uso. (Controllers, Rotas)
│ └── http/
│ ├── controllers/ # Ponte: HTTP ↔ Caso de Uso
│ └── routes/
└── usecases/ # Implementação das regras negócios
├── athlete/
├── competition/
└── participation/
docker-compose.yml # Containers: Redis + RedisInsight, RabbitMQ, API, Seed, Consumidor da fila
.env # Variáveis de ambiente
- Node.js + Express → API HTTP
- Sequelize + SQLite → ORM e banco de dados leve
- Redis → Cache em memória
- RedisInsight → GUI para monitorar Redis
- Chalk + Figlet → Logger estilizado no startup
- Docker → Gerenciamento de containers
- RabbitMQ → Filas para registro de atletas
-
Clone o repositório:
git clone https://github.com/finqi/teste-back-wanderberg cd teste-back-wanderberg -
Com Docker, inicie os containers com seed workers:
docker compose up -d --build
-
Teste os endpoints com a url base: http://localhost:3000/api
- GET /api/athletes — Lista todos os atletas
- POST /api/athletes — Criar/Atleta um atleta
{
"name": "string",
"age": 18,
"country": "string",
"cpf": "string"
}- DELETE /api/athletes/:id — Deletar um atleta
- GET /api/competitions — Lista todos
[
{
"name": "string",
"date": "2008-08-16", // ISO Date
"metric": "seconds",
"completed": true,
"rankingOrder": "ASC",
"maxAttempts": 1
},
{
"name": "string",
"date": "2008-08-16", // ISO Date
"metric": "seconds",
"completed": true,
"rankingOrder": "ASC",
"maxAttempts": 1
}
]- POST /api/competitions — Criar uma nova
{
"name": "string",
"date": "2008-08-16", // ISO Date
"metric": "seconds",
"completed": true,
"rankingOrder": "ASC",
"maxAttempts": 1
}- GET /api/competitions/:id — Detalhes de uma competição
- PUT /api/competitions/:id — Atualizar uma competição
- DELETE /api/competitions/:id — Deletar uma competição
Endpoints relacionados a competições
- POST /api/participations/register — Register participation
{
// Participação com nome(FK) e id de competição(FK)
// indice por chave por composta
"p": {
"athleteName": "John Haack",
"competitionId": 1,
"score": 115
},
// Dados do atleta que será criado caso não esteja registrado
"athlete": {
"name": "John Haack",
"country": "EUA",
"age": 31,
"cpf": "90427800021"
}
}- GET /api/competitions/:competitionId/athletes — Lista atletas por competição
- GET /api/athletes/:athleteId/competitions — Delete participation
Desenvolvido por Berg Santana