2.2 KiB
2.2 KiB
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:
{
"success": true,
"cert": {...},
"token": "A1B2C3D4E5F6..."
}
Este token se usa en requests de facturas para identificar el certificado a usar.