Backend para a Cinemais, uma plataforma de streaming fictícia.
Este serviço é responsável por gerenciar o catálogo de mídias (filmes/séries) e a lista de favoritos dos usuários.
- Node.js + TypeScript
- Fastify (framework HTTP)
- Zod (validação dos dados)
- PostgreSQL (persistência de dados)
- Jest (testes unitários e de integração)
- Docker / Docker Compose
Escolhi o Fastify porque:
- Ele é mais enxuto e performático que alternativas mais "pesadas".
- Dá maior liberdade de controle sobre rotas, middlewares e erros.
- Para um projeto simples como esse, o Fastify se adapta melhor que o NestJS, que é mais verboso e traz camadas adicionais que não seriam totalmente necessárias aqui.
Usei o PostgreSQL porque:
- Tem ótimo suporte a tipagem forte e integridade referencial, garantindo consistência dos dados.
- Fácil integração com Docker (compose sobe rapidamente Postgres + API).
- É uma escolha melhor que usar um banco em memória para esse caso, já que simula um cenário mais próximo da vida real (persistência durável dos dados).
Cria uma nova mídia.
Body:
{
"title": "Matrix Genérica",
"description": "Um dev descobre que o mundo é uma simulação e precisa debugá-lo.",
"type": "movie",
"releaseYear": 2025,
"genre": "Ficção Científica"
}Resposta (201 Created):
{
"id": "uuid",
"title": "Matrix Genérica",
"description": "...",
"type": "movie",
"releaseYear": 2025,
"genre": "Ficção Científica"
}Lista todas as mídias cadastradas.
Resposta (200 OK):
[
{ "id": "uuid", "title": "Matrix Genérica", "description": "...", "type": "movie", "releaseYear": 2025, "genre": "Ficção Científica" }
]Busca uma mídia específica pelo id.
- 200 OK se encontrar.
- 404 Not Found se não existir.
Adiciona uma mídia à lista de favoritos do usuário.
Body:
{ "mediaId": "uuid-da-midia" }Resposta (204 No Content)
- 404 Not Found se
mediaIdnão existir.
Lista todos os favoritos de um usuário.
Resposta (200 OK):
[
{ "id": "uuid", "title": "Matrix Genérica", "description": "...", "type": "movie", "releaseYear": 2025, "genre": "Ficção Científica" }
]Remove uma mídia da lista de favoritos do usuário.
Resposta (204 No Content)
Crie um arquivo .env na raiz do projeto com as seguintes variaveis:
Porta onde a API vai rodar
PORT=3001URL de conexão com o banco PostgreSQL
o valor abaixo funciona junto com o docker-compose incluso no projeto
DATABASE_URL=postgresql://app:app@db:5432/cinemaisClone o repositório e rode:
npm run docker:build
- A API sobe em
http://localhost:3001 - O Postgres sobe em
localhost:5432
Para rodar os testes unitários e de integração:
npm install
npm run docker:db:start
npm run test - Teste geral
npm run test:unit - Testes unitários
npm run test:integration - Testes de integraçãoOs testes cobrem:
- Entidade Media (validações de criação).
- Repositórios em memória.
- Casos de uso (use cases).
- Integração com a API (rotas de
/mediae/favorites).
src/
├── application/ # use cases e DTOs
├── domain/ # entidades (Media, etc.)
├── infra/ # repositórios (PG, memória), controllers http server e database
└── shared/ # erros e utilidades
tests/ # testes unitários e de integração