Feature #44
closedFeature #28: Intégrer la gestion des SOUPs dans Pipeliner via Trivy, Dependency-Track et Aggregator
Module frontend Pipeliner « SOUPs Management »
0%
conversation:21#28
Description
Créer le module client « SOUPs Management » sur le modèle du module Security Ops (Next.js App Router, TanStack Query, next-intl, Atomic Design). Vue d'ensemble : carte niveau de risque global 🔴/🟠/🟢, camembert de répartition, courbe 30j (via le wrapper unique `src/components/atoms/TimeSeriesChart.tsx`), top 3 risques critiques. Détails composants : tableau filtrable par risque/statut/date + bouton « Voir détails ». Rapports : téléchargement IEC 62304 (medtech) / PCI DSS (fintech) / générique en PDF et Excel. Conception via l'agent designer d'abord (design-system).
## Critères d'acceptation
- L'onglet « SOUPs Management » affiche la carte de risque global, le camembert, la courbe 30j et le top 3 critiques.
- Tableau des composants filtrable par risque, statut et date, avec accès au détail.
- Boutons de rapport : IEC 62304 / PCI DSS / générique en PDF et Excel.
- Aucun faux positif ni champ masqué visible côté client.
- Courbe via `TimeSeriesChart` uniquement (aucun import recharts ailleurs) ; clés i18n ajoutées dans `en.ts`.
- vitest, tsc --noEmit, eslint, build verts.
Estimation : L. Dépend de : « Proxy backend Pipeliner owned_project pour les SOUPs ».
Files
RA Updated by Redmine Admin about 2 months ago
RA Updated by Redmine Admin about 2 months ago
RA Updated by Redmine Admin about 2 months ago
## Brief de design — SOUPs Management (designer agent #27)
Module client **« SOUPs Management »** calqué sur **Security Ops (§SO)** — mêmes conventions Next.js App Router / TanStack Query / next-intl / Atomic Design. La section complète a été **ajoutée (additif uniquement)** au design-system : `docs/design/design-system.md` › section **« SOUPs Management (Pipeliner) »** (§SM.risk-map, SM.1, SM.donut, SM.2, SM.3c, SM.4, SM.privacy, SM.5, SM.i18n). Maquette filaire jointe : `soups-management-mockup.txt`.
### Atomic Design
- **Page / template** : `app/projects/[id]/soups/page.tsx` — shell §UR.1/§SO.1 verbatim (bande `← Overview` + nom projet centré `h1`). Atteinte via une **tuile Tools §PO.6** (Lucide `package-search`, stat clé = mot de risque global).
- **Organismes** : `SoupRiskOverview` (§SM.1a), `SoupComponentsTable` (§SM.2), `SoupComponentDetailDrawer` (§SM.3c), `SoupReportPanel` (§SM.4).
- **Molécules / atomes réutilisés** : `<TimeSeriesChart>` (seul importeur recharts), `SeverityBar` (§SO.2b), chips §SO.3a, segmented §TB.1, `HealthBadge`/`StatusPill` §6.1, Card §6.3, Radix `Select` §v2.5, `TextInput type=date` §7b.2, `SectionError` §PO.7. **Nouvel atome** : `SoupRiskDonut` (donut **SVG natif — PAS recharts**).
### Vue d'ensemble (§SM.1a)
Carte de **niveau de risque global** (mot+pastille+rail, 🔴/🟠/🟢 décoratifs `aria-hidden`), **donut SVG de répartition** (`breakdown`), **courbe 30 j** via `<TimeSeriesChart>` (2 lignes Critical/High), **Top 3 risques critiques** (`top_critical`, liens advisory). Sélecteur 7/30/90 j (défaut 30 j).
### Détail composants (§SM.2)
`<table>` triable **card-owns-scroll** (`min-w-[48rem]`), **filtrable par risque / statut / date**, pagination serveur (milliers de lignes). Chaque ligne : Component, Version, Risk (pastille), Status (pastille), Last seen (relatif §PK.4), **« Voir détails »** → drawer latéral droit (§SM.3c, `role=dialog`, `?component=`).
### Rapports (§SM.4)
`SoupReportPanel` : choix de standard **IEC 62304 (medtech) / PCI DSS (fintech) / Generic**, boutons **Download PDF** + **Download Excel** → `GET /api/projects/{id}/soups/report?standard=&format=` (proxy `owned_project` → aggregator → Dependency-Track, blob `Content-Disposition: attachment`). Lien **`View CycloneDX SBOM ↗`** = `report_url` de l'enveloppe (omis si `null`).
### États
empty / loading / error couverts par section (squelettes §SO.5, `SectionError` section-scoped + Retry, `Collecting history…`, `No components match these filters.`, `No SOUP data yet for this project.`).
### Tokens / couleurs
**Aucune nouvelle couleur** (100 % tokens §2/§3, base **v2.3**). `SM.risk-map` = la `§SO.severity-map`/`§SO.1a` vérifiée : 🔴 critical→`danger`, 🟠 high→`warning` (ambre « Attention »), 🟠 medium→`warning` doux, 🟢 low→neutre, 🟢 clean→`success`. **Gotcha #6** honorée : rouge « Down » réservé aux pannes — ici `danger` = sévérité, pas outage. Niveau **toujours porté par le mot + la pastille**, jamais la couleur seule (§7).
### Faux positifs / champs supprimés (§SM.privacy)
**Jamais affichés** côté client (filtrés serveur). **Au plus un compteur** neutre `{n} items suppressed` — aucune liste, aucun lien, aucun bouton « voir les supprimés ».
### Charts & i18n
- Courbe via le **seul** wrapper `src/components/atoms/TimeSeriesChart.tsx` (aucun autre import recharts) ; donut = **SVG natif**.
- **Clés i18n** : nouveau namespace **`soups`** ajouté à **`en.ts` uniquement** (`fr.ts` réexporte `en.ts` — jamais de FR séparé). Liste complète dans §SM.i18n.
**Statut → Design.** Le FE est en attente de la dépendance backend (« Proxy backend Pipeliner `owned_project` pour les SOUPs »).
RA Updated by Redmine Admin about 2 months ago
- Status changed from Spec to Design
Transition **Spec → Design** : design-system section §SM appended (additive only), maquette filaire attachée, brief de design posté. Prêt pour le FE une fois la dépendance backend (proxy `owned_project` SOUPs) levée. `spec_ref` inchangé (posé par le stage spec).
RA Updated by Redmine Admin about 2 months ago
- Status changed from Design to In development
RA Updated by Redmine Admin about 2 months ago
- Status changed from In development to QA
- branch set to feat/44-soups-module
- pr_url set to https://github.com/omdev-tech/PipeLiner-Client/pull/31
Module frontend « SOUPs Management » implémenté (TDD) sur le modèle de Security Ops, conformément au §SM du design-system (maquette `soups-management-mockup.txt`).
**Livré :**
- Vue d'ensemble (§SM.1a) : carte de risque global (§SM.risk-map = tokens §SO, aucune nouvelle couleur ; vulnérabilités en ambre « Attention », jamais rouge « Down » — gotcha #6), camembert SVG natif (§SM.donut, aucun recharts), courbe 30j via le wrapper unique `TimeSeriesChart`, top 3 risques critiques.
- Tableau des composants (§SM.2) filtrable par risque / statut / date ; « Voir détails » → drawer latéral droit (§SM.3c).
- Rapports (§SM.4) : « Télécharger le rapport » → `/api/projects/{id}/soups/report` + lien `View CycloneDX SBOM ↗` (report_url).
- Confidentialité (§SM.privacy) : uniquement un compteur « {n} items suppressed », jamais les faux positifs / champs masqués.
- États vide / chargement / erreur ; aggregator dégradé (`risk_level: "unknown"`) → lecture calme, jamais 500/rouge.
- Données via TanStack Query (`useSoups`) sur le proxy #43 (`/soups`, déjà sur `dev`). Clés i18n dans `en.ts` uniquement (namespace `soups`). Onglet « SOUPs Management » câblé.
**Gate vert :** `vitest` (480) · `tsc --noEmit` · `eslint` · `build`.
PR (base `dev`) : https://github.com/omdev-tech/PipeLiner-Client/pull/31
Branche : `feat/44-soups-module`
RA Updated by Redmine Admin about 2 months ago
- Status changed from QA to In development
QA→In development : revue de sécurité automatique a détecté 3 sinks XSS (MEDIUM) — `component.link`, `summary.report_url`, `reportUrl` liés à `href` sans valider le schéma d'URL (un lien `javascript:` provenant d'une donnée DTracker/aggregator s'exécuterait au clic). Correction : helper `safeExternalHref` (autorise http(s) uniquement, sinon null) appliqué aux 3 composants (ComponentDrawer, RiskOverview, ReportsSection). Re-QA après gate vert.
RA Updated by Redmine Admin about 2 months ago
- Status changed from In development to QA
In development→QA : correctif XSS appliqué (helper `safeExternalHref`, http(s)/relatif uniquement) sur les 3 sinks (ComponentDrawer/RiskOverview/ReportsSection) + test dédié. Gate vert : vitest 484, tsc/eslint/build OK. PR #32 mergée dans dev. Re-QA.
RA Updated by Redmine Admin about 2 months ago
- Status changed from QA to Shipped
Shipped en prod (dashboard master #66). Module « SOUPs Management » (carte risque, donut, tableau composants + drawer, téléchargement rapport). Correctif sécurité XSS (safeExternalHref) inclus. Conteneurs prod recréés 23:14.