Skip to content

feat: community enhancements — requests redesign, quality, blacklist, cleanup (#84, #68)#100

Merged
arediss merged 4 commits intomainfrom
feat/issue-84-enhancements
Apr 8, 2026
Merged

feat: community enhancements — requests redesign, quality, blacklist, cleanup (#84, #68)#100
arediss merged 4 commits intomainfrom
feat/issue-84-enhancements

Conversation

@arediss
Copy link
Copy Markdown
Owner

@arediss arediss commented Apr 8, 2026

Summary

Major feature branch addressing community requests (#84) and requests page redesign (#68).

Requests page redesign (#68)

  • Filter tabs (admin-style pills) replacing stat cards
  • Cards redesigned: subtle backdrop, inline status/quality, glass bottom action bar
  • Sections: pending separated from processed with headers
  • Infinite scroll (IntersectionObserver) replacing pagination
  • Skeleton loading state
  • Staggered fade-in animations

Quality management (#84)

  • Quality badge on request cards (inline with user/status)
  • Admin COG modal: change quality, service, root folder before approving
  • GET /requests/:id/resolve — previews path, rule match, service, available root folders
  • PUT /requests/:id — update quality/rootFolder with 404 guard
  • Root folder selector with service paths + custom option
  • Folder rule quality condition type

Notification links (#84)

  • siteUrl field in AppSettings (admin General tab)
  • Direct media links in Discord embeds and Telegram messages

Media blacklist

  • BlacklistedMedia model (tmdbId, mediaType, title, posterPath, reason)
  • Admin UI: Admin > Media > Blacklist sub-tab
  • Search TMDB + confirm modal with poster preview
  • Grid display with hover unblock button (slide animation)
  • Request creation blocked (403) for blacklisted media
  • Collection request bypass fixed
  • "Blocked" button on media detail page
  • Blacklist check accessible to all authenticated users

Advanced cleanup

  • Tri-state per status: Keep / Remove Oscarr / Remove Oscarr + Service
  • deleteMedia() on ArrClient interface (Radarr DELETE /movie, Sonarr DELETE /series)
  • Segment control UI with colored states
  • 5 statuses: pending, available, approved, declined (red), failed (purple)

Code review fixes

  • Resolve endpoint: try/catch around TMDB calls (502)
  • Race condition: await PUT before approve
  • Save button: proper error handling
  • admin.danger permission description added

Closes #84, closes #68

Test plan

  • Backend + frontend compile
  • Requests page: filter, infinite scroll, sections, cards
  • Quality: badge, edit before approve, folder rule condition
  • Blacklist: add, remove, block request, detail page indicator
  • Cleanup: tri-state, service deletion
  • Notifications: siteUrl, Discord/Telegram links
  • RBAC: all endpoints protected
  • Code review: 7/9 issues fixed
  • i18n: EN + FR complete

arediss added 3 commits April 8, 2026 17:41
… notifications (#84, #68)

Requests page redesign (#68):
- Filter tabs replacing stat cards (admin-style pills with counts)
- Cards redesigned: subtle backdrop, inline status/quality, bottom action bar
- Glass-morphism action bar with approve/decline/settings
- Sections: pending requests separated from processed
- Infinite scroll replacing pagination button
- Admin cleanup modal: bulk delete by status
- Skeleton loading state

Quality management (#84):
- Quality badge displayed on request cards
- Admin COG modal: change quality, service, root folder before approving
- GET /requests/:id/resolve endpoint — previews path, rule match, service
- PUT /requests/:id — update quality/rootFolder
- Root folder selector with available paths from service + custom option
- Folder rule "quality" condition type added

Notification links (#84):
- siteUrl field in AppSettings (configurable in admin General tab)
- Direct media links in Discord embeds and Telegram messages
- buildSiteLink helper with caching

Backend:
- POST /requests/cleanup — bulk delete by statuses (admin.danger RBAC)
- Approve endpoint accepts qualityOptionId override
- resolveServiceContext passes qualityOptionId to folder rules
- RuleMatch now carries ruleName for display
- sendToService accepts rootFolderOverride (priority over rules)
- qualityOption included in GET /requests response

i18n: EN + FR for all new strings
Backend:
- BlacklistedMedia model (tmdbId, mediaType, title, posterPath, reason, createdBy)
- CRUD admin endpoints: GET/POST/DELETE /admin/blacklist + check endpoint
- Request creation blocked with 403 if media is blacklisted
- isBlacklisted() helper in requestService

Frontend — Admin > Media > Blacklist tab:
- Search bar with debounced TMDB search + dropdown results
- Confirm modal with poster preview + reason input
- Grid of blocked media with poster cards (like homepage)
- Hover: title/reason always visible, unblock button slides up smoothly
- Shield ban badge on each card

Frontend — Media detail page:
- "Blocked" button (disabled, red shield icon) replaces "Request" for blacklisted media
- Tooltip shows the reason

i18n: EN + FR
Cleanup modal redesign:
- Tri-state per status: Keep / Remove from Oscarr / Remove from Oscarr + Service
- Segment control UI with colored active states
- Backend deletes media from Radarr/Sonarr when "Oscarr + Service" selected
- deleteMedia() added to ArrClient interface + Radarr/Sonarr implementations
- All 5 statuses shown (pending, available, approved, declined, failed) with counts
- Failed status gets purple color to distinguish from declined (red)

Code review fixes:
- Blacklist bypass via collection requests: isBlacklisted check added
- PUT /:id 404 guard: findUnique before update
- Resolve endpoint: try/catch around resolveServiceContext (502 on TMDB failure)
- Race condition: await PUT before approve in settings modal
- Save button: proper try/catch instead of swallowed .catch
- admin.danger added to PERMISSION_DESCRIPTIONS
- Blacklist check accessible to all authenticated users (not admin-only)
@arediss arediss merged commit d8e0ccf into main Apr 8, 2026
6 checks passed
@arediss arediss deleted the feat/issue-84-enhancements branch April 8, 2026 21:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feat: Some Enhancements feat: redesign requests page — stats dashboard, infinite scroll, better UX

2 participants