# 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
