- item/supplier/quotation/quotation_setting CRUD·service·router 추가 - item protocol delivery_type str→int (ERD/스키마 SMALLINT 일치) - DeliveryType enum + 한글 라벨, 공용 GET /v1/enums (도메인 코드 메타데이터) - CompanyBrief → CompanyData 로 *Data 네이밍 통일 - CORS: WebServerConfig.client_url(단일) 도입 (config_models/router) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
136 lines
4.1 KiB
Python
136 lines
4.1 KiB
Python
from enum import Enum, auto
|
|
|
|
from fastapi import HTTPException
|
|
|
|
|
|
class ErrorType(Enum):
|
|
"""서버 전역 결과 코드. Res_WebPacketProtocol.result 에 담겨 클라이언트로 전달된다.
|
|
HTTP status 와 겹치지 않도록 구간을 분리해서 관리한다.
|
|
"""
|
|
|
|
SUCCESS = 0
|
|
FAIL = 1
|
|
|
|
# DB / Redis 에러
|
|
DB_RUN_FAILED = 10
|
|
DB_ALREADY_SAME_KEY = auto()
|
|
DB_INVALID_KEY = auto()
|
|
DB_EMPTY_DATA = auto()
|
|
DB_INVALID_TYPE = auto()
|
|
|
|
# 요청/직렬화 에러
|
|
JSON_PARSE_ERROR = 100
|
|
INVALID_REQUEST_DATA = auto()
|
|
INTERNAL_EXCEPTION = auto()
|
|
|
|
# http 에러 코드와 겹치지 않게 설정 - router 전용 예외 발생 옵션
|
|
HTTP_INVALID_CLIENT_REQUEST = 419
|
|
HTTP_TO_MANY_REQUEST = 429
|
|
HTTP_INVALID_CLIENT_ACCESS = 433
|
|
HTTP_ACCESS_TOKEN_EXPIRED = 434
|
|
HTTP_REFRESH_TOKEN_EXPIRED = 435
|
|
HTTP_INVALID_TOKEN_ACCESS = 436
|
|
|
|
# 계정 관련 에러
|
|
ACCOUNT_INVALID_INFO = 1200
|
|
ACCOUNT_ALREADY_EXIST = auto()
|
|
ACCOUNT_BLOCKED_USER = auto()
|
|
|
|
# 상품 관련 에러
|
|
ITEM_NOT_FOUND = 1300
|
|
|
|
# 협력사 관련 에러
|
|
SUPPLIER_NOT_FOUND = 1400
|
|
|
|
# 견적 관련 에러
|
|
QUOTATION_NOT_FOUND = 1500
|
|
|
|
# 견적 설정 관련 에러
|
|
QUOTATION_SETTING_NOT_FOUND = 1600
|
|
|
|
|
|
# ErrorType 의 HTTP_* 값과 status_code 를 맞춰 router 단에서 raise 한다.
|
|
EXCEPTION_INVALID_CLIENT_REQUEST = HTTPException(status_code=ErrorType.HTTP_INVALID_CLIENT_REQUEST.value, detail=ErrorType.HTTP_INVALID_CLIENT_REQUEST.name)
|
|
EXCEPTION_TO_MANY_REQUEST = HTTPException(status_code=ErrorType.HTTP_TO_MANY_REQUEST.value, detail=ErrorType.HTTP_TO_MANY_REQUEST.name)
|
|
EXCEPTION_INVALID_CLIENT_ACCESS = HTTPException(status_code=ErrorType.HTTP_INVALID_CLIENT_ACCESS.value, detail=ErrorType.HTTP_INVALID_CLIENT_ACCESS.name)
|
|
EXCEPTION_ACCESS_TOKEN_EXPIRED = HTTPException(status_code=ErrorType.HTTP_ACCESS_TOKEN_EXPIRED.value, detail=ErrorType.HTTP_ACCESS_TOKEN_EXPIRED.name)
|
|
EXCEPTION_REFRESH_TOKEN_EXPIRED = HTTPException(status_code=ErrorType.HTTP_REFRESH_TOKEN_EXPIRED.value, detail=ErrorType.HTTP_REFRESH_TOKEN_EXPIRED.name)
|
|
EXCEPTION_HTTP_INVALID_TOKEN_ACCESS = HTTPException(status_code=ErrorType.HTTP_INVALID_TOKEN_ACCESS.value, detail=ErrorType.HTTP_INVALID_TOKEN_ACCESS.name)
|
|
|
|
|
|
class DBType(Enum):
|
|
"""논리 DB 구분. 모델마다 DBType() 으로 자신이 속한 DB 를 반환한다.
|
|
DB 가 늘어나면 여기에 추가하고 db_session_manager 의 맵에 등록만 하면 된다.
|
|
"""
|
|
|
|
MAIN = 1
|
|
|
|
|
|
class DBWRType(Enum):
|
|
"""Read / Write 접속 구분. 조회는 DB_READ, 변경은 DB_WRITE 엔진을 사용한다."""
|
|
|
|
DB_READ = 1
|
|
DB_WRITE = 2
|
|
|
|
|
|
# 도메인 코드값
|
|
class UserStatus(Enum):
|
|
"""users.status 코드값."""
|
|
|
|
ACTIVE = 1
|
|
INACTIVE = 2
|
|
|
|
|
|
class UserRole(Enum):
|
|
"""users.role 코드값."""
|
|
|
|
USER = 1
|
|
MANAGER = 2
|
|
|
|
|
|
class CompanyStatus(Enum):
|
|
"""companies.status 코드값."""
|
|
|
|
ACTIVE = 1
|
|
INACTIVE = 2
|
|
|
|
|
|
class QuotationType(Enum):
|
|
"""quotations.type 코드값. 1=renego(재협상 1:1), 2=requote(재견적 1:N)."""
|
|
|
|
RENEGO = 1
|
|
REQUOTE = 2
|
|
|
|
|
|
class DeliveryType(Enum):
|
|
"""items.delivery_type 코드값. 협상 채팅의 배송형태 선택지와 동일 집합."""
|
|
|
|
PARTNER = 1 # 협력사배송
|
|
COURIER = 2 # 지정택배배송
|
|
PICKUP = 3 # 픽업배송
|
|
|
|
|
|
# 도메인 enum 한글 라벨. 프론트 드롭다운 표시는 이 라벨을 쓴다(값=코드).
|
|
ENUM_LABELS = {
|
|
UserStatus.ACTIVE: "활성",
|
|
UserStatus.INACTIVE: "비활성",
|
|
UserRole.USER: "일반",
|
|
UserRole.MANAGER: "관리자",
|
|
CompanyStatus.ACTIVE: "활성",
|
|
CompanyStatus.INACTIVE: "비활성",
|
|
QuotationType.RENEGO: "재협상",
|
|
QuotationType.REQUOTE: "재견적",
|
|
DeliveryType.PARTNER: "협력사배송",
|
|
DeliveryType.COURIER: "지정택배배송",
|
|
DeliveryType.PICKUP: "픽업배송",
|
|
}
|
|
|
|
# 프론트로 내려주는 도메인 코드 enum 모음. 새 코드 enum 추가 시 여기에 등록한다.
|
|
DOMAIN_ENUMS = {
|
|
"user_status": UserStatus,
|
|
"user_role": UserRole,
|
|
"company_status": CompanyStatus,
|
|
"quotation_type": QuotationType,
|
|
"delivery_type": DeliveryType,
|
|
}
|