From f6665ff212d51578a52f02c3ca64dff27e8c09d6 Mon Sep 17 00:00:00 2001 From: skeris Date: Sun, 11 May 2025 17:11:26 +0300 Subject: [PATCH] vlang TG bot migrations imtegrations --- CHANGELOG.md | 1 + dal/schema/000020_init.down.sql | 18 +++++++++++ dal/schema/000020_init.up.sql | 56 +++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f96ce1e..8a426e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ == v0.0.0 +- ветка vlangTG - создание миграций для добавления таблицы интеграции и с ботом для телеги и таблицы текущего статуса прохождения опроса через телегабот. и всякие энамы вокруг этого - ветка chMigrate: миграция сложных запросов на LTV для промокода и мини партнёрки для перехода по quizLogo из сложных походов по внутренней сети на получение данных из clickhouse diff --git a/dal/schema/000020_init.down.sql b/dal/schema/000020_init.down.sql index 2944567..b2ec5da 100644 --- a/dal/schema/000020_init.down.sql +++ b/dal/schema/000020_init.down.sql @@ -1 +1,19 @@ +DROP TABLE IF EXISTS telegram_integration; +DROP TABLE IF EXISTS respondent_state; +DROP TABLE IF EXISTS telegram_integration_instance; +drop table if exists telegram_user_quiz_result; DROP INDEX results_for_quiz; + +DO $$ + BEGIN + IF EXISTS (SELECT 1 FROM pg_type WHERE typname = 'bot_status') THEN + DROP TYPE bot_status; + END IF; +END $$; + +DO $$ + BEGIN + IF EXISTS (SELECT 1 FROM pg_type WHERE typname = 'user_result_tg_status') THEN + DROP TYPE user_result_tg_status; + END IF; +END $$; diff --git a/dal/schema/000020_init.up.sql b/dal/schema/000020_init.up.sql index b9b9817..aee2174 100644 --- a/dal/schema/000020_init.up.sql +++ b/dal/schema/000020_init.up.sql @@ -1 +1,57 @@ +DO $$ + BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'bot_status') THEN + CREATE TYPE bot_status AS ENUM ('active','stopped', 'banned'); + END IF; + END $$; + +DO $$ + BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'user_result_tg_status') THEN + CREATE TYPE user_result_tg_status AS ENUM ('in_progress','completed'); + END IF; +END $$; + CREATE INDEX IF NOT EXISTS results_for_quiz ON answer(quiz_id, result); + +CREATE TABLE IF NOT EXISTS telegram_integration( + id bigserial unique not null primary key, + accountid varchar(30) NOT NULL, -- связь с аккаунтом квиза + quizID integer NOT NULL , -- айдишник квиза, с которым связываем интеграцию + bot_token text NOT NULL, -- токен бота + bot_name text NOT NULL DEFAULT '', -- имя бота + repeatable boolean DEFAULT false, -- флаг возможности повторить опрос + deleted boolean NOT NULL default false, -- флаг удаленного + status bot_status NOT NULL DEFAULT 'active', + instance_id integer NOT NULL default 0 +); + +CREATE TABLE IF NOT EXISTS respondent_state( + id bigserial unique not null primary key, + telegram_id integer NOT NULL, -- айдишник пользователя в телеграме, скорее всего чат id + quizID integer NOT NULL, -- айдишник квиза, который проходится этим респондентом + state bigint NOT NULL, + lang text NOT NULL default '', -- язык опрашиваемого + contact text NOT NULL default '', -- ник пользователя в телеге, если доступен + finish boolean not null default false, -- статус, пройден опрос или нет + session varchar(20) -- сессия пользователя +); + +CREATE TABLE IF NOT EXISTS telegram_integration_instance( + id bigserial unique not null primary key, + checkout bigint not null , -- время "подтверждения активности". в идеале должно быть актуальным, но отличаться от всех остальных минимум на 10 секунд. т.е. если у нас есть бот с временем в 10:10:10 и бот с временем в 10:10:31, а сейчас 10:10:32, то валидные слоты это 10:10:21 и 10:10:41. но как это сделать я не знаю. как вариант, можно просто взять бот с максимальным временем и сделать ему +10. и наверное это правильныйй вариант + limited integer not null, --константа с лимитом ботов + amount integer not null -- актуальное количество ботов +); + +CREATE TABLE IF NOT EXISTS telegram_user_quiz_result( + id BIGSERIAL PRIMARY KEY, + bot_id BIGINT NOT NULL, + quiz_id BIGINT NOT NULL, + current_field TEXT, + user_answer TEXT DEFAULT '', + state user_result_tg_status not null default 'in_progress', + session varchar(20) NOT NULL , + question_id bigint NOT NULL, -- id вопроса результата + iter integer not null +)