Este sistema integra apostas esportivas acumuladas, chat entre usuários e administradores, notificações e transações financeiras. Ele foi projetado para ser escalável, seguro e pronto para uso em uma plataforma real.
O sistema possui cinco módulos principais:
- Usuário (User) – clientes ou administradores.
- Apostas (BetSlip & BetPick) – apostas simples ou acumuladas (máx. 2 jogos).
- Partidas e Odds (Match & Odd) – cadastro de jogos e probabilidades de resultado.
- Chat (Chat & Message) – comunicação entre usuário e admin.
- Transações & Notificações (Transaction & Notification) – gerenciamento financeiro e alertas.
- Cada usuário possui saldo, histórico de apostas, mensagens e notificações.
- Usuário pode ser CLIENT ou ADMIN.
- Usuários clientes só podem conversar com administradores.
- Administradores podem conversar com múltiplos usuários.
Implementação:
- Criar endpoints para CRUD de usuários.
- Implementar autenticação e autorização (JWT ou sessão).
- Garantir que CLIENT só converse com admin e admin possa falar com vários users.
- Cada partida (
Match) tem time da casa, time visitante, horário de início e status (OPEN,CLOSED,FINISHED,CANCELED). - Cada partida possui odds (
HOME_WIN,DRAW,AWAY_WIN). - Odds são salvas no momento da aposta (snapshot) para garantir integridade financeira.
Implementação:
- Admin cria partidas e odds antes do início.
- Sistema fecha apostas automaticamente ou manualmente quando o jogo começa.
- Registrar resultado final para que o sistema possa resolver as apostas.
- Usuário seleciona 1 ou 2 jogos e escolhe seu palpite para cada.
- Sistema calcula:
totalOdd = odd1 * odd2possibleWin = stake * totalOdd
- Valor apostado é debitado do saldo do usuário.
- Ficha (
BetSlip) e palpites (BetPick) são salvos. - Status inicial:
PENDING.
- Após o término das partidas:
- Se todos os palpites estiverem corretos → ficha
WON. - Se 1 ou mais palpites estiverem errados → ficha
LOST.
- Se todos os palpites estiverem corretos → ficha
- Se ganha:
- Saldo do usuário é creditado com
possibleWin. - Criar
Transactionde crédito.
- Saldo do usuário é creditado com
Implementação:
- Validar regras antes de criar ficha:
- Máximo 2 jogos por ficha.
- Saldo suficiente do usuário.
- Partida ainda
OPEN.
- Resolver ficha dentro de transação atômica para evitar inconsistências financeiras.
- Cada usuário tem um chat com o admin.
- Admin pode ter chats com vários usuários.
- Mensagens possuem
isReadpara controle de leitura.
Implementação:
- Criar endpoints para:
- Enviar mensagem.
- Listar mensagens de um chat.
- Marcar como lida.
- Opcional: usar WebSocket para mensagens em tempo real.
- Tipos de notificações:
SYSTEM– alertas gerais do sistema.BET– resultado de apostas.PAYMENT– depósitos ou saques.MESSAGE– novas mensagens do chat.
- Notificações possuem
isReadpara controle de visualização.
Implementação:
- Criar endpoint para listar notificações por usuário.
- Criar mecanismo para gerar notificações automaticamente:
- Ao finalizar uma aposta.
- Ao processar um depósito ou saque.
- Ao receber mensagem.
- Cada ação financeira gera uma
Transaction:- DEPÓSITO – adiciona saldo.
- SAQUE – retira saldo (aprovado ou pendente).
- APOSTA – débito ao criar ficha.
- PAGAMENTO – crédito ao ganhar aposta.
- Transações garantem rastreamento completo.
Implementação:
- Criar endpoints para criar, aprovar e listar transações.
- Sempre associar transações a
userIde opcionalmente arelatedSlipId(aposta).
- Snapshot das odds: nunca recalcule odds após a aposta.
- Transações atômicas: resolver apostas e movimentar saldo em transações para evitar inconsistência.
- Limite de apostas: máximo 2 jogos por ficha.
- Controle de status: usar enums para status (
OPEN,CLOSED,PENDING,WON, etc.) - Auditoria: manter logs de transações, fichas e mensagens para segurança.
- Escalabilidade: separar resolução de apostas em fila (ex: BullMQ ou RabbitMQ) se o volume crescer.
- Segurança: verificar permissões (CLIENT vs ADMIN) para chat, apostas e transações.
- Admin cria partidas e odds (
MatcheOdd). - User cria aposta (
BetSlip+BetPick), valor é debitado. - Sistema fecha apostas (
CLOSED) quando partidas iniciam. - Admin ou sistema insere resultado final (
FINISHED). - Sistema resolve fichas:
- Se todos os palpites corretos →
WON→ crédito. - Se 1 errado →
LOST.
- Se todos os palpites corretos →
- Sistema envia notificações (
Notification). - Usuário/Admin conversam via chat.
- Transações financeiras registradas para todas as operações.
Este modelo garante:
- Consistência financeira.
- Fluxo justo de apostas acumuladas.
- Comunicação eficiente entre usuários e administradores.
- Escalabilidade e segurança pronta para produção.