runtime settings loaded from DB/ refactoring admin-panel/ minor fixes and improvements

This commit is contained in:
Vladless
2025-11-15 23:14:34 +03:00
parent 76390df4bc
commit 041e1c898d
97 changed files with 8554 additions and 6514 deletions
+2 -2
View File
@@ -23,7 +23,7 @@ async def store_key(
try:
exists = await session.execute(select(Key).where(Key.tg_id == tg_id, Key.client_id == client_id))
existing_key = exists.scalar_one_or_none()
if existing_key:
await session.execute(
update(Key)
@@ -54,7 +54,7 @@ async def store_key(
)
session.add(new_key)
logger.info(f"[Store Key] Ключ создан: tg_id={tg_id}, client_id={client_id}, server_id={server_id}")
await session.commit()
except SQLAlchemyError as e:
+10
View File
@@ -262,3 +262,13 @@ class Admin(Base):
@staticmethod
def generate_token() -> str:
return secrets.token_urlsafe(32)
class Setting(DictLikeMixin, Base):
__tablename__ = "settings"
key = Column(String, primary_key=True)
value = Column(JSONB, nullable=True)
description = Column(Text, nullable=True)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
+37
View File
@@ -0,0 +1,37 @@
from typing import Any
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from .models import Setting
async def get_setting(session: AsyncSession, key: str, default: Any = None) -> Any:
stmt = select(Setting).where(Setting.key == key)
result = await session.execute(stmt)
setting = result.scalar_one_or_none()
if setting is None or setting.value is None:
return default
return setting.value
async def set_setting(
session: AsyncSession,
key: str,
value: Any,
description: str | None = None,
) -> Setting:
stmt = select(Setting).where(Setting.key == key)
result = await session.execute(stmt)
setting = result.scalar_one_or_none()
if setting is None:
setting = Setting(key=key, value=value, description=description)
session.add(setting)
else:
setting.value = value
if description is not None:
setting.description = description
await session.flush()
return setting
+2 -2
View File
@@ -36,7 +36,7 @@ async def count_active_keys(session: AsyncSession) -> int:
async def count_active_paid_keys(session: AsyncSession) -> int:
current_time_ms = int(datetime.utcnow().timestamp() * 1000)
trial_tariffs_subquery = select(Tariff.id).where(Tariff.group_code == "trial")
return await session.scalar(
select(func.count())
.select_from(Key)
@@ -48,7 +48,7 @@ async def count_active_paid_keys(session: AsyncSession) -> int:
async def count_active_trial_keys(session: AsyncSession) -> int:
current_time_ms = int(datetime.utcnow().timestamp() * 1000)
trial_tariffs_subquery = select(Tariff.id).where(Tariff.group_code == "trial")
return await session.scalar(
select(func.count())
.select_from(Key)