Skip to content
Merged
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
50 changes: 32 additions & 18 deletions app/users/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = ""
Expand All @@ -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):
Expand All @@ -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):
Expand Down
Loading