Appearance
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
- Le déplacement est possible par glisser-déposer vers un dossier visible.
- Le déplacement est possible via un menu contextuel « Déplacer vers... » avec sélection du dossier cible dans l'arborescence.
- Le fichier apparaît immédiatement dans le dossier cible après déplacement.
- Le déplacement met à jour le rattachement du fichier en base sans ré-upload du binaire S3.
3. Périmètre fonctionnel
Backend
| Fichier | Rôle |
|---|---|
back/src/api/folders/folder.controller.ts | Endpoint PATCH /folders/:uuid/documents/:docUuid/move |
back/src/api/folders/folder.service.ts | Contrôles d'accès source/cible + mise à jour du document vers le dossier cible |
back/src/api/folders/dto/folder.dto.ts | DTO MoveFolderDocumentRequestDto (targetFolderUuid) |
back/test/e2e/folders-controller.e2e-spec.ts | Scénarios e2e IDOR et succès du déplacement |
Frontend
| Fichier | Rôle |
|---|---|
front/src/pages/admin/folders/AdminFolderDetailPage.vue | Déplacement par drag-and-drop + orchestration du move via menu contextuel |
front/src/components/documents/DocumentListItem.vue | Action menu « Déplacer vers... » |
front/src/components/documents/FolderTargetDialog.vue | Sélection du dossier cible dans une arborescence (q-tree, lazy-load) |
front/src/stores/folder-store.js | Action moveFolderDocument(sourceFolderUuid, docUuid, targetFolderUuid) |
front/e2e/pages/admin/admin-folder-detail.spec.js | Vérifications e2e du flux UI de déplacement |
4. Endpoints API (rappel)
| Méthode | Chemin | Description |
|---|---|---|
PATCH | /folders/:uuid/documents/:docUuid/move | Dé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
- succès du
Backend (e2e)
back/test/e2e/folders-controller.e2e-spec.tsPATCH .../moverefusé en accès inter-entreprise (403)PATCH .../moveautorisé intra-entreprise (200) + vérification defolder_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/moveavectargetFolderUuid
- appel
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.
