Files
midas/docs/ARQUITETURA-TECNICA.md

408 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MIDAS — Arquitetura Técnica
## App de Educação Financeira para Apostadores | PWA
---
## 1. Stack
| Camada | Tecnologia |
|--------|-----------|
| Frontend | Next.js 14 (PWA) + TailwindCSS |
| Backend | FastAPI (Python 3.12) |
| Banco | PostgreSQL 16 + Redis 7 |
| IA | GPT-4o-mini (análise de padrões) |
| Auth | JWT + bcrypt |
| Deploy | DigitalOcean (jarvis-do) |
| Pagamento | Stripe |
---
## 2. Estrutura
```
midas/
├── backend/
│ ├── app/
│ │ ├── main.py
│ │ ├── config.py
│ │ ├── database.py
│ │ ├── models/
│ │ │ ├── user.py # Usuário + plano
│ │ │ ├── bet.py # Apostas registradas
│ │ │ ├── bankroll.py # Banca + limites
│ │ │ ├── alert.py # Alertas de risco
│ │ │ ├── achievement.py # Badges/conquistas
│ │ │ └── lesson.py # Conteúdo educativo
│ │ ├── routers/
│ │ │ ├── auth.py # Login/registro
│ │ │ ├── bets.py # CRUD apostas
│ │ │ ├── bankroll.py # Gestão de banca
│ │ │ ├── dashboard.py # Dashboard principal
│ │ │ ├── alerts.py # Alertas IA
│ │ │ ├── achievements.py # Gamificação
│ │ │ ├── lessons.py # Educação
│ │ │ ├── reports.py # Relatórios
│ │ │ └── billing.py # Stripe
│ │ ├── services/
│ │ │ ├── analyzer.py # IA análise de padrões
│ │ │ ├── risk_engine.py # Motor de risco (semáforo)
│ │ │ ├── bankroll_calc.py # Calculadora de banca
│ │ │ ├── gamification.py # Engine de badges
│ │ │ └── insights.py # Geração de insights IA
│ │ └── utils/
│ │ ├── auth.py
│ │ └── rate_limit.py
│ ├── requirements.txt
│ └── seed_data.py
├── frontend/ # Next.js 14 PWA
│ ├── src/app/
│ │ ├── page.tsx # Landing
│ │ ├── login/
│ │ ├── register/
│ │ ├── dashboard/ # Dashboard principal
│ │ ├── bets/ # Registrar/listar apostas
│ │ ├── bankroll/ # Gestão de banca
│ │ ├── alerts/ # Alertas de risco
│ │ ├── achievements/ # Badges e ranking
│ │ ├── lessons/ # Mini-cursos
│ │ ├── reports/ # Relatórios mensais
│ │ └── premium/
│ └── src/components/
│ ├── Navbar.tsx
│ ├── RiskSemaphore.tsx # 🟢🟡🔴
│ ├── BankrollGauge.tsx # Gauge de banca
│ ├── BetCard.tsx
│ ├── AchievementBadge.tsx
│ ├── InsightCard.tsx
│ └── StatsChart.tsx
└── docs/
```
---
## 3. Modelo de Dados
```sql
-- Usuários
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
name VARCHAR(100),
plan VARCHAR(20) DEFAULT 'free',
streak_days INT DEFAULT 0,
total_points INT DEFAULT 0,
risk_level VARCHAR(10) DEFAULT 'green',
stripe_customer_id VARCHAR(100),
created_at TIMESTAMP DEFAULT NOW()
);
-- Banca (bankroll)
CREATE TABLE bankrolls (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
monthly_budget DECIMAL(10,2) NOT NULL,
weekly_limit DECIMAL(10,2),
daily_limit DECIMAL(10,2),
bet_max_pct DECIMAL(5,2) DEFAULT 5.0,
current_balance DECIMAL(10,2) DEFAULT 0,
month_spent DECIMAL(10,2) DEFAULT 0,
week_spent DECIMAL(10,2) DEFAULT 0,
day_spent DECIMAL(10,2) DEFAULT 0,
reset_day INT DEFAULT 1,
created_at TIMESTAMP DEFAULT NOW()
);
-- Apostas registradas
CREATE TABLE bets (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
sport VARCHAR(50),
event_name VARCHAR(255),
platform VARCHAR(100),
amount DECIMAL(10,2) NOT NULL,
odds DECIMAL(8,3),
result VARCHAR(10),
profit DECIMAL(10,2),
bet_type VARCHAR(50),
is_impulsive BOOLEAN DEFAULT FALSE,
emotion VARCHAR(50),
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_bets_user ON bets(user_id, created_at DESC);
-- Alertas
CREATE TABLE alerts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
type VARCHAR(50) NOT NULL,
severity VARCHAR(10) NOT NULL,
message TEXT NOT NULL,
ai_analysis TEXT,
is_read BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
-- Conquistas
CREATE TABLE achievements (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(100) NOT NULL,
description TEXT,
icon VARCHAR(10),
category VARCHAR(50),
requirement_type VARCHAR(50),
requirement_value INT,
points INT DEFAULT 10
);
CREATE TABLE user_achievements (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
achievement_id UUID REFERENCES achievements(id),
unlocked_at TIMESTAMP DEFAULT NOW()
);
-- Lições
CREATE TABLE lessons (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
category VARCHAR(50),
difficulty VARCHAR(20),
duration_min INT DEFAULT 5,
order_num INT,
is_premium BOOLEAN DEFAULT FALSE
);
CREATE TABLE user_lessons (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
lesson_id UUID REFERENCES lessons(id),
completed_at TIMESTAMP DEFAULT NOW()
);
```
---
## 4. Fluxo Principal
```
📱 Usuário abre o MIDAS
📊 Dashboard mostra:
├─ Semáforo de risco: 🟢 Verde / 🟡 Amarelo / 🔴 Vermelho
├─ Banca restante: R$280 / R$500 (gauge visual)
├─ Streak: 🔥 5 dias sem aposta impulsiva
├─ Últimas apostas com resultado
└─ Insights IA: "Você perde 73% mais em jogos noturnos"
Registrar aposta:
├─ Esporte, evento, plataforma, valor, odds
├─ "Como você está se sentindo?" (😎😤😰🤑)
├─ Checklist pré-aposta: ✅ Dentro do limite? ✅ Analisou? ✅ Não é recuperação?
└─ Se valor > limite → alerta + confirmação extra
🧠 IA analisa padrão:
├─ Horário (madrugada = risco)
├─ Sequência (3+ perdas seguidas = alerta)
├─ Valor crescente (escalonamento = vício)
├─ Emoção (apostando com raiva/frustração)
└─ Frequência (todo dia = dependência)
🚨 Se risco detectado → Alerta:
├─ Push notification
├─ Mensagem educativa
├─ Sugestão de pausa
└─ Link para ajuda profissional (CVV, GREA-USP)
🏆 Gamificação:
├─ Badge: "Disciplina de Ferro" (7 dias sem impulsiva)
├─ Badge: "Analista" (completou 5 lições)
├─ Ranking semanal de disciplina
└─ Pontos → desbloqueia conteúdo premium
```
---
## 5. API Endpoints
### Auth
```
POST /api/auth/register
POST /api/auth/login
GET /api/auth/me
```
### Dashboard
```
GET /api/dashboard # Dados principais (banca, risco, streak, insights)
```
### Apostas
```
POST /api/bets # Registrar aposta
GET /api/bets # Listar apostas
GET /api/bets/stats # Estatísticas (win rate, ROI, por esporte)
PATCH /api/bets/:id/result # Registrar resultado (win/loss)
```
### Banca
```
GET /api/bankroll # Status da banca
PUT /api/bankroll # Configurar limites
GET /api/bankroll/check # Verificar se aposta está dentro do limite
```
### Alertas
```
GET /api/alerts # Listar alertas
PATCH /api/alerts/:id/read # Marcar como lido
```
### Gamificação
```
GET /api/achievements # Todas as conquistas
GET /api/achievements/mine # Minhas conquistas
GET /api/leaderboard # Ranking
```
### Educação
```
GET /api/lessons # Listar lições
GET /api/lessons/:id # Conteúdo da lição
POST /api/lessons/:id/complete # Marcar como concluída
```
### Relatórios
```
GET /api/reports/weekly # Relatório semanal
GET /api/reports/monthly # Relatório mensal
```
---
## 6. Motor de Risco (IA)
### Semáforo
```
🟢 VERDE — Apostando dentro dos limites, padrão saudável
🟡 AMARELO — 1-2 sinais de alerta detectados
🔴 VERMELHO — Padrão de risco/vício identificado
```
### Sinais de Alerta (pesos)
| Sinal | Peso | Descrição |
|-------|------|-----------|
| Horário noturno (23h-5h) | 15 | Apostas de madrugada |
| Valor crescente | 25 | Cada aposta maior que a anterior |
| Recuperação | 30 | Apostar logo após perda pra "recuperar" |
| Frequência alta | 20 | +3 apostas/dia |
| Limite estourado | 25 | Passou do orçamento definido |
| Emoção negativa | 15 | Apostando com raiva/frustração |
| Sequência de perdas | 20 | 3+ perdas seguidas sem parar |
**Score**: soma dos pesos → 0-30 verde, 31-60 amarelo, 61+ vermelho
### Prompt IA (insights)
```python
INSIGHT_PROMPT = """
Analise o histórico de apostas deste usuário e gere insights.
DADOS:
- Total apostado mês: R${total_month}
- Win rate: {win_rate}%
- Esportes: {sports}
- Horários mais comuns: {hours}
- Padrão de valores: {amounts}
- Sequências de perda: {loss_streaks}
- Emoções registradas: {emotions}
Gere 3 insights em JSON:
[
{"icon": "💡", "title": "título curto", "text": "insight prático em 1 frase"},
]
Seja direto, honesto e educativo. Português BR.
"""
```
---
## 7. Gamificação — Badges
| Badge | Requisito | Pontos |
|-------|-----------|--------|
| 🌱 Primeiro Passo | Registrar primeira aposta | 10 |
| 📚 Estudante | Completar 3 lições | 20 |
| 🎯 Disciplinado | 7 dias dentro do limite | 50 |
| 🔥 Streak de Ferro | 30 dias sem aposta impulsiva | 100 |
| 🧠 Analista | Registrar 50 apostas com análise | 30 |
| 🛡️ Autocontrole | Cancelar aposta após alerta | 40 |
| 📊 Consciente | Ver relatório mensal 3x | 15 |
| 👑 Mestre da Banca | ROI positivo por 3 meses | 200 |
---
## 8. Design System
### Paleta
- **Dourado:** #D4A843 (premium, dinheiro, Midas)
- **Azul escuro:** #0F172A (confiança, seriedade)
- **Verde:** #10B981 (seguro, aprovado)
- **Amarelo:** #FBBF24 (atenção)
- **Vermelho:** #EF4444 (perigo, stop)
- **Branco:** #F8FAFC
### Identidade
- Logo: Coroa dourada + "MIDAS"
- Slogan: "Aposte com consciência"
- Font: Inter (body) + Cabinet Grotesk (display)
- Mobile-first, PWA instalável
- Dark mode como padrão
---
## 9. Portas & Deploy
| Serviço | Porta | PM2 Name |
|---------|-------|----------|
| Backend FastAPI | 8095 | midas-backend |
| Frontend Next.js | 3085 | midas-frontend |
- **URL**: midas.aivertice.com
- **DB**: PostgreSQL `midas` / user `midas`
- **Deploy**: jarvis-do (198.199.84.130)
---
## 10. Roadmap
### MVP — Semanas 1-2
- [ ] Auth (registro/login)
- [ ] Dashboard com semáforo de risco
- [ ] Registrar apostas manualmente
- [ ] Gestão de banca (definir limites)
- [ ] Alertas básicos (limite estourado, frequência alta)
- [ ] 5 lições educativas
- [ ] 5 badges iniciais
- [ ] PWA instalável
- [ ] Deploy DigitalOcean
### v1.0 — Semanas 3-4
- [ ] IA insights (GPT-4o-mini)
- [ ] Relatórios semanais/mensais
- [ ] Mais badges e ranking
- [ ] Stripe (assinatura premium)
- [ ] Push notifications
### v2.0 — Semanas 5-8
- [ ] Integração com casas de aposta (API)
- [ ] Compartilhar relatório (stories)
- [ ] Desafios semanais
- [ ] White-label B2B
- [ ] App nativo React Native
---
*Arquitetura JARVIS — 10/02/2026*