"""User repository""" from typing import Optional from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload from app.repositories.base import BaseRepository from app.db.models import User class UserRepository(BaseRepository[User]): """User repository with custom methods""" def __init__(self, session: AsyncSession): super().__init__(User, session) async def get_by_did(self, did: str) -> Optional[User]: """Get user by DID""" result = await self.session.execute( select(User).where(User.did == did) ) return result.scalar_one_or_none() async def get_or_create(self, did: str, handle: Optional[str] = None) -> User: """Get existing user or create new one""" user = await self.get_by_did(did) if not user: user = await self.create(did=did, handle=handle) return user async def get_with_cards(self, user_id: int) -> Optional[User]: """Get user with all their cards""" result = await self.session.execute( select(User) .options(selectinload(User.cards)) .where(User.id == user_id) ) return result.scalar_one_or_none()