48 lines
1.8 KiB
Python
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
|