- Sobre o Projeto
- Funcionalidades Principais
- Tecnologias Utilizadas
- Começando
- Rodando os Testes
- Documentação da API
- Estrutura do Projeto
- Conceitos Técnicos
- Licença
API REST desenvolvida com princípios SOLID e Clean Architecture para gerenciamento de academias e check-ins. O projeto simula uma aplicação do tipo GymPass, permitindo que usuários realizem check-ins em academias próximas.
- SOLID Principles:
- Clean Architecture
- Autenticação: Registro, login e refresh de tokens JWT
- Usuários: Perfil do usuário logado
- Academias: Criação (ADMIN), busca por nome, academias próximas
- Check-ins: Realização, validação (ADMIN), histórico e métricas
-
Clone o repositório:
git clone <url-do-repositorio> cd api-solid
-
Instale as dependências:
npm install
-
Configure o ambiente:
cp .env.example .env # Edite .env com suas configurações -
Inicie o banco de dados:
docker-compose up -d
-
Execute as migrações do Prisma:
npx prisma migrate dev
-
Gere o cliente Prisma:
npx prisma generate
-
Inicie o servidor em modo desenvolvimento:
npm run start:dev
A API estará disponível em http://localhost:3333.
-
Testes unitários:
npm run test:unit
-
Testes end-to-end:
npm run test:e2e
-
Todos os testes:
npm test -
Testes em modo watch (desenvolvimento):
npm run test:watch:unit # Unitários npm run test:watch:e2e # E2E
-
Cobertura de testes:
npm run test:coverage
-
Interface visual dos testes:
npm run test:ui
A documentação interativa está disponível via Swagger UI em http://localhost:3333/docs.
- Users: Registro, perfil e autenticação
- Gyms: Gerenciamento de academias (busca, criação)
- Check-ins: Sistema de check-ins (realização, validação, histórico)
- Authentication: Refresh de tokens
Para gerar/atualizar a documentação automaticamente:
npm run start:dev # A documentação é gerada dinamicamentesrc/
├── app.ts # Configuração principal do Fastify
├── server.ts # Ponto de entrada da aplicação
├── env/ # Configurações de ambiente
├── http/
│ ├── controllers/ # Controllers HTTP
│ │ ├── users/
│ │ ├── gyms/
│ │ └── check-ins/
│ ├── middlewares/ # Middlewares customizados
│ └── schemas/ # Schemas Zod para validação
├── use-cases/ # Casos de uso (regras de negócio)
├── repositories/ # Interfaces e implementações de repositório
├── utils/ # Utilitários diversos
└── @types/ # Definições de tipos customizados
prisma/
├── schema.prisma # Schema do banco de dados
└── migrations/ # Migrações do banco
generated/ # Cliente Prisma gerado
lib/ # Configurações do Prisma
- Single Responsibility: Cada classe tem uma única responsabilidade
- Open/Closed: Código aberto para extensão, fechado para modificação
- Liskov Substitution: Subtipos podem substituir seus tipos base
- Interface Segregation: Interfaces específicas ao invés de genéricas
- Dependency Inversion: Dependências de abstrações, não de concretizações
O projeto segue a Clean Architecture com camadas bem definidas:
- Controllers: Recebem requisições HTTP, validam entrada
- Use Cases: Contêm regras de negócio puras
- Repositories: Abstraem acesso a dados
// Controller (HTTP)
export async function register(request: FastifyRequest, reply: FastifyReply) {
const { name, email, password } = request.body
const registerUseCase = makeRegisterUseCase()
await registerUseCase.execute({ name, email, password })
return reply.status(201).send()
}
// Use Case (Regras de negócio)
export class RegisterUseCase {
constructor(private usersRepository: UsersRepository) {}
async execute({ name, email, password }: RegisterUseCaseRequest) {
// Validações de negócio
// Hash da senha
// Persistência
}
}
// Repository (Acesso a dados)
export class PrismaUsersRepository implements UsersRepository {
async create(data: Prisma.UserCreateInput) {
return await prisma.user.create({ data })
}
}Validação de entrada e saída usando schemas Zod:
export const createUserBodySchema = z.object({
name: z.string().min(3),
email: z.string().email(),
password: z.string().min(6),
})- Access tokens: Curta duração (10 minutos)
- Refresh tokens: Longa duração (7 dias), armazenados em cookies HTTP-only
- Middleware de verificação de JWT em rotas protegidas
Este projeto está sob a licença MIT.