api/app/services/user_image.py
2025-04-09 16:18:52 +08:00

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.user_images import UserImage
from app.schemas.user_image import UserImageCreate, UserImageUpdate
from typing import List, Optional
async def get_user_image(db: AsyncSession, image_id: int):
"""获取单个用户形象"""
result = await db.execute(select(UserImage).filter(UserImage.id == image_id))
return result.scalars().first()
async def get_user_images_by_user(db: AsyncSession, user_id: int, skip: int = 0, limit: int = 100):
"""获取用户的所有形象图片"""
result = await db.execute(
select(UserImage)
.filter(UserImage.user_id == user_id)
.order_by(UserImage.create_time.desc())
.offset(skip)
.limit(limit)
)
return result.scalars().all()
async def create_user_image(db: AsyncSession, image: UserImageCreate):
"""创建用户形象
image: 包含user_id的UserImageCreate对象
"""
# 如果设置为默认形象,先重置用户的所有形象为非默认
if image.is_default and image.user_id:
await reset_default_images(db, image.user_id)
db_image = UserImage(
user_id=image.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_user_image(db: AsyncSession, image_id: int, image: UserImageUpdate):
"""更新用户形象"""
db_image = await get_user_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_user_image(db: AsyncSession, image_id: int):
"""删除用户形象"""
db_image = await get_user_image(db, image_id)
if db_image:
await db.delete(db_image)
await db.commit()
return db_image
async def delete_user_images(db: AsyncSession, user_id: int):
"""删除用户所有形象图片"""
stmt = delete(UserImage).where(UserImage.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(UserImage).where(
UserImage.user_id == user_id,
UserImage.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(UserImage)
.filter(UserImage.user_id == user_id, UserImage.is_default == True)
)
return result.scalars().first()