XingfenD
7baadedeb4
refactor(handlers): consume port interfaces, wire media+upload assembly (Task 25+26)
...
- H now holds only small port interfaces (UserStore/LibraryStore/BookStore/
ProgressStore/BookmarkStore/RateLimiter/Scanner/Media/UploadSessions);
NewRouter is the composition root distributing *store.Store and *redispkg.R
- ports.Media gains EnsurePage; ChaptersOf returns ports.Chapter (media's
local duplicate dropped); *media.M now provably satisfies ports.Media;
ports.UploadSessions gains LibraryID for root validation before Complete
- content.go: duplicated page-index cache + cover self-heal + page extract
logic removed in favor of media service — same redis keys, same contract;
path traversal check stays in handler (403 semantics preserved)
- getLibrary/getLibRow merged into getLib(c, id); idParam helper dedupes
:id parsing; isUnique replaced by ports.IsUniqueViolation (Task 28 partial)
- main.go assembles media + upload and passes upload.U as scanner Sweeper
Full gate green: gofmt, vet, go test -p 1 (real PG+Redis, 0 skip)
2026-09-14 22:56:15 +08:00
XingfenD
b9b7022212
refactor(scanner): merge add/update into ingest, use shared utilities
...
- add/update consolidated into ingest(isNew) — persist branch differs,
error handling and cover path fully shared (Task 24)
- zipIndex/cover use bookfile.OpenReaderAt instead of hand-rolled
open+stat pairs
- root containment check uses bookfile.Contains (local inside removed)
- cover write goes through media.WriteAtomic (now exported, log-free —
callers own context); media no longer logs inside the atomic helper
2026-09-14 22:12:30 +08:00
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
443f4acfa9
feat(media): Media service with EnsureCover, EnsurePage, PageIndex, ChaptersOf, writeAtomic
CI / frontend (push) Canceled after 0s
CI / backend (push) Canceled after 0s
2026-09-14 19:50:34 +08:00
XingfenD
5ad277241c
feat(bookfile): add Contains and OpenReaderAt utilities
2026-09-14 19:49:50 +08:00
XingfenD
18bd32e0f6
refactor(store): split into per-aggregate files, unexport pool, remove dead ListBookIDs
2026-09-14 19:49:18 +08:00
XingfenD
0c3b34c184
feat(ports): define consumer-side interfaces, sentinel errors, IsUniqueViolation
2026-09-14 19:47:27 +08:00
XingfenD
f99f5a7878
docs: changelog for batch B (B1-B13 bug fixes); gofmt store.go
2026-09-14 19:46:16 +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
8fbc58eaaa
fix(redis,scanner): atomic IncrWindow Lua, lock rand/ctx fixes, ScanLock renewal, single-flight, error logging (B1,B2,B3,B9,B10,B11)
2026-09-14 19:40:53 +08:00
XingfenD
2c2f6d3116
chore: gofmt content_test.go
2026-09-14 19:38:33 +08:00
XingfenD
26111e73af
docs: changelog + README updates for batch A (migrations, CI, B14/B15/B17)
2026-09-14 19:38:16 +08:00
XingfenD
b63d50e04b
fix(smoke): drop ignored root_path field, align with API contract (B17)
2026-09-14 19:37:42 +08:00
XingfenD
f26aac103b
fix(config): validate DATABASE_URL required and parseable, log redis disabled (B15)
2026-09-14 19:37:26 +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
161128cac0
ci: add GitHub Actions workflow (Gitea Actions compatible)
2026-09-14 19:36:31 +08:00
XingfenD
6d3d23c3f9
feat(db): ordered migration system with advisory lock and baseline detection
2026-09-14 19:36:21 +08:00
XingfenD
c9b32db592
docs(plan): backend hardening implementation plan — 29 tasks across 3 batches
2026-09-14 19:33:30 +08:00
XingfenD
942a9952ca
docs(spec): clarify batch attribution for B8/B9-2 (depend on batch-C packages)
2026-09-14 19:14:45 +08:00
XingfenD and CommandCodeBot
2cf842af9e
docs(spec): backend hardening design — migrations, 17 bug fixes, ports/internal restructure, CI
...
Co-authored-by: CommandCodeBot <noreply@commandcode.ai >
2026-09-14 16:55:44 +08:00
XingfenD
a22b44be06
Merge branch 'fix/cbz-end-chapter-jump'
2026-09-08 22:45:20 +08:00
XingfenD
2e43cb2423
fix(web): stop CBZ reader snapping/bouncing at chapter end on mixed-orientation books
2026-09-08 22:42:05 +08:00
XingfenD
90b39d4f97
Merge branch 'feat/ui-redesign'
2026-09-08 21:48:41 +08:00
XingfenD
fd227c1f00
feat(web): table-style 库管理, admin entries under avatar 系统管理, shelf-view upload button
2026-09-08 21:45:03 +08:00
XingfenD
3178c2802f
refactor(web): extract prefetch slider into reusable RdSlider component
2026-09-08 21:31:20 +08:00
XingfenD
472e58bec9
fix(web): unify 更多 menu text size, add 0-3 tick anchors under prefetch slider
2026-09-08 21:30:26 +08:00
XingfenD
d2c852d6f0
feat(web): iconify reader chrome, move 连读/预读 into 更多 menu with slider
2026-09-08 21:29:01 +08:00
XingfenD
9c2b7e2074
feat(web): collapse reader toc/bookmark buttons into single 导航 toolbar button
2026-09-08 21:11:16 +08:00
XingfenD
65e07a0890
chore: ignore tsc buildinfo artifact
2026-09-08 21:08:52 +08:00
XingfenD
48161ea1ff
feat(web): unify reader TOC and bookmarks into one left nav drawer with tabs
2026-09-08 21:08:42 +08:00
XingfenD
4f4c7e5434
chore: gitignore playwright artifacts
2026-09-08 20:48:38 +08:00
XingfenD
6fbe3b0794
fix(web): active lib highlight, rail a11y names, card focus ring, AA accent + destructive tokens, touch-reachable menu, brand wordmark, chrome unify
2026-09-08 20:37:20 +08:00
XingfenD
7e0847815d
docs(changelog): phase-1 modern redesign — shadcn tokens, dual theme, app shell, rebuilt public surfaces
2026-09-08 19:37:38 +08:00
XingfenD
7727baa25b
fix(web): theme menu items fire on keyboard select (onSelect)
2026-09-08 19:19:45 +08:00
XingfenD
dcaf502de6
feat(ui): admin pages on shadcn table/card/alert-dialog; drop TopBar, trim icons/ui.ts to reader-compat surface
2026-09-08 19:14:41 +08:00
XingfenD
273f35a42f
fix(web): shelf search debounce merges against live searchParams (no lost sort/group clicks)
2026-09-08 19:08:05 +08:00
XingfenD
b1c0db6c03
feat(ui): shelf rebuilt — sticky toolbar (search/sort/group in URL), rail, menu cards, alert-dialog delete
2026-09-08 18:58:16 +08:00
XingfenD
d9e9e95ece
feat(ui): login rebuilt on shadcn card/label/input, theme toggle available pre-auth
2026-09-08 17:47:17 +08:00
XingfenD
52e95a48d8
fix(ui): gate app sidebar to md+ and use onSelect for logout (keyboard path)
2026-09-08 17:41:29 +08:00
XingfenD
7957e5cee5
feat(ui): AppShell layout route — desktop rail, tablet icon rail, mobile tabs, theme toggle
2026-09-08 17:35:14 +08:00
XingfenD
913f3286bb
feat(lib): shelf sort/section pure helpers + formatSize extraction, table tests
2026-09-08 17:29:07 +08:00
XingfenD
03bc537308
feat(ui): semantic light/dark tokens, ThemeProvider with FOUC guard, token-restyle Toaster/Cover
2026-09-08 17:17:44 +08:00
XingfenD
87b7545a94
feat(ui): shadcn/radix toolchain — deps, @ alias, cn, generated primitives
2026-09-08 17:07:28 +08:00
XingfenD
ee676c2d2e
docs(plan): modern redesign phase-1 implementation plan — 8 tasks from toolchain to acceptance walkthrough
2026-09-08 17:02:02 +08:00
XingfenD
b8a5b3deb6
docs(design): phase-1 modern redesign spec — shadcn/radix foundation, dual theme, app shell, shelf/admin rebuild; readers deferred to phase 2
2026-09-08 16:49:46 +08:00
XingfenD
2721df8ea9
fix(web): upload toast always showed 0 files (live FileList read after input reset); snapshot before upload
2026-09-08 16:22:12 +08:00