- refactor: replace inline AppError literals with model.New*Error
constructors in service and handler layers
- feat: PromoteStaged falls back to copy/delete when os.Rename returns
EXDEV (cross-device link)
- fix: upload error messages no longer leak internal multipart field
names or parser implementation details
- fix: upload size violations are converted to domain error
ErrUploadTooLarge at the handler boundary
- fix: download logs error and size mismatch when io.Copy fails or
writes fewer bytes than expected
- test: add tests for field name leak prevention, parser error
sanitization, read errors after response start, and EXDEV fallback
- fix: replace multipart form parsing with streaming multipart reads and
apply request body limits when max_upload_size is configured.
- refactor: route uploads through staging paths before promotion to
long-term data paths, keeping incomplete uploads out of durable
storage records.
- test: cover oversized uploads, unlimited uploads, staged cleanup, and
local storage promotion boundaries.
- docs: document the staged upload model and multipart parent_id query
parameter.
- Initialize slog in the serve command with terminal/file support
- Introduce `AppError` with HTTP status for unified service-layer errors
- Replace ad-hoc `api.Error` calls with `api.RespondError`
- Wrap internal errors with `model.NewInternalError` and add reference
IDs
- Add `RequestID` middleware and switch router from `gin.Default` to
`gin.New`
- Implement FileHandler with CRUD operations for files/directories
- Add FileService with business logic and SHA-256 hashing
- Create LocalStorage backend for filesystem persistence
- Add database repository with pagination and name uniqueness
constraints
- Configure max upload size in storage settings
- Include comprehensive tests for all layers