Files
site_aegisone/max_bot/sql/schema.sql
T
angel 72b6879f4b 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
2026-05-29 02:30:30 +03:00

171 lines
6.0 KiB
SQL

-- ============================================
-- 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);