Appearance
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
- L'export est disponible en CSV et Excel (
.xlsx). - L'export contient toutes les lignes de la source (pas seulement la page affichée).
- Le fichier est téléchargeable immédiatement.
- Le nom du fichier reprend le nom de la source et la date d'export.
- 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éthode | Route | Rôle |
|---|---|---|
GET | `/sources/:uuid/export?format=csv | xlsx&sortBy=<colonne>&sortOrder=asc |
4. Détails d'implémentation
Backend
- Ajout du DTO de query
SourceExportQueryDtoavec validation des paramètres :format(csv,xlsx),sortBy(colonne métier facultative),sortOrder(asc,desc).
- Ajout de l'endpoint
GET /sources/:uuid/exportprotégé parAuthGuard+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).
- récupération des colonnes métier (hors
- 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_sanitizenormalisé en ASCII, caractères non valides remplacés.
- Headers HTTP envoyés :
Content-Typeselon format,Content-Dispositionavecattachment; 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.
- ajout de
- Page détail source :
- export via
ActionMenuButtonavec entrée menu "Exporter la source", - rendu inline dans le menu pour les formats
CSVetExcel.
- export via
- 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
CSVetExceldepuis :- 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-dispositiongrâ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.tsexportSourceCSV : fichier généré + nommage + requête SQL attendue,exportSourceXLSX : fichier généré avec bon mime type,exportSource: 404 si source introuvable.
Tests E2E back (Supertest)
back/test/e2e/sources-controller.e2e-spec.tsGET /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.
- appel de l'endpoint export avec
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 (
NUMERICPostgreSQL) exportées comme texte dans le CSV et vides dans l'Excel ont été corrigées après livraison de BDD-61.
