* part1 fix: reading days show duration
* part2 fix: Fix time formatting in favorite days chart
---------
Co-authored-by: WorldTeacher <coding_contact@pm.me>
* Implement Public Shelves
Multiple changes to support shelves being marked as public.
- **Backend:**
- Added 'isPublic' field the Shelves
- Made it so that when looking for shelves it includes public ones
- Allow admins to mark shelves are public
- Added 'bookCount' to 'Shelf' so it shows for public shelves as
well
- Added 'canReadShelf' to 'SecurityUtil' for checking read access to
public shelves.
- Updated ShelfController to use this for getting shelf data
- **Frontend:**
- Updated Shelf to include 'publicShelf', 'userId', and 'bookCount'
- Updated components to allow admins to toggle shelf visibility.
- Modified 'ShelfService' to:
- Add 'getBooksOnShelf' method to fetch books from the API.
- Update /getBookCount' to use 'Shelf.bookCount' for non-owners.
- Restricted edit/delete options to shelf owners.
* Renumber Add_is_public_to_shelf.sql
Conflicted with another
---------
Co-authored-by: ACX <8075870+acx10@users.noreply.github.com>
* feat(shelf): add shelf filtering options and integrate into book processing
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(book-rule-evaluator): normalize array values to lowercase for rule comparisons
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(filter): enhance library and shelf filtering logic for 'or' and 'and' modes
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(shelf): implement support for multiple shelf IDs in book retrieval and filtering
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
---------
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(metadata): add auto-save metadata feature in editor settings
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(reader-preferences): add autoSaveMetadata property to user preferences
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(user-service): add autoSaveMetadata property to user preferences in tests
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
---------
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(book): extract file-specific information from book
First commit in a series aimed at refactoring the data model for books.
More specifically, the idea is to extract all file-specific information
from the `book` table and move it to the `book_file` table, previously named `book_additional_file`
The aim is to make it easier to:
* Improve support for books with multiple file formats (PDF, EPUB, etc) for all interactions (Read, Download, etc)
* Support for merging/unmerging books
* Add support for additional file types
* Specify preferred formats at the user level
Ref: #489
* refactor(book): ensure the API build and runs
Further work on the refactoring aimed at separating file-related details
from the `book` table.
With this commit all the missing changes that were prventing the API to build
or to book have been addressed.
TODO: test extensively, adjust existing unit tests and add new ones
* fix(read): add mapping for book format
This restores the read functionality which relies on the book format field
to decide which reader to use.
* fix: fix read, dowload and file upload
This commit fixes multiple issues either caused by the refactoring or pre-existing:
* Fix the Read button behaviour after the refactoring
* Unregister the watcher process when uploading additional formats
* Fix downloading of additional book formats (using the wrong ID)
* fix: adjust tests to use the new BookFileEntity class
All the tests that used to fecth file information from BookEntity
now need to get them from the relevant BookFileEntity
* fix: do not rely on AdditionalFileType
* Use the BookFileEntity bookFormat instead
* fix: use the relevant BookFileEntity class
* fix: call the right methods
* fix: Add missing mapping for the test
* fix: adapt the test to the new semantics
All book files, including the primary one, are treated as equal now.
The tests needs to take that into account when checking for additional
formats.
* fix: use mutable lists
* fix: fix syntax for droppung unique constraint
MariaDB uses indexes, not constraints
* fix: regression on book file ordering
We want to make this refactoring 100% compatible with the current behaviour (modulo a few bugs),
therefore we need to maintain the right order to ensure the "primary" book stays the same
after the migration.
* fix: allow download of supplementary files
* fix(opds): replace removed additionalFiles entity graph with bookFiles
- Update BookOpdsRepository @EntityGraph paths to use BookEntity.bookFiles after the refactor
- Add @DataJpaTest to validate BookOpdsRepository wiring and catch invalid EntityGraph attributes
- Add H2 as testRuntimeOnly dependency so the JPA slice test can run with an embedded DB
* chore(bookdrop): mount bookdrop folder from a local directory
It's consistent with the library dir, and makes debugging easier
when working on the local environment
* fix: rename migration after rebase
It's no longer 66, bumped to 73
* fix: handle BookEntity primary file NPEs after rebase
Adjust tests to always instanciate BookFileEntity when manipulating
BookEntity.
* chore: rename migration to avoid conflict
V73 is already taken on develop, V67 was left "unused"
* chore: rename again to ensure it's applied
* fix: make sure to flush the data to DB
Without the flush there is a high chance of leaving the DB in an inconsistent
state after a book move.
* fix: move all files belonging to a book
This fixes a pre-existing bug which has some nasty ramifications.
We never moved "additional files" when changing library for a book entity,
causing them to become effectively "unreacheable" from the UI.
* fix(migration): remove the unique index before importing data
* fix: fix build and test after rebase
* fix(migration): drop legacy table
* fix(upload): use the templetized name when storing on DB
* fix(rebase): Add logical fixes post rebase
* Adapt the code to properly handle the new `archive_type` field and logic
* Bump the version number for the DB migration
* Use `getPrimaryBookFile()` whenever trying to access book files
* fix(migration): Handle additional book formats
* Add support for FB2 files
* Corretly handle cb7 files as CBX
* fix(file mover): fix a regression when moving books across categories
The previous approach would trigger the JPA's `orphanRemoval` parameter on the
bookEntities, effetively triggering a delete on the DB.
This caused files to be moved but the data on the DB would get stale, also causing
additional formats to be treated as separate books upon a rescan.
* fix(rescan): do not delete alternative files on rescan
Upon library rescan, additional files such as images were removed from
book entities association when using the "Each file is a book" library structure.
* feat(settings): add hardcover sync settings and integrate into device settings UI
* feat(hardcover): implement Hardcover sync settings API and UI integration
* test(hardcover): add unit tests for HardcoverSyncSettingsService and HardcoverSettingsComponent
* fix(hardcover-settings): correct API key copy function to handle null values properly
---------
Co-authored-by: akiraslingshot <akiraslingshot@gmail.com>
Co-authored-by: ACX <8075870+acx10@users.noreply.github.com>
* refactor(types): improve type safety by replacing 'any' with specific types in various components
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(filters): handle undefined values in filter streams and update type for selected filters
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(epub-reader): improve rendition cleanup and enhance debug logging in helper functions
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(epub-reader): handle errors during rendition and book destruction in ngOnDestroy
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
---------
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(metadata): add support for Lubimyczytac ID and rating fields
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(metadata): add Lubimyczytac ID and rating fields to metadata editor
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(metadata): add Lubimyczytac ID and rating fields to MetadataRefreshOptions
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
---------
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: Add custom font support for EPUB reader
This commit introduces the ability to manage and use custom fonts in the EPUB reader. Key changes include:
**Backend:**
- Added `CustomFontService` for handling custom font operations.
- Introduced `CustomFontController` for API endpoints.
- Created `CustomFontEntity` and `CustomFontRepository` for database interactions.
- Added `CustomFontMapper` and `CustomFontDto` for data transformation.
- Updated `SecurityConfig` to include JWT filter for custom fonts.
- Enhanced `GlobalExceptionHandler` to handle custom font-related exceptions.
- Added database migrations:
- `V83__Create_Custom_Font_Table.sql` for creating the custom font table.
- `V84__Add_Custom_Font_To_Epub_Preferences.sql` for integrating custom fonts with EPUB preferences.
**Frontend:**
- Added `CustomFontsComponent` and `FontUploadDialogComponent` for managing custom fonts in the settings UI.
- Updated `EpubReaderPreferencesComponent` to include custom font options.
- Introduced `CustomFontService` and `CustomFontModel` for frontend logic and data handling.
- Enhanced `SettingsComponent` to integrate custom font management.
**Other Changes:**
- Updated `EpubViewerPreferences` and `EpubViewerPreferencesEntity` to support custom fonts.
- Modified existing components and services to accommodate the new feature.
This feature enhances the user experience by allowing personalized font choices for EPUB reading.
* fix: custom font does not apply after page layout changed
* fix: duplicate API call when change EPUB global settings
* fix: some code review items, extract shared filter logic and improve UX
- Extract AbstractQueryParameterJwtFilter base class to reduce code duplication
between CoverJwtFilter and CustomFontJwtFilter
- Remove cssIdentifier and fontUrl fields from CustomFont model (no longer needed)
- Add font name sanitization to prevent XSS and ensure data integrity
- Improve error handling in CustomFontService with proper APIException usage
- Replace RuntimeException handler with specific IllegalStateException and
UnsupportedOperationException handlers in GlobalExceptionHandler
- Add skeleton loading states for font previews and font dropdowns
- Improve font loading state management in epub-reader component
- Create shared custom-font.util.ts for dropdown population logic
- Use reactive font$ subscription for real-time font updates in preferences
- Make DB migrations idempotent with IF NOT EXISTS clauses
- Optimize font file validation to read only header bytes instead of entire file
* chore: re-version migration scripts
* Fix: Kobo sync missing book covers (v1.16.4) (#2147)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
* Fix: correctly update book cover hash on metadata refresh (#2149)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
* Introduce Vitest as the frontend Angular testing framework for Booklore (#2150)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
* Add Vitest frontend tests to CI with JUnit reporting and coverage (#2151)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
* Update PR template to capture frontend test details
* Add instructions for running Angular frontend tests
---------
Co-authored-by: ACX <8075870+acx10@users.noreply.github.com>
Co-authored-by: acx10 <acx10@users.noreply.github.com>