# COPY_V1_CONSOLIDATION.md ## Task lifecycle (copy v1) `POST /api/files/copy`: 1. Request wordt gevalideerd. 2. Bij geldige input wordt direct een task aangemaakt met status `queued`. 3. Een achtergrond-runner zet de task op `running` en vult progress (`done_bytes`, `total_bytes`). 4. Eindstatus: - `completed` bij succesvolle file copy - `failed` bij runtime I/O fout (`error_code = io_error`) ## Validatiefouten vs runtime-fouten Validatiefouten (voor task-creatie): - `invalid_request` - `path_traversal_detected` - `path_outside_whitelist` - `invalid_root_alias` - `path_not_found` - `type_conflict` - `already_exists` Gedrag: - request faalt direct met error response - er wordt geen task aangemaakt Runtime-fouten (na task-creatie): - `io_error` Gedrag: - request zelf retourneert `202` met `task_id` - task gaat naar `failed` - foutdetails verschijnen via `GET /api/tasks/{task_id}` ## Copy metadata in v1 (`copy_file(...)`) V1 kopieert: - file-inhoud (byte stream) - basic filesystem metadata via `copystat` (mtime/atime/mode waar ondersteund) V1 doet niet expliciet: - ownership/ACL normalisatie - extended attributes beleid ## Destination-semantiek (expliciet) `destination` blijft in v1 altijd het volledige doelpad. - Geen impliciete "copy into existing directory" interpretatie. - Als destination al bestaat: `already_exists`.