# 🔧 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
   ```
