-- ============================================================ -- Per-account beta feature flag column on `profiles`. -- -- Adds an array of opted-in beta feature keys to each profile row. -- Currently used to gate the Flows feature (`'flows'`); shape is -- generic so subsequent betas (e.g. `'ai_replies'`, `'voice_notes'`) -- can land in this column without another migration. -- -- Why a per-account flag rather than a global env var: -- - Self-hosted wacrm instances are multi-user (small teams, shared -- workspaces). A global flag would force every account on the -- instance to opt into a not-yet-stable feature simultaneously. -- - The owner wanted to dogfood the feature on their own account -- before exposing it to teammates. Flipping a column via -- Supabase Studio (`UPDATE profiles SET beta_features = ... -- WHERE user_id = ''`) is the lowest-friction toggle. -- - DB-managed flags survive env rotation, deploy-restart timing, -- and (since beta_features is a TEXT[]) extend naturally to -- additional features without further schema work. -- -- Default is the empty array, so every existing profile row opts -- out of every beta feature on apply. NOT NULL keeps callers from -- having to defend against `beta_features == null` at every site. -- -- Idempotent — safe to run multiple times. -- ============================================================ ALTER TABLE profiles ADD COLUMN IF NOT EXISTS beta_features TEXT[] NOT NULL DEFAULT ARRAY[]::TEXT[]; -- No new RLS policy needed: the existing `Users can view own profile` / -- `Users can update own profile` policies (migration 001) already gate -- access to this column. Server-side reads via service_role bypass RLS -- as they do for every other column. -- -- No index needed: the column is read on the login codepath (one row -- lookup by primary key / user_id, both already indexed) and very -- rarely written.