Skip to content

API RESTful para gerenciamento de filmes, construída com Node.js, Express, Prisma e TypeScript. Inclui documentação com Swagger.

License

Notifications You must be signed in to change notification settings

alanborgesdev/movieflix-api

Repository files navigation

🎬 MovieFlix API

API REST completa para gerenciamento de filmes com documentação Swagger, banco de dados PostgreSQL e TypeScript

MovieFlix API é uma aplicação backend robusta que permite criar, listar, atualizar e deletar filmes, além de filtrar por gênero. Ideal para integração com aplicações frontend de catálogos de filmes, sistemas de recomendação ou plataformas de streaming.

License TypeScript Node.js Express Prisma PostgreSQL Docker


🚀 Tecnologias Utilizadas

Core

  • Node.js - Runtime JavaScript
  • TypeScript 5.8.3 - Tipagem estática e melhor desenvolvimento
  • Express 4.21.2 - Framework web minimalista

Banco de Dados

  • PostgreSQL 15 - Banco de dados relacional
  • Prisma 6.8.2 - ORM moderno para TypeScript/Node.js
  • PgAdmin 4 - Interface gráfica para gerenciamento do banco

Documentação

  • Swagger UI Express 5.0.1 - Interface interativa para documentação da API
  • OpenAPI 3.0 - Especificação padrão para APIs RESTful

DevOps & Ferramentas

  • Docker Compose - Orquestração de containers
  • TSX 4.19.4 - Execução e watch de arquivos TypeScript
  • Prettier 3.5.3 - Formatação de código

🏗️ Arquitetura

Cliente → Express API → Prisma ORM → PostgreSQL
                ↓
         Swagger Docs (/docs)

🧠 Funcionalidades

  • CRUD Completo de Filmes: Criar, listar, atualizar e deletar filmes
  • Filtro por Gênero: Busca de filmes por nome do gênero
  • Validação de Duplicatas: Impede cadastro de filmes com títulos duplicados (case-insensitive)
  • Relações de Dados: Suporte a gêneros e idiomas
  • Documentação Interativa: Interface Swagger para testar endpoints
  • Banco de Dados Dockerizado: PostgreSQL e PgAdmin em containers
  • TypeScript Strict: Código fortemente tipado
  • API RESTful: Seguindo boas práticas HTTP

🗂️ Estrutura do Projeto

movieflix-api/
├── src/
│   └── server.ts              # Arquivo principal da aplicação
├── dist/                      # Código compilado (gerado)
├── data/                      # Volumes Docker (gitignored)
│   ├── postgres/              # Dados do PostgreSQL
│   └── pgadmin/               # Configurações do PgAdmin
├── prisma/
│   └── schema.prisma          # Schema do banco de dados
├── swagger.json               # Documentação OpenAPI
├── docker-compose.yml         # Configuração dos containers
├── tsconfig.json              # Configuração TypeScript
├── .prettierrc.json           # Configuração Prettier
├── package.json               # Dependências e scripts
└── LICENSE                    # Licença MIT

📡 Endpoints da API

Filmes

Método Endpoint Descrição
GET /movies Lista todos os filmes
POST /movies Cadastra um novo filme
PUT /movies/:id Atualiza um filme existente
DELETE /movies/:id Remove um filme
GET /movies/:genreName Filtra filmes por gênero

Documentação

Método Endpoint Descrição
GET /docs Interface Swagger interativa

⚙️ Como Executar o Projeto

Pré-requisitos


1️⃣ Clone o Repositório

git clone https://github.com/alanborgesdev/movieflix-api.git
cd movieflix-api

2️⃣ Instale as Dependências

npm install

3️⃣ Configure o Banco de Dados

Inicie os containers Docker

docker-compose up -d

Isso iniciará:

  • PostgreSQL na porta 5432
  • PgAdmin na porta 5050

Acesse o PgAdmin (opcional)


4️⃣ Configure o Prisma

Crie o arquivo .env na raiz do projeto:

DATABASE_URL="postgresql://user:password@localhost:5432/movieflix-db"

Execute as migrations:

npx prisma migrate dev
npx prisma generate

5️⃣ Inicie o Servidor

Modo Desenvolvimento (com hot reload)

npm run dev

Modo Produção

npm run build
npm start

6️⃣ Acesse a Aplicação

  • API: http://localhost:3000
  • Documentação Swagger: http://localhost:3000/docs

📝 Exemplo de Uso

Criar um Filme

curl -X POST http://localhost:3000/movies \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Inception",
    "genre_id": 1,
    "language_id": 1,
    "oscar_count": 4,
    "release_date": "2010-07-16"
  }'

Listar Todos os Filmes

curl http://localhost:3000/movies

Filtrar por Gênero

curl http://localhost:3000/movies/action

🗄️ Schema do Banco de Dados

Tabela: movies

Campo Tipo Descrição
id INTEGER ID único (auto-incremento)
title VARCHAR Título do filme
genre_id INTEGER FK para tabela de gêneros
language_id INTEGER FK para tabela de idiomas
oscar_count INTEGER Quantidade de Oscars
release_date DATE Data de lançamento

Relacionamentos

  • moviesN:1genres
  • moviesN:1languages

🧪 Scripts Disponíveis

# Desenvolvimento com hot reload
npm run dev

# Build para produção
npm run build

# Executar versão compilada
npm start

# Formatar código
npx prettier --write .

# Prisma Studio (interface visual do banco)
npx prisma studio

🐳 Docker

O projeto inclui configuração completa do Docker Compose:

services:
  movieflix-postgres:
    - PostgreSQL 15
    - Porta: 5432
    - Banco: movieflix-db

  movieflix-pgadmin:
    - PgAdmin 4
    - Porta: 5050
    - Interface web para gerenciar o banco

Comandos Docker Úteis

# Iniciar containers
docker-compose up -d

# Ver logs
docker-compose logs -f

# Parar containers
docker-compose down

# Parar e remover volumes (apaga dados)
docker-compose down -v

🔒 Segurança

  • Validação de entrada de dados
  • Prevenção de SQL Injection (via Prisma ORM)
  • Tratamento de erros consistente
  • Variáveis de ambiente para credenciais sensíveis

🤝 Contribuindo

Contribuições são bem-vindas! Para contribuir:

  1. Faça um fork do projeto
  2. Crie uma branch para sua feature (git checkout -b feature/NovaFuncionalidade)
  3. Commit suas mudanças (git commit -m 'Adiciona nova funcionalidade')
  4. Push para a branch (git push origin feature/NovaFuncionalidade)
  5. Abra um Pull Request

📸 Demonstração

Swagger UI

Swagger Interface

Exemplo de Response

{
  "id": 1,
  "title": "Inception",
  "genres": {
    "name": "Action"
  },
  "languages": {
    "name": "English"
  },
  "oscar_count": 4,
  "release_date": "2010-07-16T00:00:00.000Z"
}

📬 Contato

Alan Borges


🧾 Licença

Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.


Desenvolvido com ❤️ por Alan Borges

⭐ Se este projeto foi útil, considere dar uma estrela!

About

API RESTful para gerenciamento de filmes, construída com Node.js, Express, Prisma e TypeScript. Inclui documentação com Swagger.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published