from typing import Optional from pydantic import BaseModel, Field from common.enums import ErrorType class StructModel: """프로토콜/구조체 식별용 마커 클래스.""" pass class ErrorInfo(BaseModel, StructModel): """모든 응답에 공통으로 실리는 결과 정보. result.success / code / desc 로 내려간다.""" success: Optional[bool] = Field(True, description="처리 성공 여부 (성공 시 true)") code: Optional[int] = Field(ErrorType.SUCCESS.value, description="결과 코드 (ErrorType, 0=성공)") desc: Optional[str] = Field(ErrorType.SUCCESS.name, description="결과 코드 이름 (ErrorType.name)") def SetResult(self, enum: ErrorType): if enum is not None: self.success = ErrorType.SUCCESS.value == enum.value self.code = enum.value self.desc = enum.name # ---- Protocol 규약 ------------------------------------------------------- # 모든 통신 패킷은 WebPacketProtocol 을 상속한다. # 요청 : Req_xxx (Req_WebPacketProtocol) # 응답 : Res_xxx (Res_WebPacketProtocol) - 항상 result 필드를 가진다. # 각 라우터 폴더의 protocol.py 에 Req_/Res_ 를 정의한다. class WebPacketProtocol(BaseModel, StructModel): pass class Req_WebPacketProtocol(WebPacketProtocol): pass class Res_WebPacketProtocol(WebPacketProtocol): # default_factory 로 인스턴스마다 새 ErrorInfo 를 생성한다 (mutable default 공유 방지). result: ErrorInfo = Field(default_factory=ErrorInfo, description="공통 처리 결과 (성공 여부/코드/설명)") msg: Optional[str] = Field(None, description="부가 메시지 (선택)")