O Best Cine é uma aplicação completa de gerenciamento de cinema e reservas de ingressos. O sistema permite que os usuários naveguem por um catálogo de filmes, visualizem sessões disponíveis, selecionem assentos interativamente em uma sala virtual e realizem a reserva de ingressos. Este projeto resolve o problema de filas e gerenciamento manual, oferecendo uma experiência de compra de ingressos moderna, rápida e intuitiva.
O projeto vai além do básico e implementa conceitos avançados de arquitetura e integração de sistemas:
A integração com o Stripe foi desenhada para alta disponibilidade e segurança:
- Processamento Assíncrono: O checkout não termina na requisição do usuário. Utilizamos Workers rodando em containers Docker dedicados que consomem filas no Redis. Isso garante que o usuário não fique "travado" esperando o processamento bancário.
- Webhooks Seguros: A confirmação do pagamento é recebida via Webhook do Stripe. Implementamos validação de assinatura para garantir a autenticidade da requisição.
- Metadata: Dados críticos do pedido são trafegados de forma segura através de metadados criptografados nas transações, garantindo a integridade do checkout mesmo em cenários de falha.
O sistema consome a API do TMDB (The Movie Database) para manter o catálogo atualizado.
- Service Layer: Foi implementado um Service Pattern (
TmdbService) que atua como uma camada de abstração entre a aplicação e a API externa. Isso isola a lógica de negócios da complexidade das requisições HTTP, facilitando testes e manutenção.
O projeto foi construído utilizando tecnologias modernas e práticas robustas de desenvolvimento:
- Linguagem: PHP 8.2+
- Framework Backend: Laravel 12.0
- Banco de Dados: PostgreSQL 17
- Cache & Filas: Redis
- Frontend: Blade Templates, Tailwind CSS, Vite
- Ambiente de Desenvolvimento: Docker (via Laravel Sail)
- Testes: PEST Framework
- Pagamentos: Stripe SDK
- Autenticação: Laravel Breeze / Sanctum
Siga os passos abaixo para rodar o projeto localmente utilizando Docker (Sail).
- Docker Desktop instalado e rodando.
- Terminal com suporte a Git.
-
Clone o repositório:
git clone https://github.com/MarcosMMarques/BestCine.git best-cine cd best-cine -
Configure o Ambiente:
cp .env.example .env
-
Instale as Dependências: Utilizando um container Docker temporário para não depender de PHP local:
docker run --rm \ -u "$(id -u):$(id -g)" \ -v "$(pwd):/var/www/html" \ -w /var/www/html \ laravelsail/php82-composer:latest \ composer install --ignore-platform-reqs -
Suba os Containers (Alias): Recomenda-se configurar um alias para o Sail ou usar o caminho completo:
alias sail='[ -f sail ] && bash sail || bash vendor/bin/sail' sail up -d
-
Configuração Final: Gere a chave da aplicação, execute as migrações e popule o banco de dados:
sail artisan key:generate sail artisan migrate --seed
-
Frontend (Build):
sail npm install sail npm run dev
Acesse a aplicação em: http://localhost
O projeto segue as convenções do Laravel, adotando o padrão MVC (Model-View-Controller) como base, mas estendendo-o com Service Layer e Job Queues para manter o código limpo, testável e escalável.
.
├── app/
│ ├── Enums/ # Enumerações PHP (ex: Status de Reserva)
│ ├── Http/
│ │ ├── Controllers/ # Lógica de controle de fluxo (MVC)
│ │ └── Middleware/ # Filtros de requisição HTTP
│ ├── Jobs/ # Classes de tarefas assíncronas (Redis)
│ ├── Models/ # Modelos Eloquent (ORM)
│ └── Services/ # Lógica de negócio complexa e integrações (TMDB)
├── bootstrap/ # Scripts de inicialização do framework
├── config/ # Arquivos de configuração global
├── database/
│ ├── factories/ # Modelos para geração de dados fake
│ ├── migrations/ # Controle de versão do esquema do banco
│ └── seeders/ # Populadores iniciais do banco
├── public/ # Ponto de entrada web (index.php) e assets compilados
├── resources/
│ ├── css/ # Estilos não processados (Tailwind)
│ └── views/ # Templates HTML (Blade)
├── routes/
│ ├── web.php # Definição de rotas para o navegador
│ └── api.php # Definição de rotas para APIs/Webhooks
├── tests/ # Suíte de testes automatizados (PEST)
├── compose.yaml # Orquestração dos containers (Docker)
└── composer.json # Gerenciador de dependências PHP
app/: Aqui se tem toda a lógica de negócio. Regras de negócio emServicese processamento assíncrono emJobs, mantendo osControllersleves.config/: Contém todas as configurações da aplicação. Destaque paraauth.php(segurança) eservices.php(chaves de API de terceiros como Stripe e TMDB).database/: Essencial para a consistência dos dados. Asmigrationsgarantem que o esquema do banco seja reprodutível em qualquer ambiente, enquantoseedersefactoriespermitem subir um ambiente de desenvolvimento populado em segundos.resources/: A camada de visualização. Utiliza-se Blade e componentes TailwindCSS para criar uma interface modular e reutilizável.tests/: A pasta contém Unit Tests e Feature Tests escritos em PEST, cobrindo fluxos críticos como checkout e autenticação.
.env: Arquivo crítico (não versionado) onde residem segredos como senhas de banco, chaves do Stripe e API Keys. Nunca comite este arquivo.compose.yaml: Define a infraestrutura como código. Descreve os serviços (App, Postgres, Redis, Mailpit) que o Docker deve subir.composer.json: O mapa das dependências de backend. Define as bibliotecas que o projeto precisa para rodar.
O projeto é focado em renderização server-side (Blade), com as seguintes rotas principais:
- GET / (
movies.index): Página inicial listando os filmes em cartaz. - GET /movies/{id} (
movies.show): Exibe detalhes do filme, sinopse, elenco e trailer. - GET /movies/{movie}/sessions (
movies.sessions): Tela para escolha de dias e horários das sessões. - POST /reservation/checkout/{movie} (
reservation.checkout): Processa a reserva e o "pagamento" dos ingressos. - GET /profile: Gerenciamento de perfil do usuário e visualização de tickets.
A segurança dos dados dos usuários é prioridade. O sistema implementa uma camada de autenticação robusta utilizando o ecossistema Laravel:
- Guard Web (Session-Based): Para a interface do navegador, utilizando autenticação baseada em cookies de sessão seguros.
- CSRF Protection: Todas as requisições de formulários (
POST,PUT,DELETE) são protegidas automaticamente contra Cross-Site Request Forgery via tokens validados no middleware. - Middleware de Autorização: As rotas sensíveis (Checkout, Perfil) são protegidas por middlewares que garantem que apenas usuários autenticados e com permissões adequadas possam acessá-las.
O projeto utiliza PEST para testes unitários e de feature.
Para rodar os testes:
sail artisan testOu diretamente via binário do Pest:
sail bin pest- Navegação: Abra a página inicial e clique no poster de um filme do seu interesse.
- Detalhes: Veja a sinopse e clique em "Ver Sessões" ou "Reservar".
- Sessão: Escolha a data de hoje ou próxima data disponível.
- Seleção de Assentos: Um mapa interativo da sala será exibido. Clique nos assentos desejados.
- Checkout: Confirme o pedido. Se não estiver logado, será redirecionado para o Login. Após o login, você finalizará a "compra".
- Sucesso: Uma tela de confirmação exibirá os detalhes do seu pedido.
Esta seção descreve como os dados estão organizados no sistema, focando no fluxo de negócio para facilitar o entendimento:
Tudo começa com os Filmes (Movies). Eles são a entidade central do catálogo, contendo informações como título, sinopse, duração e poster. Para enriquecer os detalhes, os filmes se relacionam com outras tabelas auxiliares:
- Gêneros (Genres): Categorias do filme (Ação, Drama, etc).
- Atores (Actors): O elenco do filme.
- Produtoras (Production Companies): Estúdios responsáveis.
Para um filme ser assistido, ele precisa ser exibido em algum lugar e horário:
- Salas (Rooms): Representam o espaço físico do cinema. Cada sala tem um nome e uma capacidade total.
- Sessões (Sessions): É o cruzamento entre um Filme e uma Sala em um horário específico (
datetime). Quando o usuário navega no site, ele busca por sessões disponíveis.
O fluxo principal de negócio conecta o usuário à exibição:
- Usuários (Users): Clientes cadastrados na plataforma.
- Assentos (Seats): Lugares individuais dentro de uma sala. Durante a compra, o usuário seleciona quais assentos livres deseja ocupar naquela sessão.
- Reservas (Reservations): Representa a intenção de compra. Ela vincula o Usuário à Sessão e agrupa os Assentos selecionados. O status da reserva gerencia o ciclo de vida (pendente, confirmada, cancelada).
- Pedidos (Orders): A confirmação financeira. Após o pagamento ser processado (Stripe), um Pedido é gerado vinculado à Reserva, armazenando os valores finais, IDs de transação e status do pagamento.
Esse modelo garante que o histórico de compras seja preservado e que a ocupação das salas seja gerenciada em tempo real.