# 🔧 Admin API - Gerenciamento de Planos Este diretório contém ferramentas para gerenciar os planos do Stripe no MongoDB via API local. ## 🔒 Segurança **IMPORTANTE**: O endpoint `/api/Admin/*` **só funciona quando acessado de localhost** (127.0.0.1). Qualquer acesso externo retornará `403 Forbidden`. --- ## 📋 Arquivos - **`plans.json`** - Configuração dos planos com Price IDs do Stripe - **`update-plans.sh`** - Script bash para atualizar planos via curl - **`seed-mongodb-plans.js`** - Script MongoDB direto (método alternativo) --- ## 🚀 Método 1: API Endpoint (Recomendado) ### Vantagens - ✅ Não precisa de credenciais do MongoDB - ✅ Validação automática - ✅ Logs no sistema - ✅ Funciona com app rodando ### Como Usar #### 1️⃣ Edite o `plans.json` com seus Price IDs ```json { "pricesByCountry": { "BR": { "stripePriceId": "price_SEU_ID_AQUI" } } } ``` #### 2️⃣ Inicie a aplicação ```bash dotnet run # ou dotnet watch run ``` #### 3️⃣ Execute o script de atualização ```bash # Linux/Mac/WSL cd Scripts ./update-plans.sh # Especificar porta diferente ./update-plans.sh 5000 ``` #### 4️⃣ Ou use curl diretamente ```bash # Atualizar planos curl -k -X POST \ -H "Content-Type: application/json" \ -d @Scripts/plans.json \ https://localhost:52428/api/Admin/SeedPlans # Listar planos curl -k https://localhost:52428/api/Admin/Plans # Deletar todos os planos curl -k -X DELETE https://localhost:52428/api/Admin/Plans ``` --- ## 🗄️ Método 2: Script MongoDB Direto ### Vantagens - ✅ Funciona sem a app rodando - ✅ Acesso direto ao MongoDB ### Desvantagens - ❌ Precisa de credenciais do MongoDB - ❌ Sem validação automática ### Como Usar ```bash # Localhost mongosh "mongodb://localhost:27017/QrRapido" < Scripts/seed-mongodb-plans.js # Produção mongosh "mongodb://user:pass@host:27017/QrRapido?replicaSet=rs0&authSource=admin" < Scripts/seed-mongodb-plans.js ``` --- ## 📝 Endpoints Disponíveis ### POST `/api/Admin/SeedPlans` Cria ou atualiza planos no MongoDB **Request Body:** ```json [ { "interval": "month", "stripePriceId": "price_...", "pricesByCountry": { ... } } ] ``` **Response:** ```json { "success": true, "message": "2 plans seeded successfully", "plans": [ ... ] } ``` --- ### GET `/api/Admin/Plans` Lista todos os planos do MongoDB **Response:** ```json { "success": true, "count": 2, "plans": [ ... ] } ``` --- ### DELETE `/api/Admin/Plans` Remove todos os planos do MongoDB **Response:** ```json { "success": true, "deletedCount": 2 } ``` --- ## 🛡️ Proteção de Segurança O código verifica o IP de origem: ```csharp var remoteIp = HttpContext.Connection.RemoteIpAddress; var isLocalhost = remoteIp != null && (remoteIp.ToString() == "127.0.0.1" || remoteIp.ToString() == "::1" || remoteIp.ToString() == "localhost"); if (!isLocalhost) { return Forbid("This endpoint is only accessible from localhost"); } ``` **Tentativas de acesso externo são logadas:** ``` [Warning] Unauthorized admin access attempt from 192.168.1.100 ``` --- ## 🧪 Testando ```bash # 1. Listar planos atuais curl -k https://localhost:52428/api/Admin/Plans | jq '.' # 2. Deletar planos curl -k -X DELETE https://localhost:52428/api/Admin/Plans # 3. Criar novos planos curl -k -X POST \ -H "Content-Type: application/json" \ -d @Scripts/plans.json \ https://localhost:52428/api/Admin/SeedPlans | jq '.' # 4. Verificar se foram criados curl -k https://localhost:52428/api/Admin/Plans | jq '.plans[] | {interval, priceIds: .pricesByCountry}' ``` --- ## ⚠️ Troubleshooting ### Erro: "Connection refused" - ✅ Certifique-se que a app está rodando: `dotnet run` ### Erro: "Forbidden" mesmo em localhost - ✅ Verifique se está usando `https://localhost` (não `http://`) - ✅ Verifique se está usando `localhost` ou `127.0.0.1` (não o IP da máquina) ### Erro: "SSL certificate problem" - ✅ Use o flag `-k` no curl para aceitar certificados auto-assinados --- ## 📊 Estrutura do plans.json ```json [ { "name": { "pt-BR": "Nome em português", "es-PY": "Nombre en español", "en": "Name in english" }, "description": { ... }, "features": { ... }, "interval": "month" ou "year", "stripePriceId": "price_default", "pricesByCountry": { "BR": { "amount": 9.90, "currency": "BRL", "stripePriceId": "price_BR_ID" }, "PY": { "amount": 35000, "currency": "PYG", "stripePriceId": "price_PY_ID" } }, "isActive": true, "displayOrder": 1, "badge": { ... } // Opcional } ] ``` --- ## 🎯 Fluxo Recomendado 1. **Desenvolvimento (localhost)**: ```bash # Editar plans.json com Price IDs de teste ./update-plans.sh ``` 2. **Staging**: ```bash # SSH no servidor staging ssh user@staging-server cd /app/qrrapido ./Scripts/update-plans.sh 5000 ``` 3. **Produção**: ```bash # Opção 1: Via API (se tiver acesso SSH) ssh user@prod-server cd /app/qrrapido ./Scripts/update-plans.sh 5001 # Opção 2: Via MongoDB direto mongosh "connection_string" < Scripts/seed-mongodb-plans.js ```