- š Sobre o Projeto
- š Fluxo Principal da Aplicação
- š Tecnologias Utilizadas
- š Estrutura do Projeto
- š§ Configuração e Instalação
- š Fluxo da Aplicação
- š Autenticação e Autorização
- š API Endpoints
- š§Ŗ Testes
- š³ Docker
- š Documentação da API
- š¤ Contribuição
- šØāš» Author
Esta é uma API RESTful desenvolvida em Node.js com TypeScript que gerencia um sistema de cursos online. A aplicação permite autenticação de usuÔrios, criação e gerenciamento de cursos, e controle de acesso baseado em roles (estudante/gerente).
- ā Sistema de autenticação JWT
- ā Controle de acesso baseado em roles
- ā CRUD de cursos
- ā Sistema de matrĆculas
- ā Validação de dados com Zod
- ā Documentação automĆ”tica da API
- ā Testes automatizados
- ā Containerização com Docker
Este diagrama mostra o fluxo mais importante da aplicação, desde a autenticação até o gerenciamento de cursos:
flowchart TD
Start([š¤ UsuĆ”rio Acessa API]) --> Auth{š Autenticado?}
Auth -->|NĆ£o| Login[š POST /sessions<br/>Login com Email/Senha]
Login --> Verify[š Verificar Credenciais<br/>no PostgreSQL]
Verify --> Hash[š Validar Hash<br/>com Argon2]
Hash --> ValidCreds{ā
Credenciais<br/>VƔlidas?}
ValidCreds -->|NĆ£o| Error400[ā Erro 400<br/>Credenciais InvĆ”lidas]
ValidCreds -->|Sim| GenerateJWT[š« Gerar JWT Token<br/>com ID + Role]
GenerateJWT --> TokenResponse[š¤ Retornar Token JWT]
Auth -->|Sim| ProtectedRoute[š”ļø Rota Protegida<br/>Header: Authorization]
TokenResponse --> ProtectedRoute
ProtectedRoute --> ValidateJWT[š Validar JWT Token]
ValidateJWT --> ValidToken{ā
Token<br/>VƔlido?}
ValidToken -->|NĆ£o| Error401[ā Erro 401<br/>Token InvĆ”lido]
ValidToken -->|Sim| CheckRole[š„ Verificar Role<br/>do UsuĆ”rio]
CheckRole --> ManagerRole{šØāš¼ Role =<br/>Manager?}
ManagerRole -->|NĆ£o| Error403[ā Erro 403<br/>Sem PermissĆ£o]
ManagerRole -->|Sim| BusinessLogic[āļø Executar<br/>Lógica de Negócio]
BusinessLogic --> CourseOps{š Operação<br/>com Cursos}
CourseOps -->|GET /courses| ListCourses[š Listar Cursos<br/>com Paginação]
CourseOps -->|POST /courses| CreateCourse[ā Criar Curso<br/>Validar com Zod]
CourseOps -->|GET /courses/:id| GetCourse[š Buscar Curso<br/>por ID]
ListCourses --> DBQuery1[šļø Consulta PostgreSQL<br/>com Drizzle ORM]
CreateCourse --> ValidateData[ā
Validar Dados<br/>com Zod Schema]
GetCourse --> DBQuery2[šļø Consulta PostgreSQL<br/>com Drizzle ORM]
ValidateData --> ValidData{ā
Dados<br/>VƔlidos?}
ValidData -->|NĆ£o| ErrorValidation[ā Erro 400<br/>Dados InvĆ”lidos]
ValidData -->|Sim| DBInsert[šļø Inserir no<br/>PostgreSQL]
DBQuery1 --> Success1[ā
Sucesso 200<br/>Lista de Cursos]
DBQuery2 --> Success2[ā
Sucesso 200<br/>Dados do Curso]
DBInsert --> Success3[ā
Sucesso 201<br/>Curso Criado]
Error400 --> End([š Fim])
Error401 --> End
Error403 --> End
ErrorValidation --> End
Success1 --> End
Success2 --> End
Success3 --> End
classDef startEnd fill:#1e3a8a,stroke:#60a5fa,stroke-width:3px,color:#ffffff
classDef process fill:#7c3aed,stroke:#a78bfa,stroke-width:3px,color:#ffffff
classDef decision fill:#ea580c,stroke:#fb923c,stroke-width:3px,color:#ffffff
classDef database fill:#059669,stroke:#34d399,stroke-width:3px,color:#ffffff
classDef success fill:#047857,stroke:#10b981,stroke-width:3px,color:#ffffff
classDef error fill:#dc2626,stroke:#f87171,stroke-width:3px,color:#ffffff
class Start,End startEnd
class Login,Verify,Hash,GenerateJWT,ProtectedRoute,ValidateJWT,CheckRole,BusinessLogic,ListCourses,CreateCourse,GetCourse,ValidateData,TokenResponse process
class Auth,ValidCreds,ValidToken,ManagerRole,CourseOps,ValidData decision
class DBQuery1,DBQuery2,DBInsert database
class Success1,Success2,Success3 success
class Error400,Error401,Error403,ErrorValidation error
- š Autenticação: Sistema JWT com validação de credenciais
- š”ļø Autorização: Controle de acesso baseado em roles (Manager/Student)
- ā Validação: Schemas Zod para validação de dados
- šļø PersistĆŖncia: PostgreSQL com Drizzle ORM
- š SeguranƧa: Hash de senhas com Argon2
- Node.js - Runtime JavaScript
- TypeScript - Linguagem de programação tipada
- Fastify - Framework web rƔpido e eficiente
- PostgreSQL - Banco de dados relacional
- Drizzle ORM - ORM type-safe para TypeScript
- Zod - Validação de schemas
- JWT - Autenticação baseada em tokens
- Argon2 - Hash de senhas seguro
- Vitest - Framework de testes
- Docker - Containerização
- Pino - Logger estruturado
src/
āāā @types/ # DefiniƧƵes de tipos personalizados
āāā database/ # Configuração e schema do banco
ā āāā client.ts # Cliente do banco de dados
ā āāā schema.ts # Definição das tabelas
ā āāā seed.ts # Dados iniciais
āāā routes/ # Rotas da API
ā āāā hooks/ # Middlewares de autenticação
ā āāā create-course.ts # Criação de cursos
ā āāā get-courses.ts # Listagem de cursos
ā āāā get-courses-by-id.ts # Busca por ID
ā āāā login.ts # Autenticação
āāā test/ # Testes automatizados
ā āāā factories/ # Factories para testes
āāā utils/ # UtilitĆ”rios
āāā app.ts # Configuração do Fastify
āāā server.ts # Servidor principal
- Node.js 18+
- PostgreSQL 14+
- Docker (opcional)
- Clone o repositório
git clone https://github.com/emmanuelmarcosdeoliveira/first-node-api
cd first-node-api- Instale as dependĆŖncias
npm install- Configure as variƔveis de ambiente
cp .env.example .envConfigure as seguintes variƔveis no arquivo .env:
Exemplo:
DATABASE_URL="postgresql://usuario:senha@localhost:5432/nome_do_banco"
JWT_SECRET="seu_jwt_secret_aqui"
NODE_ENV="development"- Execute as migraƧƵes do banco
npm run db:migrate- Popule o banco com dados iniciais
npm run db:seed- Inicie o servidor
npm run devA aplicação estarĆ” disponĆvel em http://localhost:3333
graph TD
A[Cliente] --> B[Fastify Server]
B --> C{Endpoint}
C -->|POST /sessions| D[Login Route]
D --> E[Verificar Credenciais]
E --> F[Hash Password com Argon2]
F --> G{Credenciais VƔlidas?}
G -->|Sim| H[Gerar JWT Token]
G -->|NĆ£o| I[Retornar Erro 400]
H --> J[Retornar Token]
C -->|GET /courses| K[Get Courses Route]
K --> L[Verificar JWT]
L --> M{Token VƔlido?}
M -->|NĆ£o| N[Retornar Erro 401]
M -->|Sim| O[Verificar Role Manager]
O --> P{Role Manager?}
P -->|NĆ£o| Q[Retornar Erro 403]
P -->|Sim| R[Buscar Cursos no BD]
R --> S[Retornar Lista de Cursos]
C -->|POST /courses| T[Create Course Route]
T --> U[Verificar JWT]
U --> V{Token VƔlido?}
V -->|NĆ£o| W[Retornar Erro 401]
V -->|Sim| X[Verificar Role Manager]
X --> Y{Role Manager?}
Y -->|NĆ£o| Z[Retornar Erro 403]
Y -->|Sim| AA[Validar Dados com Zod]
AA --> BB{Dados VƔlidos?}
BB -->|NĆ£o| CC[Retornar Erro 400]
BB -->|Sim| DD[Criar Curso no BD]
DD --> EE[Retornar ID do Curso]
A aplicação implementa um sistema de controle de acesso baseado em roles:
- Student: UsuÔrio estudante (role padrão)
- Manager: UsuƔrio gerente com permissƵes administrativas
- Login: O usuƔrio faz login com email e senha
- Validação: As credenciais são verificadas no banco de dados
- Token JWT: Um token Ʃ gerado contendo o ID e role do usuƔrio
- Middleware: Todas as rotas protegidas verificam o token JWT
- Autorização: O sistema verifica se o usuÔrio tem a role necessÔria
// Middleware para verificar JWT
preHandler: [checkRequestJWT, checkUserRole("manager")];| Método | Endpoint | Descrição | Autenticação |
|---|---|---|---|
| POST | /sessions |
Login do usuÔrio | Não |
| Método | Endpoint | Descrição | Autenticação | Role |
|---|---|---|---|---|
| GET | /courses |
Listar todos os cursos | Sim | Manager |
| GET | /courses/:id |
Buscar curso por ID | Sim | Manager |
| POST | /courses |
Criar novo curso | Sim | Manager |
curl -X POST http://localhost:3333/sessions \
-H "Content-Type: application/json" \
-d '{
"email": "manager@example.com",
"password": "senha123"
}'{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}curl -X POST http://localhost:3333/courses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer SEU_JWT_TOKEN" \
-d '{
"title": "Curso de Node.js"
}'# Executar todos os testes
npm run tests
# Executar testes com coverage
npm run test:coverage
# Executar testes em modo watch
npm run test:watch- Factories: Criação de dados de teste
- Integration Tests: Testes de integração das rotas
- Coverage: Relatório de cobertura de código
# Construir a imagem
docker build -t first-node-api .
# Executar o container
docker run -p 3333:3333 first-node-api# Subir todos os serviƧos
docker-compose up -d
# Ver logs
docker-compose logs -f
# Parar serviƧos
docker-compose downA documentação interativa da API estĆ” disponĆvel em:
- Desenvolvimento:
http://localhost:3333/docs
A documentação é gerada automaticamente usando:
- OpenAPI/Swagger: Especificação da API
- Scalar: Interface de documentação moderna
Exemplo:
-
FaƧa um fork do projeto
-
Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature) -
Commit suas mudanƧas (
git commit -m 'Add some AmazingFeature') -
Push para a branch (
git push origin feature/AmazingFeature) -
Abra um Pull Request
# Desenvolvimento
npm run dev # Inicia servidor em modo desenvolvimento
# Banco de Dados
npm run db:generate # Gera migraƧƵes
npm run db:migrate # Executa migraƧƵes
npm run db:studio # Abre Drizzle Studio
npm run db:seed # Popula banco com dados iniciais
# Testes
npm run tests # Executa testes
npm run pretest # Executa migraƧƵes antes dos testesdeveloped by š Emmanuel Oliveira
Ā© Todos os Direitos Reservados
