from fastapi import APIRouter from sqlalchemy import select from sqlalchemy.orm import joinedload from app.deps import CurrentUser, DbSession from app.models import UserCollection from app.schemas import CollectionCloudOut, CollectionOut from app.serializers import cloud_type_summary, media_url router = APIRouter(prefix="/collections", tags=["图鉴"]) @router.get("/me", response_model=list[CollectionOut]) async def get_my_collection(user: CurrentUser, db: DbSession) -> list[CollectionOut]: result = await db.execute( select(UserCollection) .options(joinedload(UserCollection.cloud_type), joinedload(UserCollection.first_cloud)) .where(UserCollection.user_id == user.id) .order_by(UserCollection.unlocked_at.asc()) ) output: list[CollectionOut] = [] for item in result.scalars().unique().all(): first_cloud = item.first_cloud output.append( CollectionOut( id=item.id, user_id=item.user_id, cloud_type_id=item.cloud_type_id, first_cloud_id=item.first_cloud_id, unlocked_at=item.unlocked_at, cloud_type=cloud_type_summary(item.cloud_type), first_cloud=( CollectionCloudOut( id=first_cloud.id, image_url=media_url(first_cloud.image_path) or "", thumbnail_url=media_url(first_cloud.thumbnail_path) or "", captured_at=first_cloud.captured_at, created_at=first_cloud.created_at, location_name=first_cloud.location_name, ) if first_cloud else None ), ) ) return output