Files
opencloud-backend/app/routers/collections.py
T
2026-07-18 20:32:51 +08:00

48 lines
1.8 KiB
Python

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