Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 5 additions & 11 deletions app/grad_2025/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@

from fastapi import Query

from app.category.enums import Category
from app.common.schemas import Page
from app.core.router import create_router
from app.posts.schemas import PostCompactRead

from .schemas import Grad2025Cursor, Grad2025Read
from .schemas import Grad2025Cursor, Grad2025PostSearchQuery, Grad2025Read
from .service import Grad2025Service

# Public router - 학교/전공 목록 (기존 배포된 API)
Expand Down Expand Up @@ -36,16 +35,11 @@ async def read_univ_majors_private(
@private_router.get("/posts")
async def search_grad_2025_posts(
grad_2025_service: Grad2025Service,
cursor: Annotated[
str | None,
Query(description="Base64 인코딩된 커서 (응답의 next_cursor 값)"),
] = None,
categories: list[Category] | None = Query(default=None),
univ_majors: list[str] | None = Query(default=None),
search_query: Annotated[Grad2025PostSearchQuery, Query()],
) -> Page[PostCompactRead]:
decoded_cursor = Grad2025Cursor.decode(cursor)
decoded_cursor = Grad2025Cursor.decode(search_query.cursor)
return await grad_2025_service.search_posts(
cursor=decoded_cursor,
categories=categories,
univ_majors=univ_majors,
categories=search_query.categories,
univ_majors=search_query.univ_majors,
)
15 changes: 15 additions & 0 deletions app/grad_2025/schemas.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import base64

from pydantic import AliasChoices, Field

from app.category.enums import Category
from app.schemas import APISchema

from .models import Grad2025
Expand Down Expand Up @@ -28,3 +31,15 @@ def decode(cls, token: str | None) -> "Grad2025Cursor | None":
return None
data = base64.urlsafe_b64decode(token.encode()).decode()
return cls.model_validate_json(data)


class Grad2025PostSearchQuery(APISchema):
cursor: str | None = Field(
default=None,
description="Base64 인코딩된 커서 (응답의 next_cursor 값)",
)
categories: list[Category] | None = None
univ_majors: list[str] | None = Field(
default=None,
validation_alias=AliasChoices("univMajors", "univ_majors"),
)
Loading