pr-daaif
2ffdd13cf4
feat(r3.2): bibliothèque de documents (FileStorage réel) + analytics
...
- FileStorage : putObject/getObjectStream/removeObject, bucket créé au
démarrage — MinIO confiné à son implémentation (règle ESLint intacte)
- documents : upload multipart (PDF/JPG/PNG, 20 Mo max, rattachement
appareil OU OT requis, permission d'édition sur la CIBLE), liste
filtrable, téléchargement STREAMÉ par l'API (MinIO jamais exposé),
suppression ; e2e : octets téléchargés identiques aux octets envoyés
- analytics : GET /analytics/summary dérivé du réel — coûts/mois
(mouvements + main-d'œuvre figés), pannes par organe (bilans codés),
taux de préventif, durée moyenne de résolution, top équipements
- générateur OpenAPI : query params, multipart, réponse binaire (71 ops)
- CI : service MinIO (bitnami) sur les jobs api et e2e
- test de régression du tri « Interventions récentes » rendu déterministe
(positions absolues instables sous 12 suites parallèles) ; 58 tests,
6 runs complets consécutifs verts
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 21:24:04 +01:00
pr-daaif
50254daea4
feat(r2.4): portail public QR — signalement sans compte, suivi par jeton
...
- 3 routes publiques /portal (les seules @Public métier), throttlées
(@nestjs/throttler : 10 signalements/min, 60 lectures/min) : résolution
du QR, signalement (retourne un jeton de suivi opaque), suivi par
référence + jeton — pas de jeton, pas de lecture, jamais de liste
- migration r2_portail : Request.publicToken (unique)
- page /q/{réf} fidèle à l'écran 6 validé R0 (mobile d'abord) : équipement
prérempli « détecté par le QR », interrupteur personne bloquée,
suivi sans jargon Reçu → Intervention → Résolu (dérivé de l'OT lié),
rejet affiché « Sans suite : {motif} », photo annoncée (upload R3) ;
signalements gardés sur le téléphone (localStorage, 10 max)
- e2e : LA boucle produit — gardien sans compte → traitement → ✓ Résolu ;
11 tests Playwright verts, 50 tests API, 52 opérations au contrat
- générateur OpenAPI : paramètres non-« id » plus typés uuid
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 17:33:10 +01:00
pr-daaif
266ffaaf1b
feat(r1.1): socle backend du référentiel — modèle, contrat, API, seed, tests
...
- migration r1_referentiel : Category (EQUIPMENT/COMPONENT_TYPE), Location
(site → zone, lat/lng + colonne PostGIS générée geography(Point,4326)
+ index GIST), Asset (statut d'équipement), AssetComponent (organe sans
emplacement PAR CONSTRUCTION), Team, invitation sur User ; migration
autosuffisante (CREATE EXTENSION IF NOT EXISTS postgis)
- contrat : 21 nouvelles opérations (26 total), générateur OpenAPI étendu
aux paramètres de chemin ; spec + client web régénérés dans ce commit
- API : modules categories/locations/assets/teams + gestion des personnes
(liste, rôles, invitation lien 7 j à usage unique, activation publique
qui connecte directement, mise à jour rôle/équipes) — tout sous
@RequirePermission ; invariants en service (profondeur 2, kinds,
catégorie jamais supprimée)
- seed : parc de la maquette validée (5 sites + 8 zones, 8 appareils,
organes A1/B2, 9 catégories, 2 équipes) — idempotent
- 36 tests verts (couverture 96 % stmts / 85 % branches) : recette
site→zone→appareil→organes, matrice vivante, invitation→activation ;
smoke test sur build de prod
- CI : postgres → postgis/postgis:18-3.6 (la migration R1 l'exige)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 12:27:48 +01:00
pr-daaif
8adb561b63
feat(r0.10): apps/api — auth fermée par défaut, matrice en base, démo-login ADR-002, seed
...
- packages/shared : rôles/catégories, schémas Zod, contrat d'API ;
pnpm contract → docs/openapi.json committée (règle d'or ADR-001)
- apps/api : NestJS 11 + Prisma 6, migration r0_identity (Role/Permission/User) ;
guard JWT global + @Public() ; PermissionsGuard (@RequirePermission,
matrice relue en base, cache 60 s) ; FileStorage (seul import MinIO) ; /health
- démo-login ADR-002 : module conditionnel DEMO_MODE (404 sinon, testé e2e),
double verrou production, refus des comptes isDemo=false
- seed idempotent : 7 rôles, matrice complète (70 lignes), 7 comptes démo
- 19 tests Jest (unit + e2e) ; smoke test sur build de prod
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-15 21:55:04 +01:00