From caa616dd3c4b6aad10763a7b1634e4962a763af6 Mon Sep 17 00:00:00 2001 From: panya Date: Sun, 8 Feb 2026 14:46:13 +0900 Subject: [PATCH] feat: univ_majors -> univMajors --- app/grad_2025/router.py | 16 +++++----------- app/grad_2025/schemas.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/app/grad_2025/router.py b/app/grad_2025/router.py index 2004e7c..cce5d62 100644 --- a/app/grad_2025/router.py +++ b/app/grad_2025/router.py @@ -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) @@ -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, ) diff --git a/app/grad_2025/schemas.py b/app/grad_2025/schemas.py index 0264554..4fb5433 100644 --- a/app/grad_2025/schemas.py +++ b/app/grad_2025/schemas.py @@ -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 @@ -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"), + )