Skip to content

refactor(backend): extract ArtistSuggestionService from artists route - #1036

Closed
LucasSantana-Dev wants to merge 5 commits into
mainfrom
refactor/artist-suggestion-service
Closed

LucasSantana-Dev wants to merge 5 commits into
mainfrom
refactor/artist-suggestion-service

Conversation

@LucasSantana-Dev

Copy link
Copy Markdown
Owner

Summary

  • Extracts all business logic from packages/backend/src/routes/artists.ts (586 LOC) into a dedicated ArtistSuggestionService
  • Route handlers are now thin — they call the service and delegate to wrapHandler for error handling
  • Replaces array .filter + new Set() loop with a single Set for O(1) dedup in fetchSpotifyTopArtists
  • Extracts wrapHandler to routeUtils to share across route modules

ADR

docs/decisions/2026-05-23-artist-suggestion-service.md

…vice

- Create ArtistSuggestionService with three-tier lookup strategy:
  1. User's saved preferred artists (database)
  2. User's Spotify top artists (if linked)
  3. Popular artists fallback (static list)
- Move 80+ popular artist names to constants/popularArtists.ts
- Add Redis caching for fallback and user top artists
- Reduce artists.ts route handler from 586 to 298 LOC
- Update existing tests to match new behavior
- All 823 backend tests passing
Move all business logic from routes/artists.ts into services/artistSuggestion.ts:
- Add handler methods: handleGetSuggestions, handleSearchArtists, etc.
- Validate inputs and return errors in service layer
- Trim routes file from 319 to 46 LOC (meets <100 requirement)
- Create unit test suite with 33 tests (89.84% coverage, exceeds 80%)
- All tests passing (856 tests in backend package)
…utes

Move wrapHandler and ApiError interface to src/utils/routeUtils.ts.
Redefine route handlers as module-level consts; setupArtistsRoutes
becomes a compact registration block (≤100 LOC spec met).

Also fix Zod schema nullable fields and test cleanup:
- spotifyId/imageUrl: add .nullable() to match DB columns
- Remove unused `suggestions` variable in cache test
- Save/restore global.fetch around mock assignment
@vercel

vercel Bot commented May 24, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
lucky Ready Ready Preview, Comment May 24, 2026 3:18pm

Request Review

@coderabbitai

coderabbitai Bot commented May 24, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@LucasSantana-Dev, we couldn't start this review because you've used your available PR reviews for now.

Your plan currently allows 1 review/hour. Refill in 59 minutes and 13 seconds.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more review capacity refills, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than trial, open-source, and free plans. In all cases, review capacity refills continuously over time.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ba31033f-cfde-487b-8e3a-56538df9c867

📥 Commits

Reviewing files that changed from the base of the PR and between 3d7890a and a8b806c.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json, !**/package-lock.json
📒 Files selected for processing (6)
  • packages/backend/src/constants/popularArtists.ts
  • packages/backend/src/routes/artists.ts
  • packages/backend/src/services/artistSuggestion.ts
  • packages/backend/src/utils/routeUtils.ts
  • packages/backend/tests/unit/routes/artists.test.ts
  • packages/backend/tests/unit/services/artistSuggestion.test.ts
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/artist-suggestion-service

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.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.

@LucasSantana-Dev

Copy link
Copy Markdown
Owner Author

Closing: the work described in the linked ADR was already shipped in PRs #979–#983 (merged 2026-05-23). This PR was opened by a stale session that hadn't yet seen those merges.

@github-actions github-actions Bot added dependencies Pull requests that update a dependency file backend size/xl labels May 24, 2026
@github-actions

Copy link
Copy Markdown

Failed to generate code suggestions for PR

@github-actions

Copy link
Copy Markdown

Size Change: 0 B

Total Size: 424 kB

ℹ️ View Unchanged
Filename Size
packages/frontend/dist/assets/Admin-BNVD3hM_.js 2.31 kB
packages/frontend/dist/assets/api-D7ggJ795.js 3.37 kB
packages/frontend/dist/assets/AutoMessages-DLQriTl8.js 2.66 kB
packages/frontend/dist/assets/AutoMod-DOSUYPNu.js 4.08 kB
packages/frontend/dist/assets/badge-BOr391aG.js 501 B
packages/frontend/dist/assets/Card-CExedsh4.js 506 B
packages/frontend/dist/assets/Changelog-DCj1i4d5.js 29.1 kB
packages/frontend/dist/assets/CommandsConfig-Bm3-HqmZ.js 1.46 kB
packages/frontend/dist/assets/Config-Cv7bD-2A.js 1.93 kB
packages/frontend/dist/assets/CustomCommands-DJW3KraY.js 2.11 kB
packages/frontend/dist/assets/DashboardOverview-DFlx7drT.js 3.9 kB
packages/frontend/dist/assets/dialog-D7uwzeNK.js 949 B
packages/frontend/dist/assets/Docs-C7mK_7E-.js 17.6 kB
packages/frontend/dist/assets/DocsShell-C9r5i_PN.js 1.42 kB
packages/frontend/dist/assets/EmbedBuilder-CTGiIdtL.js 3.32 kB
packages/frontend/dist/assets/Features-CkPtz7IA.js 755 B
packages/frontend/dist/assets/GuildAutomation-D4LMWATL.js 2.86 kB
packages/frontend/dist/assets/index-B9JDDOCt.js 54.8 kB
packages/frontend/dist/assets/index-lylX54iU.css 17.7 kB
packages/frontend/dist/assets/input-CdbkToCC.js 465 B
packages/frontend/dist/assets/label-CpwYElB3.js 476 B
packages/frontend/dist/assets/Landing-DhnmrLru.js 5.05 kB
packages/frontend/dist/assets/LastFm-CdmPqZ51.js 1.94 kB
packages/frontend/dist/assets/legalNav-B6k3CWsW.js 274 B
packages/frontend/dist/assets/Levels-QpqHlEY0.js 2.62 kB
packages/frontend/dist/assets/Login-CXxKH7-Y.js 2.5 kB
packages/frontend/dist/assets/Lyrics-DIOIM7bO.js 1.33 kB
packages/frontend/dist/assets/Moderation-DWAG6yue.js 3.82 kB
packages/frontend/dist/assets/Music-BDH-qxPB.js 7.1 kB
packages/frontend/dist/assets/MusicConfig-DLe9d0iT.js 1.6 kB
packages/frontend/dist/assets/PreferredArtists-Baz6l6IP.js 3.75 kB
packages/frontend/dist/assets/PrivacyPolicy-Dsc3hsYh.js 1.77 kB
packages/frontend/dist/assets/ReactionRoles-Byj_vQbC.js 1.87 kB
packages/frontend/dist/assets/rolldown-runtime-Cyuzqnbw.js 471 B
packages/frontend/dist/assets/SectionHeader-DGCF9Nny.js 896 B
packages/frontend/dist/assets/select-D8Ujnv3z.js 1.22 kB
packages/frontend/dist/assets/ServerLogs-BTwTXZR-.js 2.88 kB
packages/frontend/dist/assets/ServerSettings-lEGJMzr7.js 4.19 kB
packages/frontend/dist/assets/ServersPage-B9NK6weO.js 2.99 kB
packages/frontend/dist/assets/Skeleton-C4v6hFVb.js 238 B
packages/frontend/dist/assets/Spotify-Bc20xeUf.js 1.94 kB
packages/frontend/dist/assets/Starboard-Cg1D4UZH.js 2.06 kB
packages/frontend/dist/assets/StatTile-ab7MhX_s.js 637 B
packages/frontend/dist/assets/switch-C2AiGEsh.js 544 B
packages/frontend/dist/assets/TermsOfService-BouLR3Fa.js 1.61 kB
packages/frontend/dist/assets/TrackHistory-BZDxvowH.js 2.16 kB
packages/frontend/dist/assets/TwitchNotifications-Cw84kF1n.js 2.44 kB
packages/frontend/dist/assets/useActiveHeading-DLGm_mUR.js 1.35 kB
packages/frontend/dist/assets/useFeatures-D1M1HABb.js 2.03 kB
packages/frontend/dist/assets/usePageMetadata-DTv-6eVb.js 327 B
packages/frontend/dist/assets/vendor-forms-C-bof8GF.js 25.9 kB
packages/frontend/dist/assets/vendor-radix-CdD3qYv_.js 38.9 kB
packages/frontend/dist/assets/vendor-react-2NHyFaPT.js 55.7 kB
packages/frontend/dist/assets/vendor-state-Bw5Cn1Hd.js 24.2 kB
packages/frontend/dist/assets/vendor-ui-B2w0d3pe.js 65.5 kB

compressed-size-action

@sonarqubecloud

Copy link
Copy Markdown

This branch was successfully deployed

1 active deployment
Preview — a8b806ca Deployed May 23, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend dependencies Pull requests that update a dependency file size/xl

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant