42 lines
1.2 KiB
Python
42 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
import sqlalchemy as sa
|
|
from sqlalchemy.orm import Session
|
|
|
|
from backend.app.db.models import User
|
|
from backend.app.models import UserCreate
|
|
from backend.app.repositories.base import BaseRepository
|
|
|
|
|
|
class UserRepository(BaseRepository[User]):
|
|
"""Data access helpers for user accounts."""
|
|
|
|
model = User
|
|
|
|
def __init__(self, session: Session) -> None:
|
|
super().__init__(session)
|
|
|
|
def get_by_username(self, username: str) -> User | None:
|
|
statement = sa.select(self.model).where(
|
|
sa.func.lower(self.model.username) == username.lower()
|
|
)
|
|
return self.session.scalar(statement)
|
|
|
|
def list_recent(self, limit: int = 50) -> list[User]:
|
|
statement = (
|
|
sa.select(self.model).order_by(self.model.created_at.desc()).limit(limit)
|
|
)
|
|
return list(self.session.scalars(statement))
|
|
|
|
def create(self, data: UserCreate) -> User:
|
|
user = User(
|
|
username=data.username,
|
|
email=data.email,
|
|
full_name=data.full_name,
|
|
password_hash=data.password_hash,
|
|
role=data.role,
|
|
preferences=data.preferences,
|
|
)
|
|
self.session.add(user)
|
|
return user
|