78 lines
2.8 KiB
Python
78 lines
2.8 KiB
Python
import aiosqlite
|
|
import os
|
|
from pathlib import Path
|
|
|
|
import config
|
|
|
|
_db: aiosqlite.Connection | None = None
|
|
|
|
|
|
async def init_db() -> None:
|
|
global _db
|
|
Path(config.DB_PATH).parent.mkdir(parents=True, exist_ok=True)
|
|
_db = await aiosqlite.connect(config.DB_PATH)
|
|
_db.row_factory = aiosqlite.Row
|
|
await _db.execute("PRAGMA journal_mode=WAL")
|
|
await _db.execute("PRAGMA foreign_keys=ON")
|
|
|
|
schema_path = Path(__file__).parent / "schema.sql"
|
|
schema = schema_path.read_text(encoding="utf-8")
|
|
# Выполняем каждый оператор отдельно
|
|
for statement in schema.split(";"):
|
|
stmt = statement.strip()
|
|
if stmt and not stmt.startswith("PRAGMA"):
|
|
await _db.execute(stmt)
|
|
await _db.commit()
|
|
|
|
# ── Миграции для существующих БД ─────────────────────────────────────────
|
|
# Добавляем intradesk_id в organizations, если ещё нет
|
|
try:
|
|
await _db.execute("ALTER TABLE organizations ADD COLUMN intradesk_id INTEGER")
|
|
await _db.execute(
|
|
"CREATE UNIQUE INDEX IF NOT EXISTS idx_orgs_intradesk_id "
|
|
"ON organizations(intradesk_id)"
|
|
)
|
|
await _db.commit()
|
|
except Exception:
|
|
pass # колонка уже существует
|
|
|
|
# Добавляем intradesk_task_id в tickets, если ещё нет
|
|
try:
|
|
await _db.execute(
|
|
"ALTER TABLE tickets ADD COLUMN intradesk_task_id INTEGER"
|
|
)
|
|
await _db.commit()
|
|
except Exception:
|
|
pass # колонка уже существует
|
|
|
|
# Таблица слежения за задачами для push-уведомлений
|
|
await _db.execute("""
|
|
CREATE TABLE IF NOT EXISTS task_watch (
|
|
task_id INTEGER PRIMARY KEY,
|
|
client_id INTEGER NOT NULL,
|
|
task_number INTEGER,
|
|
last_updatedat TEXT NOT NULL DEFAULT '',
|
|
last_comment_date TEXT NOT NULL DEFAULT ''
|
|
)
|
|
""")
|
|
await _db.execute(
|
|
"CREATE INDEX IF NOT EXISTS idx_task_watch_client ON task_watch(client_id)"
|
|
)
|
|
await _db.commit()
|
|
|
|
# Таблица контекста быстрого ответа (последняя активная заявка пользователя)
|
|
await _db.execute("""
|
|
CREATE TABLE IF NOT EXISTS user_reply_context (
|
|
max_user_id INTEGER PRIMARY KEY,
|
|
task_id INTEGER NOT NULL,
|
|
task_number INTEGER,
|
|
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
)
|
|
""")
|
|
await _db.commit()
|
|
|
|
|
|
def get_db() -> aiosqlite.Connection:
|
|
if _db is None:
|
|
raise RuntimeError("Database not initialized. Call init_db() first.")
|
|
return _db
|