Intégrations
Le backend s’intègre à plusieurs systèmes externes ou transverses, mais Redis n’est volontairement utilisé qu’au-dessus de la frontière base de données (révocation de jetons, throttling, files). PostgreSQL reste la source de vérité unique.
src/redis/redis.module.ts fournit un jeton REDIS_CLIENT et une abstraction TokenStore.
export const REDIS_CLIENT = 'SIM_REDIS_CLIENT';
@Global()@Module({ providers: [ { provide: REDIS_CLIENT, useFactory: (config) => new Redis(REDIS_URL) || null }, { provide: TokenStore, useFactory: (_, client) => client ? new RedisTokenStore(client) : new InMemoryTokenStore() }, ], exports: [TokenStore, REDIS_CLIENT],})- En développement, l’absence de
REDIS_URLbascule surInMemoryTokenStore. - En production,
REDIS_URLest requise.
Magasin de jetons
Section intitulée « Magasin de jetons »- Clés :
sim:auth:jti:${jti}avec TTLEX. revokedéchoue en mode ouvert (fail open) en cas de panne Redis.- Utilisé par
JwtAuthGuardpour refuser les jetons d’accès révoqués.
Autres consommateurs Redis
Section intitulée « Autres consommateurs Redis »src/jobs/jobs.queue.ts—QueueBullMQsrc/jobs/jobs.worker.ts—WorkerBullMQsrc/health/indicators.ts— ping de santé Redis
S3 / MinIO
Section intitulée « S3 / MinIO »src/s3/s3.module.ts exporte un provider global S3_CLIENT.
export const S3_CLIENT = 'SIM_S3_CLIENT';
new S3Client({ endpoint: s3.endpoint, region: s3.region, forcePathStyle: true, // requis pour MinIO credentials: { accessKeyId, secretAccessKey },});Défauts locaux
Section intitulée « Défauts locaux »export const S3_DEFAULTS = { endpoint: 'http://127.0.0.1:9000', region: 'us-east-1', bucket: 'sim', accessKeyId: 'sim', secretAccessKey: 'sim-admin',};src/uploads/uploads.service.ts :
- valide la catégorie et le type MIME
- génère
<categorie>/<userId>-<uuid>.<ext> - crée le bucket automatiquement s’il manque
- retourne les octets de l’objet pour
GET /api/v1/uploads?key=... - valide
KEY_PATTERNavantGetObjectpour empêcher le path traversal
Les clés d’objet sont stockées dans PostgreSQL ; seule la clé, pas le contenu du fichier, vit dans la base.
src/mailer encapsule Resend. En développement, les emails sont loggés plutôt qu’envoyés car RESEND_API_KEY est vide par défaut. Les emails de réinitialisation de mot de passe sont le principal flux email visible par l’utilisateur.
PDF / Puppeteer
Section intitulée « PDF / Puppeteer »src/pdf fournit PdfService.render(html, filename) via Chromium headless. Le Dockerfile installe les bibliothèques Chrome et définit PUPPETEER_EXECUTABLE_PATH.
Services PDF par module :
src/residence/contrat-pdf.service.ts— bail français de 25 articlessrc/residence/echeance-pdf.service.ts— reçu de loyersrc/residence/paiement-pdf.service.ts— reçu de paiement résident génériquesrc/facturation/facture-pdf.service.ts— facture A4 + ticket 58/80mmsrc/rh/bulletin-pdf.service.ts— bulletin de paiesrc/rapports/rapports-pdf.service.ts— feuilles de rapportsrc/audit/audit-pdf.service.ts— rapport du journal d’auditsrc/dashboard/dashboard-pdf.service.ts— tuiles du tableau de bord
La génération de graphiques en SVG pur vit dans src/audit/audit-charts.ts.
Métriques Prometheus
Section intitulée « Métriques Prometheus »src/metrics expose GET /metrics comme endpoint de scrape public et non versionné.
MetricsMiddleware enregistre :
http_requests_total{method, route, status}http_request_duration_seconds{method, route, status}
Compteurs additionnels :
sim_jobs_total{job, outcome}sim_jobs_queue_depth{status}
Les métriques Node par défaut sont désactivées sous NODE_ENV=test.
Jobs BullMQ
Section intitulée « Jobs BullMQ »src/jobs/jobs.queue.ts ne crée une Queue bullmq que quand REDIS_URL est définie. src/jobs/jobs.worker.ts consomme sim-jobs avec concurrency: 1. Les jobs sont ajoutés avec attempts: 3 et un backoff fixe de 5 secondes.
La jointure de service dans src/jobs/jobs.service.ts encapsule chaque job avec un logging de métriques et relance les erreurs pour que les déclencheurs HTTP remontent les vrais échecs.
Contrôles de santé
Section intitulée « Contrôles de santé »src/health expose des routes publiques :
| Route | Rôle |
|---|---|
/api/v1/health/live |
Toujours { status: 'ok' } |
/api/v1/health/ready |
Disponibilité PostgreSQL + Redis |
/api/v1/health |
Agrégat |
PgHealthIndicator exécute select 1 sur l’instance Kysely réelle. RedisHealthIndicator pingue ioredis ou rapporte mode: 'in-memory' quand Redis est absent.
