Skip to content

Repository files navigation

🏆 API de Competições e Atletas

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.


🏗️ Clean Architecture (Visão Geral)

           +-------------------+
           |    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()       |
           +-------------------+


📂 Estrutura de Pastas

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

🚀 Tecnologias Utilizadas

  • 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

▶️ Como Executar

  1. Clone o repositório:

    git clone https://github.com/finqi/teste-back-wanderberg
    cd teste-back-wanderberg
  2. Com Docker, inicie os containers com seed workers:

    docker compose up -d --build
  3. Teste os endpoints com a url base: http://localhost:3000/api

Endpoints

Atleta

  • 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

Competições

  • 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

Participaçã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

👨‍💻 Autor

Desenvolvido por Berg Santana

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages