first commit
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
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
|
||||
Reference in New Issue
Block a user