Tai Truong
fix readme
d202ada
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}")