from enum import Enum, auto from fastapi import HTTPException class ErrorType(Enum): """서버 전역 결과 코드. backend/common/enums.py 와 구간을 공유하되, 협상 에이전트 전용 코드를 2000 구간에 추가한다. """ 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 # 테넌트 라우팅 에러 (P4 tenant_middleware) TENANT_HEADER_MISSING = 1400 # X-Tenant-ID 부재 -> 400 TENANT_NOT_REGISTERED = auto() # 미등록 테넌트 -> 404 # 협상 에이전트 에러 NEGO_INVALID_STEP = 2000 NEGO_SESSION_NOT_FOUND = auto() NEGO_QTABLE_NOT_LOADED = auto() NEGO_DIM_MISMATCH = auto() # state/action 차원 불일치 (warm-start 폴백 트리거) # 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) # 테넌트 라우팅 전용 예외 (P4 에서 미들웨어가 raise) EXCEPTION_TENANT_HEADER_MISSING = HTTPException(status_code=400, detail=ErrorType.TENANT_HEADER_MISSING.name) EXCEPTION_TENANT_NOT_REGISTERED = HTTPException(status_code=404, detail=ErrorType.TENANT_NOT_REGISTERED.name) class DBType(Enum): """논리 DB 구분. backend 와 동일하게 단일 negosium_db(MAIN)를 공유한다. agent 전용 RL 학습 자산은 negosium_db 안의 `learning` 스키마에 둔다(별도 DB 아님). """ MAIN = 1 class DBWRType(Enum): """Read / Write 접속 구분. 조회는 DB_READ, 변경은 DB_WRITE 엔진을 사용한다.""" DB_READ = 1 DB_WRITE = 2