API REST para gerenciamento de check-ins em academias com validação por geolocalização, autenticação JWT e controle de acesso baseado em papéis (RBAC).
O DevGym é uma aplicação backend desenvolvida seguindo princípios de Arquitetura Limpa e Domain-Driven Design, com clara separação entre camadas de controllers, use-cases (regras de negócio) e repositórios.
A API permite que usuários se cadastrem, encontrem academias próximas, realizem check-ins com validação de proximidade (até 100m de distância via fórmula de Haversine) e administradores gerenciem academias e validem check-ins.
- Autenticação JWT com refresh token armazenado em cookie HTTP-only
- Cadastro e autenticação de usuários com senha hasheada (bcryptjs)
- Gerenciamento de academias (criação, busca textual, busca por proximidade)
- Check-in com validação de distância máxima de 100m usando fórmula de Haversine
- Validação de check-ins por administradores (janela de 20 minutos)
- Histórico e métricas de check-ins por usuário
- Controle de acesso por papéis (MEMBER / ADMIN)
| Método | Rota | Autenticação | Papel | Descrição |
|---|---|---|---|---|
POST |
/users |
❌ | - | Cadastrar novo usuário |
POST |
/sessions |
❌ | - | Autenticar (login) |
PATCH |
/token/refresh |
❌ | - | Atualizar token de acesso |
GET |
/me |
✅ | Qualquer | Obter perfil do usuário logado |
GET |
/gyms/search?q=&page= |
✅ | Qualquer | Buscar academias por nome |
GET |
/gyms/nearby?latitude=&longitude= |
✅ | Qualquer | Listar academias próximas (10km) |
POST |
/gyms |
✅ | ADMIN | Criar nova academia |
POST |
/gyms/:gymId/check-ins |
✅ | Qualquer | Realizar check-in |
GET |
/check-ins/history?page= |
✅ | Qualquer | Histórico de check-ins |
GET |
/check-ins/metrics |
✅ | Qualquer | Métricas do usuário |
PATCH |
/check-ins/:checkInId/validate |
✅ | ADMIN | Validar um check-in |
* Refresh token lido do cookie refreshToken
src/
├── app.ts # Configuração do Fastify
├── server.ts # Inicialização do servidor
├── env/ # Validação de variáveis de ambiente (Zod)
├── lib/ # Singleton do Prisma client
├── utils/ # Utilitários (Haversine)
├── middlewares/ # Verificação JWT e RBAC
├── http/controllers/ # Rotas e handlers HTTP
│ ├── users/ # Cadastro, autenticação, perfil, refresh
│ ├── gyms/ # CRUD, busca, academias próximas
│ └── check-ins/ # Criação, histórico, métricas, validação
├── use-cases/ # Regras de negócio
├── repositories/ # Interfaces e implementações (Prisma + in-memory)
└── factories/ # Fábricas para injeção de dependência
| Tecnologia | Versão |
|---|---|
| Node.js | ^22 |
| Fastify | ^5 |
| TypeScript | ^6 |
| Prisma | ^7 |
| PostgreSQL | 16 |
- Clone o repositório:
git clone https://github.com/euviniciuss/devgym- Suba o banco PostgreSQL com Docker Compose:
docker compose up -d- Configure as variáveis de ambiente:
cp .env.example .env
# Edite o .env com suas configurações- Instale as dependências:
npm install- Execute as migrations do Prisma:
npx prisma migrate dev- Inicie o servidor em modo desenvolvimento:
npm run devO servidor estará disponível em http://localhost:3333.
O projeto possui testes unitários e testes e2e utilizando Vitest.
Testam os use-cases isoladamente com repositórios em memória.
npm testTestam a API completa via HTTP (supertest). Requerem o banco PostgreSQL rodando.
npm run test:e2enpm run test:coveragenpm run test:watch # unitários
npm run test:e2e:watch # e2e