Uma API REST que simula um serviço de streaming: um login por conta, perfis com faixa etária, planos que limitam perfis e catálogo, um PIN para conteúdo adulto, histórico de visualização e avaliações. Feita em TDD, do enum ao teste de ponta a ponta.
Toda requisição autenticada percorre o mesmo caminho. Cada camada tem uma responsabilidade só, e as regras de negócio vivem em classes pequenas que podem ser testadas sem subir o Spring.
Swagger ou qualquer cliente HTTP, com o token no header.
Authorization: Bearer …Valida assinatura e validade e identifica a conta.
JwtAuthenticationFilterSó HTTP: valida o DTO e chama um método de serviço.
@Valid · recordsOrquestra um caso de uso dentro de uma transação.
WatchService · PlanMigrationServiceUma regra de negócio por classe.
ContentAccessPolicy · ProfileQuotaPolicy · PinPolicyRepositórios Spring Data, schema versionado com Flyway.
V1 → V7 · índice parcialGlobalExceptionHandler transforma exceções de domínio em um ApiError único: 400, 401, 403, 404 ou 409, sempre com mensagem e caminho.
TrashPurgeJob roda todo dia e apaga de vez os perfis que estão há mais de 30 dias na lixeira, junto com histórico e avaliações.
A conta é o único login. Os perfis vivem dentro dela, e cada visualização gera uma linha nova de histórico, por isso assistir duas vezes aparece duas vezes. Passe o mouse sobre uma entidade para ver só as relações dela.
Escolha um plano e um tipo de perfil para ver como o catálogo real do seed (V7__seed_movies.sql) fica para essa combinação. É a mesma regra que a API aplica na consulta ao banco.
Cada pacote reúne controller, serviço, entidade, repositório e DTOs do mesmo assunto. Os endpoints de gestão exigem a role SUBSCRIBER; os de uso recebem o profileId e conferem se o perfil é da conta.
Pacotes · com.ebac.streaming
Endpoints · /api/v1
A base são testes unitários sem Spring; no topo, fluxos completos contra um PostgreSQL de verdade, criado e descartado pelo Testcontainers a cada execução.
mvn verify