Appearance
BDD-112 — Amelioration creation de source
1. User Story
En tant qu'administrateur,
Je veux creer une source Heriade depuis l'espace de depot directement,
Afin de rendre les donnees du fichier disponibles et consultables dans la plateforme.
2. Criteres d'acceptation
- L'admin selectionne un fichier depose (CSV, Excel, JSON) depuis un espace de depot.
- L'action Creer une source est disponible dans le menu d'actions d'un document compatible.
- Cette action est visible uniquement pour les roles
administrateuretsuper-admin. - L'admin est redirige vers
/sources/createdirectement en etape 2 avec le fichier preselectionne. - Si le fichier a disparu (supprime/deplace), un message d'erreur explicite est affiche et le flux revient en etape 1.
- La creation devient une page dediee
sources/createen conservant la logique deja implementee (wizard 3 etapes). - Pour
super-admin, une recherche par nom de fichier est disponible. - La recherche de fichiers est faite cote backend et la pagination reste coherente avec le resultat filtre.
- Pour
admin, les fichiers sont recuperes uniquement dans le dossier selectionne (sans descendants).
3. Perimetre fonctionnel
Frontend
| Fichier | Role |
|---|---|
front/src/components/documents/DocumentListItem.vue | Ajout de l'action Creer une source conditionnelle (role + extension) |
front/src/pages/admin/folders/AdminFolderDetailPage.vue | Gestion de l'action create-source et redirection vers /sources/create avec documentUuid + folderUuid |
front/src/pages/admin/sources/AdminSourcesPage.vue | Le bouton Nouvelle source redirige vers la page dediee /sources/create |
front/src/pages/admin/sources/AdminSourceCreatePage.vue | Nouvelle page wizard de creation (3 etapes), prefill depuis query params, gestion erreur fichier introuvable, recherche super-admin |
front/src/router/routes.js | Ajout de la route protegee /sources/create |
Backend
| Fichier | Role |
|---|---|
back/src/api/folders/folder.controller.ts | Ajout du query param search sur GET /folders/:uuid/documents |
back/src/api/folders/folder.service.ts | Filtrage search sur documents.name applique avant pagination et count |
4. Endpoints API (rappel)
| Methode | Chemin | Description |
|---|---|---|
GET | /folders/:uuid/documents | Liste des documents d'un dossier (pagination, includeDescendants, search) |
GET | /sources/table-check | Verification d'existence de table cible |
GET | /sources/preview | Apercu du fichier avant import |
POST | /sources | Creation de source depuis un document |
5. Regles metier implementees
- L'action Creer une source est affichee uniquement si :
- utilisateur
administrateurousuper-admin - extension document compatible (
.csv,.xls,.xlsx,.json)
- utilisateur
- Depuis un dossier, la redirection vers
/sources/createtransporte le contexte :documentUuidfolderUuid
- A l'arrivee sur
/sources/create:- si le document existe encore, passage automatique en etape 2
- sinon, message d'erreur et retour en etape 1
admin:GET /folders/:uuid/documentsavecincludeDescendants=falsesuper-admin:GET /folders/:uuid/documentsavecincludeDescendants=true- Recherche super-admin :
- saisie debouncee cote front
- filtre applique cote backend (
contains, insensitive) avant pagination - pagination basee sur
totalfiltre
6. Points de verification
- Le menu d'action document affiche Creer une source uniquement quand attendu.
- Le clic sur Creer une source redirige vers
/sources/create. - Le wizard
/sources/createconserve les 3 etapes existantes. - Le pre-remplissage depuis dossier place bien l'utilisateur en etape 2.
- Le cas fichier supprime/deplace affiche une erreur explicite.
- Pour
super-admin, la barre de recherche est visible et active. - La recherche impacte bien la pagination (total/page cohérents).
- Pour
admin, la recherche n'est pas exposee et seuls les fichiers du dossier sont listes.
7. Tests associes
Backend (unitaires)
back/src/api/folders/folder.service.spec.ts- filtre
searchsurfindDocuments searchapplique afindManyetcounttrimdusearch
- filtre
Backend (e2e)
back/test/e2e/folders-controller.e2e-spec.tsGET /folders/:uuid/documentsavecsearchfiltre avant pagination- verification page 1 / page 2 sur resultat filtre
Frontend (unitaires)
front/src/__tests__/components/documents/DocumentListItem.spec.js- affichage conditionnel de l'action Creer une source
- emission de l'evenement
create-source
front/src/__tests__/pages/admin/folders/AdminFolderDetailPage.spec.js- propagation
canCreateSource - redirection vers
/sources/createavec query params
- propagation
front/src/__tests__/pages/admin/sources/AdminSourcesPage.spec.js- bouton Nouvelle source redirige vers
/sources/create
- bouton Nouvelle source redirige vers
front/src/__tests__/pages/admin/sources/AdminSourceCreatePage.spec.js- comportement
adminvssuper-admin - requete documents avec
includeDescendants/search
- comportement
front/src/__tests__/router/routes.spec.js- presence de la route
/sources/create
- presence de la route
Frontend (e2e)
front/e2e/pages/admin/admin-sources.spec.js- creation depuis la page
/sources/create(happy path + erreurs 400/404) - warning table existante
- controle d'acces non-admin
- creation depuis la page
front/e2e/pages/admin/admin-folder-detail.spec.js- presence de l'action Creer une source dans le menu document
8. Notes d'implementation
- La logique de droits reste verifiee cote backend ; l'affichage front est un confort UX.
- Le filtrage backend sur le nom de fichier est indispensable pour garder une pagination juste.
- La redirection depuis les dossiers vers
sources/createreduit la friction sans changer le comportement metier de creation.
9. Complements implementes (refacto store-first)
Refactor front : appels API centralises dans les stores
front/src/pages/admin/sources/AdminSourceCreatePage.vue- suppression des appels directs a
boot/axiospour :GET /folders/:uuid/documentsGET /sources/table-checkGET /sources/preview
- remplacement par des actions store :
folderStore.getFolderDocuments(...)sourceStore.checkTableName(...)sourceStore.getSourcePreview(...)
- suppression des appels directs a
front/src/components/sources/SourceReloadDialog.vue- suppression des appels directs a
boot/axiospour :GET /folders/:uuid/documentsGET /sources/preview
- remplacement par des actions store :
folderStore.getFolderDocuments(...)sourceStore.getSourcePreview(...)
- suppression des appels directs a
front/src/stores/folder-store.js- ajout de
getFolderDocuments(uuid, { page, limit, search, includeDescendants, notifyOnError }) fetchFolderDocuments(...)reutilise maintenantgetFolderDocuments(...)pour eviter la duplication.
- ajout de
front/src/stores/source-store.js- ajout de
checkTableName({ tableName, documentUuid }) - ajout de
getSourcePreview({ documentUuid })
- ajout de
Tests mis a jour / ajoutes
front/src/__tests__/stores/folder-store.spec.js- couverture de
getFolderDocuments(...):- params
includeDescendantsetsearch(trim) - cas
searchvide - gestion
notifyOnError: false
- params
- verification que
fetchFolderDocuments(...)passe bien pargetFolderDocuments(...).
- couverture de
front/src/__tests__/stores/source-store.spec.js- couverture de
checkTableName(...) - couverture de
getSourcePreview(...).
- couverture de
front/src/__tests__/pages/admin/sources/AdminSourceCreatePage.spec.js- adaptation des mocks vers approche store-first :
getFolderDocumentscheckTableNamegetSourcePreview
- verification des appels attendus sur ces methodes.
- adaptation des mocks vers approche store-first :
front/src/__tests__/components/sources/SourceReloadDialog.spec.js- ajout d'un test composant dedie pour valider :
- chargement des documents via
folderStore.getFolderDocuments(...) - chargement de l'apercu via
sourceStore.getSourcePreview(...).
- chargement des documents via
- ajout d'un test composant dedie pour valider :
