Appearance
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
- L'admin sélectionne un fichier déposé (CSV, Excel, JSON) depuis un espace de dépôt.
- L'admin nomme librement la source (ex. "RH Effectifs 2026", "Balance Avril").
- 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é).
- Le fichier est chargé en table dans le schéma dédié de l'entreprise (
schema_{uuid_entreprise}). - Une confirmation avec le nombre de lignes chargées est affichée.
- 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èlesources)
Endpoints
| Méthode | Route | Rôle |
|---|---|---|
POST | /sources | Créer une source depuis un document |
GET | /sources | Lister les sources (paginé, scopé entreprise) |
GET | /sources/table-check | Vérifier si une table existe déjà |
GET | /sources/:uuid | Détail d'une source |
4. Points de vérification
- La page
/sourcesest accessible uniquement aux admins (guardsourcesGuardredirige 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) ouERROR(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.tscreateSource: happy path, document introuvablecheckTable: table inexistante, table existante, document introuvablegetSources: filtrage parenterprise_idpour admin, pas de filtre pour super-admingetSource: 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.tsschemaNameFromEnterpriseUuid: format correctvalidateTableName: regex, rejet majuscules / chiffres en début / trop longsanitizeIdentifier: accents, espaces, tirets, déduplicationcheckTableExists: retour boolean depuisinformation_schema.tablesloadTable: création schéma, table, insertion
Tests E2E back (Supertest)
back/test/e2e/sources-controller.e2e-spec.tsPOST /sources: 401 sans token, 403 non-admin, 400 tableName invalide, 400 documentUuid manquant, 404 document inexistantGET /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.jsfetchSources: chargement, état loading, erreurcreateSource: 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
