VerifactuMidAPI/documentacion/arqui.md

85 lines
2.2 KiB
Markdown
Raw Normal View History

# Arquitectura
## Visión General
```
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ Cliente │────▶│ API REST │────▶│ AEAT │
│ (App) │ │ (this) │ │ VeriFactu │
└─────────────┘ └──────────────┘ └─────────────┘
```
## Capas
### 1. API Layer (`api/`)
- **handler.go**: Handlers HTTP para endpoints
- **router.go**: Registro de rutas
### 2. Business Logic (`internal/`)
- **factura.go**: Servicio de facturas (alta, anulación)
- **formats/**: Sistema de formatos de entrada con detección automática
- **registry.go**: Registro y auto-detección de formatos
- **native/**: Formato nativo de la API
- **dolibarr/**: Formato compatible con Dolibarr BFF
- **transformer.go**: Transformación JSON → datos de factura
- **hash.go**: Cálculo de hash encadenado
- **models.go**: Modelos y validación de entrada
- **config/**: Carga de configuración
- **cert/**: Gestión de certificados
- **crypto/**: Criptografía RSA
### 3. External Communication (`verifactu/`)
- **client.go**: Cliente SOAP para AEAT
- **soap.go**: Construcción de mensajes SOAP
- **xml.go**: Generación XML VeriFactu
## Flujo de Datos
```
Request HTTP
JSON Input
TransformAuto() ──▶ Detecta formato (native, dolibarr, ...)
Transformer.Transform() ──▶ TransformResult
CalculateHash(prevHash)
BuildSOAPRequest()
SendToAEAT()
Response
```
## Cifrado de Contraseñas
El cliente envía la contraseña del certificado cifrada con la clave pública RSA de la API:
```
1. GET /api/v1/auth/public-key → Obtener clave pública
2. RSA encrypt(password) → Cifrar contraseña
3. POST /api/v1/auth/register → Registrar cert con password cifrada
```
## Tokens
Al registrar un certificado se genera un token que identifica la sesión:
```json
{
"success": true,
"cert": {...},
"token": "A1B2C3D4E5F6..."
}
```
Este token se usa en requests de facturas para identificar el certificado a usar.