Consultation des specs dans l'app (menu Specs + rendu Markdown/Mermaid)

Nouvelle fonctionnalité : consulter les documents de spécification (exigences,
conception technique, plan de tâches) en lecture seule dans le frontend.

Backend :
- SpecsController (GET /api/specs, GET /api/specs/{cle}) protégé par l'auth
  globale ; SpecDocumentService avec whitelist (pas de path traversal) et
  lecture depuis le dossier specs/ embarqué, repli sur .kiro/specs en dev.
- DTOs SpecDocumentDto / SpecContenuDto ; service enregistré dans Program.cs.

Docker :
- Contexte de build backend = racine du dépôt (dockerfile: backend/Dockerfile)
  pour embarquer .kiro/specs/*.md dans l'image (app autonome).
- .dockerignore racine ajouté (exclut frontend/node_modules, bin/obj, etc.).

Frontend :
- SpecService + SpecsComponent (lazy-loadé) : page dédiée avec menu latéral par
  document ; rendu Markdown via marked (GFM) assaini par DOMPurify.
- Diagrammes Mermaid (ex. graph TB) rendus en SVG via mermaid.js importé
  dynamiquement ; déclenchement après résolution du @ViewChild (setTimeout).
- Barre de navigation : simple lien « Specs » (le choix du document se fait dans
  le menu latéral de la page, pas dans la barre).
- Routes /specs et /specs/:cle protégées par authGuard.

Specs : exigence 19 (consultation des documents) ajoutée à requirements.md ;
design.md complété (DTOs, endpoints, composant, rendu Mermaid, note Docker).
This commit is contained in:
2026-09-16 08:10:41 +02:00
parent 47e1416a16
commit 9d2b676c84
21 changed files with 1929 additions and 8 deletions
+1
View File
@@ -8,3 +8,4 @@ export * from './profil.model';
export * from './bareme.model';
export * from './adresse.model';
export * from './auth.model';
export * from './spec.model';
@@ -0,0 +1,19 @@
// Modèles des documents de spécification (miroir des DTOs backend SpecDtos.cs).
/** Métadonnées d'un document de spécification (élément du sous-menu). */
export interface SpecDocument {
/** Clé stable et sûre : 'requirements' | 'design' | 'tasks'. */
cle: string;
/** Libellé lisible pour le sous-menu (ex. « Exigences »). */
titre: string;
/** Vrai si le fichier Markdown est présent et lisible côté backend. */
disponible: boolean;
}
/** Contenu Markdown d'un document de spécification. */
export interface SpecContenu {
cle: string;
titre: string;
/** Contenu brut Markdown, rendu en HTML côté composant. */
markdown: string;
}
+1
View File
@@ -8,3 +8,4 @@ export * from './adresse-nommee.service';
export * from './profil.service';
export * from './bareme.service';
export * from './remboursement.service';
export * from './spec.service';
@@ -0,0 +1,27 @@
import { HttpClient } from '@angular/common/http';
import { Injectable, inject } from '@angular/core';
import { Observable } from 'rxjs';
import { environment } from '../../../environments/environment';
import { SpecContenu, SpecDocument } from '../models';
/**
* Service HTTP d'accès aux documents de spécification du projet (exigences,
* conception technique, plan de tâches) pour affichage en lecture seule.
* Les endpoints sont protégés par l'authentification (comme les autres appels).
*/
@Injectable({ providedIn: 'root' })
export class SpecService {
private readonly http = inject(HttpClient);
private readonly baseUrl = `${environment.apiUrl}/specs`;
/** Liste les documents de spécification connus et leur disponibilité (GET /api/specs). */
lister(): Observable<SpecDocument[]> {
return this.http.get<SpecDocument[]>(this.baseUrl);
}
/** Récupère le contenu Markdown d'un document par sa clé (GET /api/specs/{cle}). */
obtenir(cle: string): Observable<SpecContenu> {
return this.http.get<SpecContenu>(`${this.baseUrl}/${cle}`);
}
}