81 lines
2.0 KiB
Markdown
81 lines
2.0 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)
|
||
|
|
- **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.
|