from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select from sqlalchemy import delete, update from app.models.person_images import PersonImage from app.schemas.person_image import PersonImageCreate, PersonImageUpdate from typing import List, Optional async def get_person_image(db: AsyncSession, image_id: int): """获取单个人物形象""" result = await db.execute(select(PersonImage).filter(PersonImage.id == image_id)) return result.scalars().first() async def get_person_images_by_user(db: AsyncSession, user_id: int, skip: int = 0, limit: int = 100): """获取用户的所有人物形象图片""" result = await db.execute( select(PersonImage) .filter(PersonImage.user_id == user_id) .order_by(PersonImage.create_time.desc()) .offset(skip) .limit(limit) ) return result.scalars().all() async def create_person_image(db: AsyncSession, image: PersonImageCreate, user_id: int): """创建人物形象 image: 包含user_id的PersonImageCreate对象 """ # 如果设置为默认形象,先重置用户的所有形象为非默认 if image.is_default: await reset_default_images(db, user_id) db_image = PersonImage( user_id=user_id, image_url=image.image_url, is_default=image.is_default ) db.add(db_image) await db.commit() await db.refresh(db_image) return db_image async def update_person_image(db: AsyncSession, image_id: int, image: PersonImageUpdate): """更新人物形象""" db_image = await get_person_image(db, image_id) if not db_image: return None # 处理默认形象逻辑 if image.is_default is not None and image.is_default and not db_image.is_default: # 如果设置为默认且之前不是默认,重置其他形象 await reset_default_images(db, db_image.user_id) db_image.is_default = True elif image.is_default is not None: db_image.is_default = image.is_default # 更新图片URL if image.image_url: db_image.image_url = image.image_url await db.commit() await db.refresh(db_image) return db_image async def delete_person_image(db: AsyncSession, image_id: int): """删除人物形象""" db_image = await get_person_image(db, image_id) if db_image: await db.delete(db_image) await db.commit() return db_image async def delete_person_images(db: AsyncSession, user_id: int): """删除用户所有人物形象图片""" stmt = delete(PersonImage).where(PersonImage.user_id == user_id) await db.execute(stmt) await db.commit() return True async def reset_default_images(db: AsyncSession, user_id: int): """重置用户所有形象为非默认""" stmt = update(PersonImage).where( PersonImage.user_id == user_id, PersonImage.is_default == True ).values(is_default=False) await db.execute(stmt) async def get_default_image(db: AsyncSession, user_id: int): """获取用户的默认形象""" result = await db.execute( select(PersonImage) .filter(PersonImage.user_id == user_id, PersonImage.is_default == True) ) return result.scalars().first()