Spaces:
Running
Running
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}") | |