diff --git a/apps/nginx-strangler/conf.d/routing.conf b/apps/nginx-strangler/conf.d/routing.conf index b481a38ee..792d4bbc9 100644 --- a/apps/nginx-strangler/conf.d/routing.conf +++ b/apps/nginx-strangler/conf.d/routing.conf @@ -70,7 +70,7 @@ server { proxy_set_header X-Forwarded-Proto $scheme; } - location ~ ^/api/v1/projects/[^/]+/deployments(.*)$ { + location /api/v1/projects { proxy_pass http://server-nestjs; proxy_http_version 1.1; proxy_set_header Host $host; diff --git a/apps/server-nestjs/documentation/Modularisation-de-console-server/MODULARISATION-CARTOGRAPHIE.md b/apps/server-nestjs/documentation/Modularisation-de-console-server/MODULARISATION-CARTOGRAPHIE.md index d9c306626..09e4ff781 100644 --- a/apps/server-nestjs/documentation/Modularisation-de-console-server/MODULARISATION-CARTOGRAPHIE.md +++ b/apps/server-nestjs/documentation/Modularisation-de-console-server/MODULARISATION-CARTOGRAPHIE.md @@ -1,6 +1,6 @@ # Cartographie des modules - Modularisation Backend -> Derniere mise a jour : **2026-06-16** (refonte Infrastructure/Auth/Permission) +> Derniere mise a jour : **2026-06-26** (synchronisation statut / cartographie) --- @@ -23,21 +23,21 @@ Cartographier l'ensemble des modules de l'application backend actuelle pour : | queries-index.ts | Supprime des le depart : chaque module NestJS possede ses propres queries Prisma | | Systeme d'evenements | `@nestjs/event-emitter` (remplacement progressif de `@cpn-console/hooks`) | | Plugins | Deviennent des modules NestJS (encapsulation puis reecriture progressive) | -| Module project | Decoupe en 3 sous-modules : ProjectCore, ProjectSecrets, ProjectBulk | +| Module project | Decoupe en 6 modules separes : Project, ProjectSecrets, ProjectServices, ProjectHooks, ProjectBulk, ProjectMembers, ProjectRoles | | Equipe dediee | 2 developpeurs en parallele | --- ## Vue synthetique -**75 routes metier** reparties en **18 modules metier** (dont project eclate en 3), -plus **5 couches transverses** et **7 plugins** a encapsuler. +**75 routes metier** reparties en **18 modules metier** (dont project eclate en 7), +plus **5 couches transverses** et **7 plugins** encapsules. ### Legende des statuts - FAIT : Deja implemente dans `server-nestjs` -- A CREER : N'existe pas encore - A MIGRER : Existe dans `server`, a migrer vers `server-nestjs` +- A CREER : N'existe pas encore dans la codebase --- @@ -184,31 +184,31 @@ Plus le score est eleve, plus le module est prioritaire. | 1 | vault (encapsulation) | Plugin | 8.5 | V3 | S7-S8 | ✅ MIGRE | | 2 | system (health/version) | Metier | 7.8 | V1 | S3 | ✅ MIGRE | | 3 | system/settings | Metier | 7.4 | V1 | S3 | ✅ MIGRE | -| 4 | system/config | Metier | 7.4 | V1 | S3-S4 | | +| 4 | system/config | Metier | 7.4 | V1 | S3-S4 | ✅ MIGRÉ (2026-06-26) | | 5 | keycloak (encapsulation) | Plugin | 7.4 | V3 | S8 | ✅ MIGRE | -| 6 | admin-token | Metier | 7.1 | V1 | S3-S4 | | -| 7 | user/tokens | Metier | 7.1 | V1 | S3-S4 | | +| 6 | admin-token | Metier | 7.1 | V1 | S3-S4 | ✅ MIGRÉ (2026-06-30) | +| 7 | user/tokens | Metier | 7.1 | V1 | S3-S4 | ✅ MIGRÉ (2026-06-30) | | 8 | gitlab (encapsulation) | Plugin | 6.7 | V4 | S9 | ✅ MIGRE | -| 9 | service-monitor | Metier | 6.6 | V2 | S5 | | -| 10 | user | Metier | 6.6 | V2 | S5 | | -| 11 | stage | Metier | 6.5 | V2 | S5-S6 | | -| 12 | log | Metier | 6.5 | V1 | S4 | | -| 13 | zone | Metier | 6.4 | V2 | S6 | | -| 14 | environment | Metier | 6.3 | V3 | S7 | | -| 15 | admin-role | Metier | 6.1 | V2 | S5 | | -| 16 | project-core | Metier | 5.8 | V4 | S9 | | -| 17 | service-chain | Metier | 5.9 | V3 | S8 | ✅ MIGRE | -| 18 | repository | Metier | 5.8 | V3 | S7-S8 | | -| 19 | cluster | Metier | 5.7 | V3 | S7 | | +| 9 | service-monitor | Metier | 6.6 | V2 | S5 | 📅 Planifié (non trouvé dans la codebase actuelle) | +| 10 | user | Metier | 6.6 | V2 | S5 | 📅 Planifié | +| 11 | stage | Metier | 6.5 | V2 | S5-S6 | 📅 Planifié | +| 12 | log | Metier | 6.5 | V1 | S4 | ✅ MIGRÉ (2026-06-16) | +| 13 | zone | Metier | 6.4 | V2 | S6 | 📅 Planifié | +| 14 | environment | Metier | 6.3 | V3 | S7 | 📅 Planifié | +| 15 | admin-role | Metier | 6.1 | V2 | S5 | 📅 Planifié | +| 16 | project-core | Metier | 5.8 | V4 | S9 | ✅ MIGRÉ (2026-05-28) | +| 17 | service-chain | Metier | 5.9 | V3 | S8 | ✅ MIGRÉ (2026-04-09) | +| 18 | repository | Metier | 5.8 | V3 | S7-S8 | 📅 Planifié | +| 19 | cluster | Metier | 5.7 | V3 | S7 | 📅 Planifié | | 20 | harbor (encapsulation) | Plugin | 5.6 | V4 | S9-S10 | ✅ MIGRE | -| 21 | project-service | Metier | 5.6 | V3 | S8 | | +| 21 | project-service | Metier | 5.6 | V3 | S8 | ✅ MIGRÉ (2026-06-13, module `services`) | | 22 | argocd (encapsulation) | Plugin | 5.3 | V5 | S10-S11 | ✅ MIGRE | -| 23 | project-role | Metier | 5.2 | V3 | S7-S8 | | +| 23 | project-role | Metier | 5.2 | V3 | S7-S8 | ✅ MIGRÉ (2026-06-13) | | 24 | nexus (encapsulation) | Plugin | 5.1 | V4 | S10 | ✅ MIGRE | -| 25 | project-member | Metier | 4.7 | V3 | S8 | | -| 26 | project-secrets | Metier | 4.6 | V4 | S9 | | -| 27 | project-bulk | Metier | 4.2 | V4 | S9-S10 | | -| 28 | sonarqube (encapsulation) | Plugin | 4.2 | V5 | S11 | | +| 25 | project-member | Metier | 4.7 | V3 | S8 | ✅ MIGRÉ (2026-06-09) | +| 26 | project-secrets | Metier | 4.6 | V4 | S9 | ✅ MIGRÉ (2026-06-13, module séparé) | +| 27 | project-bulk | Metier | 4.2 | V4 | S9-S10 | ✅ MIGRÉ (2026-06-16, module séparé) | +| 28 | sonarqube (encapsulation) | Plugin | 4.2 | V5 | S11 | ✅ MIGRE | **Note** : Le score brut ne dicte pas directement l'ordre de migration. L'ordre reel est contraint par le graphe de dependances (bottom-up), les @@ -825,7 +825,7 @@ Encapsuler les plugins intermediaires. **Livrable fin S10** : 75 routes migrees (100% des routes metier) + plugins vault, keycloak, gitlab, harbor, nexus encapsules -### 19. project-core +### 19. project-core — ✅ MIGRÉ (2026-05-28) | Attribut | Valeur | |----------|--------| @@ -857,7 +857,7 @@ vault, keycloak, gitlab, harbor, nexus encapsules --- -### 20. project-secrets +### 20. project-secrets — ✅ MIGRÉ (2026-05-28, fusionné dans project-core) | Attribut | Valeur | |----------|--------| @@ -869,7 +869,7 @@ vault, keycloak, gitlab, harbor, nexus encapsules **Routes** : - `GET /api/v1/projects/:projectId/secrets` - Secrets du projet -**Dependances sortantes** : hooks (project.getSecrets) +**Dependances sortantes** : hooks (project.get) **Dependances entrantes** : Aucune **Points d'attention** : @@ -882,29 +882,26 @@ vault, keycloak, gitlab, harbor, nexus encapsules --- -### 21. project-bulk +### 21. project-bulk — ✅ MIGRÉ (2026-06-16, module séparé) | Attribut | Valeur | |----------|--------| -| **Routes** | 3 | +| **Routes** | 1 (bulk action) | | **Score** | 4.2 | | **Sprint** | S9-S10 | | **Dev** | A | **Routes** : -- `GET /api/v1/admin/projects/data` - Export bulk des donnees projets -- `POST /api/v1/admin/projects/bulk` - Action bulk sur les projets -- `POST /api/v1/projects/:projectId/replay-hooks` - Rejeu des hooks d'un projet +- `POST /api/v1/projects-bulk` - Action bulk sur les projets (archive, lock, unlock, replay) -**Dependances sortantes** : `queries-index` (getAllProjectsDataForExport, deleteAllEnvironmentForProject, deleteAllRepositoryForProject), hooks (project.upsert pour replay) +**Dependances sortantes** : `ProjectService` (archive), `ProjectHooksService` (replay, lock/unlock) **Dependances entrantes** : Aucune **Points d'attention** : -- Routes admin uniquement -- Le bulk action itere sur les projets avec une limite de parallelisme - (`parallelBulkLimit` dans la config). Attention aux performances +- Route admin uniquement (`@RequireAdminPermission('Manage')`) +- Le bulk action itere sur les projets avec `Promise.allSettled` (pas de limite de parallelisme) +- L'export CSV (`GET /api/v1/projects/data`) est géré par le `ProjectController`, pas par ce module - Le replay-hooks re-execute toute la chaine de hooks pour un projet -- L'export data peut generer de gros payloads **Estimation** : 2 jours diff --git a/apps/server-nestjs/documentation/Modularisation-de-console-server/MODULARISATION-STATUT.md b/apps/server-nestjs/documentation/Modularisation-de-console-server/MODULARISATION-STATUT.md index 5d36a235d..4c7266b47 100644 --- a/apps/server-nestjs/documentation/Modularisation-de-console-server/MODULARISATION-STATUT.md +++ b/apps/server-nestjs/documentation/Modularisation-de-console-server/MODULARISATION-STATUT.md @@ -1,15 +1,15 @@ # État de la modularisation Backend → NestJS > 📋 **Ce fichier est mis à jour en temps réel** -> Dernière mise à jour : **2026-06-16** +> Dernière mise à jour : **2026-06-30** (migrations admin-token + user/tokens) --- ## 🎯 Progression globale -![Progress](https://progress-bar.dev/7/?title=modularisation&width=400) +![Progress](https://progress-bar.dev/52/?title=modularisation&width=400) -**~7%** complété (1/18 modules métier migrés, 5/75 routes) +**~52%** complété (15/18 modules métier migrés, 39/75 routes) --- @@ -17,9 +17,9 @@ | Statut | Nombre de modules | % du total | |--------|-------------------|------------| -| ✅ Migré | 1 (ServiceChain) | ~6% | +| ✅ Migré | 18 (dont 15 routes métier + 3 encapsulations plugins) | ~64% | | 🚧 En cours | 0 | 0% | -| 📅 Planifié | 17 | ~94% | +| 📅 Planifié | 9 (modules métier restants) | ~32% | | ⏳ En attente de cartographie | 0 | 0% | --- @@ -48,9 +48,67 @@ profitant de son isolement complet vis-à-vis du reste du codebase. | `POST` | `/api/v1/service-chains/:id/retry` | `ManageSystem` | | `POST` | `/api/v1/service-chains/validate/:id` | `ManageSystem` | +### Project — migré le 2026-05-28 + +#### Project + +Module cœur de gestion des projets (CRUD, export CSV). + +- **Routes** : 6 (`/api/v1/projects/...`) +- **Auth** : Token (`x-dso-token`) + guards projet (`ProjectGuard`, `ProjectStatusGuard`, `ProjectLockedGuard`) +- **Validation** : Contrats Zod via `projectContract` de `@cpn-console/shared` avec `ZodValidationPipe` +- **Tests** : Controller + Service couverts (Vitest) + +| Méthode | Route | Permission | +|---------|-------|------------| +| `GET` | `/api/v1/projects/data` | `Manage` (admin) | +| `GET` | `/api/v1/projects` | Authentifié | +| `POST` | `/api/v1/projects` | `ManageProjects` (admin) + type `human` | +| `GET` | `/api/v1/projects/:projectId` | Authentifié + projet | +| `PUT` | `/api/v1/projects/:projectId` | Authentifié + projet (statut ≠ archived) | +| `DELETE` | `/api/v1/projects/:projectId` | `ManageProjects` (admin) | + +**Infrastructure créées/mise à jour** : +- `ProjectGuard` + `Project` decorator : chargement du projet par id/slug, résolution des permissions via bitmask +- `ProjectStatusGuard` + `@RequireProjectStatus()` : filtrage par statut du projet +- `ProjectLockedGuard` + `@RequireProjectLocked()` : protection contre les modifications de projets verrouillés +- `UserGuard` + `@AuthUser()` decorator : authentification token + injection du contexte utilisateur + +**Différences avec le legacy** : +- Utilisation de `projectContract` de `@cpn-console/shared` pour les schemas de validation (cohérence client/serveur) +- ZodValidationPipe au lieu de la validation ts-rest implicite +- Sous-modules `secrets`, `services`, `hooks`, `bulk`, `roles`, `members` sont des modules NestJS séparés (pas fusionnés dans un `project-core`) + +#### ProjectBulk + +Module d'actions en masse sur les projets (archivage, verrouillage, rejeu hooks). + +- **Routes** : 1 (`/api/v1/projects-bulk`) +- **Auth** : `UserGuard` + `@RequireAdminPermission('Manage')` +- **Validation** : Contrat Zod via `projectContract.bulkActionProject` +- **Tests** : Service couvert (Vitest) + +| Méthode | Route | Permission | +|---------|-------|------------| +| `POST` | `/api/v1/projects-bulk` | `Manage` (admin) | + +**Fichiers** : +- `src/modules/project-bulk/project-bulk.controller.ts` +- `src/modules/project-bulk/project-bulk.service.ts` +- `src/modules/project-bulk/project-bulk.module.ts` + +**Actions supportées** : +- `archive` — Archivage de projets (exclut les déjà archivés) +- `lock` / `unlock` — Verrouillage/déverrouillage de projets +- `replay` — Rejeu de la chaîne de hooks d'un projet + +**Points d'attention** : +- Le bulk action itère sur les projets avec `Promise.allSettled` (résultat par projet) +- L'export CSV (`GET /api/v1/projects/data`) est géré par le `ProjectController` + ### Infrastructure transverse déployée -En support de cette migration, les éléments d'infrastructure suivants ont été +En support de ces migrations, les éléments d'infrastructure suivants ont été créés : - **AuthModule** (`infrastructure/auth/`) : `AuthService` (validation token @@ -68,6 +126,249 @@ créés : > mais les usages côté contrôleurs restent encore à homogénéiser au fil des > modules migrés. +#### ProjectMember + +Module de gestion des membres projet (ajout, modification, suppression, liste). +Dédié aux routes `/api/v1/projects/:projectId/members/...`. + +- **Routes** : 4 (`/api/v1/projects/:projectId/members/...`) +- **Auth** : Token (`x-dso-token`) + guards projet (`ProjectGuard`, `ProjectStatusGuard`, `ProjectLockedGuard`) +- **Validation** : Contrats Zod via `projectMemberContract` de `@cpn-console/shared` + +| Méthode | Route | Permission | +|---------|-------|------------| +| `GET` | `/api/v1/projects/:projectId/members` | `ListMembers` (admin) | +| `POST` | `/api/v1/projects/:projectId/members` | `ManageMembers` (admin) + statut non archivé | +| `PATCH` | `/api/v1/projects/:projectId/members` | `ManageMembers` (admin) + statut non archivé | +| `DELETE` | `/api/v1/projects/:projectId/members/:userId` | `ManageMembers` (admin) ou auto-suppression + statut non archivé | + +**Fichiers** : +- `src/modules/project-members/project-members.controller.ts` +- `src/modules/project-members/project-members.service.ts` +- `src/modules/project-members/project-members.module.ts` + +**Différences avec le legacy** : +- Recherche par email non disponible (nécessite le hook Keycloak `user.retrieveUserByEmail`, non migré) +- Retour de la liste complète des membres après chaque mutation (cohérence avec le legacy) + +#### ProjectRoles + +Module de gestion des rôles projet (création, modification, suppression, liste, comptage). +Dédié aux routes `/api/v1/projects/:projectId/roles/...`. + +- **Routes** : 5 (`/api/v1/projects/:projectId/roles/...`) +- **Auth** : Token (`x-dso-token`) + guards projet (`ProjectGuard`, `ProjectStatusGuard`, `ProjectLockedGuard`) +- **Validation** : Contrats Zod via `projectRoleContract` de `@cpn-console/shared` + +| Méthode | Route | Permission | +|---------|-------|------------| +| `GET` | `/api/v1/projects/:projectId/roles` | `ListRoles` (admin) | +| `POST` | `/api/v1/projects/:projectId/roles` | `ManageRoles` (admin) + statut non archivé | +| `PATCH` | `/api/v1/projects/:projectId/roles` | `ManageRoles` (admin) + statut non archivé | +| `GET` | `/api/v1/projects/:projectId/roles/member-counts` | `ListRoles` (admin) | +| `DELETE` | `/api/v1/projects/:projectId/roles/:roleId` | `ManageRoles` (admin) + statut non archivé | + +**Fichiers** : +- `src/modules/project-roles/project-roles.controller.ts` +- `src/modules/project-roles/project-roles.service.ts` +- `src/modules/project-roles/project-roles.module.ts` + +#### ProjectSecrets + +Module de gestion des secrets projet (lecture des secrets plugin par projet). +Dédié à la route `/api/v1/projects/:projectId/secrets`. + +- **Routes** : 1 (`/api/v1/projects/:projectId/secrets`) +- **Auth** : Token (`x-dso-token`) + guards projet (`ProjectGuard`, `ProjectStatusGuard`) +- **Validation** : Contrat Zod via `projectSecretContract` de `@cpn-console/shared` + +| Méthode | Route | Permission | +|---------|-------|------------| +| `GET` | `/api/v1/projects/:projectId/secrets` | `ListSecrets` (admin) + projet (statut ≠ archived) | + +**Fichiers** : +- `src/modules/project-secrets/project-secrets.controller.ts` +- `src/modules/project-secrets/project-secrets.service.ts` +- `src/modules/project-secrets/project-secrets.module.ts` + +**Points d'attention** : +- Appelle le hook `getProjectSecrets` qui interroge chaque plugin pour ses secrets +- Données sensibles : attention au logging et à la sérialisation + +#### ProjectServices + +Module de gestion des services projet (configuration des plugins par projet). +Dédié aux routes `/api/v1/projects/:projectId/services/...`. + +- **Routes** : 2 (`/api/v1/projects/:projectId/services/...`) +- **Auth** : Token (`x-dso-token`) + guards projet (`ProjectGuard`, `ProjectStatusGuard`, `ProjectLockedGuard`) +- **Validation** : Contrats Zod via `projectServiceContract` de `@cpn-console/shared` + +| Méthode | Route | Permission | +|---------|-------|------------| +| `GET` | `/api/v1/projects/:projectId/services` | `ListEnvironments` (admin) | +| `POST` | `/api/v1/projects/:projectId/services` | `ManageEnvironments` (admin) + statut non archivé | + +**Fichiers** : +- `src/modules/project-services/project-services.controller.ts` +- `src/modules/project-services/project-services.service.ts` +- `src/modules/project-services/project-services.module.ts` + +#### ProjectHooks + +Module de gestion des hooks projet (mise à jour de la configuration hooks). +Dédié à la route `/api/v1/projects/:projectId/hooks`. + +- **Routes** : 1 (`/api/v1/projects/:projectId/hooks`) +- **Auth** : Token (`x-dso-token`) + guards projet (`ProjectGuard`, `ProjectStatusGuard`, `ProjectLockedGuard`) +- **Validation** : Contrat Zod via `projectHooksContract` de `@cpn-console/shared` + +| Méthode | Route | Permission | +|---------|-------|------------| +| `PUT` | `/api/v1/projects/:projectId/hooks` | `ManageHooks` (admin) + statut non archivé | + +**Fichiers** : +- `src/modules/project-hooks/project-hooks.controller.ts` +- `src/modules/project-hooks/project-hooks.service.ts` +- `src/modules/project-hooks/project-hooks.module.ts` + +#### Deployment + +Module de gestion des déploiements projet (CRUD des déploiements). +Dédié aux routes `/api/v1/deployments/...`. + +- **Routes** : 4 (`/api/v1/deployments/...`) +- **Auth** : Token (`x-dso-token`) + guards projet +- **Validation** : Contrats Zod via `deploymentContract` de `@cpn-console/shared` + +| Méthode | Route | Permission | +|---------|-------|------------| +| `GET` | `/api/v1/deployments` | Authentifié + projet | +| `POST` | `/api/v1/deployments` | `ManageDeployments` (admin) | +| `PUT` | `/api/v1/deployments/:deploymentId` | `ManageDeployments` (admin) | +| `DELETE` | `/api/v1/deployments/:deploymentId` | `ManageDeployments` (admin) | + +**Fichiers** : +- `src/modules/deployment/deployment.controller.ts` +- `src/modules/deployment/deployment.service.ts` +- `src/modules/deployment/deployment.module.ts` + +#### Log + +Module de gestion des logs (lecture des logs projet/environnement). + +- **Routes** : 1 (`/api/v1/logs`) +- **Auth** : Token (`x-dso-token`) + guards projet + +| Méthode | Route | Permission | +|---------|-------|------------| +| `GET` | `/api/v1/logs` | Authentifié + projet | + +**Fichiers** : +- `src/modules/log/log.controller.ts` +- `src/modules/log/log.service.ts` +- `src/modules/log/log.module.ts` + +#### Healthz + +Module de health check (liveness/readiness). + +- **Routes** : 1 (`/api/v1/healthz`) +- **Auth** : Publique + +| Méthode | Route | Permission | +|---------|-------|------------| +| `GET` | `/api/v1/healthz` | Publique | + +**Fichiers** : +- `src/modules/healthz/healthz.controller.ts` +- `src/modules/healthz/healthz.module.ts` + +#### Version + +Module de version (retourne la version de l'application). + +- **Routes** : 1 (`/api/v1/version`) +- **Auth** : Publique + +| Méthode | Route | Permission | +|---------|-------|------------| +| `GET` | `/api/v1/version` | Publique | + +**Fichiers** : +- `src/modules/version/version.controller.ts` +- `src/modules/version/version.module.ts` + +#### SystemSettings + +Module de paramètres système (lecture/écriture de configuration globale). + +- **Routes** : 2 (`/api/v1/system/settings/...`) +- **Auth** : Token (`x-dso-token`) + admin + +| Méthode | Route | Permission | +|---------|-------|------------| +| `GET` | `/api/v1/system/settings` | Admin | +| `PUT` | `/api/v1/system/settings/:key` | Admin | + +**Fichiers** : +- `src/modules/system-settings/system-settings.controller.ts` +- `src/modules/system-settings/system-settings.service.ts` +- `src/modules/system-settings/system-settings.module.ts` + + +#### AdminToken + +Module de gestion des tokens de service admin (création, liste, révocation). +Dédié aux routes `/api/v1/admin/tokens/...`. + +- **Routes** : 3 (`/api/v1/admin/tokens/...`) +- **Auth** : Token (`x-dso-token`) + admin (`@RequireAdminPermission`) +- **Validation** : Contrat Zod via `adminTokenContract` de `@cpn-console/shared` + +| Méthode | Route | Permission | +|---------|-------|------------| +| `GET` | `/api/v1/admin/tokens` | `ListAdminToken` (admin) | +| `POST` | `/api/v1/admin/tokens` | `ManageAdminToken` (admin) | +| `DELETE` | `/api/v1/admin/tokens/:tokenId` | `ManageAdminToken` (admin) | + +**Fichiers** : +- `src/modules/admin-token/admin-token.controller.ts` +- `src/modules/admin-token/admin-token.service.ts` +- `src/modules/admin-token/admin-token.module.ts` + +**Points d'attention** : +- Génération d'un mot de passe aléatoire (affiché une seule fois à la création) +- Création d'un utilisateur bot propriétaire du token +- Révocation = soft-delete (status `revoked`, pas de suppression physique) +- Hash SHA256 du mot de passe stocké en base (pas le plaintext) + +#### UserTokens + +Module de gestion des tokens d'accès personnels (PAT). Dédié aux routes +`/api/v1/user/tokens/...`. + +- **Routes** : 3 (`/api/v1/user/tokens/...`) +- **Auth** : Token (`x-dso-token`) + utilisateur humain (`user.userType === 'human'`) +- **Validation** : Contrat Zod via `personalAccessTokenContract` de `@cpn-console/shared` + +| Méthode | Route | Permission | +|---------|-------|------------| +| `GET` | `/api/v1/user/tokens` | Utilisateur humain authentifié | +| `POST` | `/api/v1/user/tokens` | Utilisateur humain authentifié | +| `DELETE` | `/api/v1/user/tokens/:tokenId` | Utilisateur humain authentifié (scope personnel) | + +**Fichiers** : +- `src/modules/user-tokens/user-tokens.controller.ts` +- `src/modules/user-tokens/user-tokens.service.ts` +- `src/modules/user-tokens/user-tokens.module.ts` + +**Points d'attention** : +- Mot de passe généré aléatoirement, affiché une seule fois à la création +- Hash SHA256 stocké en base (jamais le plaintext) +- Suppression physique (hard delete) contrairement à admin-token +- Scope strict : l'utilisateur ne peut gérer que ses propres tokens + --- ## 🚧 En cours de modularisation @@ -76,40 +377,40 @@ créés : --- +## 📅 Modules planifiés ## 📅 Modules planifiés -> Ces informations seront affinées après la cartographie (fin S2) - -### Sprint 3-4 (27 janvier - 9 février) -- **Module** : Auth -- **Responsable** : @stephane.trebel -- **Routes** : ~5 -- **Criticité** : 🔴 Haute -- **Statut** : 📅 Planifié - -### Sprint 5-6 (10-23 février) -- **Module** : Users -- **Responsable** : TBD -- **Routes** : ~10 -- **Criticité** : 🔴 Haute -- **Statut** : 📅 Planifié - -### Sprint 7-8 (24 février - 9 mars) -- **Module** : À définir (selon cartographie) -- **Responsable** : TBD -- **Routes** : TBD -- **Statut** : 📅 Planifié - -### Sprint 9-10 (10-23 mars) -- **Module** : À définir (selon cartographie) -- **Responsable** : TBD -- **Routes** : TBD -- **Statut** : 📅 Planifié - -### Sprint 11-12 (24 mars - 6 avril) -- **Modules** : Finalisation + cleanup -- **Responsable** : Équipe -- **Objectif** : Suppression du legacy +### Modules métier restants (d'après cartographie) + +| Module | Routes estimées | Priorité | Notes | +|--------|-----------------|----------|-------| +| `system/config` | 2 | Haute | ✅ MIGRÉ (2026-06-26) | +| `user` | 4 | Haute | Authentification session + utilisateurs | +| `service-monitor` | 3 | Moyenne | Santé services plugins | +| `admin-role` | 5 | Haute | Rôles admin | +| `stage` | 5 | Haute | Prérequis cluster | +| `zone` | 4 | Haute | Hooks vers plugins vault/keycloak/gitlab | +| `cluster` | 7 | Haute | Dépend direct de `stage` | +| `environment` | 4 | Haute | Scope projet | +| `repository` | 5 | Moyenne | Sync repo via hook GitLab | +| `project-service` | 2 | Moyenne | Configuration plugins par projet | + +**Total estimé** : ~36 routes restantes (~48%). + +### Plugins encapsulés mais non finalisés + +| Plugin | Hooks souscrits | Statut | +|--------|-----------------|--------| +| `vault` | 7 | ✅ Encapsulé, réécriture non commencée | +| `keycloak` | 11 | ✅ Encapsulé, réécriture non commencée | +| `gitlab` | 8 | ✅ Encapsulé, réécriture non commencée | +| `harbor` | 3 | ✅ Encapsulé, réécriture non commencée | +| `nexus` | 3 | ✅ Encapsulé, réécriture non commencée | +| `argocd` | 5 | ✅ Encapsulé, réécriture non commencée | +| `sonarqube` | 2 | ✅ Encapsulé, réécriture non commencée | + +> La phase d'**encapsulation** est terminée pour tous les plugins (modules NestJS existants). +> La phase de **réécriture métier** (suppression du hook system legacy, nettoyage des APIs) reste à planifier. --- @@ -140,9 +441,9 @@ créés : ### Routes par statut - **Total** : ~75 routes métier -- **Migrés** : 5 (~7%) +- **Migrés** : 39 (~52%) - **En cours** : 0 (0%) -- **Restants** : ~70 (~93%) +- **Restants** : ~36 (~48%) --- @@ -152,11 +453,12 @@ créés : |------|-----------| | 07/01/2026 | Début du projet (S1) | | 26/01/2026 | Fin de la cartographie (S2) | -| 27/01/2026 | Début modularisation Auth (S3) | -| 09/02/2026 | Fin modularisation Auth (S4) - 20% complété | -| 09/03/2026 | Point mi-parcours - 60% complété | -| 26/03/2026 | Migration ServiceChain (OpenCDS) finalisée — 1er module métier migré | -| 06/04/2026 | Fin de modularisation - 100% complété | +| 09/04/2026 | Migration ServiceChain (OpenCDS) finalisée — 1er module métier migré | +| 28/05/2026 | Migration du module **Project** (5 routes projet + 1 export CSV) | +| 09/06/2026 | Migration de **ProjectMember** (4 routes) | +| 13/06/2026 | Migration de **ProjectRoles** (5), **ProjectSecrets** (1), **ProjectServices** (2), **ProjectHooks** (1) | +| 16/06/2026 | Migration de **ProjectBulk** (1), **Deployment** (4), **Log** (1), **Healthz** (1), **Version** (1), **SystemSettings** (2) | +| 26/06/2026 | Mise à jour du statut d'avancement : 33 routes migrées (~44%) | --- @@ -188,9 +490,44 @@ créés : ## 🔄 Historique des changements +### 2026-06-30 +- ✅ Migration de **AdminToken** (3 routes) +- ✅ Migration de **UserTokens** (3 routes) +- ✅ Mise à jour du statut d'avancement : 39/75 routes, ~52% + +### 2026-06-26 +- ✅ Mise à jour du statut d'avancement (33/75 routes, ~44%) +- ✅ Suppression des plannings sprints obsolètes +- ✅ Ajout de la liste des modules métier restants (cartographie mise à jour) +- ✅ Ajout du statut d'encapsulation des plugins + +### 2026-06-16 +- ✅ Migration de **ProjectBulk** (1 route) +- ✅ Migration de **Deployment** (4 routes) +- ✅ Migration de **Log** (1 route) +- ✅ Migration de **Healthz** (1 route) +- ✅ Migration de **Version** (1 route) +- ✅ Migration de **SystemSettings** (2 routes) + +### 2026-06-13 +- ✅ Migration de **ProjectRoles** (5 routes) +- ✅ Migration de **ProjectSecrets** (1 route) +- ✅ Migration de **ProjectServices** (2 routes) +- ✅ Migration de **ProjectHooks** (1 route) + +### 2026-06-09 +- ✅ Migration de **ProjectMember** (4 routes) + +### 2026-05-28 +- ✅ Migration du module **Project** (5 routes projet + export CSV) +- ✅ Création des guards projet : `ProjectGuard`, `ProjectStatusGuard`, `ProjectLockedGuard` +- ✅ Création des décorateurs `@Project()`, `@RequireProjectStatus()`, `@RequireProjectLocked()` +- ✅ Création de `UserGuard` + décorateur `@AuthUser()` +- ✅ Build et lint verts (server-nestjs) + ### 2026-04-09 - ✅ Migration du module **ServiceChain (OpenCDS)** — 5 routes, proxy HTTP vers API externe -- ✅ Création de l'**AuthModule** (infrastructure/auth/) : auth par token `x-dso-token` +- ✅ Création de l'**AuthModule** : auth par token `x-dso-token` + bearer JWT Keycloak - ✅ Configuration **nginx-strangler** pour les routes service-chain - ✅ Fix Docker : build order shared → server-nestjs - ✅ Mise à jour de ce fichier de suivi @@ -210,5 +547,5 @@ créés : --- -**Version du fichier** : 1.1 +**Version du fichier** : 1.2 **Responsable de mise à jour** : Lead technique backend diff --git a/apps/server-nestjs/documentation/Modularisation-de-console-server/README.md b/apps/server-nestjs/documentation/Modularisation-de-console-server/README.md index 811aa04f0..c83513cdf 100644 --- a/apps/server-nestjs/documentation/Modularisation-de-console-server/README.md +++ b/apps/server-nestjs/documentation/Modularisation-de-console-server/README.md @@ -117,4 +117,4 @@ Ce dossier contient toute la documentation nécessaire pour mener à bien la mod **Bonne modularisation ! 🚀** -*Version 1.0 - Dernière mise à jour : 2026-01-07* +*Version 1.0 - Dernière mise à jour : 2026-05-28*