from datetime import datetime, timezone from uuid import UUID from fastapi import HTTPException, status from loguru import logger from sqlalchemy.exc import IntegrityError from sqlalchemy.orm.attributes import flag_modified from sqlmodel import select from sqlmodel.ext.asyncio.session import AsyncSession from langflow.services.database.models.user.model import User, UserUpdate async def get_user_by_username(db: AsyncSession, username: str) -> User | None: stmt = select(User).where(User.username == username) return (await db.exec(stmt)).first() async def get_user_by_id(db: AsyncSession, user_id: UUID) -> User | None: stmt = select(User).where(User.id == user_id) return (await db.exec(stmt)).first() async def update_user(user_db: User | None, user: UserUpdate, db: AsyncSession) -> User: if not user_db: raise HTTPException(status_code=404, detail="User not found") # user_db_by_username = get_user_by_username(db, user.username) # if user_db_by_username and user_db_by_username.id != user_id: # raise HTTPException(status_code=409, detail="Username already exists") user_data = user.model_dump(exclude_unset=True) changed = False for attr, value in user_data.items(): if hasattr(user_db, attr) and value is not None: setattr(user_db, attr, value) changed = True if not changed: raise HTTPException(status_code=status.HTTP_304_NOT_MODIFIED, detail="Nothing to update") user_db.updated_at = datetime.now(timezone.utc) flag_modified(user_db, "updated_at") try: await db.commit() except IntegrityError as e: await db.rollback() raise HTTPException(status_code=400, detail=str(e)) from e return user_db async def update_user_last_login_at(user_id: UUID, db: AsyncSession): try: user_data = UserUpdate(last_login_at=datetime.now(timezone.utc)) user = await get_user_by_id(db, user_id) return await update_user(user, user_data, db) except Exception as e: # noqa: BLE001 logger.error(f"Error updating user last login at: {e!s}")