from sqlalchemy.orm import relationship, Mapped, mapped_column from sqlalchemy.sql import expression as sql from sqlalchemy.ext.asyncio import AsyncSession from app.model.base import BaseModel from app.engine.postgresdb import Base class User(Base, BaseModel): __tablename__ = "users" name: Mapped[str] email: Mapped[str] hashed_password: Mapped[str] is_deleted: Mapped[bool] = mapped_column(default=False) transactions = relationship("Transaction", back_populates="user") @classmethod async def create(cls: "type[User]", db: AsyncSession, **kwargs) -> "User": query = sql.insert(cls).values(**kwargs).returning(cls.id) users = await db.execute(query) await db.commit() return users.first() @classmethod async def update(cls: "type[User]", db: AsyncSession, id: int, **kwargs) -> "User": query = ( sql.update(cls) .where(cls.id == id) .values(**kwargs) .execution_options(synchronize_session="fetch") .returning(cls.id) ) users = await db.execute(query) await db.commit() return users.first() @classmethod async def get(cls: "type[User]", db: AsyncSession, id: int) -> "User": query = sql.select(cls).where(cls.id == id) users = await db.execute(query) (user,) = users.first() return user @classmethod async def get(cls: "type[User]", db: AsyncSession, email: str) -> "User": query = sql.select(cls).where(cls.email == email) users = await db.execute(query) (user,) = users.first() return user @classmethod async def delete(cls: "type[User]", db: AsyncSession, id: int) -> "User": query = ( sql.update(cls) .where(cls.id == id) .values(is_deleted=True) .execution_options(synchronize_session="fetch") .returning(cls.id) ) users = await db.execute(query) await db.commit() return users.first()