API REST para processar pedidos e gerenciar pagamentos.
- Node.js (v22+)
- Fastify (Framework principal)
- PostgresSQL (Banco de dados)
- Drizzle ORM
- TypeScript
- PNPM (Gerenciador de pacotes)
- Vitest (Testes)
- Swagger (Documentação da API)
- Node.js >= 22.0.0
- PNPM >= 10.7.0
- PostgresSQL
Para configurar o ambiente de desenvolvimento, siga os seguintes passos:
- Clone o repositório:
git clone git@github.com:alefwhite/desafio-backend.git
cd desafio-backend- Instale as dependências:
pnpm install- Configure as variáveis de ambiente:
cp .env.example .env
# Edite o arquivo .env com suas configurações- Execute as migrações do banco de dados:
Caso tenha docker instalado execute: docker-compose up.
Senão utilize uma instalação local do postgres, para baixar acesse https://www.postgresql.org/
pnpm db-migrate- (Opcional) Execute o seed do banco de dados:
pnpm seedpnpm dev- Inicia o servidor em modo de desenvolvimentopnpm build- Compila o projeto para produçãopnpm start- Inicia o servidor em modo de produçãopnpm test- Executa os testes unitáriospnpm test:watch- Executa os testes em modo watchpnpm test:coverage- Executa os testes com coberturapnpm db-generate- Gera as migrações do Drizzlepnpm db-migrate- Executa as migrações do banco de dados
Exemplos de uso da API no arquivo routes.http
A documentação completa da API está disponível através do Swagger UI em: http://localhost:3000/docs
Todos os endpoints da API (exceto cadastro de usuário, autenticação e realizar pagamento) requerem um token JWT válido no header Authorization: Bearer <token>.
POST /api/users
Content-Type: application/json
{
"name": "Alef White",
"email": "alefwhite@email.com",
"password": "123456"
}POST /api/authenticate
Content-Type: application/json
{
"email": "alefwhite@email.com",
"password": "123456"
}
// Resposta
{
"token": "eyJhbGciOiJIUzI1NiIs..."
}PATCH /api/refresh
Content-Type: application/json
Cookie: refreshToken=<seu-refresh-token>
{}POST /api/orders
Content-Type: application/json
Authorization: Bearer <seu-token>
{
"items": [
{
"productId": 1001,
"quantity": 1
},
{
"productId": 1002,
"quantity": 1
}
],
"paymentMethod": "CREDIT_CARD" // Opções: CREDIT_CARD, BOLETO, PIX
}
// Resposta
{
"id": 123,
"status": "PENDING",
"paymentLink": "https://..."
}GET /api/orders/:orderId
Content-Type: application/json
Authorization: Bearer <seu-token>
// Resposta
[
{
"id": 123,
"customerId": "uuid-do-cliente",
"total": 1000,
"paymentMethod": "CREDIT_CARD",
"status": "PAID",
"createdAt": "2024-01-01T00:00:00Z"
}
]POST /webhook/payment
Content-Type: application/json
{
"orderId": "123",
"status": "APPROVED" // Opções: APPROVED, REPROVED
}
// Resposta
{
"id": 123,
"status": "PAID"
}- Cartão de Crédito: Aprovação automática e status "PAID"
- Boleto: Gera código fictício e status "PENDING"
- PIX: Gera código PIX fictício e status "PENDING"
PENDING: Aguardando pagamento (Boleto/PIX)PAID: Pagamento aprovadoCANCELED: Pagamento reprovado/cancelado
- Rate Limiting: 100 requisições por minuto
- CORS configurado para
http://localhost:3000 - Autenticação JWT
- Helmet para headers de segurança
- Refresh Token via cookies
O projeto utiliza várias ferramentas de desenvolvimento:
- Husky para git hooks
- Commitlint para padronização de commits
- Biome para linting
- TypeScript para tipagem estática
- Vitest para testes
- Pino para logging
Em ambiente de desenvolvimento, os logs são formatados com pino-pretty e exibidos no console. Em produção, os logs são salvos em ./logs/app.log.
ISC