85 lines
2.2 KiB
Markdown
85 lines
2.2 KiB
Markdown
# 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. |