add
This commit is contained in:
@@ -11,6 +11,8 @@ from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
|
||||
from app.config import Settings
|
||||
from app.db.base import utcnow
|
||||
from app.db.models import (
|
||||
BroadcastPoll,
|
||||
BroadcastPollAnswer,
|
||||
Guide,
|
||||
GuidePhoto,
|
||||
InternalSquad,
|
||||
@@ -124,6 +126,13 @@ class AdminTelegramUserProfile:
|
||||
accesses: list[CachedUserView] = field(default_factory=list)
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class BroadcastPollAnswerResult:
|
||||
poll: BroadcastPoll
|
||||
answer: BroadcastPollAnswer
|
||||
previous_answer: str | None = None
|
||||
|
||||
|
||||
class SyncService:
|
||||
def __init__(
|
||||
self,
|
||||
@@ -571,6 +580,69 @@ class SyncService:
|
||||
)
|
||||
return list(rows.all())
|
||||
|
||||
async def create_broadcast_poll(
|
||||
self,
|
||||
*,
|
||||
question_text: str,
|
||||
created_by_telegram_id: int,
|
||||
) -> BroadcastPoll:
|
||||
async with self._session_factory() as session:
|
||||
poll = BroadcastPoll(
|
||||
question_text=question_text,
|
||||
created_by_telegram_id=created_by_telegram_id,
|
||||
)
|
||||
session.add(poll)
|
||||
await session.commit()
|
||||
return poll
|
||||
|
||||
async def record_broadcast_poll_answer(
|
||||
self,
|
||||
*,
|
||||
poll_id: int,
|
||||
telegram_id: int,
|
||||
username: str | None,
|
||||
first_name: str | None,
|
||||
last_name: str | None,
|
||||
answer: str,
|
||||
) -> BroadcastPollAnswerResult | None:
|
||||
normalized_answer = answer.strip().lower()
|
||||
if normalized_answer not in {"yes", "no"}:
|
||||
raise ValueError("Unsupported answer")
|
||||
|
||||
async with self._session_factory() as session:
|
||||
poll = await session.scalar(
|
||||
select(BroadcastPoll).where(BroadcastPoll.id == poll_id)
|
||||
)
|
||||
if poll is None:
|
||||
return None
|
||||
|
||||
record = await session.scalar(
|
||||
select(BroadcastPollAnswer).where(
|
||||
BroadcastPollAnswer.poll_id == poll_id,
|
||||
BroadcastPollAnswer.telegram_id == telegram_id,
|
||||
)
|
||||
)
|
||||
previous_answer = record.answer if record is not None else None
|
||||
if record is None:
|
||||
record = BroadcastPollAnswer(
|
||||
poll_id=poll_id,
|
||||
telegram_id=telegram_id,
|
||||
)
|
||||
session.add(record)
|
||||
|
||||
record.username = username
|
||||
record.first_name = first_name
|
||||
record.last_name = last_name
|
||||
record.answer = normalized_answer
|
||||
record.updated_at = utcnow()
|
||||
|
||||
await session.commit()
|
||||
return BroadcastPollAnswerResult(
|
||||
poll=poll,
|
||||
answer=record,
|
||||
previous_answer=previous_answer,
|
||||
)
|
||||
|
||||
async def get_admin_telegram_users_page(
|
||||
self,
|
||||
*,
|
||||
|
||||
Reference in New Issue
Block a user