Skip to content

renatoalvess/api-solid

Repository files navigation

API Solid

Tabela de Conteúdos

Sobre o Projeto

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.

Arquitetura e Padrões

  • SOLID Principles:
  • Clean Architecture

Funcionalidades Principais

  • 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

Tecnologias Utilizadas

Node.js TypeScript Fastify Prisma PostgreSQL Docker Zod Vitest

Começando

Pré-requisitos

Node.js Docker Docker Compose

Instalação

  1. Clone o repositório:

    git clone <url-do-repositorio>
    cd api-solid
  2. Instale as dependências:

    npm install
  3. Configure o ambiente:

    cp .env.example .env
    # Edite .env com suas configurações
  4. Inicie o banco de dados:

    docker-compose up -d
  5. Execute as migrações do Prisma:

    npx prisma migrate dev
  6. Gere o cliente Prisma:

    npx prisma generate
  7. Inicie o servidor em modo desenvolvimento:

    npm run start:dev

A API estará disponível em http://localhost:3333.

Rodando os Testes

Comandos Disponíveis

  • 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

Documentação da API

A documentação interativa está disponível via Swagger UI em http://localhost:3333/docs.

Principais Grupos de Rotas

  • 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 dinamicamente

Estrutura do Projeto

src/
├── 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

Conceitos Técnicos

SOLID Principles

  • 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

Clean Architecture

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

Exemplo: Criação de Usuário

// 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 })
  }
}

Type Safety com Zod

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),
})

Autenticação JWT

  • 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

Licença

Este projeto está sob a licença MIT.

About

RESTful API built with Node.js and TypeScript, implementing SOLID principles

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors