refactor(wizard): move core to Shared, add IWizardMessenger contract (issue #112)
Moves the game-creation wizard state machine, view builder, and platform-neutral contracts (callback data, step names, storage exception, club option, step limits) from GmRelay.Bot to GmRelay.Shared. Telegram continues to work through a new TelegramWizardMessenger implementing IWizardMessenger and a WizardInteractionMapper that converts Update → WizardInteraction. Wires the new platform column on wizard_drafts (V032 migration) and switches chat/owner/thread/message ids to TEXT so the same table can hold Discord snowflakes later. - GameCreationWizard: now in Shared, takes IWizardMessenger + IWizardDraftRepository, dispatches on WizardInteraction. - New IWizardMessenger contract with Edit/Send/Answer/GetOwnerClubs (returns string ids so Telegram longs and Discord snowflakes both fit). - New WizardStepViewBuilder in Shared returns (text, IReadOnlyList<WizardAction>); TelegramWizardMessenger renders actions into InlineKeyboardMarkup via a new Bot-side ToInlineKeyboard helper. - New WizardInteractionMapper in Bot (5-case test) converts Telegram Update to WizardInteraction. - WizardDraft gains a Platform column; ChatId/MessageThreadId/OwnerId/ DraftMessageId switched to string. V032 migrates existing rows and rebuilds the owner lookup index on (platform, owner_id). - All existing wizard / create-session tests updated to the new contract (HandleInteractionAsync + WizardInteraction). Wizard callback-data format preserved. - dotnet build clean, dotnet format --verify-no-changes clean, all 101 wizard tests pass.
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
-- V032: Platform-neutral wizard drafts (issue #112).
|
||||
-- Adds the platform discriminator and switches owner/chat/thread/message
|
||||
-- columns from numeric to TEXT so the same table can hold both Telegram
|
||||
-- ids (long) and Discord snowflakes (ulong). All conversions are safe:
|
||||
-- the affected columns are nullable except chat_id/owner_telegram_id
|
||||
-- which we cast via TEXT.
|
||||
|
||||
ALTER TABLE wizard_drafts
|
||||
ADD COLUMN platform TEXT NOT NULL DEFAULT 'Telegram';
|
||||
|
||||
-- Convert chat_id: BIGINT → TEXT. Existing rows hold Telegram chat ids
|
||||
-- which convert losslessly to their decimal string form.
|
||||
ALTER TABLE wizard_drafts
|
||||
ALTER COLUMN chat_id TYPE TEXT USING chat_id::TEXT;
|
||||
|
||||
-- Convert message_thread_id: INT (nullable) → TEXT (nullable).
|
||||
ALTER TABLE wizard_drafts
|
||||
ALTER COLUMN message_thread_id TYPE TEXT USING message_thread_id::TEXT;
|
||||
|
||||
-- Convert draft_message_id: BIGINT (nullable) → TEXT (nullable).
|
||||
ALTER TABLE wizard_drafts
|
||||
ALTER COLUMN draft_message_id TYPE TEXT USING draft_message_id::TEXT;
|
||||
|
||||
-- Rename owner_telegram_id → owner_id (now platform-agnostic) and
|
||||
-- convert from BIGINT to TEXT.
|
||||
ALTER TABLE wizard_drafts
|
||||
RENAME COLUMN owner_telegram_id TO owner_id;
|
||||
|
||||
ALTER TABLE wizard_drafts
|
||||
ALTER COLUMN owner_id TYPE TEXT USING owner_id::TEXT;
|
||||
|
||||
-- Replace the old owner lookup index with one that uses the new column
|
||||
-- names and the platform discriminator.
|
||||
DROP INDEX IF EXISTS idx_wizard_drafts_owner;
|
||||
|
||||
CREATE INDEX idx_wizard_drafts_owner
|
||||
ON wizard_drafts(platform, owner_id);
|
||||
|
||||
CREATE INDEX idx_wizard_drafts_platform
|
||||
ON wizard_drafts(platform);
|
||||
Reference in New Issue
Block a user