# 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*