Skip to content

BDD-41 — Déplacement de fichiers

1. User Story

En tant que client externe (entreprise) ou super administrateur,
Je veux déplacer un fichier vers un autre dossier ou sous-dossier,
Afin d'organiser mon arborescence.

2. Critères d'acceptation

  1. Le déplacement est possible par glisser-déposer vers un dossier visible.
  2. Le déplacement est possible via un menu contextuel « Déplacer vers... » avec sélection du dossier cible dans l'arborescence.
  3. Le fichier apparaît immédiatement dans le dossier cible après déplacement.
  4. Le déplacement met à jour le rattachement du fichier en base sans ré-upload du binaire S3.

3. Périmètre fonctionnel

Backend

FichierRôle
back/src/api/folders/folder.controller.tsEndpoint PATCH /folders/:uuid/documents/:docUuid/move
back/src/api/folders/folder.service.tsContrôles d'accès source/cible + mise à jour du document vers le dossier cible
back/src/api/folders/dto/folder.dto.tsDTO MoveFolderDocumentRequestDto (targetFolderUuid)
back/test/e2e/folders-controller.e2e-spec.tsScénarios e2e IDOR et succès du déplacement

Frontend

FichierRôle
front/src/pages/admin/folders/AdminFolderDetailPage.vueDéplacement par drag-and-drop + orchestration du move via menu contextuel
front/src/components/documents/DocumentListItem.vueAction menu « Déplacer vers... »
front/src/components/documents/FolderTargetDialog.vueSélection du dossier cible dans une arborescence (q-tree, lazy-load)
front/src/stores/folder-store.jsAction moveFolderDocument(sourceFolderUuid, docUuid, targetFolderUuid)
front/e2e/pages/admin/admin-folder-detail.spec.jsVérifications e2e du flux UI de déplacement

4. Endpoints API (rappel)

MéthodeCheminDescription
PATCH/folders/:uuid/documents/:docUuid/moveDéplace un document du dossier source (:uuid) vers un dossier cible (targetFolderUuid)

Body requis :

json
{
  "targetFolderUuid": "34f4cc93-b0af-473d-a939-e8ce8b72501d"
}

5. Règles métier implémentées

  • Le dossier source et le dossier cible doivent exister et être actifs.
  • Le dossier source et le dossier cible doivent appartenir à la même entreprise.
  • Le document doit exister dans le dossier source.
  • Le déplacement met à jour le rattachement en base (folder_id) vers le dossier cible.
  • Le binaire S3 n'est pas rechargé (pas de copie/suppression physique S3 dans ce ticket).

6. Points de vérification

  • Le menu d'actions document affiche « Déplacer vers... ».
  • L'ouverture du dialogue affiche l'arborescence depuis la racine du contexte courant.
  • Le bouton de confirmation reste inactif tant qu'aucun dossier cible valide n'est sélectionné.
  • Le drag-and-drop vers un sous-dossier visible déclenche le même endpoint de déplacement.
  • Après succès, la vue se rafraîchit immédiatement pour refléter le nouvel emplacement du fichier.
  • Un utilisateur d'une autre entreprise ne peut pas déplacer un document (protection IDOR).

7. Tests associés

Backend (unitaires)

  • back/src/api/folders/folder.service.spec.ts
    • succès du moveDocument
    • source = cible refusé
    • dossier source/cible absent
    • entreprises différentes refusées
    • document absent dans source

Backend (e2e)

  • back/test/e2e/folders-controller.e2e-spec.ts
    • PATCH .../move refusé en accès inter-entreprise (403)
    • PATCH .../move autorisé intra-entreprise (200) + vérification de folder_id

Frontend (unitaires)

  • front/src/__tests__/components/documents/DocumentListItem.spec.js
    • présence de l'action « Déplacer vers... »
    • emission move-document
  • front/src/__tests__/components/documents/FolderTargetDialog.spec.js
    • chargement de l'arborescence
    • sélection cible + confirmation
    • lazy-load enfants
  • front/src/__tests__/pages/admin/folders/AdminFolderDetailPage.spec.js
    • déplacement par drag-and-drop
    • déplacement via popup « Déplacer vers... »
  • front/src/__tests__/stores/folder-store.spec.js
    • appel PATCH /folders/:sourceUuid/documents/:docUuid/move avec targetFolderUuid

Frontend (e2e)

  • front/e2e/pages/admin/admin-folder-detail.spec.js
    • présence de l'entrée menu « Déplacer vers... »
    • ouverture de la popup de sélection cible
    • déplacement effectif et rafraîchissement de la liste

8. Notes d'implémentation

  • Le composant de sélection de cible est volontairement générique (FolderTargetDialog) pour réutilisation future (autres objets que document).
  • Le déplacement UI (drag-and-drop ou menu contextuel) réutilise le même flux métier front (moveFolderDocument).
  • Le stockage S3 reste stable dans ce ticket : on déplace le fichier dans l'arborescence applicative sans migration physique d'objet.