Commit Graph

183 Commits

Author SHA1 Message Date
neon 31422c9054 fix: add book:restored toast and fix missing events in reconcile 2026-03-28 09:21:47 -06:00
neon af9424f04a feat: add audiobook progress and refactor metadata extraction 2026-03-28 07:39:23 -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 48a1c6bb1d fix: restore Genre Reading Time treemap colors using getThemePalette 2026-03-26 07:49:30 -06:00
neon 0e9067d119 fix: match ECharts palette colors to --primary per accent
- replace broken HSL approach with pure JS oklch-to-hex using exact --primary L/C from accents.css
- remove --chart-1..10 and --chart-icon-* CSS tokens
- remove dead --color-chart-* Tailwind bridge aliases
- inline CSS relative color syntax in ChartCard and StatisticsSummaryCard
- fix MetadataScoreDistributionChart mark area to rgba (ECharts-compatible)
2026-03-26 07:42:49 -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 16a5513076 feat: standardize logging with some initial logs 2026-03-25 02:36:55 -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 f847cc1d22 fix(metadata): use per-provider keys and extract relevance scoring
- replace shared 'providerId' key in pickedSources with provider-specific
  field names (googleBooksId, goodreadsId, etc.) so each provider's ID
  pick is independent and not overwritten when switching tabs
- extract candidate relevance scoring into candidate-relevance.ts with
  Levenshtein-based title/author scoring, ISBN exact match, and junk
  title filtering; remove duplicate inline scoring from goodreads provider
2026-03-24 09:23:01 -06:00
neon ac7b896c6e feat(metadata): add ComicVine provider with shared relevance scoring 2026-03-23 13:19:08 -06:00
neon 50fa9f6627 feat(metadata): add Hardcover provider and split settings into tabs
- implement HardcoverProvider (IdentifiableProvider) with ISBN, title+author, title-only search fallback chain
- add HardcoverClient with fixed-delay rate limiter using atomic slot reservation
- add hardcover.mapper.ts and hardcover.types.ts for clean separation of concerns
- fix cached_contributors as JSONB scalar (no subfield selection)
- fix null series position normalisation to undefined
- fix edition publishedYear fallback to book-level dates
- add 37 unit tests across mapper and provider
- update metadata-fetch.module.test.ts for HardcoverProvider registration
- split MetadataPreferencesSettings into Providers tab and new Field Rules tab
- update Hardcover favicon to assets.hardcover.app/static/favicon.ico
2026-03-23 07:24:32 -06:00
neon eb5d08ad24 feat: add account avatar management and tighten user email requirements 2026-03-23 04:06:26 -06:00
neon 473459b854 chore(deps): update workspace dependencies 2026-03-23 01:58:44 -06:00
neon 4123b7cee9 fix(server): resolve type errors from audiobook and library creator 2026-03-23 01:26:25 -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 7095bbc668 feat(library): improve creator with cron validation and assignable users 2026-03-22 16:21:40 -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 7d3a88e23d feat(client): add staging and statistics nav buttons to header 2026-03-20 03:19:38 -06:00
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 0cf8eff3b4 feat(client): implement route-aware page titles and author deletion 2026-03-19 04:29:06 -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 d07b876b9c feat: add multi-book edit action to selection bar 2026-03-18 08:12:25 -06:00
neon 416952a3a0 feat: refine theme tokens and apply consistent styling 2026-03-18 06:57:19 -06:00
neon e61486fae9 feat(stats): introduce statistics with charts, KPI summary, and filter 2026-03-17 23:38:29 -06:00
neon 3c27802be2 fix(client): improve virtual grid layout stability and alignment 2026-03-16 22:42:52 -06:00
neon 4b6f276070 refactor(settings): rename Operations section to Maintenance 2026-03-16 20:10:18 -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 854ab783c8 feat: multi-format read and download support
- add split Read button on book detail page (primary format direct, dropdown for others)
- add useBookDownload composable with auth-aware blob download and ZIP export
- add BookDownloadButton component for detail page and files tab
- refactor useBookBulkActions to delegate export to useBookDownload
- add Open/Download submenus to book card dropdown
- group Edit/Refresh/Regenerate under Metadata submenu in book card
2026-03-16 08:33:03 -06:00
neon d0329aa391 feat: separate author cover size/shape settings with circle layout 2026-03-16 06:55:38 -06:00
neon c00410f02e chore: tighten sidebar spacing and nav item padding 2026-03-16 03:38:44 -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 c5fcabded7 feat: enhance book metadata editing and details view
- add tags input to book edit page
- rearrange provider IDs in edit page to a single row
- make rating stars clickable in book details for direct updates
- always display rating in book details even if not set
- improve alignment of title, score badge, and provider icons
2026-03-13 03:31:18 -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