191 lines
7.0 KiB
Markdown
191 lines
7.0 KiB
Markdown
# 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
|