Skip to content

JobaRules/api-clean-solid-node

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

API Clean SOLID

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.

Objetivo

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.

Stack

  • Node.js
  • TypeScript
  • Express
  • Prisma ORM
  • MySQL
  • JWT (jsonwebtoken)
  • Hash de senha com bcryptjs

Estrutura de pastas (resumo)

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)

Arquitetura (como flui uma request)

  1. A rota recebe a requisição em infra/http/routes.
  2. O controller (infra/http/controllers) valida/encaminha dados.
  3. O use case (application/.../use-cases) executa regra de negócio.
  4. O repositório concreto (Prisma) acessa o banco.
  5. 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.

Pré-requisitos

  • Node.js 18+
  • npm
  • Docker + Docker Compose (opcional, recomendado para subir MySQL)

Instalação

npm install

Variáveis de ambiente

Crie um arquivo .env na raiz do projeto:

PORT=3333
JWT_SECRET=sua_chave_jwt
DATABASE_URL="mysql://guest:guestpassword@localhost:3306/server_db"

Banco de dados

Opção 1: com Docker

cd docker-mysql
docker compose up -d
cd ..

Aplicar migrations do Prisma

npx prisma migrate deploy

Se estiver em ambiente local de desenvolvimento e quiser gerar/aplicar novas migrations:

npx prisma migrate dev

Executar a API

npm run dev

Servidor padrão:

http://localhost:3333

Endpoints atuais

Públicos

  • POST /user -> cria usuário
  • POST /login -> autentica e retorna token JWT

Privados (Bearer Token)

  • GET /users/profile -> perfil do usuário autenticado
  • GET /users/find -> busca usuário pelo request.userId
  • GET /user/profile/:id -> perfil por ID
  • PATCH /user/update -> atualiza dados do usuário autenticado
  • DELETE /user/remove/:id -> remove usuário por ID

Exemplo de header de autenticação

Authorization: Bearer <seu_token_jwt>

Exemplos práticos (Postman/Insomnia)

Base URL:

http://localhost:3333

1) Criar usuário

POST /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"
}

2) Login

POST /login

Request:

{
	"email": "joao@email.com",
	"password": "123456"
}

Resposta esperada (200):

{
	"token": "<jwt_token>"
}

3) Buscar perfil autenticado

GET /users/profile

Headers:

Authorization: Bearer <jwt_token>

Resposta esperada (200):

{
	"id": 1,
	"name": "João Silva",
	"email": "joao@email.com"
}

4) Atualizar usuário autenticado

PATCH /user/update

Headers:

Authorization: Bearer <jwt_token>
Content-Type: application/json

Request:

{
	"name": "João Atualizado",
	"email": "joao.novo@email.com"
}

Resposta esperada (200):

{
	"id": 1,
	"name": "João Atualizado",
	"email": "joao.novo@email.com"
}

5) Buscar usuário por ID (rota pública)

GET /users/:id

Exemplo: GET /users/1

Resposta esperada (200):

{
	"id": 1,
	"name": "João Silva",
	"email": "joao@email.com"
}

6) Remover usuário por ID

DELETE /user/remove/:id

Headers:

Authorization: Bearer <jwt_token>

Exemplo: DELETE /user/remove/1

Resposta esperada: 204 No Content

Respostas de erro comuns

  • 400 -> dados inválidos ou regra de negócio
  • 401 -> token ausente/inválido
  • 404 -> usuário não encontrado

Scripts

  • npm run dev -> inicia API com ts-node-dev

Observações

  • 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.userId após validar o JWT.

Próximos passos sugeridos

  • 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).

About

API REST em Node.js + TypeScript com foco em Clean Architecture e princípios SOLID, com autenticação JWT, gerenciamento de usuários e persistência em MySQL via Prisma.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors