# Arquitetura Backend + Traefik - Aggios

## 📋 Estrutura do Projeto

```
backend/
├── cmd/server/
│   └── main.go              # Entry point da aplicação
├── internal/
│   ├── api/
│   │   ├── handlers/        # Handlers HTTP
│   │   ├── middleware/      # Middlewares (JWT, CORS, etc)
│   │   └── routes.go        # Definição das rotas
│   ├── auth/               # Lógica de autenticação (JWT, OAuth2)
│   ├── config/             # Configuração da aplicação
│   ├── database/           # Conexão e migrations do DB
│   ├── models/             # Estruturas de dados
│   ├── services/           # Lógica de negócio
│   └── storage/            # Redis e MinIO
├── migrations/             # SQL migrations
├── go.mod
├── go.sum
├── Dockerfile
└── .env.example
```

## 🔐 Segurança & Autenticação

### JWT (JSON Web Tokens)
- **Access Token**: 24 horas de expiração
- **Refresh Token**: 7 dias de expiração
- **Algoritmo**: HS256
- **Payload**: `user_id`, `email`, `tenant_id`

### Password Security
- Hash com Argon2 (mais seguro que bcrypt)
- Salt aleatório por senha
- Pepper no servidor (JWT_SECRET)

### Multi-Tenant
- Isolamento por `tenant_id` no JWT
- Validação de tenant em cada requisição
- Subdomain routing automático via Traefik

## 🔄 Fluxo de Autenticação

```
1. POST /api/auth/login
   └── Validar email/password
   └── Gerar Access Token (24h) + Refresh Token (7d)
   └── Salvar hash do refresh token no Redis/DB

2. API Requests
   └── Header: Authorization: Bearer {access_token}
   └── Middleware JWT valida token
   └── user_id e tenant_id adicionados ao contexto

3. Token Expirado
   └── POST /api/auth/refresh com refresh_token
   └── Novo access token gerado
   └── Refresh token pode rotacionar (opcional)

4. Logout
   └── POST /api/logout
   └── Invalidar refresh token no Redis
   └── Client descarta access token
```

## 🌍 Multi-Tenant com Traefik

### Routing automático:
- `api.aggios.app` → Backend geral
- `{subdomain}.aggios.app` → Tenant específico (ex: acme.aggios.app)
- Traefik resolve hostname → passa para backend
- Backend extrai `tenant_id` do JWT

### Exemplo:
```
Cliente acme.aggios.app → Traefik
                         ↓
                    Extrai subdomain: "acme"
                    ↓
                Backend recebe request com tenant_id
                JWT validado para tenant "acme"
                ↓
                Acesso apenas aos dados do "acme"
```

## 📦 Serviços Docker

### PostgreSQL 16
- Multi-tenant database
- Conexão: `postgres:5432`
- Migrations automáticas no startup

### Redis 7
- Cache de sessões
- Invalidação de refresh tokens
- Conexão: `redis:6379`

### MinIO
- S3-compatible storage
- Para uploads (agências, documentos, etc)
- Console: `http://minio-console.localhost`
- API: `http://minio.localhost`

### Traefik
- Reverse proxy com auto-discovery Docker
- SSL/TLS com Let's Encrypt
- Dashboard: `http://traefik.localhost`
- Suporta wildcard subdomains

## 🚀 Inicialização

```bash
# 1. Copiar .env
cp .env.example .env

# 2. Editar .env com valores seguros
nano .env

# 3. Build e start
docker-compose up -d

# 4. Logs
docker-compose logs -f backend

# 5. Testar health
curl http://localhost:8080/api/health
```

## 📱 API Mobile-Ready

A API está preparada para:
- ✅ REST com JSON
- ✅ CORS habilitado
- ✅ JWT stateless (não precisa cookies)
- ✅ Versionamento de API (`/api/v1/*`)
- ✅ Rate limiting
- ✅ Error handling padronizado

### Exemplo Android/iOS:
```javascript
// Login
POST /api/auth/login
{
  "email": "user@example.com",
  "password": "senha123"
}

// Response
{
  "access_token": "eyJ...",
  "refresh_token": "xxx...",
  "token_type": "Bearer",
  "expires_in": 86400
}

// Request autenticado
GET /api/users/me
Authorization: Bearer eyJ...
```

## 🔍 Próximos Passos

1. Implementar Argon2 para hashing de senhas
2. Adicionar OAuth2 (Google, GitHub)
3. Rate limiting por IP/tenant
4. Audit logging
5. Metrics (Prometheus)
6. Health checks avançados
7. Graceful shutdown
8. Request validation middleware
9. API documentation (Swagger)
10. Tests (unit + integration)

## 🛡️ Production Checklist

- [ ] Mudar JWT_SECRET
- [ ] Configurar HTTPS real (Let's Encrypt)
- [ ] Habilitar SSL no PostgreSQL
- [ ] Configurar backups automatizados
- [ ] Monitoramento (Sentry, DataDog)
- [ ] Logging centralizado
- [ ] Rate limiting agressivo
- [ ] WAF (Web Application Firewall)
- [ ] Secrets em vault (HashiCorp Vault)
- [ ] CORS restritivo
