diff --git a/app/users/schemas.py b/app/users/schemas.py index 3c43a12..cf9ec5c 100644 --- a/app/users/schemas.py +++ b/app/users/schemas.py @@ -87,6 +87,24 @@ def from_profile( ) +def _validate_birth(v: str | date) -> date: + """birth 필드의 파싱 및 범위 검증을 수행합니다.""" + if isinstance(v, date): + d = v + else: + try: + d = TypeAdapter(date).validate_python(v) + except Exception: + raise ValueError("올바른 날짜 형식이 아닙니다.") + + if d < date(1900, 1, 1): + raise ValueError("생년월일은 1900년 1월 1일 이후여야 합니다.") + if d > date.today(): + raise ValueError("생년월일은 오늘 이전이어야 합니다.") + + return d + + class UserFormBase(APISchema): nickname: str description: Description = "" @@ -99,22 +117,7 @@ class UserFormBase(APISchema): @field_validator("birth", mode="before") @classmethod def parse_and_validate_birth(cls, v: str | date): - if isinstance(v, date): - d = v - else: - # 나머지는 Pydantic에게 맡김 - try: - d = TypeAdapter(date).validate_python(v) - except Exception: - raise ValueError("올바른 날짜 형식이 아닙니다.") - - # 범위 검사 - if d < date(1900, 1, 1): - raise ValueError("생년월일은 1900년 1월 1일 이후여야 합니다.") - if d > date.today(): - raise ValueError("생년월일은 오늘 이전이어야 합니다.") - - return d + return _validate_birth(v) class UserCreate(UserFormBase): @@ -123,8 +126,19 @@ class UserCreate(UserFormBase): agree_marketing: bool -class UserUpdate(UserFormBase): - pass +class UserUpdate(APISchema): + nickname: str | None = None + description: Description | None = None + birth: date | None = None + gender: Gender | None = None + job: str | None = None + preferred_categories: list[Category] | None = None + profile_image: str | None = None + + @field_validator("birth", mode="before") + @classmethod + def parse_and_validate_birth(cls, v: str | date | None): + return _validate_birth(v) if v is not None else None class UserImageMeta(APISchema):