Skip to content

gwtovitor/cinemais-api

Repository files navigation

🎬 Cinemais API

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.


⚙️ Tecnologias Utilizadas

  • 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

🚀 Justificativas das Escolhas

Framework: Fastify

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.

Banco de Dados: PostgreSQL

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

📚 Endpoints

📌 Catálogo de Mídia

POST /media

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

GET /media

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" }
]

GET /media/:id

Busca uma mídia específica pelo id.

  • 200 OK se encontrar.
  • 404 Not Found se não existir.

⭐ Favoritos

POST /users/:userId/favorites

Adiciona uma mídia à lista de favoritos do usuário.
Body:

{ "mediaId": "uuid-da-midia" }

Resposta (204 No Content)

  • 404 Not Found se mediaId não existir.

GET /users/:userId/favorites

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" }
]

DELETE /users/:userId/favorites/:mediaId

Remove uma mídia da lista de favoritos do usuário.
Resposta (204 No Content)


🔒 ENV

Crie um arquivo .env na raiz do projeto com as seguintes variaveis:

Porta onde a API vai rodar

PORT=3001

URL 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/cinemais

🐳 Como Rodar com Docker

Clone o repositório e rode:

npm run docker:build
  • A API sobe em http://localhost:3001
  • O Postgres sobe em localhost:5432

🧪 Rodando Testes

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ção

Os 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 /media e /favorites).

📂 Estrutura do Projeto

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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors