o2o-negosium-original/backend/router/v1/auth/protocol.py
민헌 3c8923c075 feat(chat): 협상 유의사항 안내 팝업 2종 이식 + 팝업 숨김 저장 API
KT-NEGOWIZ fe_v2 의 서비스 안내 팝업을 우리 구조로 이식.

- frontend: GuideContent(공용 본문, VAT/배송비는 chat init 메타로 동적 표시)
  + ServiceInfoPopup(채팅 진입 시 자동 — 안내 보지 않기/오늘 하루 보지 않기)
  + ServiceGuidePopup(메뉴 유의사항·이용 가이드 버튼 수동 — X/배경/ESC 닫기)
  + useServiceInfoPopup 훅(서버 상태 + localStorage 오늘 하루)
  + apis/auth 에 popupStatus 쿼리·hidePopup 뮤테이션, 헬프데스크 연락처 반영,
    한국어 단어 잘림 방지(break-keep)
- backend: GET /v1/auth/popup/status, POST /v1/auth/popup/hide
  (authenticate 공통 인증 + supplier_users.hide_service_info 영구 저장), 테스트 4건
- db: supplier_users.hide_service_info 컬럼 — 00-init 테이블 정의 갱신,
  기존 DB 보정은 alters/2026-07-07-supplier-users-hide-service-info.sql 별도 파일
  (기준선 이후 보정 ALTER 는 alters/ 파일로 관리하도록 규칙 변경)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 13:41:46 +09:00

67 lines
2.6 KiB
Python

from pydantic import Field
from common.models.gmodel import Res_WebPacketProtocol, WebPacketProtocol
# 라우터 폴더마다 protocol.py 를 두고 Req_/Res_ 를 정의한다 (protocol 규약).
class AuthProtocol(WebPacketProtocol):
pass
class Req_Login(AuthProtocol):
id: str = Field("", description="로그인 ID")
pw: str = Field("", description="비밀번호(평문, 서버에서 bcrypt 해시·검증)")
class Res_Login(Res_WebPacketProtocol):
su_id: str = Field("", description="유저 식별자(uuid)")
name: str = Field("", description="유저 개인 이름")
supplier_id: str = Field("", description="소속 공급사 uuid(partner.suppliers)")
supplier_name: str = Field("", description="공급사명")
role: int = Field(0, description="권한 코드 1=user, 2=manager (UserRole)")
access_token: str = Field("", description="액세스 토큰(JWT)")
refresh_token: str = Field("", description="리프레시 토큰(JWT)")
class Req_CreateAccount(AuthProtocol):
supplier_id: str = Field("", max_length=36, description="소속 공급사 uuid(partner.suppliers.supplier_id)")
id: str = Field("", max_length=20, description="로그인 ID")
pw: str = Field("", description="비밀번호(평문, 서버에서 bcrypt 해시)")
name: str = Field("", max_length=50, description="이름")
email: str = Field("", max_length=255, description="이메일")
contact_number: str = Field("", max_length=20, description="연락처")
role: int = Field(1, description="권한 코드 1=user, 2=manager (UserRole)")
class Res_CreateAccount(Res_WebPacketProtocol):
su_id: str = ""
class Res_RefreshToken(Res_WebPacketProtocol):
access_token: str = Field("", description="재발급된 액세스 토큰(JWT)")
class Res_Me(Res_WebPacketProtocol):
su_id: str = Field("", description="유저 식별자(uuid)")
id: str = Field("", description="로그인 ID")
name: str = Field("", description="유저 개인 이름")
supplier_id: str = Field("", description="소속 공급사 uuid")
supplier_name: str = Field("", description="공급사명")
role: int = Field(0, description="권한 코드 1=user, 2=manager (UserRole)")
class Res_Logout(Res_WebPacketProtocol):
pass
class Res_PopupStatus(Res_WebPacketProtocol):
service_info: bool = Field(False, description="협상 유의사항(서비스 안내) 팝업 '안내 보지 않기' 여부")
class Req_HidePopup(AuthProtocol):
popup_type: str = Field("", description="숨길 팝업 종류: service_info")
class Res_HidePopup(Res_WebPacketProtocol):
pass