Commit Graph

152 Commits

Author SHA1 Message Date
neon 9d61ded2ff chore: add OSS readiness files and contributor docs 2026-03-20 00:34:07 -06:00
neon a7df587c1e feat: implement reading session tracking for epub, pdf, and cbz readers 2026-03-19 20:18:09 -06:00
neon 069fa1488c feat: add user-level statistics pipeline and dashboard charts 2026-03-19 18:05:22 -06:00
neon d65a4815bc feat(stats): add advanced analytics charts and defaults 2026-03-19 08:11:17 -06:00
neon 6557a2b9e1 feat(metadata): add runtime provider throttle status in settings 2026-03-19 05:32:17 -06:00
neon 9adf7fc85b fix(metadata): enforce genre provider scope and update resolver tests 2026-03-18 12:04:20 -06:00
neon 55c28195d6 fix(server): use insert-first upsert for genre/author/tag race condition 2026-03-18 11:53:37 -06:00
neon 9ef641e650 feat: add audit logging system
- audit_log table with action, resource, resourceId, description, ip, countryCode, meta
- AuditEventsService (EventEmitter), AuditRepository, AuditService, AuditInterceptor
- @Auditable decorator wired on all mutating endpoints across every controller
- auth events (login, logout, register, password change, failed login) emitted directly in AuthService with IP capture
- geoip-lite for offline IP-to-country resolution
- nightly retention cleanup via cron with configurable audit_retention_days setting
- superuser-only GET /audit-log endpoint with userId, action, resource, date range filters
- AuditLogPage.vue with table, filters, pagination, and failed-auth row highlighting
- regenerated baseline migration to include audit_log in 0000_baseline.sql
2026-03-18 11:34:13 -06:00
neon c836eedca9 feat: add per-provider throttle backoff for metadata fetch
- detect HTTP 429 via fetchWithThrottle utility and throw ProviderThrottleError
- track per-provider cooldown windows with exponential backoff in ProviderThrottleTracker
- Google Books uses a conservative schedule (10m/30m/1h/2h/4h); others use default (2m/5m/10m/30m/1h)
- pipeline filters throttled providers before each book fetch
- orchestrator extends inter-book delay to 10-20s when any provider is throttled
2026-03-18 09:09:32 -06:00
neon e61486fae9 feat(stats): introduce statistics with charts, KPI summary, and filter 2026-03-17 23:38:29 -06:00
neon 6842a43f6c feat: add sort toolbar and extended filters to authors page 2026-03-16 18:06:44 -06:00
neon 0a11d54fe0 feat: add drag-and-drop reorder for libraries, lenses, and collections
- add displayOrder column to lenses and collections schema
- add POST /api/v1/{lenses,collections}/reorder endpoints (user-scoped)
- move Lens type to @projectx/types; add displayOrder to Collection type
- add useDraggableOrder composable with optimistic updates, debounce, rollback, and unmount cleanup
- wire VueDraggable into AppSidebar with per-section edit-mode toggle
- replace section header add/reorder buttons with a single kebab dropdown
2026-03-16 16:19:19 -06:00
neon d0329aa391 feat: separate author cover size/shape settings with circle layout 2026-03-16 06:55:38 -06:00
neon 52f1727fb1 feat: overhaul scanner module with 14 improvements and 147 unit tests 2026-03-16 05:24:37 -06:00
neon f81fef7b9b feat: overhaul book detail tab layout and metadata 2026-03-16 01:56:15 -06:00
neon 08fbad434b chore: update app defaults and improve book card rating overlay
- set metadata fetch preferences defaults (goodreads-first provider order, saveProviderIds, genre merge)
- set appearance defaults: dark theme, vinyl pattern, brightness 50, updated card overlays
- set cover size 140px, grid gap 20px, new indicator threshold 7 days
- replace rating dots with colored star badge (per-rating color scale)
- set convert-to-kepub default to false
2026-03-15 22:20:21 -06:00
neon 3340ee7388 feat: enhance metadata fetch and author enrichment config 2026-03-15 21:11:58 -06:00
neon aa2456fbf8 feat(authors): add auto-enrichment queue, worker safety, and live status 2026-03-13 08:14:45 -06:00
neon c9221f92be feat(metadata): add configurable metadata score with filter support 2026-03-13 03:05:51 -06:00
neon 3d8dabf9ae feat(library): apply watcher toggle changes without restart 2026-03-12 20:16:52 -06:00
neon 52a44a7970 fix: fix kobo cover sync and split device controller by concern 2026-03-12 19:50:47 -06:00
neon dd156da144 feat: add iTunes metadata provider support 2026-03-12 14:41:26 -06:00
neon febed98ff5 feat(settings): update reader and library settings with auto-finalize 2026-03-11 20:33:31 -06:00
neon c8bb7dd90a chore: tighten settings page sizing and polish
- reduce icon/card sizes in Libraries, Kobo settings to match other pages
- shrink accent color swatches in Appearance settings
- widen OIDC input fields
- reduce Save button height in File Naming settings
- constrain Kobo slider ranges to sane values (reading 0.5-10%, finished 75-100%, KEPUB 1-500MB)
- collapse Kobo setup guide to single column
- update DTO validation bounds to match new slider ranges
- remove vue/v-on-handler-style ESLint rule
2026-03-11 18:10:02 -06:00
neon 4c4a5cbf25 chore: migrate server tests from Jest to Vitest 2026-03-11 13:30:04 -06:00
neon b64aa519ef chore: migrate server tests from Jest to Vitest 2026-03-11 13:07:31 -06:00
neon 173d7585bf feat: add empty states and improve sidebar badge styling 2026-03-11 09:47:42 -06:00
neon 2102d0f9d8 feat(scanner): improve staging metadata and destination finalize flow 2026-03-11 03:33:31 -06:00
neon 9d25e219ab chore: remove unused files and keep staged settings updates 2026-03-10 22:44:53 -06:00
neon 956801f907 feat: redesign settings pages, theme tokens, and fix layout alignment 2026-03-10 04:21:33 -06:00
neon 440972cb89 refactor(settings): move settings from drawer to dedicated tabbed view 2026-03-10 04:20:33 -06:00
neon 652dcba69a feat: replace roles system with flat permissions and isSuperuser flag 2026-03-10 04:19:33 -06:00
neon 86a1b512cc feat(auth): add initial setup flow and harden auth/session handling 2026-03-10 04:17:33 -06:00
neon 1d44702bec feat(client): polish ViewHeader, library icon, and appearance fixes 2026-03-10 04:12:33 -06:00
neon a3579ac57f ci: overhaul CI workflows for reliability and maintainability
- add CODEOWNERS assigning .github/ to @neonsolstice
- configure automated updates for npm, docker, and github-actions ecosystems
- replace custom change-detection bash script with dorny/paths-filter@v4
- consolidate lint, typecheck, and test into a single checks matrix job
- gate per-package change detection via has-changes step (matrix unavailable in job-level if)
- fix duplicate actions/setup-node call in setup-node-pnpm composite action
- scope pnpm store cache key by pnpm version to prevent stale cross-version cache hits
- pin all action references to commit SHAs
- fix container-image concurrency group to use commit SHA across all trigger types
- add timeout-minutes to all jobs
- document fail-fast: false rationale and checks: write trade-off
2026-03-07 18:14:36 -06:00
neon f911c552a7 fix: harden foliate streaming EPUB resolution 2026-03-06 17:21:49 -06:00
neon 1d60aa902c feat(metadata): add genre merge and provider-id auto-fill preferences 2026-03-06 15:43:16 -06:00
neon 91dddc6740 test: add backend coverage and related service updates 2026-03-06 12:08:22 -06:00
neon 891cd19f46 chore: implement local quality foundation 2026-03-06 09:08:15 -06:00
neon aeae0ac8ce feat: add configurable download filename patterns 2026-03-06 07:22:29 -06:00
neon ac180e521f feat: compact book details and add provider icon links 2026-03-06 05:34:03 -06:00
neon 78051d0b42 feat(cover): add online cover search with provider infrastructure 2026-03-06 04:21:48 -06:00
neon f21dfc12e3 fix: cbx filename title fallback and remove book card hover tooltips 2026-03-05 03:22:29 -06:00
neon 7a0e66fe21 feat(metadata): add CBX/CBZ format writers and ComicInfo support 2026-03-04 17:51:19 -06:00
neon 38a601675e feat: add epub streaming with server-side file serving 2026-03-04 04:53:52 -06:00
neon 94a0d51584 feat(metadata): add PDF metadata writer with XMP round-trip 2026-03-03 11:57:15 -06:00
neon 6d76243909 feat: add file-write module for writing metadata back to EPUB files 2026-03-03 04:56:16 -06:00
neon d63859cf30 feat: stream bulk metadata refresh and cover re-extraction via SSE
- add useRefreshingBooks composable for shared per-book spinner state
- show refresh spinner on BookCoverCard during any bulk operation
- bulk-refresh-metadata and bulk-re-extract-cover endpoints now stream SSE
- client reads SSE stream and updates each card cover+spinner one-by-one
- wire all missing SelectionActionBar events in LensView and CollectionView
2026-03-02 23:33:37 -06:00
neon 63662b46f8 refactor(client): lift sidebar to App.vue and add rating sort 2026-03-02 19:36:08 -06:00
neon ec5dda57b0 feat(books): enhance filter UI with nested groups and improvements
- fix nested group ALL/ANY toggle visibility and empty-rules group handling
- add FilterSummary component with color-coded field/operator/value display
- add collapsible filter preview in LensView with header toggle
- raise MAX_DEPTH to 5 to match backend validation
- add ruleToParts helper for structured rule rendering
- update filter chip styling: emerald fields, muted operators, primary values
- style ALL/ANY badges with sky-blue and amber respectively
- add segmented sort chip with rose accent and icon
- rebuild @projectx/types package to include tag and collection in RuleField
2026-03-02 16:15:14 -06:00