# 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) - **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 │ ▼ ValidateInput() ──▶ ValidationError[] │ ▼ TransformToInvoiceData() │ ▼ 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.