Commit Graph

81 Commits

Author SHA1 Message Date
neon 1fbc499ffc feat(books): show collections and collapsible genres in quick view 2026-04-01 12:01:49 -06:00
neon acc5f833e8 fix(cover): harden cover fetching and validate dashboard scroller lenses 2026-04-01 03:38:20 -06:00
neon 86f0478bc0 refactor(audit): streamline audit module structure 2026-03-31 05:36:35 -06:00
neon 5161fdf203 refactor(server): harden health, library, and lens module architecture 2026-03-31 05:11:33 -06:00
neon 32bbba9aa9 fix(metadata): harden preference concurrency and score recalculation 2026-03-31 04:50:04 -06:00
neon db30a45782 test(scanner): bootstrap scanner E2E test infrastructure 2026-03-30 01:18:32 -06:00
neon 400e5fabc9 feat(books): add read status values across schema, types, and validation 2026-03-29 16:56:57 -06:00
neon 399fa179d2 perf: remove unused tags, metadataScore, durationSeconds from BookCard
- drop tags field and bookTags fan-out query from all BookCard paths
- drop metadataScore from BookCard select (only used in BookDetail)
- fix durationSeconds: was never selected in DB; derive audiobook badge from file format using FORMAT_TO_GROUP instead
2026-03-29 14:09:24 -06:00
neon d5ba57f483 feat: harden nested audio metadata contract and UI consistency 2026-03-29 10:04:26 -06:00
neon efbb63e764 fix(books): fix rating display bug and trim recommendation response body 2026-03-29 09:21:23 -06:00
neon 77a1a3fecb feat: add reading progress thresholds to library settings 2026-03-28 13:34:40 -06:00
neon 6daeca7ab2 feat(stats): add top series and library insight charts with backend 2026-03-27 13:16:51 -06:00
neon 10a4a2045a feat(cover): add per-library aspect ratio and per-view cover size 2026-03-26 21:14:22 -06:00
neon 61746cb62c feat: add format breakdown to Reading Clock with improved tooltip 2026-03-26 10:41:07 -06:00
neon ba37f19b45 feat(stats): add user analytics charts and stabilize ECharts theme 2026-03-26 04:28:08 -06:00
neon 1418957b6f chore: cleanup project structure and resolve client type errors
- resolve all 69 client type-checking errors for stricter TS compliance
- remove obsolete type-check baseline scripts and files
- overhaul project root with updated README.md and new DEVELOPMENT.md
- migrate to unified baseline migration strategy and cleanup docker configs
- remove redundant production and dev-specific shell scripts
2026-03-25 07:14:51 -06:00
neon a30aef22b4 feat(metadata): add iTunes cover provider with selectable resolution 2026-03-24 21:39:58 -06:00
neon d2eba30728 feat(metadata): batch library overrides and improve comic refresh 2026-03-24 20:09:15 -06:00
neon ac7b896c6e feat(metadata): add ComicVine provider with shared relevance scoring 2026-03-23 13:19:08 -06:00
neon df337e1b7e feat(users): add ManageEmail permission and gated book actions
- split email into EmailSend (read/send) and ManageEmail (SMTP config); fix providers tab to be read-only for EmailSend
- add library reassignment to admin user form (GET/PUT /users/:id/libraries)
- hide Download, Edit Metadata, Delete actions throughout UI based on user permissions
- redirect non-manage_libraries users away from Libraries settings
2026-03-23 00:36:11 -06:00
neon 2117b729d5 feat(reader): add audiobook reader with narrator and Audible metadata
- add audiobook reader with playback queue, progress tracking, and audio settings
- add narrator support with DB schema, module, and metadata extraction
- add Audible and Audnexus metadata providers with mappers and tests
- improve scanner with file classification, walk utilities, and file-event processing
- extend upload validator and processor for audio formats
2026-03-21 16:14:55 -06:00
neon 9bcde5b0c8 feat: implement password reset via UI-configured system mail provider
- replace env-var SMTP config with DB-backed system mail provider
- add isSystemProvider flag to emailProviders table
- add SystemMailService for sending password reset emails
- add PATCH :id/system and DELETE system endpoints on email providers
- add forgotPassword/resetPassword audit logging with IP tracking
- block OIDC and inactive users from password reset flow
- fire-and-forget async work to prevent email enumeration timing oracle
- add HTML email template for password reset
- remove mailer.service and all SMTP env vars
2026-03-21 04:12:55 -06:00
neon 2df7e093c5 feat: implement per-user read status tracking
- add user_book_status table (userId, bookId, status, source, timestamps)
- add UserBookStatusModule with repository and service
- auto-update status on progress save (fire-and-forget, skips manual overrides)
- expose PATCH /api/v1/books/:id/status endpoint
- include readStatus on BookCard and BookDetail responses
- surface status icon overlay on cover cards (toggleable)
- add status dropdown in book detail page inline with rating stars
- rewrite statistics summary to query user_book_status directly
2026-03-20 05:07:16 -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 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 e61486fae9 feat(stats): introduce statistics with charts, KPI summary, and filter 2026-03-17 23:38:29 -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 f81fef7b9b feat: overhaul book detail tab layout and metadata 2026-03-16 01:56:15 -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 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 2102d0f9d8 feat(scanner): improve staging metadata and destination finalize flow 2026-03-11 03:33:31 -06:00
neon 956801f907 feat: redesign settings pages, theme tokens, and fix layout alignment 2026-03-10 04:21:33 -06:00
neon 652dcba69a feat: replace roles system with flat permissions and isSuperuser flag 2026-03-10 04:19: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 1d60aa902c feat(metadata): add genre merge and provider-id auto-fill preferences 2026-03-06 15:43:16 -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 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 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