Skip to content

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

  1. L'admin selectionne un fichier depose (CSV, Excel, JSON) depuis un espace de depot.
  2. L'action Creer une source est disponible dans le menu d'actions d'un document compatible.
  3. Cette action est visible uniquement pour les roles administrateur et super-admin.
  4. L'admin est redirige vers /sources/create directement en etape 2 avec le fichier preselectionne.
  5. Si le fichier a disparu (supprime/deplace), un message d'erreur explicite est affiche et le flux revient en etape 1.
  6. La creation devient une page dediee sources/create en conservant la logique deja implementee (wizard 3 etapes).
  7. Pour super-admin, une recherche par nom de fichier est disponible.
  8. La recherche de fichiers est faite cote backend et la pagination reste coherente avec le resultat filtre.
  9. Pour admin, les fichiers sont recuperes uniquement dans le dossier selectionne (sans descendants).

3. Perimetre fonctionnel

Frontend

FichierRole
front/src/components/documents/DocumentListItem.vueAjout de l'action Creer une source conditionnelle (role + extension)
front/src/pages/admin/folders/AdminFolderDetailPage.vueGestion de l'action create-source et redirection vers /sources/create avec documentUuid + folderUuid
front/src/pages/admin/sources/AdminSourcesPage.vueLe bouton Nouvelle source redirige vers la page dediee /sources/create
front/src/pages/admin/sources/AdminSourceCreatePage.vueNouvelle page wizard de creation (3 etapes), prefill depuis query params, gestion erreur fichier introuvable, recherche super-admin
front/src/router/routes.jsAjout de la route protegee /sources/create

Backend

FichierRole
back/src/api/folders/folder.controller.tsAjout du query param search sur GET /folders/:uuid/documents
back/src/api/folders/folder.service.tsFiltrage search sur documents.name applique avant pagination et count

4. Endpoints API (rappel)

MethodeCheminDescription
GET/folders/:uuid/documentsListe des documents d'un dossier (pagination, includeDescendants, search)
GET/sources/table-checkVerification d'existence de table cible
GET/sources/previewApercu du fichier avant import
POST/sourcesCreation de source depuis un document

5. Regles metier implementees

  • L'action Creer une source est affichee uniquement si :
    • utilisateur administrateur ou super-admin
    • extension document compatible (.csv, .xls, .xlsx, .json)
  • Depuis un dossier, la redirection vers /sources/create transporte le contexte :
    • documentUuid
    • folderUuid
  • 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/documents avec includeDescendants=false
  • super-admin : GET /folders/:uuid/documents avec includeDescendants=true
  • Recherche super-admin :
    • saisie debouncee cote front
    • filtre applique cote backend (contains, insensitive) avant pagination
    • pagination basee sur total filtre

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/create conserve 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 search sur findDocuments
    • search applique a findMany et count
    • trim du search

Backend (e2e)

  • back/test/e2e/folders-controller.e2e-spec.ts
    • GET /folders/:uuid/documents avec search filtre 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/create avec query params
  • front/src/__tests__/pages/admin/sources/AdminSourcesPage.spec.js
    • bouton Nouvelle source redirige vers /sources/create
  • front/src/__tests__/pages/admin/sources/AdminSourceCreatePage.spec.js
    • comportement admin vs super-admin
    • requete documents avec includeDescendants/search
  • front/src/__tests__/router/routes.spec.js
    • presence de la route /sources/create

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
  • 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/create reduit 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/axios pour :
      • GET /folders/:uuid/documents
      • GET /sources/table-check
      • GET /sources/preview
    • remplacement par des actions store :
      • folderStore.getFolderDocuments(...)
      • sourceStore.checkTableName(...)
      • sourceStore.getSourcePreview(...)
  • front/src/components/sources/SourceReloadDialog.vue

    • suppression des appels directs a boot/axios pour :
      • GET /folders/:uuid/documents
      • GET /sources/preview
    • remplacement par des actions store :
      • folderStore.getFolderDocuments(...)
      • sourceStore.getSourcePreview(...)
  • front/src/stores/folder-store.js

    • ajout de getFolderDocuments(uuid, { page, limit, search, includeDescendants, notifyOnError })
    • fetchFolderDocuments(...) reutilise maintenant getFolderDocuments(...) pour eviter la duplication.
  • front/src/stores/source-store.js

    • ajout de checkTableName({ tableName, documentUuid })
    • ajout de getSourcePreview({ documentUuid })

Tests mis a jour / ajoutes

  • front/src/__tests__/stores/folder-store.spec.js

    • couverture de getFolderDocuments(...) :
      • params includeDescendants et search (trim)
      • cas search vide
      • gestion notifyOnError: false
    • verification que fetchFolderDocuments(...) passe bien par getFolderDocuments(...).
  • front/src/__tests__/stores/source-store.spec.js

    • couverture de checkTableName(...)
    • couverture de getSourcePreview(...).
  • front/src/__tests__/pages/admin/sources/AdminSourceCreatePage.spec.js

    • adaptation des mocks vers approche store-first :
      • getFolderDocuments
      • checkTableName
      • getSourcePreview
    • verification des appels attendus sur ces methodes.
  • 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(...).