Skip to content

Latest commit

Β 

History

13 Commits

Folders and files

Repository files navigation

🎬 CineReserve API

CI Python Django PostgreSQL Redis Docker License

API RESTful para sistema de reserva de ingressos do cinema Cinepolis Natal.


πŸ—οΈ Arquitetura

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     CineReserve API                      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚    users     β”‚    movies    β”‚       reservations         β”‚
β”‚  Registro    β”‚  Filmes      β”‚  Reservar Assento          β”‚
β”‚  Login JWT   β”‚  Sessoes     β”‚  Checkout                  β”‚
β”‚  Perfil      β”‚  Mapa Asst.  β”‚  Meus Ingressos            β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚              β”‚                  β”‚
β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  PostgreSQL  β”‚ β”‚   Redis    β”‚ β”‚        Celery            β”‚
β”‚  (banco)     β”‚ β”‚  (locks +  β”‚ β”‚  - Auto-release locks    β”‚
β”‚              β”‚ β”‚   cache)   β”‚ β”‚  - Email confirmacao     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

βš™οΈ Tecnologias

Camada Tecnologia
Linguagem Python 3.12+
Framework Django 6 + Django REST Framework
Autenticacao JWT (djangorestframework-simplejwt)
Banco de Dados PostgreSQL 16
Cache / Lock Distribuido Redis 7
Tarefas Assincronas Celery
Email Mailtrap (SMTP Sandbox)
Documentacao Swagger (drf-spectacular)
Testes pytest + pytest-django
Containers Docker + Docker Compose
CI/CD GitHub Actions

βœ… Funcionalidades

Requisitos Tecnicos

  • API RESTful com Django REST Framework e Poetry
  • Autenticacao JWT
  • Banco de dados PostgreSQL
  • Redis como distributed lock para reservas temporarias
  • Cache Redis nos endpoints de alta leitura (filmes e sessoes)
  • Paginacao em todos os endpoints de listagem
  • Testes unitarios e de integracao (9/9 passando)
  • Documentacao Swagger em /api/docs/
  • Docker + Docker Compose
  • Repositorio publico no GitHub

Casos de Uso

  • Cadastro e login com JWT
  • Listagem de filmes disponiveis
  • Listagem de sessoes por filme
  • Mapa de assentos em tempo real (disponivel, reservado, comprado)
  • Lock distribuido de 10 minutos por assento via Redis
  • Checkout e geracao de ingresso digital unico
  • Portal "Meus Ingressos" com historico completo

Bonus

  • Rate limiting nos endpoints de autenticacao
  • Celery para liberacao automatica de locks expirados
  • Celery para envio de email de confirmacao apos checkout
  • Pipeline CI/CD com GitHub Actions
  • Health check endpoint
  • Seed de dados de exemplo
  • Tratamento global de erros padronizado

πŸš€ Como Rodar

Pre-requisitos

  • Docker Desktop instalado e rodando
  • Python 3.12+
  • Poetry

1. Clone o repositorio

git clone https://github.com/Oskar-Fernandes/cinereserve.git
cd cinereserve

2. Configure o ambiente

cp .env.example .env

Edite o .env com suas credenciais se necessario.

3. Instale as dependencias

poetry install

4. Inicie os servicos (PostgreSQL + Redis)

docker compose up -d db redis

5. Rode as migrations

poetry run python manage.py migrate

6. Popule o banco com dados de exemplo

poetry run python manage.py seed

7. Crie o superusuario (opcional)

poetry run python manage.py createsuperuser

8. Inicie o servidor

poetry run python manage.py runserver

Acesse: http://localhost:8000/api/docs/


πŸ“– Documentacao da API

URL Descricao
http://localhost:8000/api/docs/ Swagger UI
http://localhost:8000/api/health/ Health Check
http://localhost:8000/admin/ Painel Admin

πŸ“‘ Endpoints

Usuarios

Metodo Endpoint Descricao Auth
POST /api/users/register/ Cadastrar usuario Nao
POST /api/users/login/ Login (retorna JWT) Nao
POST /api/users/token/refresh/ Renovar token Nao
GET /api/users/profile/ Ver perfil Sim

Filmes

Metodo Endpoint Descricao Auth
GET /api/movies/ Listar filmes Nao
GET /api/movies/{id}/ Detalhe do filme Nao
GET /api/movies/{id}/sessions/ Sessoes do filme Nao
GET /api/movies/sessions/{id}/seats/ Mapa de assentos Sim

Reservas

Metodo Endpoint Descricao Auth
POST /api/reservations/sessions/{s}/seats/{s}/reserve/ Reservar assento (lock 10min) Sim
POST /api/reservations/sessions/{s}/seats/{s}/checkout/ Finalizar e gerar ingresso Sim
GET /api/reservations/my-tickets/ Meus ingressos Sim

Sistema

Metodo Endpoint Descricao Auth
GET /api/health/ Status da API Nao
GET /api/docs/ Documentacao Swagger Nao

πŸ”„ Fluxo de Reserva

1. POST /api/users/login/          β†’ Obter token JWT
2. GET  /api/movies/               β†’ Listar filmes
3. GET  /api/movies/{id}/sessions/ β†’ Ver sessoes disponiveis
4. GET  /api/movies/sessions/{id}/seats/ β†’ Ver mapa de assentos
5. POST /api/reservations/.../reserve/  β†’ Reservar assento (lock 10min)
6. POST /api/reservations/.../checkout/ β†’ Finalizar compra + email
7. GET  /api/reservations/my-tickets/   β†’ Ver ingressos

Como Testar a API pelo Swagger

Passo 1 - Acesse o Swagger

Abra no navegador: http://localhost:8000/api/docs/

Passo 2 - Registre um usuario

Clique em POST /api/users/register/ > Try it out > cole o body abaixo > Execute:

{
  "username": "teste",
  "email": "teste@email.com",
  "password": "senha123"
}

Passo 3 - Faca o login

Clique em POST /api/users/login/ > Try it out > cole o body abaixo > Execute:

{
  "email": "teste@email.com",
  "password": "senha123"
}

Na resposta, copie o valor do campo "access" (o token JWT).

Passo 4 - Autorize no Swagger

Clique no botao "Authorize" no canto superior direito da pagina. Cole APENAS o token no campo Value (sem a palavra Bearer). Clique em Authorize e depois em Close.

Passo 5 - Teste o fluxo completo

  1. GET /api/movies/ - Liste os filmes
  2. GET /api/movies/1/sessions/ - Veja as sessoes do filme 1
  3. GET /api/movies/sessions/1/seats/ - Veja o mapa de assentos
  4. POST /api/reservations/sessions/1/seats/2/reserve/ - Reserve o assento 2
  5. POST /api/reservations/sessions/1/seats/2/checkout/ - Finalize a compra
  6. GET /api/reservations/my-tickets/ - Veja seus ingressos

πŸ§ͺ Rodando os Testes

poetry run pytest

🐳 Docker

# Iniciar todos os servicos
docker compose up -d

# Parar todos os servicos
docker compose down

# Ver logs
docker compose logs -f

πŸ“ Estrutura do Projeto

cinereserve/
β”œβ”€β”€ core/                        # Configuracoes Django, URLs, Celery
β”‚   β”œβ”€β”€ settings.py
β”‚   β”œβ”€β”€ urls.py
β”‚   β”œβ”€β”€ celery.py
β”‚   β”œβ”€β”€ exceptions.py
β”‚   └── views.py
β”œβ”€β”€ users/                       # Cadastro e autenticacao
β”œβ”€β”€ movies/                      # Filmes, sessoes e assentos
β”‚   └── management/commands/     # Comando seed
β”œβ”€β”€ reservations/                # Reservas e ingressos
β”œβ”€β”€ .github/workflows/ci.yml     # CI/CD GitHub Actions
β”œβ”€β”€ docker-compose.yml
β”œβ”€β”€ Dockerfile
β”œβ”€β”€ pyproject.toml
└── .env.example

πŸ”’ Seguranca

  • JWT com expiracao de 1 hora (refresh de 7 dias)
  • Rate limiting: 5 req/min no registro, 10 req/min no login
  • Variaveis sensiveis isoladas no .env
  • .env nunca commitado no repositorio '@ | Set-Content README.md -Encoding UTF8

About

RESTful API for cinema ticket reservation system built with Django REST Framework, PostgreSQL, Redis, and Docker.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages