Skip to content

feat(feature-toggles): persist per-guild toggles in db - #614

Merged
LucasSantana-Dev merged 3 commits into
mainfrom
feat/feature-toggles-persistence
Apr 14, 2026
Merged

LucasSantana-Dev merged 3 commits into
mainfrom
feat/feature-toggles-persistence

Conversation

@LucasSantana-Dev

Copy link
Copy Markdown
Owner

Summary

  • Add GuildFeatureToggle Prisma model with guildId + name unique constraint
  • Wire POST /api/guilds/:id/features/:name to upsert toggle state in DB
  • FeatureToggleService.isEnabledForGuild checks DB override before Unleash/fallback
  • Remove silent catches from featuresStore update actions — errors now surface to UI
  • Add toast error feedback in useFeatures for failed toggle updates

Test plan

  • Backend toggle route tests updated: setGuildFeatureToggle mock added, POST response asserts new format {success, guildId, name, enabled}
  • DB migration SQL verified: creates guild_feature_toggles table with FK to guilds
  • CI passes (SonarCloud coverage + Quality Gates)
  • After merge, run migration on prod: npx prisma migrate deploy

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Apr 14, 2026 •

Copy link
Copy Markdown

Warning

Rate limit exceeded

@LucasSantana-Dev has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 35 minutes and 1 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 35 minutes and 1 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, 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 the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: e1714dd4-30f2-4264-bc94-3e3fa48dd0a7

📥 Commits

Reviewing files that changed from the base of the PR and between 09e4ed5 and edf02d5.

📒 Files selected for processing (9)
  • packages/backend/src/routes/toggles.ts
  • packages/backend/tests/integration/routes/toggles.test.ts
  • packages/frontend/src/hooks/useFeatures.test.ts
  • packages/frontend/src/hooks/useFeatures.ts
  • packages/frontend/src/stores/featuresStore.ts
  • packages/shared/src/services/FeatureToggleService.spec.ts
  • packages/shared/src/services/FeatureToggleService.ts
  • prisma/migrations/20260414000000_add_guild_feature_toggles/migration.sql
  • prisma/schema.prisma
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/feature-toggles-persistence

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.

@vercel

vercel Bot commented Apr 14, 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 Apr 14, 2026 6:02pm

@github-actions

github-actions Bot commented Apr 14, 2026 •

Copy link
Copy Markdown

Size Change: +20 B (+0.01%)

Total Size: 326 kB

📦 View Changed
Filename Size Change
packages/frontend/dist/assets/Features-C7WDj7NZ.js 2.86 kB +2.86 kB (new file) 🆕
packages/frontend/dist/assets/Features-Cx3OiY9-.js 0 B -2.84 kB (removed) 🏆
packages/frontend/dist/assets/index-Bc7gAV0Y.js 11.8 kB +11.8 kB (new file) 🆕
packages/frontend/dist/assets/index-CF5Y52NP.js 0 B -11.8 kB (removed) 🏆
ℹ️ View Unchanged
Filename Size
packages/frontend/dist/assets/ActionPanel-C1_aFFa9.js 398 B
packages/frontend/dist/assets/api-WBeJP_MU.js 2.93 kB
packages/frontend/dist/assets/authStore-BsPLQ35L.js 559 B
packages/frontend/dist/assets/AutoMessages-C2eAw-2y.js 2.69 kB
packages/frontend/dist/assets/AutoMod-DNMTTHJP.js 4.09 kB
packages/frontend/dist/assets/avatar-BQnx8ml3.js 1.79 kB
packages/frontend/dist/assets/badge-1w20SMT3.js 499 B
packages/frontend/dist/assets/Button-CK6bsnJt.js 761 B
packages/frontend/dist/assets/Card-DnMZziVL.js 453 B
packages/frontend/dist/assets/chunk-QFMPRPBF-B0_TipZB.js 14.8 kB
packages/frontend/dist/assets/CommandsConfig-1xHXbKOX.js 1.49 kB
packages/frontend/dist/assets/Config-CrB3wyqq.js 1.74 kB
packages/frontend/dist/assets/CustomCommands-Beo_tYo3.js 2.16 kB
packages/frontend/dist/assets/DashboardOverview-C2Bvu2od.js 3.42 kB
packages/frontend/dist/assets/dialog-Bebu5T9M.js 947 B
packages/frontend/dist/assets/dist-BYvsGl5s.js 414 B
packages/frontend/dist/assets/EmbedBuilder-BmxX8CyT.js 3.36 kB
packages/frontend/dist/assets/EmptyState-lhGRi9gh.js 428 B
packages/frontend/dist/assets/GuildAutomation-Dp4NRG8v.js 2.94 kB
packages/frontend/dist/assets/guildStore-Bj-q4NEc.js 797 B
packages/frontend/dist/assets/index-l5jkq5KR.css 14.5 kB
packages/frontend/dist/assets/input-CmtLKKUO.js 461 B
packages/frontend/dist/assets/label-BHlkUPCY.js 483 B
packages/frontend/dist/assets/LastFm-Dl3NnbsY.js 1.74 kB
packages/frontend/dist/assets/Levels-QrqGsJR0.js 2.65 kB
packages/frontend/dist/assets/Login-Ytgi0Aua.js 2.54 kB
packages/frontend/dist/assets/Lyrics-D6SetrMB.js 1.33 kB
packages/frontend/dist/assets/Moderation-DeFDZ2fq.js 3.86 kB
packages/frontend/dist/assets/Music-Cp-qOo8y.js 6.16 kB
packages/frontend/dist/assets/MusicConfig-D_9cgAGb.js 1.62 kB
packages/frontend/dist/assets/PrivacyPolicy-BTjDqB3o.js 1.38 kB
packages/frontend/dist/assets/rbac-BN1DzQHh.js 152 B
packages/frontend/dist/assets/ReactionRoles-CSWTo4_h.js 1.9 kB
packages/frontend/dist/assets/rolldown-runtime-COnpUsM8.js 467 B
packages/frontend/dist/assets/scroll-area-DE87jUCx.js 517 B
packages/frontend/dist/assets/SectionHeader-Ct2qWDhq.js 382 B
packages/frontend/dist/assets/select-sC_ROyTR.js 1.22 kB
packages/frontend/dist/assets/ServerLogs-CZghB0sO.js 2.9 kB
packages/frontend/dist/assets/ServerSettings-DVi5wtu_.js 4.22 kB
packages/frontend/dist/assets/ServersPage-CFEnF3jZ.js 2.95 kB
packages/frontend/dist/assets/Skeleton-DMHFbvVW.js 234 B
packages/frontend/dist/assets/Spotify-DgkILB_a.js 1.75 kB
packages/frontend/dist/assets/Starboard-xLrOVing.js 2.1 kB
packages/frontend/dist/assets/StatTile-BkmmFyEu.js 604 B
packages/frontend/dist/assets/switch-RfNgpq5v.js 539 B
packages/frontend/dist/assets/TermsOfService-D7Oh05tV.js 1.37 kB
packages/frontend/dist/assets/TrackHistory-CicN8ewe.js 2.18 kB
packages/frontend/dist/assets/TwitchNotifications-C95nZjFJ.js 2.44 kB
packages/frontend/dist/assets/useGuildSelection-7MoigJl6.js 489 B
packages/frontend/dist/assets/usePageMetadata-B513X5D1.js 328 B
packages/frontend/dist/assets/utils-D5piDr1U.js 148 B
packages/frontend/dist/assets/vendor-forms-B7m4p2yU.js 25.4 kB
packages/frontend/dist/assets/vendor-radix-CqxcePto.js 33.5 kB
packages/frontend/dist/assets/vendor-react-DRFstzzV.js 55.6 kB
packages/frontend/dist/assets/vendor-state-C5KtdxzA.js 22.2 kB
packages/frontend/dist/assets/vendor-ui-BIJpYk2I.js 64.2 kB

compressed-size-action

@sonarqubecloud

Copy link
Copy Markdown

@LucasSantana-Dev
LucasSantana-Dev merged commit 41252b1 into main Apr 14, 2026
13 checks passed
LucasSantana-Dev added a commit that referenced this pull request May 13, 2026
* feat(feature-toggles): persist per-guild toggles in db with prisma

* test(feature-toggles): update toggle route tests for db persistence

* test: cover toast handlers in use-features and feature-toggle-service
LucasSantana-Dev added a commit that referenced this pull request May 20, 2026
…pec (#902)

## Summary

The `autoMessagesExecutor.spec.ts` landed in #901 relied on ambient jest
types. It passed in isolated `npx jest` runs (looser typing path) but
fails under `npm run test:ci --workspace=packages/shared` (the workspace
invocation, which is `jest --ci --silent` and enforces the shared
package's strict tsconfig — which does not include `@types/jest` in
`types`).

## What changed

- Adds `import { describe, expect, it, jest } from '@jest/globals'` —
matches the shared convention used by `PremiumService.spec.ts`,
`LastFmLinkService/index.spec.ts`, and
`SpotifyLinkService/index.spec.ts`.
- Updates mock typing from the legacy `jest.fn<R, [Args]>()` two-arg
form to `@jest/globals`'s required single-type-arg `jest.fn<Fn>()` form.

## Verification

- `npx jest --config packages/shared/jest.config.cjs --ci --silent
packages/shared/src/services/guildAutomation/autoMessagesExecutor.spec.ts`
— 4/4 passing
- `npm run test:ci --workspace=packages/shared` — failing test-suite
count drops from 3 to 2 (this spec is no longer one of them). The
remaining 2 failures (`FeatureToggleService.spec.ts`,
`__tests__/utils/spotify/artistApi.test.ts`) are pre-existing tech debt
last touched in #762/#614/#648 respectively, out of scope for this fix.

## Why this slipped through #901

PR #901 was merged on `UNSTABLE` while `Quality Gates` (the workspace
test:ci runner) was still in flight. The check that would have caught
this never reported before merge. Going forward, prefer waiting for
`Quality Gates` on PRs touching `packages/shared`.

## Test plan

- [x] `npm run test:ci --workspace=packages/shared` locally —
autoMessagesExecutor spec green
- [ ] Quality Gates check on this PR (the one we should have waited for)

Refs: #901

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

## Release Notes

* **Tests**
* Improved test infrastructure with enhanced type safety for mock
functions.

---

**Note:** This release contains internal test improvements with no
changes to user-facing functionality.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/LucasSantana-Dev/Lucky/pull/902?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@LucasSantana-Dev
LucasSantana-Dev deleted the feat/feature-toggles-persistence branch May 23, 2026 02:21

This branch was successfully deployed

1 active deployment
Preview — edf02d59 Deployed Apr 14, 2026 by vercel[bot]
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.

1 participant