Первоначальная версия VidConf
This commit is contained in:
59
backend/repositories/users.py
Normal file
59
backend/repositories/users.py
Normal file
@@ -0,0 +1,59 @@
|
||||
"""Репозиторий доступа к таблице `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())
|
||||
Reference in New Issue
Block a user