Files
webmanager-mvp/project_docs/BATCH_DIRECTORY_MOVE_V1_DESIGN.md
T
2026-03-11 16:21:00 +01:00

7.0 KiB

Batch Directory Move v1

1. Scope

Doel van batch directory move v1 is het gecontroleerd ondersteunen van verplaatsingen voor meerdere geselecteerde items via de bestaande move/task-flow, zonder de huidige file-flow te destabiliseren.

Aanbevolen v1-scope:

  • alleen same-root batch move
  • meerdere directories ondersteunen
  • gemengde selectie van files + directories ondersteunen, maar alleen binnen dezelfde root
  • geen cross-root batch directory move
  • geen rollback
  • geen recursive copy-delete move voor directories
  • geen partial rename-semantiek in batchmodus

Niet in scope:

  • cross-root batch directory move
  • batch move met meerdere roots tegelijk
  • batch move met conflictoplossing UI
  • cancel/retry
  • rollback bij gedeeltelijk succes
  • hernoemen per item binnen batch-popup

2. Selectiesituaties

Meerdere directories

  • Toegestaan in v1, mits alle geselecteerde directories binnen dezelfde root vallen.
  • Bestemming is de current path van het inactieve paneel.
  • Elk item krijgt als doelpad: destination_base + / + item.name.

Meerdere files + directories gemengd

  • Toegestaan in v1, mits alle geselecteerde items binnen dezelfde root vallen.
  • Files en directories worden in dezelfde batch verwerkt.
  • Elk item gebruikt dezelfde destination-map semantiek.

1 directory + meerdere files

  • Valt onder gemengde selectie en is dus toegestaan onder dezelfde same-root-regels.

Niet toegestaan in v1

  • selectie die items uit verschillende roots combineert
  • selectie waarbij voor een directory het doelpad in de eigen subtree valt
  • selectie met symlink-source-items
  • selectie waarbij een doelpad al bestaat

3. Same-root versus cross-root

Aanbevolen v1-keuze:

  • batch directory move blijft beperkt tot same-root
  • cross-root batch directory move wordt expliciet geblokkeerd

Motivatie:

  • same-root kan native rename/move gebruiken en sluit aan op de huidige directory move v1
  • cross-root voor directories vereist recursieve copy + delete en introduceert veel meer partial-failure-risico
  • gemengde batch over roots maakt progress, foutafhandeling en rollback aanzienlijk complexer

Geblokkeerde melding in v1:

  • Cross-root batch directory move is not supported in v1

4. Taskmodel

Aanbevolen richting:

  • één task voor de hele batch

Motivatie:

  • sluit beter aan op de gebruikersactie: één batch-confirmatie, één batchresultaat
  • voorkomt een explosie van losse tasks bij grote selecties
  • maakt batchprogress en foutsamenvatting eenvoudiger zichtbaar

Progress:

  • done_items / total_items zijn leidend
  • total_items = aantal geselecteerde top-level items in de batch
  • done_items telt per succesvol verplaatst top-level item op
  • done_bytes / total_bytes blijven null in v1 voor batch directory move
    • ook bij gemengde selectie is het verstandig in v1 item-gebaseerde progress leidend te houden

Failure-semantiek:

  • fail-fast binnen de batchtask
  • bij eerste runtime-fout stopt verdere verwerking
  • task eindigt als failed
  • reeds verplaatste items blijven verplaatst
  • geen rollback in v1

Partial completion model:

  • partial completion wordt impliciet zichtbaar via done_items < total_items
  • failed_item bevat het item waarop de batch stopte
  • geen aparte partial_completed status in v1

5. Backend-impact

Hergebruik:

  • bestaande move-validatie voor individuele file/directory move
  • bestaande task persistence en read-endpoints
  • bestaande same-root native move in filesystem adapter
  • bestaande path_guard containment en symlink-afwijzing

Waarschijnlijke wijzigingen:

  • move service: batchvalidatie en task-creatie voor meerdere items
  • task runner: batch move worker
  • filesystem adapter: hergebruik van bestaande file move en directory move primitives
  • task repository: waarschijnlijk geen schemawijziging nodig als done_items, total_items, current_item, failed_item al volstaan

Belangrijk semantisch behoud:

  • rename voor exact 1 item blijft apart via bestaande rename-flow/F6-popupbeslislogica
  • batchmodus is altijd move, nooit rename

6. UI-impact

Gedrag voor Move-knop en F6:

  • bij meerdere geselecteerde items mag de bestaande batch move-confirmatie worden hergebruikt
  • die confirmatie moet duidelijk tonen:
    • aantal geselecteerde items
    • destination-map
    • dat batch same-root vereist voor directories
  • voor gemengde selectie moet dezelfde batch-confirmatie bruikbaar blijven

Benodigde meldingen:

  • Cross-root batch directory move is not supported in v1
  • Batch move requires all selected items to be in the same root
  • Destination already exists for one or more items
  • Destination cannot be inside source
  • Source must not be a symlink

Aanbeveling:

  • hergebruik bestaande batch confirm-popup
  • geen extra popup-type toevoegen in v1
  • alleen de validatietekst en submit-logica uitbreiden

7. Security en validatie

Per item moeten minimaal deze checks gelden:

  • source ligt binnen whitelist
  • destination-parent ligt binnen whitelist
  • source is geen symlink
  • destination bestaat nog niet
  • directory destination ligt niet in subtree van source
  • same-root verplicht voor directories in batch v1

Gemengde foutgevallen:

  • als selectie meerdere roots bevat: directe validatiefout vóór task-creatie
  • als één item ongeldig is: hele batchcreatie afwijzen vóór task-creatie
  • geen "best effort" pre-validatie waarbij geldige items toch alvast starten

Containment:

  • path_guard blijft leidend voor alle bron- en doelpaden
  • geen vrije pathconstructie buiten bestaande root mapping

8. Teststrategie

Golden tests:

  • batch same-root directories success
  • batch same-root mixed files + directories success
  • batch cross-root directories blocked
  • batch mixed-root selection blocked
  • batch destination exists blocked
  • batch destination inside source blocked
  • batch symlink source blocked
  • batch task failed shape bij runtime io_error

Regressietests:

  • exacte 1 file move-flow blijft ongewijzigd
  • exacte 1 directory same-root move blijft werken
  • batch file-only move blijft werken
  • F6 rename/move voor exact 1 item blijft semantisch gelijk

Securitytests:

  • traversal in één van de source paths
  • traversal in destination base
  • symlink directory source
  • symlink file source binnen gemengde selectie

Runtime edge cases:

  • eerste item succeeds, tweede faalt -> task failed met done_items == 1
  • destination conflict ontdekt vóór task-creatie
  • empty selection blijft no-op in UI, geen backend-aanroep

9. Aanbeveling

Aanbevolen v1-richting met laag regressierisico:

  • ondersteun alleen same-root batch move
  • ondersteun gemengde selectie van files + directories alleen als alle items in dezelfde root zitten
  • gebruik één task per batch
  • gebruik item-based progress (done_items / total_items)
  • fail-fast zonder rollback
  • hergebruik bestaande batch move-confirmatie in de UI

Waarom deze richting:

  • bouwt rechtstreeks voort op de huidige same-root directory move v1 en batch file move
  • beperkt backendcomplexiteit tot validatie + batchrunner, zonder cross-root recursieve directorylogica
  • houdt de UI voorspelbaar: één batchactie, één task, één resultaat
  • minimaliseert regressierisico voor de bestaande single-item file-flow en F6-semantiek