Estrutura de Pastas
O projeto segue uma estrutura organizada baseada em Clean Architecture, com separação clara entre camadas.
Visão Geral
csgoflip/
├── src/ # Código fonte do backend
├── client/ # Frontend (Next.js 14)
├── next-shadcn-admin-dashboard/ # Admin Panel (Next.js 16)
├── docs/ # Esta documentação
├── prisma/ # Schema e migrações do banco
├── docker/ # Configurações Docker
├── test/ # Testes automatizados
└── scripts/ # Scripts utilitáriosBackend (src/)
Camada de Domínio
src/domain/
├── entities/ # Entidades do domínio
│ ├── user.entity.ts # Usuário
│ ├── case.entity.ts # Caixa
│ ├── item.entity.ts # Item
│ ├── case-opening.entity.ts # Abertura de caixa
│ ├── battle.entity.ts # Batalha
│ ├── battle-player.entity.ts # Jogador de batalha
│ ├── battle-round.entity.ts # Rodada de batalha
│ ├── battle-settlement.entity.ts # Distribuição de batalha
│ ├── transaction.entity.ts # Transação financeira
│ ├── deposit.entity.ts # Depósito
│ ├── withdrawal.entity.ts # Saque
│ ├── user-inventory.entity.ts # Inventário do usuário
│ ├── upgrade.entity.ts # Upgrade
│ ├── swap.entity.ts # Troca
│ ├── raffle.entity.ts # Sorteio
│ ├── raffle-ticket.entity.ts # Ticket de sorteio
│ ├── event.entity.ts # Evento/Battle Pass
│ ├── notification.entity.ts # Notificação
│ └── audit-log.entity.ts # Log de auditoria
│
└── repositories/ # Interfaces dos repositórios
├── user.repository.interface.ts
├── case.repository.interface.ts
├── case-opening.repository.interface.ts
├── battle.repository.interface.ts
├── transaction.repository.interface.ts
├── deposit.repository.interface.ts
├── withdrawal.repository.interface.ts
├── user-inventory.repository.interface.ts
├── upgrade.repository.interface.ts
├── swap.repository.interface.ts
├── raffle.repository.interface.ts
├── event.repository.interface.ts
└── notification.repository.interface.tsCamada de Aplicação
src/application/
├── dto/ # Data Transfer Objects
│ ├── auth.dto.ts # DTOs de autenticação
│ ├── case.dto.ts # DTOs de caixa
│ ├── case-opening.dto.ts # DTOs de abertura
│ ├── battle.dto.ts # DTOs de batalha
│ ├── payment.dto.ts # DTOs de pagamento
│ ├── inventory.dto.ts # DTOs de inventário
│ ├── upgrade.dto.ts # DTOs de upgrade
│ ├── swap.dto.ts # DTOs de swap
│ ├── raffle.dto.ts # DTOs de sorteio
│ ├── event.dto.ts # DTOs de evento
│ ├── notification.dto.ts # DTOs de notificação
│ ├── admin.dto.ts # DTOs do admin
│ └── provably-fair.dto.ts # DTOs de verificação
│
├── services/ # Serviços de aplicação
│ ├── transaction.service.ts # Double-entry bookkeeping
│ ├── provably-fair.service.ts # Cálculo de rolls
│ ├── flip.service.ts # Sistema FLIP
│ ├── notification.service.ts # Envio de notificações
│ ├── probability.service.ts # Cálculo de probabilidades
│ └── money.service.ts # Formatação monetária
│
├── interfaces/ # Interfaces de serviços externos
│ ├── payment-provider.interface.ts
│ ├── storage.interface.ts
│ └── email.interface.ts
│
└── use-cases/ # Casos de uso
├── auth/
│ ├── steam-callback.use-case.ts
│ ├── logout.use-case.ts
│ └── get-me.use-case.ts
│
├── case/
│ ├── get-cases.use-case.ts
│ ├── get-case-by-id.use-case.ts
│ └── get-case-items.use-case.ts
│
├── case-opening/
│ ├── open-case.use-case.ts
│ ├── open-multiple-cases.use-case.ts
│ ├── get-opening-history.use-case.ts
│ ├── verify-opening.use-case.ts
│ └── get-recent-openings.use-case.ts
│
├── battle/
│ ├── create-battle.use-case.ts
│ ├── join-battle.use-case.ts
│ ├── get-battle.use-case.ts
│ ├── get-active-battles.use-case.ts
│ ├── execute-battle.use-case.ts
│ └── cancel-battle.use-case.ts
│
├── inventory/
│ ├── get-user-inventory.use-case.ts
│ ├── sell-item.use-case.ts
│ └── sell-multiple-items.use-case.ts
│
├── payment/
│ ├── initiate-deposit.use-case.ts
│ ├── confirm-deposit.use-case.ts
│ ├── request-withdrawal.use-case.ts
│ ├── approve-withdrawal.use-case.ts
│ └── get-transactions.use-case.ts
│
├── upgrade/
│ ├── perform-upgrade.use-case.ts
│ ├── calculate-upgrade-chance.use-case.ts
│ └── verify-upgrade.use-case.ts
│
├── swap/
│ ├── create-swap.use-case.ts
│ ├── accept-swap.use-case.ts
│ ├── cancel-swap.use-case.ts
│ └── get-swaps.use-case.ts
│
├── raffle/
│ ├── get-active-raffles.use-case.ts
│ ├── buy-tickets.use-case.ts
│ └── draw-raffle.use-case.ts
│
├── event/
│ ├── get-active-events.use-case.ts
│ ├── get-event-progress.use-case.ts
│ ├── add-event-xp.use-case.ts
│ └── claim-reward.use-case.ts
│
├── notification/
│ ├── get-notifications.use-case.ts
│ ├── mark-as-read.use-case.ts
│ └── get-unread-count.use-case.ts
│
└── admin/
├── get-dashboard-stats.use-case.ts
├── get-revenue-chart.use-case.ts
├── get-users.use-case.ts
├── ban-user.use-case.ts
├── get-cases.use-case.ts
├── create-case.use-case.ts
├── update-case.use-case.ts
├── delete-case.use-case.ts
├── get-items.use-case.ts
├── create-item.use-case.ts
├── get-deposits.use-case.ts
├── confirm-deposit.use-case.ts
├── get-withdrawals.use-case.ts
├── approve-withdrawal.use-case.ts
└── ... (40+ use cases admin)Camada de Infraestrutura
src/infrastructure/
├── database/
│ ├── prisma.service.ts # Serviço Prisma
│ └── repositories/ # Implementações dos repositórios
│ ├── user.repository.ts
│ ├── case.repository.ts
│ ├── case-opening.repository.ts
│ ├── battle.repository.ts
│ ├── transaction.repository.ts
│ ├── deposit.repository.ts
│ ├── withdrawal.repository.ts
│ ├── user-inventory.repository.ts
│ ├── upgrade.repository.ts
│ ├── swap.repository.ts
│ ├── raffle.repository.ts
│ ├── event.repository.ts
│ └── notification.repository.ts
│
├── auth/
│ ├── session.service.ts # Gestão de sessões Redis
│ ├── steam-oauth.service.ts # Steam OAuth
│ └── two-factor.service.ts # 2FA TOTP
│
├── redis/
│ ├── redis.module.ts # Módulo Redis
│ ├── redis.service.ts # Operações Redis
│ └── cache.service.ts # Cache de dados
│
├── locks/
│ ├── lock.module.ts # Módulo de locks
│ └── lock.service.ts # Distributed locks (Redlock)
│
├── queue/
│ ├── queue.module.ts # Módulo BullMQ
│ └── processors/
│ ├── battle.processor.ts # Processador de batalhas
│ └── notification.processor.ts
│
├── websocket/
│ ├── websocket.module.ts # Módulo WebSocket
│ ├── websocket.gateway.ts # Gateway Socket.io
│ └── redis-io.adapter.ts # Adapter Redis para scaling
│
├── audit/
│ ├── audit.module.ts # Módulo de auditoria
│ └── audit.service.ts # Serviço de audit logs
│
├── external-apis/
│ ├── steam.service.ts # API Steam
│ ├── payment/
│ │ ├── stripe.provider.ts # Provider Stripe
│ │ └── pix.provider.ts # Provider PIX
│ └── storage/
│ └── s3.service.ts # AWS S3
│
├── snowflake/
│ ├── snowflake.module.ts # Módulo Snowflake
│ └── snowflake.service.ts # Geração de IDs
│
└── security/
├── rate-limiter.service.ts # Rate limiting customizado
└── ip-blacklist.service.ts # Blacklist de IPsCamada de Apresentação
src/presentation/
├── controllers/
│ ├── auth.controller.ts # /api/auth/*
│ ├── case.controller.ts # /api/cases/*
│ ├── case-opening.controller.ts # /api/cases/:id/open
│ ├── battle.controller.ts # /api/battles/*
│ ├── inventory.controller.ts # /api/inventory/*
│ ├── payment.controller.ts # /api/payment/*
│ ├── upgrade.controller.ts # /api/upgrades/*
│ ├── swap.controller.ts # /api/swaps/*
│ ├── raffle.controller.ts # /api/raffles/*
│ ├── event.controller.ts # /api/events/*
│ ├── notification.controller.ts # /api/notifications/*
│ ├── live-drops.controller.ts # /api/live-drops/*
│ ├── provably-fair.controller.ts # /api/provably-fair/*
│ ├── admin.controller.ts # /api/admin/*
│ ├── health.controller.ts # /api/health
│ └── webhook.controller.ts # /api/webhooks/*
│
├── guards/
│ ├── auth.guard.ts # Guard de autenticação
│ └── admin.guard.ts # Guard de admin
│
├── pipes/
│ ├── validation.pipe.ts # Validação global
│ └── sanitize.pipe.ts # Sanitização de input
│
├── decorators/
│ ├── current-user.decorator.ts # @CurrentUser()
│ └── public.decorator.ts # @Public()
│
├── filters/
│ └── http-exception.filter.ts # Tratamento de erros
│
├── interceptors/
│ └── logging.interceptor.ts # Log de requisições
│
└── modules/
├── auth.module.ts
├── case.module.ts
├── case-opening.module.ts
├── battle.module.ts
├── inventory.module.ts
├── payment.module.ts
├── upgrade.module.ts
├── swap.module.ts
├── raffle.module.ts
├── event.module.ts
├── notification.module.ts
├── live-drops.module.ts
├── provably-fair.module.ts
├── admin.module.ts
└── shared.module.tsFrontend (client/)
client/
├── app/ # App Router (Next.js 14)
│ ├── layout.tsx # Layout raiz
│ ├── page.tsx # Home (listagem de caixas)
│ │
│ ├── case/[id]/
│ │ └── page.tsx # Abertura de caixa
│ │
│ ├── batalha/[id]/
│ │ └── page.tsx # Visualização de batalha
│ │
│ ├── batalhas/
│ │ └── page.tsx # Lista de batalhas
│ │
│ ├── battles/create/
│ │ └── page.tsx # Criar batalha
│ │
│ ├── upgrade/
│ │ └── page.tsx # Sistema de upgrade
│ │
│ ├── swap/
│ │ └── page.tsx # Sistema de swap
│ │
│ ├── perfil/
│ │ └── page.tsx # Perfil do usuário
│ │
│ ├── sorteios/
│ │ ├── page.tsx # Lista de sorteios
│ │ └── [id]/page.tsx # Detalhes do sorteio
│ │
│ ├── evento/
│ │ └── page.tsx # Battle Pass
│ │
│ ├── auth/callback/
│ │ └── page.tsx # Callback OAuth
│ │
│ ├── components/ # Componentes React
│ │ ├── Header.tsx # Cabeçalho
│ │ ├── Footer.tsx # Rodapé
│ │ ├── CaseCard.tsx # Card de caixa
│ │ ├── CaseRoulette.tsx # Roleta de caixa
│ │ ├── BattleRoulette.tsx # Roleta de batalha
│ │ ├── LiveDrops.tsx # Live drops
│ │ ├── AnimatedBalance.tsx # Saldo animado
│ │ ├── WinScreen.tsx # Tela de vitória
│ │ └── ui/ # Componentes UI genéricos
│ │ ├── Button.tsx
│ │ ├── Input.tsx
│ │ ├── Modal.tsx
│ │ └── Tooltip.tsx
│ │
│ ├── lib/ # Utilitários
│ │ ├── api.ts # Cliente API
│ │ ├── auth-context.tsx # Contexto de autenticação
│ │ ├── websocket-context.tsx # Contexto WebSocket
│ │ ├── toast-context.tsx # Contexto de toasts
│ │ ├── use-user-balance.tsx # Hook de saldo
│ │ ├── use-battle-socket.tsx # Hook de batalha
│ │ └── use-live-drops.tsx # Hook de live drops
│ │
│ └── globals.css # Estilos globais
│
├── public/ # Assets estáticos
│ ├── cases/ # Imagens de caixas
│ ├── items/ # Imagens de itens
│ └── icons/ # Ícones
│
├── tailwind.config.ts # Config Tailwind
├── next.config.js # Config Next.js
└── package.jsonAdmin Dashboard (next-shadcn-admin-dashboard/)
next-shadcn-admin-dashboard/
├── src/
│ ├── app/ # App Router (Next.js 16)
│ │ ├── layout.tsx # Layout raiz
│ │ │
│ │ └── (main)/
│ │ ├── login/ # Login do admin
│ │ ├── auth/callback/ # Callback OAuth
│ │ ├── unauthorized/ # Acesso negado
│ │ │
│ │ └── dashboard/ # Área protegida
│ │ ├── layout.tsx # Layout do dashboard
│ │ ├── page.tsx # Home (KPIs)
│ │ │
│ │ ├── users/ # Gestão de usuários
│ │ │ ├── page.tsx
│ │ │ └── [id]/page.tsx
│ │ │
│ │ ├── cases/ # Gestão de caixas
│ │ │ └── page.tsx
│ │ │
│ │ ├── items/ # Gestão de itens
│ │ │ └── page.tsx
│ │ │
│ │ ├── battles/ # Gestão de batalhas
│ │ │ └── page.tsx
│ │ │
│ │ ├── deposits/ # Gestão de depósitos
│ │ │ └── page.tsx
│ │ │
│ │ ├── withdrawals/ # Gestão de saques
│ │ │ └── page.tsx
│ │ │
│ │ └── transactions/ # Histórico
│ │ └── page.tsx
│ │
│ ├── components/
│ │ ├── ui/ # shadcn/ui components
│ │ │ ├── button.tsx
│ │ │ ├── card.tsx
│ │ │ ├── table.tsx
│ │ │ ├── dialog.tsx
│ │ │ └── ... (50+ componentes)
│ │ │
│ │ └── data-table/ # Tabela de dados avançada
│ │ ├── data-table.tsx
│ │ ├── columns.tsx
│ │ └── pagination.tsx
│ │
│ ├── hooks/
│ │ └── use-admin-api.ts # Hooks React Query
│ │
│ ├── lib/
│ │ ├── api.ts # Cliente API
│ │ └── utils.ts # Utilitários
│ │
│ ├── contexts/
│ │ └── auth-context.tsx # Autenticação admin
│ │
│ └── stores/
│ └── preferences/ # Preferências (tema, layout)
│
└── package.jsonBanco de Dados (prisma/)
prisma/
├── schema.prisma # Schema completo
├── migrations/ # Migrações versionadas
│ ├── 20240101_init/
│ │ └── migration.sql
│ ├── 20240115_add_battles/
│ │ └── migration.sql
│ └── ...
└── seed.ts # Seed de dados iniciaisDocker (docker/)
docker/
├── api/ # Docker para API
│ ├── Dockerfile
│ └── nginx/
│ └── nginx.conf
│
├── infra/ # Infraestrutura local (dev)
│ ├── docker-compose.yml
│ ├── postgres/
│ │ └── init.sql
│ ├── redis/
│ │ └── redis.conf
│ ├── prometheus/
│ │ └── prometheus.yml
│ └── grafana/
│ └── dashboards/
│
└── production/ # Configurações de produção
├── server1-infra/ # Servidor de infra
│ ├── docker-compose.yml
│ ├── nginx/
│ ├── ssl/
│ └── systemd/
│
└── server2-api/ # Servidor de API
├── docker-compose.yml
├── nginx/
└── pm2/Testes (test/)
test/
├── unit/ # Testes unitários
│ ├── application/
│ │ └── use-cases/
│ │ ├── open-case.use-case.spec.ts
│ │ └── create-battle.use-case.spec.ts
│ │
│ └── infrastructure/
│ └── services/
│ ├── provably-fair.service.spec.ts
│ └── transaction.service.spec.ts
│
├── integration/ # Testes de integração
│ └── api/
│ ├── auth.spec.ts
│ ├── cases.spec.ts
│ └── battles.spec.ts
│
├── e2e/ # Testes end-to-end
│ └── case-opening.e2e.spec.ts
│
└── __mocks__/ # Mocks compartilhados
├── prisma.mock.ts
└── redis.mock.tsConvenções de Nomenclatura
| Tipo | Convenção | Exemplo |
|---|---|---|
| Entidades | PascalCase, singular | User, CaseOpening |
| Repositórios Interface | I + Nome + Repository | IUserRepository |
| Repositórios Impl | Nome + Repository | UserRepository |
| Use Cases | Verbo + Substantivo + UseCase | OpenCaseUseCase |
| DTOs | Nome + Dto | CreateBattleDto |
| Controllers | Nome + Controller | BattleController |
| Services | Nome + Service | TransactionService |
| Guards | Nome + Guard | AuthGuard |
| Módulos | Nome + Module | BattleModule |
| Arquivos | kebab-case | open-case.use-case.ts |
