Plataforma SaaS de eventos com checkout, Pix, ingresso digital, QR Code individual e controle de entrada concorrente. O repositório contém backend Java/Spring Boot, frontend Angular/Taiga UI e infraestrutura Docker.
- Backend: Java 21, Spring Boot 3.5.16, Spring Security, JPA/Hibernate, PostgreSQL, Flyway, JWT, Swagger e ZXing.
- Frontend: Angular 20 LTS, standalone components, Signals, Reactive Forms, Taiga UI 5.16 e PWA.
- Pagamento:
PaymentProviderdesacoplado, comFakePaymentProvidere integração PixAsaasPaymentProviderpara Sandbox/produção. - Check-in: token opaco, armazenamento somente do hash e atualização atômica contra uso simultâneo.
- Integração: URLs relativas
/api; proxy do Angular no desenvolvimento e proxy do Nginx no Docker.
event-access-platform/
├── backend/
├── frontend/
├── infrastructure/
├── docs/
├── docker-compose.yml
├── .env.example
├── Makefile
├── start.sh
└── start.ps1
Pré-requisitos: Docker Engine e Docker Compose v2.
cp .env.example .env
docker compose up --buildNo Windows PowerShell:
./start.ps1- Frontend: http://localhost:4200
- Backend: http://localhost:8080
- Swagger: http://localhost:8080/swagger-ui/index.html
- Health: http://localhost:8080/actuator/health
- Caixa de e-mails (Mailpit, desenvolvimento): http://localhost:8025
/forgot-password gera um link de uso único, válido por 30 minutos, enviado por
e-mail. Em desenvolvimento a stack sobe com o Mailpit e a mensagem aparece em
http://localhost:8025 — nada sai para a internet. Em produção, aponte
MAIL_HOST/MAIL_PORT para o provedor real e mantenha MAIL_ENABLED=true.
A resposta da API é sempre a mesma, exista ou não a conta.
Cada evento exporta em dois formatos:
- CSV (
/reports/sales,/reports/checkins) — dados brutos para importar em outra ferramenta. - XLSX (
/reports/workbook.xlsx,/reports/sales.xlsx,/reports/checkins.xlsx) — planilha formatada com abas de resumo, vendas, ingressos e entradas, cabeçalho congelado, filtros, valores em moeda e datas no fuso da organização.
O tema é aplicado no elemento <html> (atributo tuiTheme) e aceita três
estados: claro, escuro e "seguir o sistema". A escolha fica em localStorage e
o controle está disponível também nas telas de login e recuperação de senha.
| Perfil | Senha | |
|---|---|---|
| SUPER_ADMIN | admin@eventaccess.local | Admin@123 |
| ORGANIZER_ADMIN | organizer@eventaccess.local | Organizer@123 |
| DOOR_STAFF | door@eventaccess.local | Door@123 |
As contas são criadas somente quando APP_ENVIRONMENT=development.
- Entre com
organizer@eventaccess.local. - Abra Eventos e use o checkout público da Festa de Verão.
- Escolha Comum ou Premium e conclua a identificação.
- Com
PAYMENT_PROVIDER=FAKE, aprove a simulação. ComASAAS, confirme a cobrança no painel Sandbox e aguarde o webhook ou use Sincronizar em Pagamentos. - Abra o ingresso emitido.
- Entre como
door@eventaccess.local, abra Portaria, selecione evento e portaria e leia o QR Code. - A primeira leitura é aprovada; a segunda é recusada como
ALREADY_USED.
Backend:
cd backend
mvn clean verify
mvn spring-boot:runFrontend:
cd frontend
npm install
npm run lint
npm run test
npm run build
npm startdocker compose down
docker compose down -v --remove-orphans- BCrypt para senhas.
- Access token curto e refresh token rotativo armazenado como hash.
- Autorização no backend por perfil.
- Consultas administrativas filtradas pela organização autenticada.
- QR token HMAC-SHA-256, sem dados pessoais e sem persistência em texto puro.
- Reserva de estoque com lock pessimista.
- Aprovação idempotente e check-in atômico.
- CORS restritivo, headers de segurança e respostas de erro padronizadas.
- Inicialização em produção é bloqueada quando o JWT usa o segredo padrão.
Copie .env.example. Em produção, substitua obrigatoriamente JWT_SECRET, QR_SECRET, senha do banco, origens CORS e URLs públicas.
make zipO ZIP implementa de ponta a ponta os fluxos críticos: login, isolamento organizacional, eventos, categorias, checkout, Pix fake ou Asaas, webhook idempotente, emissão, QR Code, portaria, recusa de duplicidade e dashboard. O schema inclui também as entidades previstas para convites, equipe, reembolsos e auditoria, deixando os módulos administrativos secundários preparados para expansão sem alterar o núcleo transacional.
A versão v5 corrige os seletores de perfil, evento e categoria, adiciona categorias de ingresso em português, color picker da pulseira e tratamento guiado para publicação sem ingressos. Consulte CHANGELOG-v5.md e docs/ui-patch-v5.md.
Use .env.asaas.example como base. Você precisará da API Key de Sandbox e de um token próprio para o webhook. Não envie nem versione esses segredos. O guia completo está em docs/asaas-sandbox.md.
Copy-Item .env.asaas.example .env
notepad .env
podman compose up --build -dA versão v6 também corrige o checkout público, o armazenamento do QR Code Base64 e a atualização automática do faturamento. Consulte CHANGELOG-v6.md.
A versão v6.3 fecha o fluxo operacional do ingresso e da portaria:
- check-in manual por código público
TKT-...; - leitura por token opaco ou URL completa
/t/{token}e/ticket/{token}; - download do ingresso completo em PNG;
- download separado do QR Code;
- aceite visível e separado dos Termos de Uso e da Política de Privacidade;
- páginas públicas
/termos-de-usoe/politica-de-privacidade; - auditoria do check-in manual pelo endpoint
/checkins/manual.
Consulte CHANGELOG-v6.3.md e docs/v6.3-checkin-ticket-legal.md.