-- +goose Up -- Single-bot collapse + per-user variant preferences. -- -- With one Telegram bot there is no longer a "service language" (which bot a player -- signed in through), and variant availability is no longer gated by the bot's -- supported languages but by an explicit per-account preference. variant_preferences -- is the set of game variants (engine.Variant stable labels) a player is willing to be -- matched into: it gates the New Game picker and the matchmaker, while an invited friend -- may still accept any variant. New accounts default to Erudit only (a DB-level default, -- so no application seed is needed); the set may never be empty and must be a subset of -- the three known variants. feedback_messages.channel_lang (the bot a message arrived -- through) likewise loses meaning under one bot and is dropped; the sender's interface -- language (lang) is kept. SET search_path = backend, pg_catalog; ALTER TABLE accounts ADD COLUMN variant_preferences text[] NOT NULL DEFAULT ARRAY['erudit_ru']::text[], ADD CONSTRAINT accounts_variant_preferences_nonempty_chk CHECK (cardinality(variant_preferences) >= 1), ADD CONSTRAINT accounts_variant_preferences_subset_chk CHECK (variant_preferences <@ ARRAY['scrabble_en', 'scrabble_ru', 'erudit_ru']::text[]); ALTER TABLE accounts DROP COLUMN service_language; ALTER TABLE feedback_messages DROP COLUMN channel_lang; -- The auto-match pairing query filters open games by (variant, multiple_words_per_turn) -- and takes the oldest by created_at; games_open_idx (open_deadline_at) does not serve it. -- A partial index over open games turns the scan-and-sort into a single index seek. CREATE INDEX games_open_match_idx ON games (variant, multiple_words_per_turn, created_at) WHERE status = 'open'; -- +goose Down SET search_path = backend, pg_catalog; DROP INDEX games_open_match_idx; ALTER TABLE feedback_messages ADD COLUMN channel_lang text; ALTER TABLE accounts ADD COLUMN service_language text CHECK (service_language IN ('en', 'ru')); ALTER TABLE accounts DROP CONSTRAINT accounts_variant_preferences_subset_chk, DROP CONSTRAINT accounts_variant_preferences_nonempty_chk, DROP COLUMN variant_preferences;