# Delete API

This page explains how `DELETE /del/*path` moves a file or folder into a date-bucketed trash, and how to restore it.

## Request

```bash
# Delete a single file
curl -X DELETE http://localhost:8080/del/blog/2025/ERftP1gTS7WCTeJ8_1744080848530.jpg

# Delete an entire folder
curl -X DELETE http://localhost:8080/del/blog/2025
```

`*path` is relative to `storage/image/upload/` and may point at a file or a folder.

## Move Rules

| Step | Behavior |
|---|---|
| 1 | `os.Stat` confirms the target exists and checks whether it is a folder |
| 2 | Create `storage/image/upload/.trash/YYYY-MM-DD/` (server local date) |
| 3 | Destination is `.trash/YYYY-MM-DD/{file or folder name}`; only the last path segment is kept, not the original parent path |
| 4 | A same-day name collision renames to `{name}_{millisecond timestamp}{extension}` |
| 5 | `os.Rename` moves it |

The trash sits under `upload/` but starts with `.`; Nginx's `location ~ /\.` denies any path containing `/.`, so trash contents cannot be read through Nginx.

## Responses

| Status | Body | Case |
|---|---|---|
| `200` | `{"success":1,"message":"move path to: ..."}` | File moved |
| `200` | `{"success":1,"message":"move folder to: ..."}` | Folder moved |
| `400` | `please assign a path first` | Empty `*path` |
| `400` | `path not found: ...` | Target does not exist |
| `400` | `can not create folder: ...` / `can not move file: ...` | Trash creation or move failed |
| `408` | `timed out` | Exceeded 30 seconds |

The path in `message` is the absolute path on the server.

## Restore and Cache

To restore, move the item from `.trash/YYYY-MM-DD/` back to its original location under `storage/image/upload/`. Deletion does not purge transformed caches, so existing size variants keep being served; see [Caching Layers](/caching#invalidation).
