fix(request): correct delete permission check and await movie save#2742
Conversation
Two bugs in the request route handler: 1. DELETE /request/:id used three top-level && conditions to gate deletion, meaning any authenticated user could delete any PENDING request because the third condition (status !== PENDING) short-circuits the denial. The intent is: non-admins may only retract their own requests while they are still pending. Fixed by grouping the ownership and status checks with || inside a single outer && against the admin check. Before: !admin && !owner && !pending (allows deletion if pending) After: !admin && (!owner || !pending) (owner + pending required) Also replaces the magic number 1 with MediaRequestStatus.PENDING. 2. The movie branch of PUT /request/:id called requestRepository.save() without await, returning the 200 response before the write completed. The TV branch in the same handler correctly awaits the save. Fixed by adding the missing await. Tests cover: owner can delete own pending request, admin can delete any request, non-owner non-admin is denied on a pending request, owner is denied on an approved request, and movie update changes are persisted before the response is returned.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughAdded request route tests and tightened request route logic: new test suite for DELETE and PUT Changes
Sequence Diagram(s)sequenceDiagram
participant Client as Client
participant Server as API Server
participant Auth as Auth Middleware
participant DB as Database
Client->>Server: DELETE /request/:requestId
Server->>Auth: checkUser (session)
Auth-->>Server: user info
Server->>DB: load MediaRequest by id
DB-->>Server: request (owner, status)
alt request not found
Server-->>Client: 404 Not Found
else user is owner OR admin AND status == PENDING
Server->>DB: delete request
DB-->>Server: deleted
Server-->>Client: 204 No Content
else
Server-->>Client: 401 Unauthorized
end
sequenceDiagram
participant Client as Client
participant Server as API Server
participant Auth as Auth Middleware
participant DB as Database
Client->>Server: PUT /request/:requestId (movie with server/profile/rootFolder)
Server->>Auth: checkUser (session)
Auth-->>Server: user info
Server->>DB: load MediaRequest by id
DB-->>Server: request
Server->>DB: apply updates
Server->>DB: await save(request)
DB-->>Server: saved request
Server-->>Client: 200 OK (updated request)
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. 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. Comment |
|
@fallenbagel any chance i could get a review? |
|
Verified the bug via API as a non-admin user with a valid session cookie successfully deletes another user's pending request. Confirmed the permission check is broken as described. Will review later. |
There was a problem hiding this comment.
Pull request overview
Fixes two request-route bugs in the server API: (1) corrects authorization logic so only admins can delete any request while non-admins can only retract their own pending requests, and (2) ensures movie request updates are persisted before responding.
Changes:
- Fix
DELETE /request/:idpermission gating for pending vs non-pending requests (and replaces a status magic number withMediaRequestStatus.PENDING). - Await
requestRepository.save()in the movie branch ofPUT /request/:idto prevent responding before the write completes. - Add a new
server/routes/request.test.tssuite covering both regressions.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| server/routes/request.ts | Corrects delete authorization logic and awaits movie request persistence. |
| server/routes/request.test.ts | Adds regression tests for delete authorization and awaited movie update persistence. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
Thanks @fallenbagel ! Sorry for the nudge, but just happy to contribute to my favourite app for the first time. Keep on rocking! 🙇 |
- Restore settings.main.localLogin in a finally block in authenticatedAgent
to prevent state leaking between tests
- Explicitly set cookie: { secure: false } in test session config to make
HTTP-only intent clear and suppress the GH Advanced Security finding
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@server/routes/request.test.ts`:
- Around line 57-61: The test mutates global settings.main.localLogin in the
before hook (via getSettings()) and never restores it, causing state leakage;
fix by capturing the original value of settings.main.localLogin when you call
getSettings() in the before hook and restore that value in an after or afterEach
hook (or use your existing settings helper to scope changes), referencing the
same symbols: createApp(), getSettings(), settings.main.localLogin, before ->
after/afterEach to ensure the global flag is returned to its prior value.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 5ad916d6-3d72-4ae5-bb81-2e6147124c61
📒 Files selected for processing (1)
server/routes/request.test.ts
- Scope localLogin mutation to loginAs helper via try/finally
- Rename authenticatedAgent to loginAs, createMovieRequest to seedRequest
- Add sendNotification mock with beforeEach reset
- Remove cookie: { secure: false } from session config
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [seerr/seerr](https://github.com/seerr-team/seerr) | minor | `v3.1.1` → `v3.2.0` | --- ### Release Notes <details> <summary>seerr-team/seerr (seerr/seerr)</summary> ### [`v3.2.0`](https://github.com/seerr-team/seerr/releases/tag/v3.2.0) [Compare Source](seerr-team/seerr@v3.1.1...v3.2.0) ##### [3.2.0](https://github.com/seerr-team/seerr/compare/v3.1.1..v3.2.0) - 2026-04-15 ##### 🚀 Features - *(blocklist)* Add support for collections ([#​1841](seerr-team/seerr#1841)) - ([993ae4c](seerr-team/seerr@993ae4c)) - *(discover)* Handle errors gracefully when content is available ([#​1542](seerr-team/seerr#1542)) - ([7920970](seerr-team/seerr@7920970)) - *(i18n)* Add Estonian language support ([#​2611](seerr-team/seerr#2611)) - ([56b79ff](seerr-team/seerr@56b79ff)) - *(i18n)* Add Luxembourgish language support ([#​2671](seerr-team/seerr#2671)) - ([dccdc95](seerr-team/seerr@dccdc95)) - *(i18n)* Add Vietnamese language support ([#​2670](seerr-team/seerr#2670)) - ([40edaea](seerr-team/seerr@40edaea)) - *(jellyfin)* Allow Jellyfin Guids with dashes for import-from-jellyfin endpoint ([#​2340](seerr-team/seerr#2340)) - ([3557745](seerr-team/seerr@3557745)) - *(notifications)* Add ntfy markdown formatting ([#​2602](seerr-team/seerr#2602)) - ([77f2c13](seerr-team/seerr@77f2c13)) - *(notifications)* Webhook custom headers ([#​2230](seerr-team/seerr#2230)) - ([3152f72](seerr-team/seerr@3152f72)) - *(notifications)* Add priority setting for ntfy agent ([#​2306](seerr-team/seerr#2306)) - ([61e0377](seerr-team/seerr@61e0377)) - *(person)* Add tmdb- and imdb link on person detail page ([#​2136](seerr-team/seerr#2136)) - ([fb2ee7c](seerr-team/seerr@fb2ee7c)) - *(quota)* Added support for unlimited quota days ([#​2797](seerr-team/seerr#2797)) - ([6d8b2b7](seerr-team/seerr@6d8b2b7)) - *(requests)* Mark requests as failed when Radarr/Sonarr unreachable ([#​2171](seerr-team/seerr#2171)) - ([c23117e](seerr-team/seerr@c23117e)) - *(settings)* Add blocklist region and language options ([#​1802](seerr-team/seerr#1802)) - ([ff469cb](seerr-team/seerr@ff469cb)) - *(settings)* Add help tooltips for services setup ([#​2662](seerr-team/seerr#2662)) - ([f5115da](seerr-team/seerr@f5115da)) - *(sonarr)* Add monitorNewItems option to sonarr settings & modal ([#​2071](seerr-team/seerr#2071)) - ([5c34c91](seerr-team/seerr@5c34c91)) - *(trending)* Add filter options ([#​2137](seerr-team/seerr#2137)) - ([4ce0db1](seerr-team/seerr@4ce0db1)) - *(ui)* Add loading state to request approve/decline buttons ([#​2815](seerr-team/seerr#2815)) - ([bd8f2d4](seerr-team/seerr@bd8f2d4)) - *(userlist)* Add sortable columns to User List ([#​1615](seerr-team/seerr#1615)) - ([eaf397a](seerr-team/seerr@eaf397a)) - *(webhook)* Add imdbid to webhook notification ([#​2658](seerr-team/seerr#2658)) - ([2432e8d](seerr-team/seerr@2432e8d)) - Sort quality profiles ASC in request and service configuration ([#​1805](seerr-team/seerr#1805)) - ([25e376c](seerr-team/seerr@25e376c)) - Add trailing whitespace warning on login username field ([#​2040](seerr-team/seerr#2040)) ([#​2177](seerr-team/seerr#2177)) - ([636dcb9](seerr-team/seerr@636dcb9)) ##### 🐛 Bug Fixes - *(auth)* Resolve Plex OAuth client ID mismatch ([#​2746](seerr-team/seerr#2746)) - ([15b3109](seerr-team/seerr@15b3109)) - *(email)* Correctly classify final MIME header in PGP email encryption ([#​2618](seerr-team/seerr#2618)) - ([9ec3d58](seerr-team/seerr@9ec3d58)) - *(email)* Preserve newlines in PGP key textarea fields ([#​2617](seerr-team/seerr#2617)) - ([835e917](seerr-team/seerr@835e917)) - *(emby)* Use static version in auth header for emby only ([#​2821](seerr-team/seerr#2821)) - ([fe2c041](seerr-team/seerr@fe2c041)) - *(entities)* Replace MySQL-only onUpdate with [@​UpdateDateColumn](https://github.com/UpdateDateColumn) ([#​2823](seerr-team/seerr#2823)) - ([0b8f872](seerr-team/seerr@0b8f872)) - *(generate-password)* Await setPassword to fix race condition ([#​2845](seerr-team/seerr#2845)) - ([061121c](seerr-team/seerr@061121c)) - *(issues)* Update issue timestamp when adding comments ([#​2616](seerr-team/seerr#2616)) - ([a16d046](seerr-team/seerr@a16d046)) - *(jellyfin-scanner)* Add TheMovieDb provider fallback for Jellyfin scanner ([#​2605](seerr-team/seerr#2605)) - ([10f23f0](seerr-team/seerr@10f23f0)) - *(login)* Resolve stuck transition when switching login forms ([#​2779](seerr-team/seerr#2779)) - ([735ec47](seerr-team/seerr@735ec47)) - *(media)* Exclude null mediaAddedAt entries ([#​2607](seerr-team/seerr#2607)) - ([001f6b1](seerr-team/seerr@001f6b1)) - *(migration)* Repair postgres blocklist id sequence ([#​2686](seerr-team/seerr#2686)) - ([f40323c](seerr-team/seerr@f40323c)) - *(movie,tv)* Respect display language for trailers ([#​2674](seerr-team/seerr#2674)) - ([90d407d](seerr-team/seerr@90d407d)) - *(open-api)* Add missing mediaType query parameter to blocklist and watchlist ([#​2722](seerr-team/seerr#2722)) - ([c7185d4](seerr-team/seerr@c7185d4)) - *(override-rules)* Remove users from `useEffect` dependency array ([#​2771](seerr-team/seerr#2771)) - ([be57997](seerr-team/seerr@be57997)) - *(overseerr-merge)* Sanitise corrupt quota values during overseerr migration ([#​2863](seerr-team/seerr#2863)) - ([43eff25](seerr-team/seerr@43eff25)) - *(plex)* Set 4K Plex URLs whenever ratingKey4k is set ([#​2635](seerr-team/seerr#2635)) - ([1548948](seerr-team/seerr@1548948)) - *(proxy)* Add path validation guardrail to imageproxy ([#​2531](seerr-team/seerr#2531)) - ([e086081](seerr-team/seerr@e086081)) - *(region-selector)* Prevent empty region reporting during sync ([#​2636](seerr-team/seerr#2636)) - ([fbfcb43](seerr-team/seerr@fbfcb43)) - *(request)* Record modifiedBy on retry and add route tests ([#​2824](seerr-team/seerr#2824)) - ([20ccd4b](seerr-team/seerr@20ccd4b)) - *(request)* Correct delete permission check and await movie save ([#​2742](seerr-team/seerr#2742)) - ([6aeab38](seerr-team/seerr@6aeab38)) - *(requests)* Mark requests as completed when media is already available ([#​2462](seerr-team/seerr#2462)) - ([d25d0ca](seerr-team/seerr@d25d0ca)) - *(settings)* Persist new settings defaults to disk on startup ([#​2884](seerr-team/seerr#2884)) - ([66130be](seerr-team/seerr@66130be)) - *(settings)* Serialize settings writes and prevent partial overwrites ([#​2696](seerr-team/seerr#2696)) - ([6c52a2f](seerr-team/seerr@6c52a2f)) - *(settings)* Remove beta info banner ([#​2615](seerr-team/seerr#2615)) - ([fece753](seerr-team/seerr@fece753)) - *(setup)* Fix Plex login not proceeding after authentication ([#​2596](seerr-team/seerr#2596)) - ([1dc5154](seerr-team/seerr@1dc5154)) - *(watchlist-sync)* Handle empty watchlists on PostgreSQL ([#​2718](seerr-team/seerr#2718)) - ([865396f](seerr-team/seerr@865396f)) - Improve local login UX ([#​2849](seerr-team/seerr#2849)) - ([aef2481](seerr-team/seerr@aef2481)) - Await missing repository saves ([#​2760](seerr-team/seerr#2760)) - ([1bb638e](seerr-team/seerr@1bb638e)) - Helm chart liveness and readiness probe ([#​2755](seerr-team/seerr#2755)) - ([4434c45](seerr-team/seerr@4434c45)) - Disambiguate tmdb ids by media type across lookups ([#​2577](seerr-team/seerr#2577)) - ([0be1896](seerr-team/seerr@0be1896)) - Anchor streaming service filter check icon to each provider card ([#​2634](seerr-team/seerr#2634)) - ([94ccd47](seerr-team/seerr@94ccd47)) ##### 📖 Documentation - *(contributing-guide)* Fix a typo ([#​2807](seerr-team/seerr#2807)) - ([6f9b743](seerr-team/seerr@6f9b743)) - *(docker)* Replace backslashes by backticks in windows docker run commands \[skip-ci] ([#​2557](seerr-team/seerr#2557)) - ([40e02bb](seerr-team/seerr@40e02bb)) - Clarify Docker volume creation instructions on fresh Windows install ([#​2861](seerr-team/seerr#2861)) - ([a133930](seerr-team/seerr@a133930)) - Move network-related docs to a dedicated tab ([#​2791](seerr-team/seerr#2791)) - ([5bbdc52](seerr-team/seerr@5bbdc52)) - Promote Nixpkgs as an official installation method ([#​2775](seerr-team/seerr#2775)) - ([05ad60c](seerr-team/seerr@05ad60c)) - Fix PM2 start command syntax ([#​2713](seerr-team/seerr#2713)) - ([5373da4](seerr-team/seerr@5373da4)) ##### 🚜 Refactor - *(imageproxy)* Reduce noisy image cache logging ([#​2789](seerr-team/seerr#2789)) - ([036d000](seerr-team/seerr@036d000)) - *(notifications)* Move event from author to title field in Discord Embed ([#​2119](seerr-team/seerr#2119)) - ([a2d1e1b](seerr-team/seerr@a2d1e1b)) - *(userlist)* Responsive columns and buttons ([#​2083](seerr-team/seerr#2083)) - ([dbe1fca](seerr-team/seerr@dbe1fca)) - *(watchlistsync)* Log media request creation after success instead of before ([#​2790](seerr-team/seerr#2790)) - ([685cb44](seerr-team/seerr@685cb44)) - Rename Error components to ErrorPage ([#​2668](seerr-team/seerr#2668)) - ([d5c5f1f](seerr-team/seerr@d5c5f1f)) ##### 🧪 Testing - *(user-list)* Deflake sorting assertions ([#​2766](seerr-team/seerr#2766)) - ([20c2ed8](seerr-team/seerr@20c2ed8)) - Support server-side unit testing ([#​2485](seerr-team/seerr#2485)) - ([8563362](seerr-team/seerr@8563362)) ##### ⚙️ Miscellaneous Tasks - *(actions)* Update github actions ([#​2683](seerr-team/seerr#2683)) - ([a2154f9](seerr-team/seerr@a2154f9)) - *(actions)* Update github actions ([#​2672](seerr-team/seerr#2672)) - ([f047cab](seerr-team/seerr@f047cab)) - *(actions)* Update github actions ([#​2632](seerr-team/seerr#2632)) - ([e25c1a5](seerr-team/seerr@e25c1a5)) - *(create-tag)* Correct quote style in commit message for tag preparation ([#​2593](seerr-team/seerr#2593)) - ([687f18b](seerr-team/seerr@687f18b)) - *(docker)* Release alias for major and minor version series ([#​2881](seerr-team/seerr#2881)) - ([1cc73a8](seerr-team/seerr@1cc73a8)) - *(i18n)* Update translations from Weblate - ([e85216a](seerr-team/seerr@e85216a)) - *(i18n)* Update translations from Weblate - ([b1adc79](seerr-team/seerr@b1adc79)) - *(i18n)* Update translations from Weblate ([#​2419](seerr-team/seerr#2419)) - ([4bd7c19](seerr-team/seerr@4bd7c19)) - *(pr-validation)* Make checklist box detection case-insensitive ([#​2802](seerr-team/seerr#2802)) - ([58514ec](seerr-team/seerr@58514ec)) - *(pr-validation)* Update pull request permissions to write for validation jobs ([#​2800](seerr-team/seerr#2800)) - ([986761f](seerr-team/seerr@986761f)) - *(pr-validation)* Disable package manager cache in nodejs setup ([#​2799](seerr-team/seerr#2799)) - ([67e27d5](seerr-team/seerr@67e27d5)) - *(release)* Prepare v3.2.0 - ([e0b2a1c](seerr-team/seerr@e0b2a1c)) - *(release)* Merge develop into main - ([c5800a0](seerr-team/seerr@c5800a0)) - Bump minimum required node version to 22.19.0 ([#​2873](seerr-team/seerr#2873)) - ([891265f](seerr-team/seerr@891265f)) - Add PR validation workflow and update contributing guidelines ([#​2777](seerr-team/seerr#2777)) - ([772e83d](seerr-team/seerr@772e83d)) - Upgrade to eslint v9 ([#​2574](seerr-team/seerr#2574)) - ([36243a0](seerr-team/seerr@36243a0)) - Ignore helm scope in git-cliff ([#​2638](seerr-team/seerr#2638)) - ([4d2b658](seerr-team/seerr@4d2b658)) ##### New Contributors ❤️ - [@​aslafy-z](https://github.com/aslafy-z) made their first contribution - [@​leereilly](https://github.com/leereilly) made their first contribution - [@​jisef](https://github.com/jisef) made their first contribution - [@​dougrathbone](https://github.com/dougrathbone) made their first contribution - [@​bobziroll](https://github.com/bobziroll) made their first contribution - [@​v3DJG6GL](https://github.com/v3DJG6GL) made their first contribution - [@​Roboroads](https://github.com/Roboroads) made their first contribution - [@​costajohnt](https://github.com/costajohnt) made their first contribution - [@​tiagodefendi](https://github.com/tiagodefendi) made their first contribution - [@​Jyasapara](https://github.com/Jyasapara) made their first contribution - [@​Sym-jay](https://github.com/Sym-jay) made their first contribution - [@​bibi0019](https://github.com/bibi0019) made their first contribution - [@​redondos](https://github.com/redondos) made their first contribution - [@​bogo22](https://github.com/bogo22) made their first contribution - [@​jabloink](https://github.com/jabloink) made their first contribution - [@​YakGravity](https://github.com/YakGravity) made their first contribution - [@​dj0024javia](https://github.com/dj0024javia) made their first contribution - [@​Jerra94](https://github.com/Jerra94) made their first contribution - [@​its-wizza](https://github.com/its-wizza) made their first contribution - [@​ventiph](https://github.com/ventiph) made their first contribution - [@​RinZ27](https://github.com/RinZ27) made their first contribution<!-- generated by git-cliff --> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19--> Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/180 Co-authored-by: bot-owl <bot@erwanleboucher.dev> Co-committed-by: bot-owl <bot@erwanleboucher.dev>
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [seerr/seerr](https://github.com/seerr-team/seerr) | minor | `v3.1.1` → `v3.2.0` | --- ### Release Notes <details> <summary>seerr-team/seerr (seerr/seerr)</summary> ### [`v3.2.0`](https://github.com/seerr-team/seerr/releases/tag/v3.2.0) [Compare Source](seerr-team/seerr@v3.1.1...v3.2.0) ##### [3.2.0](https://github.com/seerr-team/seerr/compare/v3.1.1..v3.2.0) - 2026-04-15 ##### 🚀 Features - *(blocklist)* Add support for collections ([#​1841](seerr-team/seerr#1841)) - ([993ae4c](seerr-team/seerr@993ae4c)) - *(discover)* Handle errors gracefully when content is available ([#​1542](seerr-team/seerr#1542)) - ([7920970](seerr-team/seerr@7920970)) - *(i18n)* Add Estonian language support ([#​2611](seerr-team/seerr#2611)) - ([56b79ff](seerr-team/seerr@56b79ff)) - *(i18n)* Add Luxembourgish language support ([#​2671](seerr-team/seerr#2671)) - ([dccdc95](seerr-team/seerr@dccdc95)) - *(i18n)* Add Vietnamese language support ([#​2670](seerr-team/seerr#2670)) - ([40edaea](seerr-team/seerr@40edaea)) - *(jellyfin)* Allow Jellyfin Guids with dashes for import-from-jellyfin endpoint ([#​2340](seerr-team/seerr#2340)) - ([3557745](seerr-team/seerr@3557745)) - *(notifications)* Add ntfy markdown formatting ([#​2602](seerr-team/seerr#2602)) - ([77f2c13](seerr-team/seerr@77f2c13)) - *(notifications)* Webhook custom headers ([#​2230](seerr-team/seerr#2230)) - ([3152f72](seerr-team/seerr@3152f72)) - *(notifications)* Add priority setting for ntfy agent ([#​2306](seerr-team/seerr#2306)) - ([61e0377](seerr-team/seerr@61e0377)) - *(person)* Add tmdb- and imdb link on person detail page ([#​2136](seerr-team/seerr#2136)) - ([fb2ee7c](seerr-team/seerr@fb2ee7c)) - *(quota)* Added support for unlimited quota days ([#​2797](seerr-team/seerr#2797)) - ([6d8b2b7](seerr-team/seerr@6d8b2b7)) - *(requests)* Mark requests as failed when Radarr/Sonarr unreachable ([#​2171](seerr-team/seerr#2171)) - ([c23117e](seerr-team/seerr@c23117e)) - *(settings)* Add blocklist region and language options ([#​1802](seerr-team/seerr#1802)) - ([ff469cb](seerr-team/seerr@ff469cb)) - *(settings)* Add help tooltips for services setup ([#​2662](seerr-team/seerr#2662)) - ([f5115da](seerr-team/seerr@f5115da)) - *(sonarr)* Add monitorNewItems option to sonarr settings & modal ([#​2071](seerr-team/seerr#2071)) - ([5c34c91](seerr-team/seerr@5c34c91)) - *(trending)* Add filter options ([#​2137](seerr-team/seerr#2137)) - ([4ce0db1](seerr-team/seerr@4ce0db1)) - *(ui)* Add loading state to request approve/decline buttons ([#​2815](seerr-team/seerr#2815)) - ([bd8f2d4](seerr-team/seerr@bd8f2d4)) - *(userlist)* Add sortable columns to User List ([#​1615](seerr-team/seerr#1615)) - ([eaf397a](seerr-team/seerr@eaf397a)) - *(webhook)* Add imdbid to webhook notification ([#​2658](seerr-team/seerr#2658)) - ([2432e8d](seerr-team/seerr@2432e8d)) - Sort quality profiles ASC in request and service configuration ([#​1805](seerr-team/seerr#1805)) - ([25e376c](seerr-team/seerr@25e376c)) - Add trailing whitespace warning on login username field ([#​2040](seerr-team/seerr#2040)) ([#​2177](seerr-team/seerr#2177)) - ([636dcb9](seerr-team/seerr@636dcb9)) ##### 🐛 Bug Fixes - *(auth)* Resolve Plex OAuth client ID mismatch ([#​2746](seerr-team/seerr#2746)) - ([15b3109](seerr-team/seerr@15b3109)) - *(email)* Correctly classify final MIME header in PGP email encryption ([#​2618](seerr-team/seerr#2618)) - ([9ec3d58](seerr-team/seerr@9ec3d58)) - *(email)* Preserve newlines in PGP key textarea fields ([#​2617](seerr-team/seerr#2617)) - ([835e917](seerr-team/seerr@835e917)) - *(emby)* Use static version in auth header for emby only ([#​2821](seerr-team/seerr#2821)) - ([fe2c041](seerr-team/seerr@fe2c041)) - *(entities)* Replace MySQL-only onUpdate with [@​UpdateDateColumn](https://github.com/UpdateDateColumn) ([#​2823](seerr-team/seerr#2823)) - ([0b8f872](seerr-team/seerr@0b8f872)) - *(generate-password)* Await setPassword to fix race condition ([#​2845](seerr-team/seerr#2845)) - ([061121c](seerr-team/seerr@061121c)) - *(issues)* Update issue timestamp when adding comments ([#​2616](seerr-team/seerr#2616)) - ([a16d046](seerr-team/seerr@a16d046)) - *(jellyfin-scanner)* Add TheMovieDb provider fallback for Jellyfin scanner ([#​2605](seerr-team/seerr#2605)) - ([10f23f0](seerr-team/seerr@10f23f0)) - *(login)* Resolve stuck transition when switching login forms ([#​2779](seerr-team/seerr#2779)) - ([735ec47](seerr-team/seerr@735ec47)) - *(media)* Exclude null mediaAddedAt entries ([#​2607](seerr-team/seerr#2607)) - ([001f6b1](seerr-team/seerr@001f6b1)) - *(migration)* Repair postgres blocklist id sequence ([#​2686](seerr-team/seerr#2686)) - ([f40323c](seerr-team/seerr@f40323c)) - *(movie,tv)* Respect display language for trailers ([#​2674](seerr-team/seerr#2674)) - ([90d407d](seerr-team/seerr@90d407d)) - *(open-api)* Add missing mediaType query parameter to blocklist and watchlist ([#​2722](seerr-team/seerr#2722)) - ([c7185d4](seerr-team/seerr@c7185d4)) - *(override-rules)* Remove users from `useEffect` dependency array ([#​2771](seerr-team/seerr#2771)) - ([be57997](seerr-team/seerr@be57997)) - *(overseerr-merge)* Sanitise corrupt quota values during overseerr migration ([#​2863](seerr-team/seerr#2863)) - ([43eff25](seerr-team/seerr@43eff25)) - *(plex)* Set 4K Plex URLs whenever ratingKey4k is set ([#​2635](seerr-team/seerr#2635)) - ([1548948](seerr-team/seerr@1548948)) - *(proxy)* Add path validation guardrail to imageproxy ([#​2531](seerr-team/seerr#2531)) - ([e086081](seerr-team/seerr@e086081)) - *(region-selector)* Prevent empty region reporting during sync ([#​2636](seerr-team/seerr#2636)) - ([fbfcb43](seerr-team/seerr@fbfcb43)) - *(request)* Record modifiedBy on retry and add route tests ([#​2824](seerr-team/seerr#2824)) - ([20ccd4b](seerr-team/seerr@20ccd4b)) - *(request)* Correct delete permission check and await movie save ([#​2742](seerr-team/seerr#2742)) - ([6aeab38](seerr-team/seerr@6aeab38)) - *(requests)* Mark requests as completed when media is already available ([#​2462](seerr-team/seerr#2462)) - ([d25d0ca](seerr-team/seerr@d25d0ca)) - *(settings)* Persist new settings defaults to disk on startup ([#​2884](seerr-team/seerr#2884)) - ([66130be](seerr-team/seerr@66130be)) - *(settings)* Serialize settings writes and prevent partial overwrites ([#​2696](seerr-team/seerr#2696)) - ([6c52a2f](seerr-team/seerr@6c52a2f)) - *(settings)* Remove beta info banner ([#​2615](seerr-team/seerr#2615)) - ([fece753](seerr-team/seerr@fece753)) - *(setup)* Fix Plex login not proceeding after authentication ([#​2596](seerr-team/seerr#2596)) - ([1dc5154](seerr-team/seerr@1dc5154)) - *(watchlist-sync)* Handle empty watchlists on PostgreSQL ([#​2718](seerr-team/seerr#2718)) - ([865396f](seerr-team/seerr@865396f)) - Improve local login UX ([#​2849](seerr-team/seerr#2849)) - ([aef2481](seerr-team/seerr@aef2481)) - Await missing repository saves ([#​2760](seerr-team/seerr#2760)) - ([1bb638e](seerr-team/seerr@1bb638e)) - Helm chart liveness and readiness probe ([#​2755](seerr-team/seerr#2755)) - ([4434c45](seerr-team/seerr@4434c45)) - Disambiguate tmdb ids by media type across lookups ([#​2577](seerr-team/seerr#2577)) - ([0be1896](seerr-team/seerr@0be1896)) - Anchor streaming service filter check icon to each provider card ([#​2634](seerr-team/seerr#2634)) - ([94ccd47](seerr-team/seerr@94ccd47)) ##### 📖 Documentation - *(contributing-guide)* Fix a typo ([#​2807](seerr-team/seerr#2807)) - ([6f9b743](seerr-team/seerr@6f9b743)) - *(docker)* Replace backslashes by backticks in windows docker run commands \[skip-ci] ([#​2557](seerr-team/seerr#2557)) - ([40e02bb](seerr-team/seerr@40e02bb)) - Clarify Docker volume creation instructions on fresh Windows install ([#​2861](seerr-team/seerr#2861)) - ([a133930](seerr-team/seerr@a133930)) - Move network-related docs to a dedicated tab ([#​2791](seerr-team/seerr#2791)) - ([5bbdc52](seerr-team/seerr@5bbdc52)) - Promote Nixpkgs as an official installation method ([#​2775](seerr-team/seerr#2775)) - ([05ad60c](seerr-team/seerr@05ad60c)) - Fix PM2 start command syntax ([#​2713](seerr-team/seerr#2713)) - ([5373da4](seerr-team/seerr@5373da4)) ##### 🚜 Refactor - *(imageproxy)* Reduce noisy image cache logging ([#​2789](seerr-team/seerr#2789)) - ([036d000](seerr-team/seerr@036d000)) - *(notifications)* Move event from author to title field in Discord Embed ([#​2119](seerr-team/seerr#2119)) - ([a2d1e1b](seerr-team/seerr@a2d1e1b)) - *(userlist)* Responsive columns and buttons ([#​2083](seerr-team/seerr#2083)) - ([dbe1fca](seerr-team/seerr@dbe1fca)) - *(watchlistsync)* Log media request creation after success instead of before ([#​2790](seerr-team/seerr#2790)) - ([685cb44](seerr-team/seerr@685cb44)) - Rename Error components to ErrorPage ([#​2668](seerr-team/seerr#2668)) - ([d5c5f1f](seerr-team/seerr@d5c5f1f)) ##### 🧪 Testing - *(user-list)* Deflake sorting assertions ([#​2766](seerr-team/seerr#2766)) - ([20c2ed8](seerr-team/seerr@20c2ed8)) - Support server-side unit testing ([#​2485](seerr-team/seerr#2485)) - ([8563362](seerr-team/seerr@8563362)) ##### ⚙️ Miscellaneous Tasks - *(actions)* Update github actions ([#​2683](seerr-team/seerr#2683)) - ([a2154f9](seerr-team/seerr@a2154f9)) - *(actions)* Update github actions ([#​2672](seerr-team/seerr#2672)) - ([f047cab](seerr-team/seerr@f047cab)) - *(actions)* Update github actions ([#​2632](seerr-team/seerr#2632)) - ([e25c1a5](seerr-team/seerr@e25c1a5)) - *(create-tag)* Correct quote style in commit message for tag preparation ([#​2593](seerr-team/seerr#2593)) - ([687f18b](seerr-team/seerr@687f18b)) - *(docker)* Release alias for major and minor version series ([#​2881](seerr-team/seerr#2881)) - ([1cc73a8](seerr-team/seerr@1cc73a8)) - *(i18n)* Update translations from Weblate - ([e85216a](seerr-team/seerr@e85216a)) - *(i18n)* Update translations from Weblate - ([b1adc79](seerr-team/seerr@b1adc79)) - *(i18n)* Update translations from Weblate ([#​2419](seerr-team/seerr#2419)) - ([4bd7c19](seerr-team/seerr@4bd7c19)) - *(pr-validation)* Make checklist box detection case-insensitive ([#​2802](seerr-team/seerr#2802)) - ([58514ec](seerr-team/seerr@58514ec)) - *(pr-validation)* Update pull request permissions to write for validation jobs ([#​2800](seerr-team/seerr#2800)) - ([986761f](seerr-team/seerr@986761f)) - *(pr-validation)* Disable package manager cache in nodejs setup ([#​2799](seerr-team/seerr#2799)) - ([67e27d5](seerr-team/seerr@67e27d5)) - *(release)* Prepare v3.2.0 - ([e0b2a1c](seerr-team/seerr@e0b2a1c)) - *(release)* Merge develop into main - ([c5800a0](seerr-team/seerr@c5800a0)) - Bump minimum required node version to 22.19.0 ([#​2873](seerr-team/seerr#2873)) - ([891265f](seerr-team/seerr@891265f)) - Add PR validation workflow and update contributing guidelines ([#​2777](seerr-team/seerr#2777)) - ([772e83d](seerr-team/seerr@772e83d)) - Upgrade to eslint v9 ([#​2574](seerr-team/seerr#2574)) - ([36243a0](seerr-team/seerr@36243a0)) - Ignore helm scope in git-cliff ([#​2638](seerr-team/seerr#2638)) - ([4d2b658](seerr-team/seerr@4d2b658)) ##### New Contributors ❤️ - [@​aslafy-z](https://github.com/aslafy-z) made their first contribution - [@​leereilly](https://github.com/leereilly) made their first contribution - [@​jisef](https://github.com/jisef) made their first contribution - [@​dougrathbone](https://github.com/dougrathbone) made their first contribution - [@​bobziroll](https://github.com/bobziroll) made their first contribution - [@​v3DJG6GL](https://github.com/v3DJG6GL) made their first contribution - [@​Roboroads](https://github.com/Roboroads) made their first contribution - [@​costajohnt](https://github.com/costajohnt) made their first contribution - [@​tiagodefendi](https://github.com/tiagodefendi) made their first contribution - [@​Jyasapara](https://github.com/Jyasapara) made their first contribution - [@​Sym-jay](https://github.com/Sym-jay) made their first contribution - [@​bibi0019](https://github.com/bibi0019) made their first contribution - [@​redondos](https://github.com/redondos) made their first contribution - [@​bogo22](https://github.com/bogo22) made their first contribution - [@​jabloink](https://github.com/jabloink) made their first contribution - [@​YakGravity](https://github.com/YakGravity) made their first contribution - [@​dj0024javia](https://github.com/dj0024javia) made their first contribution - [@​Jerra94](https://github.com/Jerra94) made their first contribution - [@​its-wizza](https://github.com/its-wizza) made their first contribution - [@​ventiph](https://github.com/ventiph) made their first contribution - [@​RinZ27](https://github.com/RinZ27) made their first contribution<!-- generated by git-cliff --> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19--> Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/187 Co-authored-by: bot-owl <bot@erwanleboucher.dev> Co-committed-by: bot-owl <bot@erwanleboucher.dev>
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [seerr/seerr](https://github.com/seerr-team/seerr) | minor | `v3.1.1` → `v3.2.0` | --- ### Release Notes <details> <summary>seerr-team/seerr (seerr/seerr)</summary> ### [`v3.2.0`](https://github.com/seerr-team/seerr/releases/tag/v3.2.0) [Compare Source](seerr-team/seerr@v3.1.1...v3.2.0) ##### [3.2.0](https://github.com/seerr-team/seerr/compare/v3.1.1..v3.2.0) - 2026-04-15 ##### 🚀 Features - *(blocklist)* Add support for collections ([#​1841](seerr-team/seerr#1841)) - ([993ae4c](seerr-team/seerr@993ae4c)) - *(discover)* Handle errors gracefully when content is available ([#​1542](seerr-team/seerr#1542)) - ([7920970](seerr-team/seerr@7920970)) - *(i18n)* Add Estonian language support ([#​2611](seerr-team/seerr#2611)) - ([56b79ff](seerr-team/seerr@56b79ff)) - *(i18n)* Add Luxembourgish language support ([#​2671](seerr-team/seerr#2671)) - ([dccdc95](seerr-team/seerr@dccdc95)) - *(i18n)* Add Vietnamese language support ([#​2670](seerr-team/seerr#2670)) - ([40edaea](seerr-team/seerr@40edaea)) - *(jellyfin)* Allow Jellyfin Guids with dashes for import-from-jellyfin endpoint ([#​2340](seerr-team/seerr#2340)) - ([3557745](seerr-team/seerr@3557745)) - *(notifications)* Add ntfy markdown formatting ([#​2602](seerr-team/seerr#2602)) - ([77f2c13](seerr-team/seerr@77f2c13)) - *(notifications)* Webhook custom headers ([#​2230](seerr-team/seerr#2230)) - ([3152f72](seerr-team/seerr@3152f72)) - *(notifications)* Add priority setting for ntfy agent ([#​2306](seerr-team/seerr#2306)) - ([61e0377](seerr-team/seerr@61e0377)) - *(person)* Add tmdb- and imdb link on person detail page ([#​2136](seerr-team/seerr#2136)) - ([fb2ee7c](seerr-team/seerr@fb2ee7c)) - *(quota)* Added support for unlimited quota days ([#​2797](seerr-team/seerr#2797)) - ([6d8b2b7](seerr-team/seerr@6d8b2b7)) - *(requests)* Mark requests as failed when Radarr/Sonarr unreachable ([#​2171](seerr-team/seerr#2171)) - ([c23117e](seerr-team/seerr@c23117e)) - *(settings)* Add blocklist region and language options ([#​1802](seerr-team/seerr#1802)) - ([ff469cb](seerr-team/seerr@ff469cb)) - *(settings)* Add help tooltips for services setup ([#​2662](seerr-team/seerr#2662)) - ([f5115da](seerr-team/seerr@f5115da)) - *(sonarr)* Add monitorNewItems option to sonarr settings & modal ([#​2071](seerr-team/seerr#2071)) - ([5c34c91](seerr-team/seerr@5c34c91)) - *(trending)* Add filter options ([#​2137](seerr-team/seerr#2137)) - ([4ce0db1](seerr-team/seerr@4ce0db1)) - *(ui)* Add loading state to request approve/decline buttons ([#​2815](seerr-team/seerr#2815)) - ([bd8f2d4](seerr-team/seerr@bd8f2d4)) - *(userlist)* Add sortable columns to User List ([#​1615](seerr-team/seerr#1615)) - ([eaf397a](seerr-team/seerr@eaf397a)) - *(webhook)* Add imdbid to webhook notification ([#​2658](seerr-team/seerr#2658)) - ([2432e8d](seerr-team/seerr@2432e8d)) - Sort quality profiles ASC in request and service configuration ([#​1805](seerr-team/seerr#1805)) - ([25e376c](seerr-team/seerr@25e376c)) - Add trailing whitespace warning on login username field ([#​2040](seerr-team/seerr#2040)) ([#​2177](seerr-team/seerr#2177)) - ([636dcb9](seerr-team/seerr@636dcb9)) ##### 🐛 Bug Fixes - *(auth)* Resolve Plex OAuth client ID mismatch ([#​2746](seerr-team/seerr#2746)) - ([15b3109](seerr-team/seerr@15b3109)) - *(email)* Correctly classify final MIME header in PGP email encryption ([#​2618](seerr-team/seerr#2618)) - ([9ec3d58](seerr-team/seerr@9ec3d58)) - *(email)* Preserve newlines in PGP key textarea fields ([#​2617](seerr-team/seerr#2617)) - ([835e917](seerr-team/seerr@835e917)) - *(emby)* Use static version in auth header for emby only ([#​2821](seerr-team/seerr#2821)) - ([fe2c041](seerr-team/seerr@fe2c041)) - *(entities)* Replace MySQL-only onUpdate with [@​UpdateDateColumn](https://github.com/UpdateDateColumn) ([#​2823](seerr-team/seerr#2823)) - ([0b8f872](seerr-team/seerr@0b8f872)) - *(generate-password)* Await setPassword to fix race condition ([#​2845](seerr-team/seerr#2845)) - ([061121c](seerr-team/seerr@061121c)) - *(issues)* Update issue timestamp when adding comments ([#​2616](seerr-team/seerr#2616)) - ([a16d046](seerr-team/seerr@a16d046)) - *(jellyfin-scanner)* Add TheMovieDb provider fallback for Jellyfin scanner ([#​2605](seerr-team/seerr#2605)) - ([10f23f0](seerr-team/seerr@10f23f0)) - *(login)* Resolve stuck transition when switching login forms ([#​2779](seerr-team/seerr#2779)) - ([735ec47](seerr-team/seerr@735ec47)) - *(media)* Exclude null mediaAddedAt entries ([#​2607](seerr-team/seerr#2607)) - ([001f6b1](seerr-team/seerr@001f6b1)) - *(migration)* Repair postgres blocklist id sequence ([#​2686](seerr-team/seerr#2686)) - ([f40323c](seerr-team/seerr@f40323c)) - *(movie,tv)* Respect display language for trailers ([#​2674](seerr-team/seerr#2674)) - ([90d407d](seerr-team/seerr@90d407d)) - *(open-api)* Add missing mediaType query parameter to blocklist and watchlist ([#​2722](seerr-team/seerr#2722)) - ([c7185d4](seerr-team/seerr@c7185d4)) - *(override-rules)* Remove users from `useEffect` dependency array ([#​2771](seerr-team/seerr#2771)) - ([be57997](seerr-team/seerr@be57997)) - *(overseerr-merge)* Sanitise corrupt quota values during overseerr migration ([#​2863](seerr-team/seerr#2863)) - ([43eff25](seerr-team/seerr@43eff25)) - *(plex)* Set 4K Plex URLs whenever ratingKey4k is set ([#​2635](seerr-team/seerr#2635)) - ([1548948](seerr-team/seerr@1548948)) - *(proxy)* Add path validation guardrail to imageproxy ([#​2531](seerr-team/seerr#2531)) - ([e086081](seerr-team/seerr@e086081)) - *(region-selector)* Prevent empty region reporting during sync ([#​2636](seerr-team/seerr#2636)) - ([fbfcb43](seerr-team/seerr@fbfcb43)) - *(request)* Record modifiedBy on retry and add route tests ([#​2824](seerr-team/seerr#2824)) - ([20ccd4b](seerr-team/seerr@20ccd4b)) - *(request)* Correct delete permission check and await movie save ([#​2742](seerr-team/seerr#2742)) - ([6aeab38](seerr-team/seerr@6aeab38)) - *(requests)* Mark requests as completed when media is already available ([#​2462](seerr-team/seerr#2462)) - ([d25d0ca](seerr-team/seerr@d25d0ca)) - *(settings)* Persist new settings defaults to disk on startup ([#​2884](seerr-team/seerr#2884)) - ([66130be](seerr-team/seerr@66130be)) - *(settings)* Serialize settings writes and prevent partial overwrites ([#​2696](seerr-team/seerr#2696)) - ([6c52a2f](seerr-team/seerr@6c52a2f)) - *(settings)* Remove beta info banner ([#​2615](seerr-team/seerr#2615)) - ([fece753](seerr-team/seerr@fece753)) - *(setup)* Fix Plex login not proceeding after authentication ([#​2596](seerr-team/seerr#2596)) - ([1dc5154](seerr-team/seerr@1dc5154)) - *(watchlist-sync)* Handle empty watchlists on PostgreSQL ([#​2718](seerr-team/seerr#2718)) - ([865396f](seerr-team/seerr@865396f)) - Improve local login UX ([#​2849](seerr-team/seerr#2849)) - ([aef2481](seerr-team/seerr@aef2481)) - Await missing repository saves ([#​2760](seerr-team/seerr#2760)) - ([1bb638e](seerr-team/seerr@1bb638e)) - Helm chart liveness and readiness probe ([#​2755](seerr-team/seerr#2755)) - ([4434c45](seerr-team/seerr@4434c45)) - Disambiguate tmdb ids by media type across lookups ([#​2577](seerr-team/seerr#2577)) - ([0be1896](seerr-team/seerr@0be1896)) - Anchor streaming service filter check icon to each provider card ([#​2634](seerr-team/seerr#2634)) - ([94ccd47](seerr-team/seerr@94ccd47)) ##### 📖 Documentation - *(contributing-guide)* Fix a typo ([#​2807](seerr-team/seerr#2807)) - ([6f9b743](seerr-team/seerr@6f9b743)) - *(docker)* Replace backslashes by backticks in windows docker run commands \[skip-ci] ([#​2557](seerr-team/seerr#2557)) - ([40e02bb](seerr-team/seerr@40e02bb)) - Clarify Docker volume creation instructions on fresh Windows install ([#​2861](seerr-team/seerr#2861)) - ([a133930](seerr-team/seerr@a133930)) - Move network-related docs to a dedicated tab ([#​2791](seerr-team/seerr#2791)) - ([5bbdc52](seerr-team/seerr@5bbdc52)) - Promote Nixpkgs as an official installation method ([#​2775](seerr-team/seerr#2775)) - ([05ad60c](seerr-team/seerr@05ad60c)) - Fix PM2 start command syntax ([#​2713](seerr-team/seerr#2713)) - ([5373da4](seerr-team/seerr@5373da4)) ##### 🚜 Refactor - *(imageproxy)* Reduce noisy image cache logging ([#​2789](seerr-team/seerr#2789)) - ([036d000](seerr-team/seerr@036d000)) - *(notifications)* Move event from author to title field in Discord Embed ([#​2119](seerr-team/seerr#2119)) - ([a2d1e1b](seerr-team/seerr@a2d1e1b)) - *(userlist)* Responsive columns and buttons ([#​2083](seerr-team/seerr#2083)) - ([dbe1fca](seerr-team/seerr@dbe1fca)) - *(watchlistsync)* Log media request creation after success instead of before ([#​2790](seerr-team/seerr#2790)) - ([685cb44](seerr-team/seerr@685cb44)) - Rename Error components to ErrorPage ([#​2668](seerr-team/seerr#2668)) - ([d5c5f1f](seerr-team/seerr@d5c5f1f)) ##### 🧪 Testing - *(user-list)* Deflake sorting assertions ([#​2766](seerr-team/seerr#2766)) - ([20c2ed8](seerr-team/seerr@20c2ed8)) - Support server-side unit testing ([#​2485](seerr-team/seerr#2485)) - ([8563362](seerr-team/seerr@8563362)) ##### ⚙️ Miscellaneous Tasks - *(actions)* Update github actions ([#​2683](seerr-team/seerr#2683)) - ([a2154f9](seerr-team/seerr@a2154f9)) - *(actions)* Update github actions ([#​2672](seerr-team/seerr#2672)) - ([f047cab](seerr-team/seerr@f047cab)) - *(actions)* Update github actions ([#​2632](seerr-team/seerr#2632)) - ([e25c1a5](seerr-team/seerr@e25c1a5)) - *(create-tag)* Correct quote style in commit message for tag preparation ([#​2593](seerr-team/seerr#2593)) - ([687f18b](seerr-team/seerr@687f18b)) - *(docker)* Release alias for major and minor version series ([#​2881](seerr-team/seerr#2881)) - ([1cc73a8](seerr-team/seerr@1cc73a8)) - *(i18n)* Update translations from Weblate - ([e85216a](seerr-team/seerr@e85216a)) - *(i18n)* Update translations from Weblate - ([b1adc79](seerr-team/seerr@b1adc79)) - *(i18n)* Update translations from Weblate ([#​2419](seerr-team/seerr#2419)) - ([4bd7c19](seerr-team/seerr@4bd7c19)) - *(pr-validation)* Make checklist box detection case-insensitive ([#​2802](seerr-team/seerr#2802)) - ([58514ec](seerr-team/seerr@58514ec)) - *(pr-validation)* Update pull request permissions to write for validation jobs ([#​2800](seerr-team/seerr#2800)) - ([986761f](seerr-team/seerr@986761f)) - *(pr-validation)* Disable package manager cache in nodejs setup ([#​2799](seerr-team/seerr#2799)) - ([67e27d5](seerr-team/seerr@67e27d5)) - *(release)* Prepare v3.2.0 - ([e0b2a1c](seerr-team/seerr@e0b2a1c)) - *(release)* Merge develop into main - ([c5800a0](seerr-team/seerr@c5800a0)) - Bump minimum required node version to 22.19.0 ([#​2873](seerr-team/seerr#2873)) - ([891265f](seerr-team/seerr@891265f)) - Add PR validation workflow and update contributing guidelines ([#​2777](seerr-team/seerr#2777)) - ([772e83d](seerr-team/seerr@772e83d)) - Upgrade to eslint v9 ([#​2574](seerr-team/seerr#2574)) - ([36243a0](seerr-team/seerr@36243a0)) - Ignore helm scope in git-cliff ([#​2638](seerr-team/seerr#2638)) - ([4d2b658](seerr-team/seerr@4d2b658)) ##### New Contributors ❤️ - [@​aslafy-z](https://github.com/aslafy-z) made their first contribution - [@​leereilly](https://github.com/leereilly) made their first contribution - [@​jisef](https://github.com/jisef) made their first contribution - [@​dougrathbone](https://github.com/dougrathbone) made their first contribution - [@​bobziroll](https://github.com/bobziroll) made their first contribution - [@​v3DJG6GL](https://github.com/v3DJG6GL) made their first contribution - [@​Roboroads](https://github.com/Roboroads) made their first contribution - [@​costajohnt](https://github.com/costajohnt) made their first contribution - [@​tiagodefendi](https://github.com/tiagodefendi) made their first contribution - [@​Jyasapara](https://github.com/Jyasapara) made their first contribution - [@​Sym-jay](https://github.com/Sym-jay) made their first contribution - [@​bibi0019](https://github.com/bibi0019) made their first contribution - [@​redondos](https://github.com/redondos) made their first contribution - [@​bogo22](https://github.com/bogo22) made their first contribution - [@​jabloink](https://github.com/jabloink) made their first contribution - [@​YakGravity](https://github.com/YakGravity) made their first contribution - [@​dj0024javia](https://github.com/dj0024javia) made their first contribution - [@​Jerra94](https://github.com/Jerra94) made their first contribution - [@​its-wizza](https://github.com/its-wizza) made their first contribution - [@​ventiph](https://github.com/ventiph) made their first contribution - [@​RinZ27](https://github.com/RinZ27) made their first contribution<!-- generated by git-cliff --> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19--> Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/187 Co-authored-by: bot-owl <bot@erwanleboucher.dev> Co-committed-by: bot-owl <bot@erwanleboucher.dev>
Description
Two bugs in
server/routes/request.ts:1. Anyone can delete any pending request
The
DELETE /request/:idhandler used three top-level&&conditions to gate deletion:Because all three must be true to deny, the third condition short-circuits the check whenever a request is
PENDING-- meaning any authenticated user can delete any pending request they did not create. The intended behaviour is that non-admins may only retract their own requests while they are still pending.Also replaces the magic number
1withMediaRequestStatus.PENDING.2. Movie request update is not awaited
The movie branch of
PUT /request/:idcalledrequestRepository.save()withoutawait, returning the200response before the write completed. The TV branch in the same handler correctly awaits the save.AI Disclosure: I used Claude Code to help write the tests. I reviewed and understood all generated code before submitting.
How Has This Been Tested?
New suite at
server/routes/request.test.tsusing the real SQLite test database viasetupTestDb():allows the owner to delete their own pending requestallows an admin to delete any pending requestprevents a non-owner non-admin from deleting a pending request-- directly tests the authorization bugprevents the owner from deleting an approved request-- asserts the status check is enforcedreturns 404 for a non-existent requestpersists server and root folder changes to the database-- regression guard for the unawaited movie saveTo reproduce bug 1 manually:
DELETE /api/v1/request/:idas User B.This was independently confirmed by @fallenbagel via API before review.
Screenshots / Logs (if applicable)
N/A -- backend-only change with no UI impact.
Checklist:
pnpm buildpnpm i18n:extract(no new UI strings added)Summary by CodeRabbit
Bug Fixes
Tests