XingfenD
fbd5cd243d
feat(upload): extract upload subsystem + move sweep to scanner ticker (B16)
...
- internal/upload owns chunked-upload domain logic (fingerprint resume,
part tmp+rename, assemble, session sweep) and the shared UniquePath
helper used by both single-file and chunked completion paths
- handlers/uploads.go is now HTTP-only: bind params, call upload.U, map
sentinel errors to the unchanged status/code/message contract
- B16: session sweep moved out of the UploadInit request path onto the
scanner ticker via a Sweeper hook (upload.U satisfies it)
- unit tests for the package without PG/Redis; contract pinned by the
existing handler integration tests (all green)
2026-09-14 22:00:25 +08:00
XingfenD
08b81fde60
fix(upload): retry on O_EXCL collision in single-file upload (B12)
2026-09-14 19:45:08 +08:00
XingfenD
8023a7ec5c
fix(serve): check cover write errors, clean tmp only on failure path (B11)
2026-09-14 19:43:27 +08:00
XingfenD
0c5dfd4353
fix(library): reject reserved names (cache, .uploads) with 400 reserved_name (B8)
2026-09-14 19:42:52 +08:00
XingfenD
0e62d4aa18
fix(handlers): Upload io.Copy error → 500 not 413 (B6), Me distinguishes no-rows from DB errors (B7)
2026-09-14 19:42:25 +08:00
XingfenD
b82a891c50
fix: upload part tmp+rename (B4), transactional last-admin DeleteUser (B5), RowsAffected order (B13)
2026-09-14 19:42:11 +08:00
XingfenD
2c2f6d3116
chore: gofmt content_test.go
2026-09-14 19:38:33 +08:00
XingfenD
f0437139f3
fix(main): channel-based serve error instead of log.Fatalf in goroutine (B14)
2026-09-14 19:36:57 +08:00
XingfenD
0fe3bc3057
feat(bookmarks): api+store — per-user CRUD, owner-scoped 404, percent-ordered list
2026-09-08 01:03:44 +08:00
XingfenD
b8da9fd92e
feat(cbz): adapt reader to real archive structure — PageIndex skips macOS junk (__MACOSX/ and ._ AppleDouble were polluting pages with 163-byte blacks), pages endpoint derives chapters[{title,start}] from folder layout, imageless zip now lands state=error instead of an empty reader, CbzReader gains 目录 sidebar + prev/next chapter (TextReader pattern, rd-* classes); pagesidx cache key bumped for one-time invalidation; e2e on 311MB 調教開關:第二季.zip: 15048→7524 real pages, 52 chapters, all JPEGs
2026-09-08 00:22:13 +08:00
XingfenD
7d650107d2
feat(upload): resumable chunked upload protocol for large files — init(parts≤32MB)/status/complete endpoints with fingerprint-derived deterministic uploadId (same file resumes, no restart), sessions in BOOKS_DIR/.uploads with 24h sweep, frontend uploadBook auto-switches >16MB to 8MB parts (retry x3 in place, skip received); oversize single POST now reports honest 413 too_large instead of "multipart field 'file' required" (was MaxBytesReader abort mislabeled); UPLOAD_MAX_MB wired into both compose stacks (cap total, .env.example 2048), nginx body limit drops to 32m; testCfg limit 1MB, CJK/fullwidth-colon filename proven unaffected; e2e verified with 311MB real file (39 parts, sha1 match)
2026-09-07 23:56:40 +08:00
XingfenD
45eefd6741
feat(libs): create library by name only; root_path derived server-side as BOOKS_DIR/SafeName(name), validated at creation; drop root_path input from admin UI; align changelogs to bilingual template; trim AGENTS.md to rules not derivable from repo layout
2026-09-07 21:56:59 +08:00
XingfenD
ca64bc0d73
refactor(repo): conform structure to AGENTS.md (web->frontend, internal/api->cmd/webui/{api,handlers}, docs/README+CHANGELOGs, module .gitignores, drop stray library/ and committed debug bins)
2026-09-07 21:37:30 +08:00
XingfenD
04095b5438
feat(backend): main wiring, graceful shutdown, local smoke green
2026-09-06 19:52:42 +08:00