Skip to content

docs(api): add parameter descriptions for app contoller annotations#438

Open
zachyale wants to merge 193 commits intodevelopfrom
feature/add-openapi-parameter-descriptions
Open

docs(api): add parameter descriptions for app contoller annotations#438
zachyale wants to merge 193 commits intodevelopfrom
feature/add-openapi-parameter-descriptions

Conversation

@zachyale
Copy link
Copy Markdown
Member

@zachyale zachyale commented Apr 9, 2026

Description

Continues the work of improving API controller annotations.

Linked Issue: Loosely associated with #183

Changes

Summary by CodeRabbit

  • Documentation
    • Enhanced API documentation with detailed parameter descriptions across all endpoints for improved clarity.
    • Added input validation constraints for date and time parameters to enforce valid ranges (months 1-12, weeks 1-53).

github-actions Bot and others added 30 commits March 21, 2026 02:18
## [2.3.0](v2.2.6...v2.3.0) (2026-03-21)

### Features

* **release:** document develop-based stable release previews ([930e526](930e526))

### Bug Fixes

* **api:** fix potential memory leaks in file processing ([031e8ae](031e8ae))
* **ci:** correct artifact download action pin ([37ca101](37ca101))
* **ci:** publish PR test results from workflow_run ([11a76bf](11a76bf))
* **ci:** repair release preview and test result publishing ([afa5b81](afa5b81))
* drop telemetry from app ([#52](#52)) ([4d82cb7](4d82cb7))
* **ui:** repair frontend compile after rebrand ([fea1ec6](fea1ec6))

### Refactors

* **build:** rename frontend dist output to grimmory ([ecf388f](ecf388f))
* **i18n:** rename booklore translation keys to grimmory ([eb94afa](eb94afa))
* **metadata:** move default parser from Amazon to Goodreads ([e252122](e252122))
* pull kepubify & ffprobe during build ([#50](#50)) ([1c15629](1c15629))
* **ui:** rebrand frontend surfaces to grimmory ([d786dd8](d786dd8))

### Chores

* **api:** remove the custom startup banner ([98c9b1a](98c9b1a))
* **deps:** bump flatted from 3.4.1 to 3.4.2 in /booklore-ui ([#73](#73)) ([c4bd0c7](c4bd0c7))
* **funding:** point support links at opencollective ([55c0ac0](55c0ac0))
* **release:** 2.2.7 [skip ci] ([0b5e24c](0b5e24c))
* remove old verbose PR template, replace with temporary more low-key one. ([#84](#84)) ([b868526](b868526))
* **ui:** drop financial support dialog ([#21](#21)) ([62be6b1](62be6b1))

### Documentation

* updated supported file formats in README.md ([#68](#68)) ([f912e80](f912e80))

### Style

* **i18n:** normalize translation json formatting ([#89](#89)) ([857290d](857290d))
* **ui:** simplify the topbar logo branding ([0416d48](0416d48))

(cherry picked from commit c335c7b)
…ooklore PR Port) (#16)

* fix(api): Correct format for fixed-layout epub when using Kobo Sync

* chore: Cleanup duplicate code

* feat: Cache fixed-layout property in db

* fix: Missing nullcheck in after retrieving BookFileEntity

* fix: Remove memory leak in EpubReaderService.java

* chore: Avoid opening the epub twice for fixed-layout extraction

* chore: Fix DB migration from rebase

---------

Co-authored-by: brios <127139797+balazs-szucs@users.noreply.github.com>
#79)

* chore(deps): bump actions/setup-node from 6.2.0 to 6.3.0 (#1)

Dependabot couldn't find the original pull request head commit, ea510f4.

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump docker/setup-buildx-action from 3.12.0 to 4.0.0 (#2)

Dependabot couldn't find the original pull request head commit, faed6bf.

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump docker/build-push-action from 6.19.2 to 7.0.0 (#3)

Dependabot couldn't find the original pull request head commit, f110823.

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump docker/login-action from 3.7.0 to 4.0.0 (#6)

Dependabot couldn't find the original pull request head commit, 9a8d7a1.

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(archive): infer archive type via Magic Numbers instead of filename

* fix(archive): improve archive type detection and improve logging for cover image retrieval

---------

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…unt (#87)

* fix: fixed halves missing from series number in Hardcover metadata

* fix: use series primary books count
* refactor(frontend): migrate state to TanStack Query and signals

* fix(frontend): keep book cache in sync after patches
…hints to supported versions (#76)

* chore(deps): bump actions/setup-node from 6.2.0 to 6.3.0 (#1)

Dependabot couldn't find the original pull request head commit, ea510f4.

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump docker/setup-buildx-action from 3.12.0 to 4.0.0 (#2)

Dependabot couldn't find the original pull request head commit, faed6bf.

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump docker/build-push-action from 6.19.2 to 7.0.0 (#3)

Dependabot couldn't find the original pull request head commit, f110823.

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump docker/login-action from 3.7.0 to 4.0.0 (#6)

Dependabot couldn't find the original pull request head commit, 9a8d7a1.

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* docs(security): update security policy with reporting guidelines and hints to supported versions

---------

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…oring services (#137)

* refactor(concurrency): improve thread management and locking in monitoring services

* chore: remove unnecessary comments
the kepubify / ffprobe binaries may be on disk but they're
in the "data" directory under `tools` rather than under the
current directory
… in the app (#158)

Co-authored-by: Zack Yancey <yanceyz@proton.me>
…100)

* chore(build): migrate Gradle build scripts from Groovy to Kotlin DSL

* chore(docker): update Gradle build files to Kotlin DSL in Dockerfile
…tead of better fields like ISBN in Goodreads/Bookdrop (#85)

* chore(deps): bump actions/setup-node from 6.2.0 to 6.3.0 (#1)

Dependabot couldn't find the original pull request head commit, ea510f4.

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump docker/setup-buildx-action from 3.12.0 to 4.0.0 (#2)

Dependabot couldn't find the original pull request head commit, faed6bf.

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump docker/build-push-action from 6.19.2 to 7.0.0 (#3)

Dependabot couldn't find the original pull request head commit, f110823.

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump docker/login-action from 3.7.0 to 4.0.0 (#6)

Dependabot couldn't find the original pull request head commit, 9a8d7a1.

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(metadata): fix metadata fetching relying for filename "first" instead of better fields like ISBN in Goodreads/Bookdrop

* perf(ci): speed up image builds and centralize cache writes

- Image builds:
  - pin frontend and backend Docker build stages to the build platform so multi-arch packaging can reuse architecture-independent work
  - add an Angular build cache mount and move dynamic version metadata to the end of the runtime stage so static layers stay reusable across tags
  - reduce image workflow checkout depth and keep preview builds on `linux/amd64` only to avoid unnecessary QEMU and history overhead

- Cache policy:
  - make CI packaging smoke builds consume the shared image cache without writing new BuildKit cache state
  - make normal preview builds consume shared GHA and registry caches without mutating the canonical cache
  - keep nightly and stable release builds as the workflows that refresh the shared image cache in both GHA and registry backends

- Preview override:
  - add a `refresh_shared_cache` input to the preview workflow for an explicit no-cache rebuild that repopulates the shared cache when maintainers need to bust and refresh it
  - keep the default preview behavior optimized for fast disposable builds rather than cache churn

- Validation:
  - keep workflow YAML parsing clean after the cache-policy changes
  - keep `git diff --check` clean for the touched Docker and workflow files

* docs: Add a note about how to make a release

* chore: remove unncesary comments

---------

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: James Cox <james@imaj.es>
…nt of frontend lint issues (#163)

* feat(lint): add Angular Lint Threshold workflow for CI integration

* Update workflow name for clarity in CI integration

* fix(lint): update LINT_THRESHOLD to 725 in CI checks

* Also run workflow on main branch

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fix(lint): simplify lint problem count calculation using jq

* feat(lint): enhance quality threshold checks and reporting in CI workflow

* refactor(lint): rename lint step for clarity in CI workflow

* fix(lint): swap lint warning and error thresholds for correct configuration

* fix(lint): update build warning threshold and correct log processing for accurate warning count

* refactor(lint): remove unnecessary working-directory specification for quality thresholds step

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* refactor(icon): fix SVG icon loading straight to memory

* refactor(icon): loading with improved error handling

* refactor(icon): add flag for SVG icons loading state

* chore(release): 2.3.0 [skip ci]

## [2.3.0](v2.2.6...v2.3.0) (2026-03-21)

### Features

* **release:** document develop-based stable release previews ([930e526](930e526))

### Bug Fixes

* **api:** fix potential memory leaks in file processing ([031e8ae](031e8ae))
* **ci:** correct artifact download action pin ([37ca101](37ca101))
* **ci:** publish PR test results from workflow_run ([11a76bf](11a76bf))
* **ci:** repair release preview and test result publishing ([afa5b81](afa5b81))
* drop telemetry from app ([#52](#52)) ([4d82cb7](4d82cb7))
* **ui:** repair frontend compile after rebrand ([fea1ec6](fea1ec6))

### Refactors

* **build:** rename frontend dist output to grimmory ([ecf388f](ecf388f))
* **i18n:** rename booklore translation keys to grimmory ([eb94afa](eb94afa))
* **metadata:** move default parser from Amazon to Goodreads ([e252122](e252122))
* pull kepubify & ffprobe during build ([#50](#50)) ([1c15629](1c15629))
* **ui:** rebrand frontend surfaces to grimmory ([d786dd8](d786dd8))

### Chores

* **api:** remove the custom startup banner ([98c9b1a](98c9b1a))
* **deps:** bump flatted from 3.4.1 to 3.4.2 in /booklore-ui ([#73](#73)) ([c4bd0c7](c4bd0c7))
* **funding:** point support links at opencollective ([55c0ac0](55c0ac0))
* **release:** 2.2.7 [skip ci] ([0b5e24c](0b5e24c))
* remove old verbose PR template, replace with temporary more low-key one. ([#84](#84)) ([b868526](b868526))
* **ui:** drop financial support dialog ([#21](#21)) ([62be6b1](62be6b1))

### Documentation

* updated supported file formats in README.md ([#68](#68)) ([f912e80](f912e80))

### Style

* **i18n:** normalize translation json formatting ([#89](#89)) ([857290d](857290d))
* **ui:** simplify the topbar logo branding ([0416d48](0416d48))

* fix(book-browser): prevent memory leaks by unsubscribing from observables (#80)

* test(icon): remove redundant initialization in IconServiceTest

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Alex Fair <20632147+afairgiant@users.noreply.github.com>
- Command surface:
  - add a root `Justfile` with namespaced `api`, `ui`, and `release` modules so humans and agents can use the same entrypoints from the repo root
  - add project-local Justfiles for `booklore-api`, `booklore-ui`, and `tools/release` so each area remains self-contained and can still be driven from inside its own directory
  - standardize local developer workflows around `just check`, `just test`, `just api run`, `just ui dev`, `just db-up`, and `just image-build`

- Workflow integration:
  - update the reusable test suite workflow to install `just` and run backend and frontend CI steps through the Justfiles instead of hardcoded shell commands
  - update the semantic-release workflows to install `just` and invoke release tooling via `just release install`, `just release preview`, and `just release run`
  - keep the Docker image publication workflows on the native Docker actions while moving the project-command logic into the canonical command surface

- Documentation:
  - split backend and frontend implementation guidance into `booklore-api/README.md`, `booklore-api/CONTRIBUTING.md`, `booklore-ui/README.md`, and `booklore-ui/CONTRIBUTING.md`
  - simplify the top-level `README.md` and `CONTRIBUTING.md` so they stay focused on overview, policy, and navigation while pointing to component-specific guides for deeper detail
  - align contributor-facing examples on the `just` interface instead of mixing ad hoc Gradle, npm, Docker, and Compose commands

- Developer environment:
  - add `mise.toml` to pin the expected Java and Node toolchain versions for local work
  - switch the development Compose defaults from the old Booklore database values to Grimmory-oriented defaults
  - keep the command layout ready for a future API/UI split without forcing that packaging change yet
- Issue intake:
  - rebrand the bug and feature request forms from Booklore to Grimmory
  - remove the old `[Bug]` and `[Feature]` title prefixes so issue titles can stay natural
  - default issue intake to `needs-triage` while relying on GitHub Issue Types for the primary classification

- New templates:
  - add a dedicated enhancement template for smaller quality-of-life and UX improvements
  - add a documentation template for doc fixes, missing guides, and confusing setup flows
  - add a performance template for runtime, UI, build, and operational performance problems

- Type alignment:
  - map the templates onto the repo's issue-type taxonomy with `Bug`, `Feature`, `Enhancement`, `Documentation`, and `Performance`
  - keep the larger feature template distinct from the smaller enhancement template so incoming requests are easier to triage
- Community links:
  - update the issue-template support link to use the canonical Grimmory Discord invite from `README.md`
  - update the contributing guide to point at the same Discord server

- Consistency:
  - remove the stale invite URL so issue intake, contributor docs, and the repository landing page all reference the same community link
- Community links:
  - replace the old Discord invite code with the new `9YJ7HB4n8T` invite in the repository README
  - update the contributor guide to point at the same server
  - align the issue-template support link with the same canonical invite

- Consistency:
  - keep the public docs and issue intake flow on a single Discord destination so users and contributors land in the right community space
- Agent workflow:
  - add a root `AGENTS.md` focused on agent execution rather than general contributor onboarding
  - document the expected command surface, branch target, and staged verification order
- Repo boundaries:
  - map the backend and frontend layout with the key source, resource, test, i18n, and asset paths
  - call out ownership boundaries for deploy, packaging, tools, docs, and shared assets
- Project rules:
  - capture backend and frontend conventions that agents should follow before editing or validating work
  - include repo-specific PR expectations such as linked issues, test output, and UI evidence
- GitHub Actions caching:
  - replace implicit setup-java cache writes with explicit Gradle cache restore/save steps
  - only persist the shared Gradle cache from long-lived develop and release workflows
  - remove the unnecessary QEMU setup from the single-arch smoke build
  - disable QEMU image caching in multi-arch publish workflows to stop repeated binfmt cache entries
- CodeQL workflow:
  - replace the generated advanced template with a pinned repo-owned CodeQL workflow
  - add per-ref concurrency to cancel superseded CodeQL runs before they create more caches
  - restrict dependency caching to Java, using restore-only on pull requests and full caching on long-lived runs
  - disable trap caching and turn off PR overlay database caching to avoid repetitive low-value CodeQL caches
- Validation:
  - validated the edited workflow YAML with yq
  - did not execute the workflows locally
- Planning:
  - add the staged frontend migration plan under docs/plans
  - record the intended rename, Yarn 4 adoption, lint rollout, and PR replay sequence
- Cleanup ledger:
  - capture the remaining frontend Booklore-era aliases that should survive the cutover temporarily
  - document explicit triggers for removing each compatibility shim after the dust settles
balazs-szucs and others added 6 commits April 8, 2026 18:25
…ions (#348)

* fix(metadata): add support for audible fields in metadata refresh options

* fix(metadata): add support for Lubimyczytac and Audible ratings in scoring

* fix(metadata): update default audible ratings and review counts to zero

* fix(metadata): add reRenderOnLangChange to TranslocoService provider in tests

* fix(tests): update MetadataProviderFieldSelectorComponent tests for async setup and translation
* refactor(file): improve path handling and validation

* fix: update XML escaping to use escapeXml10 for improved compatibility

* feat(mime): integrate Apache Tika for content-based MIME detection across services

* test: enhance MultipartFile tests with input stream handling and content type validation
* chore(deps): bump the npm-dependencies group across 1 directory with 30 updates

Bumps the npm-dependencies group with 30 updates in the /frontend directory:

| Package | From | To |
| --- | --- | --- |
| [@angular/animations](https://github.com/angular/angular/tree/HEAD/packages/animations) | `21.2.6` | `21.2.7` |
| [@angular/cdk](https://github.com/angular/components) | `21.2.4` | `21.2.5` |
| [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) | `21.2.6` | `21.2.7` |
| [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) | `21.2.6` | `21.2.7` |
| [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) | `21.2.6` | `21.2.7` |
| [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) | `21.2.6` | `21.2.7` |
| [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) | `21.2.6` | `21.2.7` |
| [@angular/platform-browser-dynamic](https://github.com/angular/angular/tree/HEAD/packages/platform-browser-dynamic) | `21.2.6` | `21.2.7` |
| [@angular/router](https://github.com/angular/angular/tree/HEAD/packages/router) | `21.2.6` | `21.2.7` |
| [@angular/service-worker](https://github.com/angular/angular/tree/HEAD/packages/service-worker) | `21.2.6` | `21.2.7` |
| [@embedpdf/pdfium](https://github.com/embedpdf/embed-pdf-viewer/tree/HEAD/packages/pdfium) | `2.12.1` | `2.14.0` |
| @embedpdf/snippet | `2.12.1` | `2.14.0` |
| [@tanstack/angular-query-experimental](https://github.com/TanStack/query/tree/HEAD/packages/angular-query-experimental) | `5.95.2` | `5.96.2` |
| [ng2-charts](https://github.com/valor-software/ng2-charts) | `8.0.0` | `10.0.0` |
| [ngx-extended-pdf-viewer](https://github.com/stephanrauh/ngx-extended-pdf-viewer) | `25.6.4` | `26.0.0` |
| [ngx-sse-client](https://github.com/marcospds/ngx-sse-client) | `20.0.1` | `21.0.0` |
| [primeng](https://github.com/primefaces/primeng/tree/HEAD/packages/primeng) | `21.1.3` | `21.1.5` |
| [uuid](https://github.com/uuidjs/uuid) | `11.1.0` | `13.0.0` |
| [@analogjs/vite-plugin-angular](https://github.com/analogjs/analog) | `2.3.1` | `2.4.0` |
| [@analogjs/vitest-angular](https://github.com/analogjs/analog) | `2.3.1` | `2.4.0` |
| [@angular-devkit/architect](https://github.com/angular/angular-cli) | `0.2102.4` | `0.2102.6` |
| [@angular-devkit/schematics](https://github.com/angular/angular-cli) | `21.2.4` | `21.2.6` |
| [@angular/build](https://github.com/angular/angular-cli) | `21.2.4` | `21.2.6` |
| [@angular/cli](https://github.com/angular/angular-cli) | `21.2.4` | `21.2.6` |
| [@angular/compiler-cli](https://github.com/angular/angular/tree/HEAD/packages/compiler-cli) | `21.2.6` | `21.2.7` |
| [@playwright/test](https://github.com/microsoft/playwright) | `1.58.2` | `1.59.1` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `25.5.0` | `25.5.2` |
| [eslint](https://github.com/eslint/eslint) | `10.1.0` | `10.2.0` |
| [typescript](https://github.com/microsoft/TypeScript) | `5.9.3` | `6.0.2` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.57.2` | `8.58.0` |



Updates `@angular/animations` from 21.2.6 to 21.2.7
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.7/packages/animations)

Updates `@angular/cdk` from 21.2.4 to 21.2.5
- [Release notes](https://github.com/angular/components/releases)
- [Changelog](https://github.com/angular/components/blob/main/CHANGELOG.md)
- [Commits](angular/components@v21.2.4...v21.2.5)

Updates `@angular/common` from 21.2.6 to 21.2.7
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.7/packages/common)

Updates `@angular/compiler` from 21.2.6 to 21.2.7
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.7/packages/compiler)

Updates `@angular/core` from 21.2.6 to 21.2.7
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.7/packages/core)

Updates `@angular/forms` from 21.2.6 to 21.2.7
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.7/packages/forms)

Updates `@angular/platform-browser` from 21.2.6 to 21.2.7
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.7/packages/platform-browser)

Updates `@angular/platform-browser-dynamic` from 21.2.6 to 21.2.7
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.7/packages/platform-browser-dynamic)

Updates `@angular/router` from 21.2.6 to 21.2.7
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.7/packages/router)

Updates `@angular/service-worker` from 21.2.6 to 21.2.7
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.7/packages/service-worker)

Updates `@embedpdf/pdfium` from 2.12.1 to 2.14.0
- [Release notes](https://github.com/embedpdf/embed-pdf-viewer/releases)
- [Changelog](https://github.com/embedpdf/embed-pdf-viewer/blob/main/packages/pdfium/CHANGELOG.md)
- [Commits](https://github.com/embedpdf/embed-pdf-viewer/commits/v2.14.0/packages/pdfium)

Updates `@embedpdf/snippet` from 2.12.1 to 2.14.0

Updates `@tanstack/angular-query-experimental` from 5.95.2 to 5.96.2
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/angular-query-experimental/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/angular-query-experimental@5.96.2/packages/angular-query-experimental)

Updates `ng2-charts` from 8.0.0 to 10.0.0
- [Release notes](https://github.com/valor-software/ng2-charts/releases)
- [Commits](valor-software/ng2-charts@v8.0.0...v10.0.0)

Updates `ngx-extended-pdf-viewer` from 25.6.4 to 26.0.0
- [Release notes](https://github.com/stephanrauh/ngx-extended-pdf-viewer/releases)
- [Commits](stephanrauh/ngx-extended-pdf-viewer@25.6.4...26.0.0)

Updates `ngx-sse-client` from 20.0.1 to 21.0.0
- [Release notes](https://github.com/marcospds/ngx-sse-client/releases)
- [Commits](marcospds/ngx-sse-client@v20.0.1...v21.0.0)

Updates `primeng` from 21.1.3 to 21.1.5
- [Release notes](https://github.com/primefaces/primeng/releases)
- [Changelog](https://github.com/primefaces/primeng/blob/master/CHANGELOG.md)
- [Commits](https://github.com/primefaces/primeng/commits/21.1.5/packages/primeng)

Updates `uuid` from 11.1.0 to 13.0.0
- [Release notes](https://github.com/uuidjs/uuid/releases)
- [Changelog](https://github.com/uuidjs/uuid/blob/main/CHANGELOG.md)
- [Commits](uuidjs/uuid@v11.1.0...v13.0.0)

Updates `@analogjs/vite-plugin-angular` from 2.3.1 to 2.4.0
- [Release notes](https://github.com/analogjs/analog/releases)
- [Changelog](https://github.com/analogjs/analog/blob/beta/CHANGELOG.md)
- [Commits](analogjs/analog@v2.3.1...v2.4.0)

Updates `@analogjs/vitest-angular` from 2.3.1 to 2.4.0
- [Release notes](https://github.com/analogjs/analog/releases)
- [Changelog](https://github.com/analogjs/analog/blob/beta/CHANGELOG.md)
- [Commits](analogjs/analog@v2.3.1...v2.4.0)

Updates `@angular-devkit/architect` from 0.2102.4 to 0.2102.6
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/commits)

Updates `@angular-devkit/schematics` from 21.2.4 to 21.2.6
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](angular/angular-cli@v21.2.4...v21.2.6)

Updates `@angular/build` from 21.2.4 to 21.2.6
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](angular/angular-cli@v21.2.4...v21.2.6)

Updates `@angular/cli` from 21.2.4 to 21.2.6
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](angular/angular-cli@v21.2.4...v21.2.6)

Updates `@angular/compiler-cli` from 21.2.6 to 21.2.7
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.7/packages/compiler-cli)

Updates `@playwright/test` from 1.58.2 to 1.59.1
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](microsoft/playwright@v1.58.2...v1.59.1)

Updates `@types/node` from 25.5.0 to 25.5.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `eslint` from 10.1.0 to 10.2.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](eslint/eslint@v10.1.0...v10.2.0)

Updates `typescript` from 5.9.3 to 6.0.2
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](microsoft/TypeScript@v5.9.3...v6.0.2)

Updates `typescript-eslint` from 8.57.2 to 8.58.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.58.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@angular/animations"
  dependency-version: 21.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: "@angular/cdk"
  dependency-version: 21.2.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: "@angular/common"
  dependency-version: 21.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: "@angular/compiler"
  dependency-version: 21.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: "@angular/core"
  dependency-version: 21.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: "@angular/forms"
  dependency-version: 21.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: "@angular/platform-browser"
  dependency-version: 21.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: "@angular/platform-browser-dynamic"
  dependency-version: 21.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: "@angular/router"
  dependency-version: 21.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: "@angular/service-worker"
  dependency-version: 21.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: "@embedpdf/pdfium"
  dependency-version: 2.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-dependencies
- dependency-name: "@embedpdf/snippet"
  dependency-version: 2.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-dependencies
- dependency-name: "@tanstack/angular-query-experimental"
  dependency-version: 5.96.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-dependencies
- dependency-name: ng2-charts
  dependency-version: 10.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: npm-dependencies
- dependency-name: ngx-extended-pdf-viewer
  dependency-version: 26.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: npm-dependencies
- dependency-name: ngx-sse-client
  dependency-version: 21.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: npm-dependencies
- dependency-name: primeng
  dependency-version: 21.1.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: uuid
  dependency-version: 13.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: npm-dependencies
- dependency-name: "@analogjs/vite-plugin-angular"
  dependency-version: 2.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm-dependencies
- dependency-name: "@analogjs/vitest-angular"
  dependency-version: 2.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm-dependencies
- dependency-name: "@angular-devkit/architect"
  dependency-version: 0.2102.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: "@angular-devkit/schematics"
  dependency-version: 21.2.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: "@angular/build"
  dependency-version: 21.2.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: "@angular/cli"
  dependency-version: 21.2.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: "@angular/compiler-cli"
  dependency-version: 21.2.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: "@playwright/test"
  dependency-version: 1.59.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm-dependencies
- dependency-name: "@types/node"
  dependency-version: 25.5.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm-dependencies
- dependency-name: eslint
  dependency-version: 10.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm-dependencies
- dependency-name: typescript
  dependency-version: 6.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: npm-dependencies
- dependency-name: typescript-eslint
  dependency-version: 8.58.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>

* fix(pdf): improve page change handling and add scroll margin to test setup

* chore(dependencies): downgrade typescript to version 5.9.3

* fix(pdf): update authorization handling and adjust PDF buffer management

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
the book download proxy code path should never be called.  this is
because the book download URL received as part of the kobo proxy points
at the Rakuten Kobo CDN rather than at grimmory.  further, even if this
code could download the file from the CDN (it doesn't), it would be
pointless as we don't return it.  instead of fixing the return this
drops the proxy from that code path
* fix(api): invert kobo book type check for downloads

with the previous organization of code paths this leads to an
exception being raised in the logs even though the response message
is fine

* style: drop extra newline
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 9, 2026

📝 Walkthrough

Walkthrough

This PR enhances API documentation by adding Swagger @Parameter annotations to method parameters across 13 controller classes. Additionally, UserStatsController introduces input validation constraints (@Min/@Max) on numeric query parameters and adds class-level @Validated annotation.

Changes

Cohort / File(s) Summary
App Controllers
booklore-api/src/main/java/org/booklore/app/controller/AppAuthorController, AppBookController, AppFilterController, AppNotebookController, AppSeriesController, AppShelfController
Added Swagger @Parameter annotations with descriptions to request parameters (page, size, sort, dir, libraryId, search, bookId, q, limit, etc.) across six controller endpoints. No changes to routing, defaults, or runtime logic.
Authentication & File Controllers
booklore-api/src/main/java/org/booklore/controller/AdditionalFileController, LogoutController, OidcAuthController, OidcGroupMappingController
Added Swagger @Parameter annotations to path variables and request parameters across file upload/download/delete endpoints, OIDC callback/logout methods, and group mapping endpoints. No changes to request handling or authorization logic.
Session & Task Controllers
booklore-api/src/main/java/org/booklore/controller/ReadingSessionController, TaskController
Added Swagger @Parameter annotations to bookId, page, size, taskId, and taskType parameters. No changes to control flow or service logic.
User Stats Controller
booklore-api/src/main/java/org/booklore/controller/UserStatsController
Added Swagger @Parameter annotations to year/month/week parameters and introduced input validation constraints (@Min/@Max on month and week) across 14 endpoints. Applied class-level @Validated annotation. No changes to statistics calculation logic.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~15 minutes

Possibly related PRs

  • grimmory#289: Reintroduces API documentation and endpoints; complements this PR's OpenAPI metadata enrichment.
  • grimmory#437: Adds @Tag and @Operation OpenAPI annotations to the same controller classes; works in tandem with this PR's parameter-level documentation.

Suggested labels

backend, enhancement

Suggested reviewers

  • imajes
  • balazs-szucs

Poem

🐰 With whiskers twitching in delight,
We annotate our docs with all our might,
Each parameter now shines so clear,
Our API's story draws near,
Swagger dancing through the code—hooray! 🎉

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 2.04% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'docs(api): add parameter descriptions for app contoller annotations' follows conventional commit format with 'docs' type and descriptive scope/subject, despite the typo 'contoller' instead of 'controller'.
Description check ✅ Passed The PR description includes both required sections (Description and Changes) with meaningful content explaining the purpose and specific changes made, matching the template structure.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/add-openapi-parameter-descriptions
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch feature/add-openapi-parameter-descriptions

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

… auth/task endpoints (#437)

* docs(api): add OpenAPI tags and operation metadata to controllers

* docs(api): normalize @operation annotation formatting in OpenAPI controllers

* docs(api): align operationId values with existing controller method names

* chore(api-docs): update api docs to be enabled by default for dev builds
Base automatically changed from feature/add-openapi-docs-tags to develop April 9, 2026 18:28
balazs-szucs and others added 13 commits April 9, 2026 22:50
…#372)

* refactor(api): optimize caching mechanisms and improve book filtering logic

* refactor(preferences): remove unused ExternalDocLinkComponent and enhance translate function typing

* refactor(initializer): add Duration import for improved cache management

* refactor(docker): increase MaxMetaspaceSize for improved memory management

* refactor(repository): replace findAllForSummaryByIds with findAllById

* refactor(cache): implement invalidateAppBooksQueries for improved cache management

* refactor(AppBookService): increase default page size and optimize magic shelf book resolution

* refactor(AppBookSpecification, MagicShelfBookService, TaskCancellationManager, magic-shelf-component): streamline join handling and improve memory management

* refactor(AppBookService, MagicShelfBookService): enhance book retrieval logic and improve error handling

* chore: fix formatting

* chore: fix formatting
…and update related code (#334)

* refactor(epub): migrate from documentnode to grimmory epub4j library and update related code

* chore(deps): restore proper imports

* refactor(epub): update to epub4j version 1.0.0 and improve cover image detection

* fix(epub): validate spine indices in convertXPointerRangeToCfi method

* chore(deps): update epub4j dependencies to version 1.0.1

* chore(deps): update epub4j dependency to version 1.0.1

* feat(build): enable preview features and update epub4j dependencies in build configuration

* feat(epub): update epub4j dependencies to version 1.1.0 and refactor resource handling for improved streaming
…g and low priority fetch (#431)

* fix(lazy-loading): improve image loading performance with lazy loading and low priority fetch

* fix(styles): update intrinsic size for virtual scroller items to use CSS variable

* refactor(book-card): simplify redundant cover width binding

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: Zach <zachyale@gmail.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
…uses and file types (#448)

* fix(filter): update filter options to use CountedOption for read statuses and file types

* fix(specification): validate file types and read statuses, throwing APIException for invalid values
… in infinite scrolling (#433)

* fix(reader): optimize memory management for canvas and image handling in infinite scrolling

* fix(reader): improve image loading management and optimize memory usage in infinite scrolling
* fix(dashboard): improve performance with OnPush change detection

* fix(dashboard): refactor book card component for improved readability and performance

* fix(tests): mock matchMedia for improved test compatibility

* fix(tests): matchMedia mock for better CI compatibility and support

* fix(dashboard): add clearAll method to BookBrowserScrollService and update tests

* fix(dashboard): improve performance with content visibility and refactor styles

* fix(dashboard): improve scroll performance with estimated total height and refactor layout

* fix(tests): add mock for getCurrentUser in userService for improved test coverage

* fix(dashboard): implement infinite scroll for book loading and scroll restoration

* fix(tests): fix lint error

* fix(tests): mock ResizeObserver and IntersectionObserver

* fix(tests): mock ResizeObserver and IntersectionObserver (again)

* fix(dashboard): improve accessibility and performance by updating aria attributes and optimizing animations

* fix(dashboard): improve submenu accessibility and optimize virtual scroller performance

* fix(dashboard): clean up imports and improve component structure

* fix(dashboard): correct mobile check in author browser component

* fix(dashboard): add OnDestroy lifecycle hook to BookBrowserComponent
… for better resource management (#443)

* refactor(settings): replace unsubscribe logic with takeUntilDestroyed for better resource management

* refactor(settings): streamline saveSettings method and improve error handling

* fix(settings): improve error handling in saveSetting method

* refactor(settings): update tab structure

* refactor(settings): implement OnDestroy interface and clean up unused destroyRef instances
…ures (#463)

* fix(reader): resolve epub preview runtime and audiobook download failures

* fix(files): load book library path for additional file downloads

* fix(files): scope additional file operations to book-owned non-primary files
* fix(pdf-reader): localize embedpdf viewer to active app language

* fix(pdf-reader): use runtime locale fallback for embedpdf translations

* fix(pdf-reader): clarify document viewer save info copy
# Conflicts:
#	booklore-api/src/main/java/org/booklore/app/controller/AppBookController.java
#	booklore-api/src/main/java/org/booklore/controller/AdditionalFileController.java
@zachyale zachyale force-pushed the feature/add-openapi-parameter-descriptions branch from 558f0af to 1ac904a Compare April 11, 2026 03:39
@coderabbitai coderabbitai Bot requested a review from imajes April 11, 2026 03:39
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
booklore-api/src/main/java/org/booklore/controller/UserStatsController.java (1)

253-253: Consider adding lower bounds for window-size params (weeks, months).

Line 253 and Line 276 currently allow 0/negative values. Adding @Min(1) keeps these endpoints consistent with the new month/week validation approach.

Suggested diff
-    public ResponseEntity<List<WeeklyListeningTrendResponse>> getWeeklyListeningTrend(
-            `@Parameter`(description = "Number of weeks") `@RequestParam`(defaultValue = "26") int weeks) {
+    public ResponseEntity<List<WeeklyListeningTrendResponse>> getWeeklyListeningTrend(
+            `@Parameter`(description = "Number of weeks") `@RequestParam`(defaultValue = "26") `@Min`(1) int weeks) {
         return ResponseEntity.ok(readingSessionService.getWeeklyListeningTrend(weeks));
     }
@@
-    public ResponseEntity<List<MonthlyPaceResponse>> getMonthlyListeningPace(
-            `@Parameter`(description = "Number of months") `@RequestParam`(defaultValue = "12") int months) {
+    public ResponseEntity<List<MonthlyPaceResponse>> getMonthlyListeningPace(
+            `@Parameter`(description = "Number of months") `@RequestParam`(defaultValue = "12") `@Min`(1) int months) {
         return ResponseEntity.ok(readingSessionService.getMonthlyListeningPace(months));
     }

Also applies to: 276-276

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@booklore-api/src/main/java/org/booklore/controller/UserStatsController.java`
at line 253, The weeks/months request parameters in UserStatsController are
currently unconstrained and can be zero/negative; annotate the parameters (the
`@RequestParam` int weeks and the `@RequestParam` int months in the controller
methods) with javax.validation.constraints.Min(1) to enforce a lower bound
(e.g., `@Min`(1) `@RequestParam`(defaultValue="26") int weeks), add the necessary
import, and ensure the controller (UserStatsController) or the specific handler
methods are covered by Spring validation by adding `@Validated` on the class or
method if not already present so the `@Min` constraint is enforced at runtime.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@booklore-api/src/main/java/org/booklore/controller/UserStatsController.java`:
- Line 253: The weeks/months request parameters in UserStatsController are
currently unconstrained and can be zero/negative; annotate the parameters (the
`@RequestParam` int weeks and the `@RequestParam` int months in the controller
methods) with javax.validation.constraints.Min(1) to enforce a lower bound
(e.g., `@Min`(1) `@RequestParam`(defaultValue="26") int weeks), add the necessary
import, and ensure the controller (UserStatsController) or the specific handler
methods are covered by Spring validation by adding `@Validated` on the class or
method if not already present so the `@Min` constraint is enforced at runtime.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8cf239f1-3f81-42c0-a3e2-c0eb4b544a95

📥 Commits

Reviewing files that changed from the base of the PR and between 35dca81 and 1ac904a.

📒 Files selected for processing (13)
  • booklore-api/src/main/java/org/booklore/app/controller/AppAuthorController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppBookController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppFilterController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppNotebookController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppSeriesController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppShelfController.java
  • booklore-api/src/main/java/org/booklore/controller/AdditionalFileController.java
  • booklore-api/src/main/java/org/booklore/controller/LogoutController.java
  • booklore-api/src/main/java/org/booklore/controller/OidcAuthController.java
  • booklore-api/src/main/java/org/booklore/controller/OidcGroupMappingController.java
  • booklore-api/src/main/java/org/booklore/controller/ReadingSessionController.java
  • booklore-api/src/main/java/org/booklore/controller/TaskController.java
  • booklore-api/src/main/java/org/booklore/controller/UserStatsController.java
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Test Suite / Backend Tests
  • GitHub Check: Test Suite / Frontend Tests
  • GitHub Check: Analyze (java-kotlin)
🧰 Additional context used
📓 Path-based instructions (1)
booklore-api/src/**/*.java

📄 CodeRabbit inference engine (AGENTS.md)

booklore-api/src/**/*.java: Use 4-space indentation in Java files and match surrounding Java style
Prefer constructor injection via Lombok patterns already used in the codebase. Do not introduce @Autowired field injection
Use MapStruct for entity/DTO mapping

Files:

  • booklore-api/src/main/java/org/booklore/app/controller/AppShelfController.java
  • booklore-api/src/main/java/org/booklore/controller/ReadingSessionController.java
  • booklore-api/src/main/java/org/booklore/controller/LogoutController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppAuthorController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppNotebookController.java
  • booklore-api/src/main/java/org/booklore/controller/OidcAuthController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppSeriesController.java
  • booklore-api/src/main/java/org/booklore/controller/OidcGroupMappingController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppFilterController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppBookController.java
  • booklore-api/src/main/java/org/booklore/controller/TaskController.java
  • booklore-api/src/main/java/org/booklore/controller/UserStatsController.java
  • booklore-api/src/main/java/org/booklore/controller/AdditionalFileController.java
🧠 Learnings (5)
📚 Learning: 2026-04-04T15:36:56.558Z
Learnt from: balazs-szucs
Repo: grimmory-tools/grimmory PR: 372
File: booklore-api/src/main/java/org/booklore/app/service/AppBookService.java:357-359
Timestamp: 2026-04-04T15:36:56.558Z
Learning: In `booklore-api/src/main/java/org/booklore/app/service/AppBookService.java`, `shelfId` and `magicShelfId` are mutually exclusive navigation contexts in `getFilterOptions`. A request will never supply both at the same time, so the `else if (shelfId != null)` branch after the `magicBookIds != null` check is intentional and correct — there is no missing shelf-∩-magicShelf intersection case. Do not flag this pattern as a bug.

Applied to files:

  • booklore-api/src/main/java/org/booklore/app/controller/AppShelfController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppFilterController.java
📚 Learning: 2026-04-10T08:15:37.436Z
Learnt from: imnotjames
Repo: grimmory-tools/grimmory PR: 449
File: booklore-api/src/main/java/org/booklore/service/book/BookDownloadService.java:139-145
Timestamp: 2026-04-10T08:15:37.436Z
Learning: When using Spring `ContentDisposition.builder(...).filename(name, StandardCharsets.UTF_8).build()` (i.e., explicitly providing UTF-8), the resulting header value should include both the quoted `filename="=?UTF-8?..."` and the RFC 5987 `filename*=` parameters. In this case, any extra ASCII fallback computation (e.g., deriving an ASCII `fallbackFilename` via `NON_ASCII_PATTERN` and calling `.filename(fallbackFilename)`) is likely redundant—prefer calling only `.filename(fallbackName?, StandardCharsets.UTF_8)` as appropriate and let Spring handle the UTF-8 header parameters. Verify by comparing the emitted header for `filename` and `filename*` before deciding to keep an ASCII fallback.

Applied to files:

  • booklore-api/src/main/java/org/booklore/app/controller/AppShelfController.java
  • booklore-api/src/main/java/org/booklore/controller/ReadingSessionController.java
  • booklore-api/src/main/java/org/booklore/controller/LogoutController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppAuthorController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppNotebookController.java
  • booklore-api/src/main/java/org/booklore/controller/OidcAuthController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppSeriesController.java
  • booklore-api/src/main/java/org/booklore/controller/OidcGroupMappingController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppFilterController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppBookController.java
  • booklore-api/src/main/java/org/booklore/controller/TaskController.java
  • booklore-api/src/main/java/org/booklore/controller/UserStatsController.java
  • booklore-api/src/main/java/org/booklore/controller/AdditionalFileController.java
📚 Learning: 2026-03-26T01:46:48.863Z
Learnt from: CR
Repo: grimmory-tools/grimmory PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-26T01:46:48.863Z
Learning: Applies to booklore-api/src/**/*.java : Prefer constructor injection via Lombok patterns already used in the codebase. Do not introduce `Autowired` field injection

Applied to files:

  • booklore-api/src/main/java/org/booklore/app/controller/AppAuthorController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppNotebookController.java
  • booklore-api/src/main/java/org/booklore/app/controller/AppBookController.java
📚 Learning: 2026-03-26T02:20:27.862Z
Learnt from: imnotjames
Repo: grimmory-tools/grimmory PR: 198
File: booklore-api/src/main/java/org/booklore/controller/KoboController.java:100-103
Timestamp: 2026-03-26T02:20:27.862Z
Learning: In `booklore-api/src/main/java/org/booklore/controller/KoboController.java`, the Kobo reader device already makes direct outbound connections to Kobo's CDN/servers for other requests (confirmed by imnotjames via testing). Therefore, returning a `307 TEMPORARY_REDIRECT` to `cdn.kobo.com` for non-`BL-` book cover thumbnails (instead of server-side proxying) does NOT introduce a new privacy or behavioral regression — the Kobo device's IP and User-Agent are already exposed to Kobo through other direct requests.

Applied to files:

  • booklore-api/src/main/java/org/booklore/controller/OidcAuthController.java
📚 Learning: 2026-03-26T01:46:48.863Z
Learnt from: CR
Repo: grimmory-tools/grimmory PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-26T01:46:48.863Z
Learning: Applies to booklore-api/src/**/*.java : Use MapStruct for entity/DTO mapping

Applied to files:

  • booklore-api/src/main/java/org/booklore/app/controller/AppBookController.java
🔀 Multi-repo context grimmory-tools/grimmory-docs

Findings for grimmory-tools/grimmory-docs [::grimmory-tools/grimmory-docs::]

  • docs/integration/komga-api.md — multiple Komga API endpoints reference {libraryId} and {bookId} (lines shown by search: ~237–257, 278). These are documentation pages that reference path/query parameter names used in Booklore controllers. [::grimmory-tools/grimmory-docs::]
  • docs/integration/opds.md — entries refer to GET /komga/api/v1/books/{id}/file and related book endpoints (lines shown ~141–144). [::grimmory-tools/grimmory-docs::]
  • docs/authentication/oidc-settings.md and related auth docs — contain sections on OIDC/back-channel logout and group-mapping (many lines; see search hits). These may be affected in OpenAPI output for OIDC endpoints annotated in the PR. [::grimmory-tools/grimmory-docs::]
  • docs/authors.md, docs/series.md, docs/notebook.md, docs/notebook.md, docs/readers/, docs/library/ — general product docs referencing authors/books/series/shelves and pagination/filters (search hits for page/size/libraryId/bookId-like terms across many docs). These are static docs that might need syncing if the project regenerates or publishes updated OpenAPI-driven API docs. [::grimmory-tools/grimmory-docs::]

Assessment

  • I found documentation pages that reference the same parameter names and endpoints the PR annotates for OpenAPI. No Java code consumers live here (this repo holds user/docs); the main impact is that API docs generation or published OpenAPI spec used by these docs may change/enrich parameter descriptions. [::grimmory-tools/grimmory-docs::]
🔇 Additional comments (13)
booklore-api/src/main/java/org/booklore/controller/ReadingSessionController.java (1)

7-7: OpenAPI parameter docs were added cleanly without behavior changes.

@Parameter metadata is aligned with existing @PathVariable/@RequestParam bindings and keeps runtime behavior intact.

Also applies to: 48-50

booklore-api/src/main/java/org/booklore/app/controller/AppAuthorController.java (1)

4-4: Parameter descriptions are consistent and useful for API consumers.

Nice improvement to OpenAPI clarity for pagination/filtering and path params, with no change to endpoint behavior.

Also applies to: 29-35, 47-47

booklore-api/src/main/java/org/booklore/app/controller/AppShelfController.java (1)

4-4: Good OpenAPI coverage for magic-shelf paging inputs.

The added @Parameter annotations improve generated docs while preserving current request binding/defaults.

Also applies to: 104-106

booklore-api/src/main/java/org/booklore/app/controller/AppNotebookController.java (1)

4-4: Strong documentation pass across notebook endpoints.

Path/query parameter descriptions are now consistently documented across browse/update/delete routes.

Also applies to: 33-35, 47-52, 64-65, 78-79

booklore-api/src/main/java/org/booklore/controller/LogoutController.java (1)

4-4: Nice improvement documenting the optional Origin header.

This makes the logout contract clearer in OpenAPI without affecting request handling.

Also applies to: 34-34

booklore-api/src/main/java/org/booklore/app/controller/AppSeriesController.java (1)

4-4: Series endpoint parameter docs look good and consistent.

The added descriptions improve discoverability for filtering/sorting/pagination inputs.

Also applies to: 29-35, 52-57

booklore-api/src/main/java/org/booklore/controller/OidcAuthController.java (1)

4-4: OIDC parameter documentation updates are solid.

Good addition of descriptions for callback and logout inputs; this improves API clarity without touching flow logic.

Also applies to: 82-87, 133-137, 155-155

booklore-api/src/main/java/org/booklore/controller/OidcGroupMappingController.java (1)

4-4: Mapping ID parameter documentation is correctly applied.

Both update and delete endpoints now expose clearer path-parameter docs in OpenAPI.

Also applies to: 50-50, 60-60

booklore-api/src/main/java/org/booklore/app/controller/AppBookController.java (1)

41-41: Clean OpenAPI parameter enrichment with no behavioral drift.

These @Parameter(description = ...) additions are consistent and keep request binding/runtime logic intact.

Also applies to: 53-55, 67-67, 79-79, 91-91, 103-103, 115-115, 129-129, 143-145

booklore-api/src/main/java/org/booklore/app/controller/AppFilterController.java (1)

30-32: Looks good — parameter docs are clear and aligned with endpoint inputs.

booklore-api/src/main/java/org/booklore/controller/TaskController.java (1)

70-70: Good annotation-only update on task route parameters.

No functional behavior appears altered; this improves OpenAPI clarity for both endpoints.

Also applies to: 94-94

booklore-api/src/main/java/org/booklore/controller/UserStatsController.java (1)

22-22: Nice validation hardening.

Adding @Validated plus explicit month/week bounds is a solid improvement for request correctness and error consistency.

Also applies to: 50-50, 65-65, 91-91, 105-105, 241-241, 300-300

booklore-api/src/main/java/org/booklore/controller/AdditionalFileController.java (1)

41-41: Looks good — parameter descriptions are consistently applied across file endpoints.

Also applies to: 54-55, 69-73, 86-87, 100-101, 115-116

@zachyale zachyale force-pushed the develop branch 2 times, most recently from 0bf513c to 62434c5 Compare April 22, 2026 21:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.