Files
upl/README.md
T
ddidderr 5ca52b5780 feat: assemble completed uploads
Implement POST /api/uploads/{id}/complete. The storage layer now reloads upload
metadata, verifies that every expected chunk exists with the exact expected
length, concatenates chunks in order into a temporary final file, flushes it,
and renames it into data/complete only after assembly succeeds.

The endpoint preserves staging data after completion, rejects incomplete uploads
with a conflict response, and refuses to overwrite an existing completed file.
This keeps failed or duplicate completion attempts explicit rather than silently
clobbering local files.

Extend the model, router, documentation, and test checklist for completion
responses and add integration coverage for successful assembly, incomplete
uploads, staging preservation, and duplicate completion conflicts.

Test Plan:
- just check

Refs: PLAN.md milestone 8
2026-05-30 17:02:59 +02:00

1.6 KiB

upl

upl is a small personal resumable upload service. The intended deployment is:

browser -> nginx -> upl Rust server -> local filesystem

The first implementation milestone provides the Rust server shell and static browser UI. Upload metadata, chunk persistence, resume state, and completion assembly are tracked in PLAN.md and will be added in later coherent slices.

Project Structure

upl
  Rust server
    src/main.rs        binary entrypoint and listener setup
    src/app.rs         Axum router, shared state, static file service
    src/api.rs         HTTP handlers and API error responses
    src/model.rs       JSON request, response, and metadata shapes
    src/storage.rs     local filesystem layout, chunks, and assembly
    src/lib.rs         library surface used by integration tests
  Browser UI
    static/index.html  upload tool markup
    static/styles.css  responsive tool styling
    static/app.js      file-selection behavior
  Validation
    tests/             integration tests for server behavior
    TESTS.md           reusable manual and automated test checklist

Configuration

  • UPL_BIND sets the listen address. It defaults to 127.0.0.1:3000.
  • UPL_STATIC_DIR sets the static asset directory. It defaults to static/ inside this repository.
  • UPL_DATA_DIR sets the upload data directory. It defaults to data/ inside this repository.
  • The server accepts request bodies up to 64 MiB, which leaves room for the planned 16 MiB upload chunks and matches the nginx example in PLAN.md.

Common Commands

Use the justfile for routine tasks:

just check
just run