joaoalbertorsc / streaming-api

Streaming API

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.

Java 21Spring Boot 3.5Spring Security · JWT Spring Data JPAPostgreSQL 16Flyway springdoc / SwaggerJUnit 5 · Mockito · Testcontainers
16endpoints REST
5entidades
20filmes no catálogo
172testes automatizados
99,5%cobertura de linhas
Arquitetura

Do token ao banco, em seis passos

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.

01

Cliente

Swagger ou qualquer cliente HTTP, com o token no header.

Authorization: Bearer …
02

Filtro JWT

Valida assinatura e validade e identifica a conta.

JwtAuthenticationFilter
03

Controller

Só HTTP: valida o DTO e chama um método de serviço.

@Valid · records
04

Service

Orquestra um caso de uso dentro de uma transação.

WatchService · PlanMigrationService
05

Policies

Uma regra de negócio por classe.

ContentAccessPolicy · ProfileQuotaPolicy · PinPolicy
06

PostgreSQL

Repositórios Spring Data, schema versionado com Flyway.

V1 → V7 · índice parcial
ERROS

GlobalExceptionHandler transforma exceções de domínio em um ApiError único: 400, 401, 403, 404 ou 409, sempre com mensagem e caminho.

03:00

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.

Modelo de domínio

Uma conta, vários perfis, um histórico por perfil

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.

PKchave primária (UUID) FKchave estrangeira UQúnico ── ⟨ um para muitos
Regra de acesso · simulador

Quem pode assistir o quê

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.

Plano da conta

Até 2 perfis ativos.

Perfil

Todas as classificações.

0 / 20

filmes liberados

plan.allows(movie.minimumPlan) && age.allows(movie.classification) rating ∈ {16, 18} → exige X-Account-Pin
Código e contrato

Pacotes por funcionalidade, 16 endpoints

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

Qualidade

172 testes, do mais rápido ao mais real

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.

Ponta a ponta · PostgreSQL5
Repositórios · H2 e PostgreSQL10
Controllers · @WebMvcTest53
Unitários · domínio, policies e serviços104
99,5%das linhas98,8%das ramificaçõesJaCoCoem mvn verify