v1.7.0: refactor max_bot to flat structure, add VCF+UserModel+NLP history context, portal pages and proxy fixes
- Refactored max_bot from nested packages to flat module structure - Q2: Extended BotUser model (patronymic, email, org, address, vcf_raw, contact_hash, phone_verified, email_verified, last_interaction, total_conversations, total_tickets) - Q2: VCF parser (FN, N, TEL, EMAIL, ORG, ADR), upsert on re-contact, NLP history context (_get_user_history_context -> YandexGPT) - Q1: Broadcast preview modal with 10s confirmation timer - Q3: CSS var(--white)->var(--bg-card), var(--text)->var(--text-primary) - Q4: bot_settings showNotification(), editable max_bot_id - Q5: Webhook secret passthrough via X-Max-Bot-Api-Secret - Masking sensitive keys, dialog_cleared handler, migrate via _add_column_if_not_exists() - Rate limit (asyncio.sleep 0.5 per 10), dead code removed, conv.intent context in contact.py - Portal pages: bot_consent, bot_kb (edit), bot_settings, bot_test, bot_tickets, portal_settings - Tests: 21/21 passing, added test_yandex_gpt.py, test_email_sender.py - Deploy: deploy_full.sh, schema.sql, seed_knowledge_base.sql
This commit is contained in:
@@ -0,0 +1,170 @@
|
||||
-- ============================================
|
||||
-- AegisOne MAX Bot — Database Schema
|
||||
-- ============================================
|
||||
-- Run this to set up all bot tables.
|
||||
-- Assumes database 'aegisone' already exists.
|
||||
|
||||
-- ============================================
|
||||
-- CLEANUP: Drop ALL old bot tables before recreating
|
||||
-- ============================================
|
||||
DROP TABLE IF EXISTS bot_1c_sync_log CASCADE;
|
||||
DROP TABLE IF EXISTS bot_ticket_messages CASCADE;
|
||||
DROP TABLE IF EXISTS bot_ticket_statuses CASCADE;
|
||||
DROP TABLE IF EXISTS bot_tickets CASCADE;
|
||||
DROP TABLE IF EXISTS bot_messages CASCADE;
|
||||
DROP TABLE IF EXISTS bot_conversations CASCADE;
|
||||
DROP TABLE IF EXISTS bot_knowledge_base CASCADE;
|
||||
DROP TABLE IF EXISTS bot_categories CASCADE;
|
||||
DROP TABLE IF EXISTS bot_users CASCADE;
|
||||
DROP TABLE IF EXISTS bot_consent_logs CASCADE;
|
||||
DROP TABLE IF EXISTS bot_features CASCADE;
|
||||
DROP TABLE IF EXISTS bot_settings CASCADE;
|
||||
DROP TABLE IF EXISTS bot_notification_subscriptions CASCADE;
|
||||
DROP TABLE IF EXISTS bot_notifications CASCADE;
|
||||
DROP TABLE IF EXISTS bot_risk_questions CASCADE;
|
||||
DROP TABLE IF EXISTS bot_broadcasts CASCADE;
|
||||
DROP TABLE IF EXISTS bot_response_templates CASCADE;
|
||||
DROP TABLE IF EXISTS file_sync_queue CASCADE;
|
||||
|
||||
-- 1. BOT SETTINGS
|
||||
CREATE TABLE IF NOT EXISTS bot_settings (
|
||||
id SERIAL PRIMARY KEY,
|
||||
key VARCHAR(255) UNIQUE NOT NULL,
|
||||
value TEXT,
|
||||
created_at TIMESTAMP DEFAULT now(),
|
||||
updated_at TIMESTAMP DEFAULT now()
|
||||
);
|
||||
|
||||
-- 2. BOT FEATURES
|
||||
CREATE TABLE IF NOT EXISTS bot_features (
|
||||
id SERIAL PRIMARY KEY,
|
||||
key VARCHAR(255) UNIQUE NOT NULL,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
description TEXT,
|
||||
is_enabled BOOLEAN DEFAULT FALSE,
|
||||
created_at TIMESTAMP DEFAULT now()
|
||||
);
|
||||
|
||||
-- 3. BOT CATEGORIES (for knowledge base)
|
||||
CREATE TABLE IF NOT EXISTS bot_categories (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
description TEXT,
|
||||
sort_order INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT now()
|
||||
);
|
||||
|
||||
-- 4. BOT KNOWLEDGE BASE (Q&A pairs)
|
||||
CREATE TABLE IF NOT EXISTS bot_knowledge_base (
|
||||
id SERIAL PRIMARY KEY,
|
||||
category_id INTEGER REFERENCES bot_categories(id) ON DELETE SET NULL,
|
||||
question TEXT NOT NULL,
|
||||
answer TEXT,
|
||||
keywords TEXT[],
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
source_url VARCHAR(500),
|
||||
sort_order INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT now(),
|
||||
updated_at TIMESTAMP DEFAULT now()
|
||||
);
|
||||
|
||||
-- 5. BOT USERS (MAX messenger users)
|
||||
CREATE TABLE IF NOT EXISTS bot_users (
|
||||
id BIGINT PRIMARY KEY,
|
||||
first_name VARCHAR(255),
|
||||
last_name VARCHAR(255),
|
||||
patronymic VARCHAR(255),
|
||||
username VARCHAR(255),
|
||||
phone VARCHAR(50),
|
||||
email VARCHAR(255),
|
||||
organization VARCHAR(255),
|
||||
address TEXT,
|
||||
vcf_raw TEXT,
|
||||
contact_hash VARCHAR(255),
|
||||
phone_verified BOOLEAN DEFAULT FALSE,
|
||||
email_verified BOOLEAN DEFAULT FALSE,
|
||||
consent_given BOOLEAN DEFAULT FALSE,
|
||||
consent_date TIMESTAMP,
|
||||
last_interaction TIMESTAMP,
|
||||
total_conversations INTEGER DEFAULT 0,
|
||||
total_tickets INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT now(),
|
||||
updated_at TIMESTAMP DEFAULT now()
|
||||
);
|
||||
|
||||
-- 6. BOT CONVERSATIONS
|
||||
CREATE TABLE IF NOT EXISTS bot_conversations (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
user_id BIGINT NOT NULL REFERENCES bot_users(id) ON DELETE CASCADE,
|
||||
state VARCHAR(50) DEFAULT 'greeting',
|
||||
intent VARCHAR(50),
|
||||
inquiry_text TEXT,
|
||||
created_at TIMESTAMP DEFAULT now(),
|
||||
updated_at TIMESTAMP DEFAULT now()
|
||||
);
|
||||
|
||||
-- 7. BOT MESSAGES
|
||||
CREATE TABLE IF NOT EXISTS bot_messages (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
conversation_id BIGINT NOT NULL REFERENCES bot_conversations(id) ON DELETE CASCADE,
|
||||
direction VARCHAR(10) NOT NULL,
|
||||
text TEXT,
|
||||
attachment_json TEXT,
|
||||
created_at TIMESTAMP DEFAULT now()
|
||||
);
|
||||
|
||||
-- 8. BOT TICKETS (support tickets)
|
||||
CREATE TABLE IF NOT EXISTS bot_tickets (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
user_id BIGINT NOT NULL REFERENCES bot_users(id) ON DELETE CASCADE,
|
||||
title VARCHAR(500),
|
||||
description TEXT,
|
||||
priority VARCHAR(20) DEFAULT 'normal',
|
||||
status VARCHAR(20) DEFAULT 'Новая',
|
||||
created_by VARCHAR(100) DEFAULT 'bot',
|
||||
assigned_to BIGINT,
|
||||
created_at TIMESTAMP DEFAULT now(),
|
||||
updated_at TIMESTAMP DEFAULT now()
|
||||
);
|
||||
|
||||
-- 9. BOT TICKET MESSAGES
|
||||
CREATE TABLE IF NOT EXISTS bot_ticket_messages (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
ticket_id BIGINT NOT NULL REFERENCES bot_tickets(id) ON DELETE CASCADE,
|
||||
direction VARCHAR(10) NOT NULL,
|
||||
text TEXT,
|
||||
created_at TIMESTAMP DEFAULT now()
|
||||
);
|
||||
|
||||
-- 10. BOT TICKET STATUSES (change log)
|
||||
CREATE TABLE IF NOT EXISTS bot_ticket_statuses (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
ticket_id BIGINT NOT NULL REFERENCES bot_tickets(id) ON DELETE CASCADE,
|
||||
old_status VARCHAR(20),
|
||||
new_status VARCHAR(20) NOT NULL,
|
||||
changed_by VARCHAR(100),
|
||||
created_at TIMESTAMP DEFAULT now()
|
||||
);
|
||||
|
||||
-- ============================================
|
||||
-- CLEANUP: Drop unused tables from old bot
|
||||
-- ============================================
|
||||
DROP TABLE IF EXISTS bot_notification_subscriptions CASCADE;
|
||||
DROP TABLE IF EXISTS bot_notifications CASCADE;
|
||||
DROP TABLE IF EXISTS bot_risk_questions CASCADE;
|
||||
DROP TABLE IF EXISTS bot_broadcasts CASCADE;
|
||||
DROP TABLE IF EXISTS file_sync_queue CASCADE;
|
||||
DROP TABLE IF EXISTS bot_response_templates CASCADE;
|
||||
|
||||
-- ============================================
|
||||
-- INDEXES
|
||||
-- ============================================
|
||||
CREATE INDEX IF NOT EXISTS idx_bot_conversations_user_id ON bot_conversations(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_bot_conversations_state ON bot_conversations(state);
|
||||
CREATE INDEX IF NOT EXISTS idx_bot_messages_conversation_id ON bot_messages(conversation_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_bot_tickets_user_id ON bot_tickets(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_bot_tickets_status ON bot_tickets(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_bot_ticket_messages_ticket_id ON bot_ticket_messages(ticket_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_bot_knowledge_base_category ON bot_knowledge_base(category_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_bot_knowledge_base_active ON bot_knowledge_base(is_active);
|
||||
CREATE INDEX IF NOT EXISTS idx_bot_knowledge_base_keywords ON bot_knowledge_base USING gin(keywords);
|
||||
Reference in New Issue
Block a user