Create feature_flags table and admin UI #34

Open
opened 2026-06-08 03:20:57 +00:00 by ldraney · 0 comments
Owner

Type

Feature

Lineage

Follow-up from spike #16 (docs/auth.md) and docs/feature-flags.md. Depends on #32 (users + OmniAuth).

Repo

ldraney/palinks

User Story

As Lucas
I want a feature flags panel behind a person icon
So that I can toggle features without redeploying

Context

Feature flags are DB-backed with three types: global, role-scoped, per-user. Resolution order: user pref > role override > global default. The person icon in the top-left opens a settings panel. Superadmin sees all flags with toggles. Members see flags available to their role. The feature_enabled? helper gates code in controllers and views. See docs/feature-flags.md for the full design.

File Targets

  • db/migrate/xxx_create_feature_flags.rb — feature_flags table
  • app/models/feature_flag.rb — new model
  • app/helpers/feature_flags_helper.rbfeature_enabled? helper
  • app/controllers/feature_flags_controller.rb — toggle endpoint
  • app/views/ — person icon, settings panel, flag toggles
  • db/seeds.rb — seed initial flags (e.g. click_tracking)

Feature Flag

None — this IS the feature flag system. Cannot flag itself.

Acceptance Criteria

  • feature_flags table created with name (unique), description, enabled_globally, role_overrides (JSONB)
  • feature_enabled?(:flag_name, current_user) helper works
  • Person icon in top-left corner opens settings panel
  • Superadmin sees all flags with toggles
  • Members see flags available to their role
  • Toggling a flag takes effect immediately
  • Initial flags seeded (at minimum: click_tracking)

Test Expectations

  • Unit test: feature_enabled? resolution order (user pref > role > global)
  • Unit test: FeatureFlag model validations
  • Integration test: toggle endpoint updates flag state
  • Run: bundle exec rails test

Constraints

  • Follow naming conventions in docs/feature-flags.md (snake_case, no enable_ prefix)
  • role_overrides JSONB: {"superadmin": true, "member": false}
  • Per-user overrides stored in users.preferences JSONB under "flags" key

Checklist

  • PR opened
  • Tests pass
  • No unrelated changes
  • project-palinks — project page
  • docs/feature-flags.md — flag design, resolution order, lifecycle
  • #32 — users + OmniAuth (dependency for per-user prefs)
### Type Feature ### Lineage Follow-up from spike #16 (`docs/auth.md`) and `docs/feature-flags.md`. Depends on #32 (users + OmniAuth). ### Repo `ldraney/palinks` ### User Story As Lucas I want a feature flags panel behind a person icon So that I can toggle features without redeploying ### Context Feature flags are DB-backed with three types: global, role-scoped, per-user. Resolution order: user pref > role override > global default. The person icon in the top-left opens a settings panel. Superadmin sees all flags with toggles. Members see flags available to their role. The `feature_enabled?` helper gates code in controllers and views. See `docs/feature-flags.md` for the full design. ### File Targets - `db/migrate/xxx_create_feature_flags.rb` — feature_flags table - `app/models/feature_flag.rb` — new model - `app/helpers/feature_flags_helper.rb` — `feature_enabled?` helper - `app/controllers/feature_flags_controller.rb` — toggle endpoint - `app/views/` — person icon, settings panel, flag toggles - `db/seeds.rb` — seed initial flags (e.g. `click_tracking`) ### Feature Flag None — this IS the feature flag system. Cannot flag itself. ### Acceptance Criteria - [ ] feature_flags table created with name (unique), description, enabled_globally, role_overrides (JSONB) - [ ] `feature_enabled?(:flag_name, current_user)` helper works - [ ] Person icon in top-left corner opens settings panel - [ ] Superadmin sees all flags with toggles - [ ] Members see flags available to their role - [ ] Toggling a flag takes effect immediately - [ ] Initial flags seeded (at minimum: `click_tracking`) ### Test Expectations - [ ] Unit test: feature_enabled? resolution order (user pref > role > global) - [ ] Unit test: FeatureFlag model validations - [ ] Integration test: toggle endpoint updates flag state - Run: `bundle exec rails test` ### Constraints - Follow naming conventions in `docs/feature-flags.md` (snake_case, no enable_ prefix) - role_overrides JSONB: `{"superadmin": true, "member": false}` - Per-user overrides stored in `users.preferences` JSONB under `"flags"` key ### Checklist - [ ] PR opened - [ ] Tests pass - [ ] No unrelated changes ### Related - `project-palinks` — project page - `docs/feature-flags.md` — flag design, resolution order, lifecycle - #32 — users + OmniAuth (dependency for per-user prefs)
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ldraney/palinks#34
No description provided.