From 7a3cc427981877f7555ef2cc54063f8cdfb80134 Mon Sep 17 00:00:00 2001 From: Misaka_Company Date: Mon, 11 May 2026 11:06:00 +0800 Subject: [PATCH] feat: add pydantic schemas for location API Co-Authored-By: Claude Opus 4.6 --- app/schemas/__init__.py | 0 app/schemas/common.py | 7 +++++++ app/schemas/location.py | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 app/schemas/__init__.py create mode 100644 app/schemas/common.py create mode 100644 app/schemas/location.py diff --git a/app/schemas/__init__.py b/app/schemas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/schemas/common.py b/app/schemas/common.py new file mode 100644 index 0000000..af20c84 --- /dev/null +++ b/app/schemas/common.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel + + +class ErrorResponse(BaseModel): + error_code: str + message: str + detail: dict | None = None diff --git a/app/schemas/location.py b/app/schemas/location.py new file mode 100644 index 0000000..a4af99a --- /dev/null +++ b/app/schemas/location.py @@ -0,0 +1,39 @@ +import re + +from pydantic import BaseModel, field_validator + +ZONGPAI_PATTERN = re.compile(r"^(\d{2}(B|C|T)\d+|\d{2}(BW|CW)\d{4})$") +LOCATION_NORMAL_PATTERN = re.compile(r"^[A-Z]+\d+-\d+-\d+$") +LOCATION_TRANS_PATTERN = re.compile(r"^TRANS-\d+") + + +class LocationRequest(BaseModel): + zongpai_no: str + location_code: str + + @field_validator("zongpai_no") + @classmethod + def validate_zongpai_no(cls, v: str) -> str: + v = v.strip().upper() + if not ZONGPAI_PATTERN.match(v): + raise ValueError("INVALID_ZONGPAI") + return v + + @field_validator("location_code") + @classmethod + def validate_location_code(cls, v: str) -> str: + v = v.strip().upper() + if not LOCATION_NORMAL_PATTERN.match(v) and not LOCATION_TRANS_PATTERN.match(v): + raise ValueError("INVALID_LOCATION") + return v + + +class LocationResponse(BaseModel): + zongpai_no: str + location_code: str + created_at: str + + +class DuplicateLocationDetail(BaseModel): + existing_location: str + created_at: str