Backend
Rust, 55 archivos, 22 144 líneas, 166 tests. cargo clippy corre con
-D warnings: ningún aviso pasa.
Autenticación
- Contraseñas con Argon2id. Bloqueo temporal por intentos fallidos — comprobado en la práctica: bloquea de verdad.
- Access token JWT HS256 de vida corta (30 min), en memoria en la web y en
expo-secure-storeen móvil. Nunca enlocalStorageniAsyncStorage. - Refresh token opaco y rotatorio: se guarda sólo su hash SHA-256. Cada refresco encadena el nuevo al anterior; si llega uno ya revocado se revoca toda la cadena, que es la forma estándar de detectar un token robado.
Autorización
La directiva @auth(requires: [...]) está declarada en el contrato y cada
campo anotado lleva su guarda en el servidor. Son 22 campos.
DataLoaders
Nueve, uno por agregado. Resolver ticket.customer en una lista de 50 tickets
es una consulta, no 50. Uno de ellos usa dos claves para que
ticket.warranty y asset.warranty compartan caché.
Tareas de fondo
Ver Tareas de fondo.
Subcomandos
crm-api # arranca el servidor
crm-api seed-demo [--reset] # datos de demostración coherentes
crm-api export-schema [ruta] # el SDL que emite async-graphql
crm-api run-jobs # una pasada del barrido, sin esperar
crm-api set-password <correo> <clave>
Integraciones
Ver Mensajería y chatbot y ADR-08 El sistema funciona sin credenciales de Meta.