Skip to content

BDD-61 - Export source Heriade

1. User Story

En tant qu'administrateur,
Je veux exporter les données d'une source Heriade,
Afin de les utiliser dans un autre outil (Excel, CSV, etc.).

2. Critères d'acceptance

  1. L'export est disponible en CSV et Excel (.xlsx).
  2. L'export contient toutes les lignes de la source (pas seulement la page affichée).
  3. Le fichier est téléchargeable immédiatement.
  4. Le nom du fichier reprend le nom de la source et la date d'export.
  5. L'export respecte le tri courant de la source (sortBy, sortOrder).

3. Périmètre fonctionnel

Frontend

  • Page détail source : front/src/pages/admin/sources/AdminSourceDetailPage.vue
  • Page liste sources : front/src/pages/admin/sources/AdminSourcesPage.vue
  • Store Pinia : front/src/stores/source-store.js
  • Composant menu actions (évolué pour actions inline) : front/src/components/ui/ActionMenuButton.vue
  • Tests page détail : front/src/__tests__/pages/admin/sources/AdminSourceDetailPage.spec.js
  • Tests page liste : front/src/__tests__/pages/admin/sources/AdminSourcesPage.spec.js
  • Tests store : front/src/__tests__/stores/source-store.spec.js
  • Tests composant menu : front/src/__tests__/components/ui/ActionMenuButton.spec.js

Backend

  • Controller : back/src/api/sources/sources.controller.ts
  • Service principal : back/src/api/sources/sources.service.ts
  • DTO : back/src/api/sources/dto/source.dto.ts
  • Config CORS (exposition headers téléchargement) : back/src/main.ts
  • Tests unitaires service : back/src/api/sources/sources.service.spec.ts
  • Tests E2E controller : back/test/e2e/sources-controller.e2e-spec.ts

Endpoints

MéthodeRouteRôle
GET`/sources/:uuid/export?format=csvxlsx&sortBy=<colonne>&sortOrder=asc

4. Détails d'implémentation

Backend

  • Ajout du DTO de query SourceExportQueryDto avec validation des paramètres :
    • format (csv, xlsx),
    • sortBy (colonne métier facultative),
    • sortOrder (asc, desc).
  • Ajout de l'endpoint GET /sources/:uuid/export protégé par AuthGuard + AdminGuard.
  • Génération de fichier dans SourcesService :
    • récupération des colonnes métier (hors _id),
    • récupération de toutes les lignes de la table (sans pagination),
    • application du tri demandé sur l'ensemble exporté (ORDER BY ... NULLS LAST),
    • génération CSV (avec BOM UTF-8 pour compatibilité Excel),
    • génération XLSX (workbook avec feuille Export).
  • Aucun filtre texte global n'est appliqué à l'export (pas de paramètre filter).
  • Nommage du fichier :
    • {nom_source_sanitize}_{YYYY-MM-DD}_{HH-mm}.{format}
    • nom_source_sanitize normalisé en ASCII, caractères non valides remplacés.
  • Headers HTTP envoyés :
    • Content-Type selon format,
    • Content-Disposition avec attachment; filename=....
  • CORS mis à jour pour exposer les headers de téléchargement au front :
    • Content-Disposition,
    • Content-Length.

Frontend

  • Store source-store :
    • ajout de exportSource({ sourceUuid, format, sortBy, sortOrder }),
    • appel Axios avec responseType: 'blob',
    • envoi du tri courant au backend (sortBy, sortOrder) pour conserver l'ordre affiché,
    • récupération du filename via content-disposition (fallback si absent),
    • déclenchement du téléchargement via Blob + URL.createObjectURL.
  • Page détail source :
    • export via ActionMenuButton avec entrée menu "Exporter la source",
    • rendu inline dans le menu pour les formats CSV et Excel.
  • Page liste sources :
    • même pattern que la page détail dans le menu d'actions de chaque source.
  • Composant ActionMenuButton :
    • évolution pour supporter une action "inlineActions" (boutons compacts dans le menu).

5. Points de vérification

  • L'action export est disponible au format CSV et Excel depuis :
    • la page liste des sources,
    • la page détail d'une source.
  • L'export récupère toutes les données de la source (pas de limite liée à la pagination UI).
  • L'export conserve le tri courant (colonne + sens) et n'applique pas de filtre texte global.
  • Le téléchargement démarre immédiatement après clic.
  • Le nom du fichier suit la convention définie et inclut date + heure.
  • Le front reçoit bien content-disposition grâce à Access-Control-Expose-Headers.
  • En cas d'erreur d'export, une notification utilisateur est affichée.

6. Tests associés

Tests unitaires back

  • back/src/api/sources/sources.service.spec.ts
    • exportSource CSV : fichier généré + nommage + requête SQL attendue,
    • exportSource XLSX : fichier généré avec bon mime type,
    • exportSource : 404 si source introuvable.

Tests E2E back (Supertest)

  • back/test/e2e/sources-controller.e2e-spec.ts
    • GET /sources/:uuid/export : 401 sans token,
    • GET /sources/:uuid/export : 403 pour rôle non admin,
    • GET /sources/:uuid/export : 400 UUID invalide,
    • GET /sources/:uuid/export : 400 format invalide,
    • GET /sources/:uuid/export : 404 source introuvable.

Tests unitaires front

  • front/src/__tests__/stores/source-store.spec.js
    • appel de l'endpoint export avec responseType: 'blob',
    • déclenchement du téléchargement navigateur,
    • fallback du filename si header absent.
  • front/src/__tests__/pages/admin/sources/AdminSourceDetailPage.spec.js
    • export CSV et Excel depuis le menu détail.
  • front/src/__tests__/pages/admin/sources/AdminSourcesPage.spec.js
    • export CSV et Excel depuis le menu liste.
  • front/src/__tests__/components/ui/ActionMenuButton.spec.js
    • rendu et émission d'actions inline dans le menu.

7. Correctifs liés

  • BDD-146 — Les colonnes numériques (NUMERIC PostgreSQL) exportées comme texte dans le CSV et vides dans l'Excel ont été corrigées après livraison de BDD-61.