Files
vidconf/backend/repositories/users.py

60 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Репозиторий доступа к таблице `users`."""
import uuid
from sqlalchemy import or_, select
from sqlalchemy.ext.asyncio import AsyncSession
from models.user import User
class UserRepository:
"""Инкапсулирует SQL-запросы к пользователям."""
def __init__(self, session: AsyncSession) -> None:
self._session = session
async def get_by_email(self, email: str) -> User | None:
"""Найти пользователя по email (регистр значим, как задано в БД)."""
result = await self._session.execute(select(User).where(User.email == email))
return result.scalar_one_or_none()
async def get_by_id(self, user_id: uuid.UUID) -> User | None:
"""Найти пользователя по id."""
return await self._session.get(User, user_id)
async def create(
self,
*,
email: str,
name_user: str,
password_hash: str,
team_id: uuid.UUID | None = None,
) -> User:
"""Создать нового пользователя (role='user', email_verified=False по умолчанию)."""
user = User(email=email, name_user=name_user, password_hash=password_hash, team_id=team_id)
self._session.add(user)
await self._session.flush()
return user
async def list_all(self) -> list[User]:
"""Список всех пользователей (для мультиселекта участников брони, без пагинации)."""
result = await self._session.execute(select(User).order_by(User.name_user))
return list(result.scalars().all())
async def search(self, *, q: str | None, limit: int) -> list[User]:
"""Пикер участников конференции: без `q` — полный список (как `list_all`);
с `q` — поиск по имени/email (`ILIKE`), ограниченный `limit`.
"""
if not q:
return await self.list_all()
like = f"%{q}%"
stmt = (
select(User)
.where(or_(User.name_user.ilike(like), User.email.ilike(like)))
.order_by(User.name_user)
.limit(limit)
)
result = await self._session.execute(stmt)
return list(result.scalars().all())