feat(admin): add admin panel and reminder system

This commit is contained in:
2026-07-30 19:46:16 +05:00
parent ecc006287b
commit e79624a13a
17 changed files with 582 additions and 148 deletions
+29 -3
View File
@@ -87,20 +87,46 @@ class BaseRepository(Generic[ModelTranslator]):
)
# Готовим подключение к БД. Сами миграции запускаются отдельно через migrate.py.
# Готовим подключение к БД: создаём таблицы и накатываем недостающие колонки.
async def prepare_database() -> None:
database_path.parent.mkdir(parents=True, exist_ok=True)
# Импортируем модели, чтобы репозитории работали с уже загруженными таблицами
# Импортируем модели, чтобы Base.metadata знала обо всех таблицах
import tgbot.database # noqa: F401
from tgbot.database.core import Base, engine
from tgbot.database.db_settings import SettingsRepository
# Создаём все таблицы (если их ещё нет)
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
# Мягкая миграция: добавляем колонку remind_interval если её нет
await _migrate_settings_columns()
try:
await SettingsRepository().ensure_default()
except SQLAlchemyError as error:
raise RuntimeError(
"База данных не готова. Запусти миграции командой: python migrate.py"
"База данных не готова — проверь подключение к SQLite"
) from error
bot_logger.info("База данных готова")
async def _migrate_settings_columns() -> None:
"""Добавляет новые колонки в storage_settings для существующих БД."""
from sqlalchemy import text
from tgbot.database.core import engine
migrations = [
"ALTER TABLE storage_settings ADD COLUMN remind_interval INTEGER NOT NULL DEFAULT 0",
]
async with engine.begin() as conn:
for sql in migrations:
try:
await conn.execute(text(sql))
except Exception:
# Колонка уже существует — игнорируем
pass