Fix [verification]: fix verification status & refactor code

This commit is contained in:
Kirill Samoylenkov 2025-11-08 15:38:12 +05:00
parent a511f7df3f
commit 680e19b3e7
5 changed files with 36 additions and 28 deletions

View file

@ -111,7 +111,7 @@ async def call_finish_verification(
status = await verify_student(
tg_user=telegram_user,
name=data["full_name"],
student_id=int(data["self_id"]),
self_id=int(data["self_id"]),
is_student=data["role"] == "student",
group_id=data["group_id"],
session=session,

View file

@ -1,4 +1,3 @@
from aiogram import F
from aiogram.fsm.context import FSMContext
from aiogram.types import Message

View file

@ -14,6 +14,4 @@ class VerificationStatus(Enum):
NOT_FOUND = auto()
ALREADY_BOUND_TO_CURRENT_ACCOUNT = auto()
ALREADY_BOUND_TO_ANOTHER_ACCOUNT = auto()
ACCOUNT_ALREADY_BOUND = auto()

View file

@ -5,7 +5,6 @@ __all__ = [
from loguru import logger as loguru_logger
from sqlalchemy.exc import NoResultFound
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
@ -39,7 +38,7 @@ async def verify_student(
tg_user: TelegramUser,
name: str,
is_student: bool,
student_id: int,
self_id: int,
group_id: str,
session: AsyncSession,
) -> VerificationStatus:
@ -58,38 +57,39 @@ async def verify_student(
VerificationStatus: result of the verification process.
"""
if tg_user.university_member_id is not None:
return VerificationStatus.ALREADY_BOUND_TO_CURRENT_ACCOUNT
return VerificationStatus.ACCOUNT_ALREADY_BOUND
if is_student:
query = (
select(Student)
.where(Student.name == name)
.where(Student.student_id == student_id)
.where(Student.student_id == self_id)
.where(Student.group_id == group_id)
)
else:
# Fixme: Add Teacher query.
# https://github.com/orgs/dibuildo/projects/2/views/1?pane=issue&itemId=135551755
query = (
select(Student)
.where(Student.name == name)
.where(Student.student_id == self_id)
)
result = await session.execute(query)
found_member = result.scalar_one_or_none()
try:
student = result.scalar_one()
if student.tg_users:
return VerificationStatus.ALREADY_BOUND_TO_ANOTHER_ACCOUNT
except NoResultFound:
if found_member is None:
# FIXME: placeholder.
# In a real scenario we should return NOT_FOUND.
loguru_logger.info(f"Creating new student: {name}")
loguru_logger.debug(f"Creating new student: {name}")
student = Student(
name=name,
student_id=student_id,
student_id=self_id,
group_id=group_id,
)
session.add(student)
tg_user.university_member_id = student.id # pyrefly: ignore
student.tg_users.append(tg_user)
await session.commit()
@ -99,3 +99,14 @@ async def verify_student(
)
return VerificationStatus.SUCCESSFULLY_BOUND
found_member.tg_users.append(tg_user)
await session.commit()
loguru_logger.debug(
f"Successfully bound user {tg_user.id} "
f"to university_member {found_member.id}"
)
return VerificationStatus.SUCCESSFULLY_BOUND

View file

@ -103,7 +103,7 @@ class RouterRegistry:
if isinstance(chat_types, ChatType):
chat_types = [chat_types]
if isinstance(filters, Filter):
if isinstance(filters, (Filter, State)):
filters = [filters]
elif filters is None:
filters = list()