-- Channel: Twitter/X (G10) -- Twitter Account Activity API uses OAuth 2.0 with PKCE for user authentication. -- Webhook CRC (Challenge-Response Check) for webhook validation. -- Reference: Chatwoot app/models/channel/twitter_profile.rb CREATE TABLE IF NOT EXISTS channel_twitters ( id SERIAL PRIMARY KEY, account_id INTEGER NOT NULL, inbox_id INTEGER NOT NULL UNIQUE, twitter_user_id VARCHAR(255) NOT NULL, name VARCHAR(255), screen_name VARCHAR(255), profile_image_url VARCHAR(512), access_token VARCHAR(1024) NOT NULL, refresh_token VARCHAR(1024), twitter_access_token VARCHAR(512), twitter_access_token_secret VARCHAR(512), webhook_id VARCHAR(255), webhook_env VARCHAR(255), reauthorization_required BOOLEAN DEFAULT FALSE, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), deleted_at TIMESTAMP WITH TIME ZONE ); CREATE INDEX idx_channel_twitters_deleted_at ON channel_twitters(deleted_at); CREATE INDEX idx_channel_twitters_account_id ON channel_twitters(account_id) WHERE deleted_at IS NULL; CREATE INDEX idx_channel_twitters_inbox_id ON channel_twitters(inbox_id) WHERE deleted_at IS NULL; CREATE INDEX idx_channel_twitters_twitter_user_id ON channel_twitters(twitter_user_id) WHERE deleted_at IS NULL; -- Channel: Microsoft/Azure AD (G10) -- Microsoft Graph API uses OAuth 2.0 with Azure AD for enterprise authentication. -- Webhook subscriptions for real-time event processing. -- This is a gochat addition — no Chatwoot reference exists. CREATE TABLE IF NOT EXISTS channel_microsofts ( id SERIAL PRIMARY KEY, account_id INTEGER NOT NULL, inbox_id INTEGER NOT NULL UNIQUE, tenant_id VARCHAR(255) NOT NULL, client_id VARCHAR(255) NOT NULL, access_token VARCHAR(2048) NOT NULL, refresh_token VARCHAR(2048), team_id VARCHAR(255), channel_id VARCHAR(255), display_name VARCHAR(255), subscription_id VARCHAR(255), reauthorization_required BOOLEAN DEFAULT FALSE, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), deleted_at TIMESTAMP WITH TIME ZONE ); CREATE INDEX idx_channel_microsofts_deleted_at ON channel_microsofts(deleted_at); CREATE INDEX idx_channel_microsofts_account_id ON channel_microsofts(account_id) WHERE deleted_at IS NULL; CREATE INDEX idx_channel_microsofts_inbox_id ON channel_microsofts(inbox_id) WHERE deleted_at IS NULL; CREATE INDEX idx_channel_microsofts_tenant_id ON channel_microsofts(tenant_id) WHERE deleted_at IS NULL; CREATE INDEX idx_channel_microsofts_client_id ON channel_microsofts(client_id) WHERE deleted_at IS NULL; -- Channel: Google/Google Chat (G10) -- Google Chat API uses OAuth 2.0 for authentication. -- This is a gochat addition — no Chatwoot reference exists. CREATE TABLE IF NOT EXISTS channel_googles ( id SERIAL PRIMARY KEY, account_id INTEGER NOT NULL, inbox_id INTEGER NOT NULL UNIQUE, google_user_id VARCHAR(255) NOT NULL, access_token VARCHAR(2048) NOT NULL, refresh_token VARCHAR(2048), space_id VARCHAR(255), display_name VARCHAR(255), subscription_id VARCHAR(255), reauthorization_required BOOLEAN DEFAULT FALSE, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), deleted_at TIMESTAMP WITH TIME ZONE ); CREATE INDEX idx_channel_googles_deleted_at ON channel_googles(deleted_at); CREATE INDEX idx_channel_googles_account_id ON channel_googles(account_id) WHERE deleted_at IS NULL; CREATE INDEX idx_channel_googles_inbox_id ON channel_googles(inbox_id) WHERE deleted_at IS NULL; CREATE INDEX idx_channel_googles_google_user_id ON channel_googles(google_user_id) WHERE deleted_at IS NULL;