- Descrição
- Funcionalidades
- Tecnologias Utilizadas
- Instalação e Configuração
- Uso da API
- Desenvolvimento
- Testes
- Migrações de Banco de Dados
Este repositório contém a implementação de um case de seleção para desenvolvedor backend. Não se trata de um projeto real, mas sim de um exercício prático para avaliar habilidades de programação. Não há intenção de uso em produção.
FilmesTop API é um serviço backend desenvolvido para gerenciar um sistema de aluguel de filmes online. Esta API permite que os usuários explorem um vasto catálogo de filmes, realizem aluguéis, avaliem os títulos assistidos e gerenciem seu histórico de locações.
- 🎬 Listagem de filmes disponíveis por gênero
- 📊 Detalhamento completo de informações sobre filmes específicos
- 🛒 Sistema de aluguel de filmes
- ⭐ Avaliação personalizada de filmes alugados
- 📅 Visualização detalhada do histórico de aluguéis dos usuários
Tecnologia | Versão | Descrição |
---|---|---|
Python | 3.11 | Linguagem de programação principal |
Flask | 3.0.3 | Framework web para construção da API |
SQLAlchemy | 2.0.34 | ORM para interação com o banco de dados |
PostgreSQL | 13.x | Sistema de gerenciamento de banco de dados |
Marshmallow | 3.19.0 | Biblioteca para serialização/desserialização |
Alembic | 1.13.2 | Ferramenta para migrações de banco de dados |
Antes de começar, certifique-se de ter instalado:
- Python 3.11
- PostgreSQL 13.x
- pip (gerenciador de pacotes do Python)
-
Clone o repositório:
git clone https://github.com/Pedro-Emanuel/filmestop-api.git cd filmestop-api
-
Crie e ative um ambiente virtual:
python3.11 -m venv venv_py311 source venv_py311/bin/activate # No Windows use: venv_py311\Scripts\activate
-
Instale as dependências do projeto:
pip install -r requirements.txt
-
Configure as variáveis de ambiente:
Crie um arquivo
.env
na raiz do projeto e adicione:DB_USER=seu_usuario DB_PASS=sua_senha DB_NAME=filmestop_db DB_HOST=localhost # Local # DB_HOST=db # Docker
Nota de Segurança: Este exemplo é fornecido apenas para fins educativos e de demonstração. Mantenha suas credenciais seguras e não as compartilhe publicamente.
-
Inicialize o postgres:
Certifique-se de que o PostgreSQL está instalado e em execução. Se necessário, inicie o serviço:
# No Linux (systemd): sudo systemctl start postgresql # No macOS: brew services start postgresql # No Windows: # Inicie o serviço PostgreSQL através do Gerenciador de Serviços
Configure o banco de dados e o usuário:
sudo -u postgres psql # Mesmo usuário e senha definidos no .env # No prompt do PostgreSQL, execute: CREATE DATABASE filmestop_db; CREATE USER seu_usuario WITH PASSWORD 'sua_senha'; GRANT ALL PRIVILEGES ON DATABASE filmestop_db TO seu_usuario; \c filmestop_db GRANT ALL ON SCHEMA public TO seu_usuario; ALTER SCHEMA public OWNER TO seu_usuario; \q
-
Inicialize o banco de dados:
Abra um novo terminal, entre no ambiente virtual e execute as migrações do banco de dados:
flask db upgrade
-
Execute o servidor de desenvolvimento:
python run.py
-
Popule o banco de dados:
Para adicionar dados iniciais ao banco de dados, execute o script
populate_db.sh
:chmod +x populate_db.sh ./populate_db.sh
Este script adicionará alguns filmes e usuários ao banco de dados para testes.
Experimente olhar as rotas de admin no app/routes.py (apenas para testes).
Método | Endpoint | Descrição |
---|---|---|
GET | /movies |
Lista todos os filmes |
GET | /movies/genre?genre=<genero> |
Lista filmes por gênero |
GET | /movies/<id> |
Obtém detalhes de um filme específico |
POST | /rent |
Aluga um filme |
POST | /rate |
Avalia um filme alugado |
GET | /users/<id>/rentals |
Lista aluguéis de um usuário |
curl -X GET http://localhost:5001/movies
curl -X GET "http://localhost:5001/movies/genre?genre=com%C3%A9dia"
⚠️ Importante: Ao pesquisar gêneros ou títulos com caracteres especiais (como acentos), use a codificação URL apropriada.
Exemplos de codificação:
Palavra | Codificação URL |
---|---|
comédia | com%C3%A9dia |
ficção | fic%C3%A7%C3%A3o |
💡 Dica: Você pode usar ferramentas online de codificação URL ou funções específicas em sua linguagem de programação para gerar a string codificada corretamente.
Parâmetros opcionais:
page
: Número da página (padrão: 1)per_page
: Número de itens por página (padrão: 10)
Exemplo com paginação:
curl -X GET "http://localhost:5001/movies/genre?genre=com%C3%A9dia&page=1&per_page=5"
curl -X GET http://localhost:5001/movies/6
curl -X POST http://localhost:5001/rent \
-H "Content-Type: application/json" \
-d '{"user_id": 10, "movie_id": 6}'
curl -X POST http://localhost:5001/rate \
-H "Content-Type: application/json" \
-d '{"user_id": 10, "movie_id": 6, "rating": 4.5}'
curl -X GET http://localhost:5001/users/10/rentals
A estrutura do projeto segue o seguinte padrão:
filmestop-api/
│
├── app/
│ ├── __init__.py
│ ├── models.py
│ ├── routes.py
│ ├── schemas.py
│ └── utils.py
│
├── migrations/
│ ├── versions/
│ │ ├── 2ee9952e7b50_init.py
│ │ └── 55fbe96430b8_adding_final_grade_and_total_ratings_to_.py
│ ├── alembic.ini
│ ├── env.py
│ ├── README
│ └── script.py.mako
│
├── tests/
│ ├── conftest.py
│ ├── __init__.py
│ ├── test_models.py
│ └── test_routes.py
│
├── .env
├── .gitignore
├── requirements.txt
├── run.py
└── README.md
Para executar os testes unitários:
python -m pytest tests/
Os testes estão organizados nos seguintes arquivos:
test_models.py
: Testes para os modelos de dadostest_routes.py
: Testes para as rotas da API
As migrações do banco de dados são gerenciadas usando Alembic através do Flask-Migrate.
Para criar uma nova migração após fazer alterações nos modelos:
flask db migrate -m "Descrição da migração"
Para aplicar as migrações pendentes ao banco de dados:
flask db upgrade
Para reverter a última migração aplicada:
flask db downgrade
As migrações existentes podem ser encontradas no diretório migrations/versions/
. Atualmente, temos as seguintes migrações:
2ee9952e7b50_init.py
: Migração inicial55fbe96430b8_adding_final_grade_and_total_ratings_to_.py
: Adição de nota final e total de avaliações à tabela de filmes
Para ver o histórico completo de migrações:
flask db history