Skip to content

BDD-56 — Création d'une source depuis un fichier déposé

1. User Story

En tant qu'administrateur,
Je veux créer une source Heriade depuis un fichier déposé dans un espace de dépôt,
Afin de rendre les données du fichier disponibles et consultables dans la plateforme.

2. Critères d'acceptance

  1. L'admin sélectionne un fichier déposé (CSV, Excel, JSON) depuis un espace de dépôt.
  2. L'admin nomme librement la source (ex. "RH Effectifs 2026", "Balance Avril").
  3. L'admin saisit le nom de la table cible dans le schéma PostgreSQL de l'entreprise. Si une table portant ce nom existe déjà, un avertissement explicite est affiché (le contenu sera remplacé).
  4. Le fichier est chargé en table dans le schéma dédié de l'entreprise (schema_{uuid_entreprise}).
  5. Une confirmation avec le nombre de lignes chargées est affichée.
  6. En cas d'erreur (format invalide, colonnes manquantes), un message explicite est affiché.

3. Périmètre fonctionnel

Frontend

  • Page sources : front/src/pages/admin/sources/AdminSourcesPage.vue
  • Wizard de création : front/src/components/sources/SourceCreationDialog.vue
  • Store Pinia : front/src/stores/source-store.js
  • Guard de route : front/src/router/sourcesGuard.js
  • Routes : front/src/router/routes.js (route /sources)
  • Menu de navigation : front/src/layouts/MainLayout.vue

Backend

  • Controller : back/src/api/sources/sources.controller.ts
  • Service principal : back/src/api/sources/sources.service.ts
  • Service parsing fichier : back/src/api/sources/services/file-parser.service.ts
  • Service schéma/table : back/src/api/sources/services/schema-table.service.ts
  • DTO : back/src/api/sources/dto/source.dto.ts
  • Presenter : back/src/api/sources/source.presenter.ts
  • Module : back/src/api/sources/sources.module.ts
  • Exceptions : back/src/exceptions/source.exceptions.ts
  • Schéma Prisma : back/prisma/schema.prisma (modèle sources)

Endpoints

MéthodeRouteRôle
POST/sourcesCréer une source depuis un document
GET/sourcesLister les sources (paginé, scopé entreprise)
GET/sources/table-checkVérifier si une table existe déjà
GET/sources/:uuidDétail d'une source

4. Points de vérification

  • La page /sources est accessible uniquement aux admins (guard sourcesGuard redirige sinon).
  • Le wizard affiche uniquement les fichiers aux extensions compatibles (.csv, .xls, .xlsx, .json).
  • L'admin peut saisir librement le nom de la source sans contrainte de format.
  • Le nom de table est validé en temps réel : minuscules, chiffres, _, commence par une lettre, max 63 caractères.
  • Quand un nom de table valide est saisi, une vérification asynchrone (GET /sources/table-check) est déclenchée après 400 ms de debounce.
  • Si la table existe, un banner orange avertit que le contenu sera remplacé — le bouton "Suivant" reste actif.
  • L'étape 3 (confirmation) récapitule fichier, nom de source et table cible avant soumission.
  • En cas d'erreur 400 (parsing), le message de l'API est affiché dans le dialog.
  • En cas d'erreur 404 (fichier supprimé), un message explicite est affiché.
  • Le nombre de lignes importées est visible dans la notification de succès et dans la liste.
  • Les sources sont listées avec statut ACTIVE (badge vert) ou ERROR (badge rouge).
  • Les super-admins voient toutes les sources avec le contexte entreprise/dossier.

5. Tests associés

Tests unitaires back

  • back/src/api/sources/sources.service.spec.ts
    • createSource : happy path, document introuvable
    • checkTable : table inexistante, table existante, document introuvable
    • getSources : filtrage par enterprise_id pour admin, pas de filtre pour super-admin
    • getSource : détail, source introuvable
  • back/src/api/sources/services/file-parser.service.spec.ts
    • CSV : délimiteur virgule et point-virgule, valeurs nulles, absence d'en-tête
    • Excel : XLSX valide, fichier invalide
    • JSON : tableau d'objets, format invalide
    • Extension non supportée
  • back/src/api/sources/services/schema-table.service.spec.ts
    • schemaNameFromEnterpriseUuid : format correct
    • validateTableName : regex, rejet majuscules / chiffres en début / trop long
    • sanitizeIdentifier : accents, espaces, tirets, déduplication
    • checkTableExists : retour boolean depuis information_schema.tables
    • loadTable : création schéma, table, insertion

Tests E2E back (Supertest)

  • back/test/e2e/sources-controller.e2e-spec.ts
    • POST /sources : 401 sans token, 403 non-admin, 400 tableName invalide, 400 documentUuid manquant, 404 document inexistant
    • GET /sources : 401 sans token, 403 non-admin, 200 + format paginé
    • GET /sources/:uuid : 401 sans token, 404 UUID inexistant

Tests unitaires front

  • front/src/__tests__/stores/source-store.spec.js
    • fetchSources : chargement, état loading, erreur
    • createSource : POST + refresh liste, gestion erreur

Tests E2E front (Playwright)

  • front/e2e/pages/admin/admin-sources.spec.js
    • Affichage liste vide avec bouton de création
    • Affichage d'une source ACTIVE dans la liste
    • Happy path — création complète en 3 étapes
    • Warning affiché si la table existe déjà (banner orange non bloquant)
    • Erreur 400 affichée en étape 3 (format invalide)
    • Erreur 404 affichée en étape 3 (document supprimé)
    • Non-admin redirigé hors de /sources