94 lines
3.2 KiB
Python
94 lines
3.2 KiB
Python
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() |