API REST em Node.js + TypeScript com foco em separação de responsabilidades usando princípios de Clean Architecture e SOLID.
Projeto de estudo pessoal, desenvolvido exclusivamente para aprendizado e prática de arquitetura/boas práticas de backend.
Este projeto demonstra uma base de backend organizada por camadas, com:
- autenticação com JWT;
- gerenciamento de usuários;
- persistência com Prisma + MySQL;
- composição de dependências via factories.
- Node.js
- TypeScript
- Express
- Prisma ORM
- MySQL
- JWT (
jsonwebtoken) - Hash de senha com
bcryptjs
src/
application/ -> casos de uso e contratos (regras da aplicação)
domain/ -> entidades de domínio
infra/ -> HTTP, banco, env e detalhes de infraestrutura
main/ -> factories (montagem/injeção de dependências)
types/ -> extensões de tipos (ex.: Request do Express)- A rota recebe a requisição em
infra/http/routes. - O controller (
infra/http/controllers) valida/encaminha dados. - O use case (
application/.../use-cases) executa regra de negócio. - O repositório concreto (Prisma) acessa o banco.
- A resposta retorna ao controller e depois ao cliente.
Essa separação facilita manutenção, testes e troca de infraestrutura sem quebrar regra de negócio.
- Node.js 18+
- npm
- Docker + Docker Compose (opcional, recomendado para subir MySQL)
npm installCrie um arquivo .env na raiz do projeto:
PORT=3333
JWT_SECRET=sua_chave_jwt
DATABASE_URL="mysql://guest:guestpassword@localhost:3306/server_db"cd docker-mysql
docker compose up -d
cd ..npx prisma migrate deploySe estiver em ambiente local de desenvolvimento e quiser gerar/aplicar novas migrations:
npx prisma migrate devnpm run devServidor padrão:
http://localhost:3333POST /user-> cria usuárioPOST /login-> autentica e retorna token JWT
GET /users/profile-> perfil do usuário autenticadoGET /users/find-> busca usuário pelorequest.userIdGET /user/profile/:id-> perfil por IDPATCH /user/update-> atualiza dados do usuário autenticadoDELETE /user/remove/:id-> remove usuário por ID
Authorization: Bearer <seu_token_jwt>Base URL:
http://localhost:3333POST /user
Request:
{
"name": "João Silva",
"email": "joao@email.com",
"password": "123456"
}Resposta esperada (201):
{
"id": 1,
"name": "João Silva",
"email": "joao@email.com"
}POST /login
Request:
{
"email": "joao@email.com",
"password": "123456"
}Resposta esperada (200):
{
"token": "<jwt_token>"
}GET /users/profile
Headers:
Authorization: Bearer <jwt_token>Resposta esperada (200):
{
"id": 1,
"name": "João Silva",
"email": "joao@email.com"
}PATCH /user/update
Headers:
Authorization: Bearer <jwt_token>
Content-Type: application/jsonRequest:
{
"name": "João Atualizado",
"email": "joao.novo@email.com"
}Resposta esperada (200):
{
"id": 1,
"name": "João Atualizado",
"email": "joao.novo@email.com"
}GET /users/:id
Exemplo: GET /users/1
Resposta esperada (200):
{
"id": 1,
"name": "João Silva",
"email": "joao@email.com"
}DELETE /user/remove/:id
Headers:
Authorization: Bearer <jwt_token>Exemplo: DELETE /user/remove/1
Resposta esperada: 204 No Content
400-> dados inválidos ou regra de negócio401-> token ausente/inválido404-> usuário não encontrado
npm run dev-> inicia API comts-node-dev
- O schema Prisma inclui entidades de blog (post, category, comment, tag), mas nem todas as rotas estão expostas ainda.
- O middleware de autenticação injeta
request.userIdapós validar o JWT.
- Adicionar testes unitários para os use cases.
- Criar script de build (
tsc) e start de produção. - Documentar respostas de erro por endpoint (Swagger/OpenAPI).