|
| 1 | +from typing import Annotated, Literal, Optional, Union |
| 2 | + |
| 3 | +from pydantic import BaseModel, ConfigDict, model_validator |
| 4 | +from pydantic.alias_generators import to_camel |
| 5 | + |
| 6 | +BmsButtonLinkType = Literal["AC", "WL", "AL", "BK", "MD", "BC", "BT", "BF"] |
| 7 | + |
| 8 | + |
| 9 | +class BmsWebButton(BaseModel): |
| 10 | + """WL: 웹 링크 버튼.""" |
| 11 | + |
| 12 | + link_type: Literal["WL"] = "WL" |
| 13 | + name: str |
| 14 | + link_mobile: str |
| 15 | + link_pc: Optional[str] = None |
| 16 | + target_out: Optional[bool] = None |
| 17 | + |
| 18 | + model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True) |
| 19 | + |
| 20 | + |
| 21 | +class BmsAppButton(BaseModel): |
| 22 | + """AL: 앱 링크 버튼. linkMobile, linkAndroid, linkIos 중 하나 이상 필수.""" |
| 23 | + |
| 24 | + link_type: Literal["AL"] = "AL" |
| 25 | + name: str |
| 26 | + link_mobile: Optional[str] = None |
| 27 | + link_android: Optional[str] = None |
| 28 | + link_ios: Optional[str] = None |
| 29 | + target_out: Optional[bool] = None |
| 30 | + |
| 31 | + model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True) |
| 32 | + |
| 33 | + @model_validator(mode="after") |
| 34 | + def validate_at_least_one_link(self) -> "BmsAppButton": |
| 35 | + if not any([self.link_mobile, self.link_android, self.link_ios]): |
| 36 | + raise ValueError( |
| 37 | + "AL 타입 버튼은 linkMobile, linkAndroid, linkIos 중 하나 이상 필수입니다." |
| 38 | + ) |
| 39 | + return self |
| 40 | + |
| 41 | + |
| 42 | +class BmsChannelAddButton(BaseModel): |
| 43 | + """AC: 채널 추가 버튼.""" |
| 44 | + |
| 45 | + link_type: Literal["AC"] = "AC" |
| 46 | + name: Optional[str] = None |
| 47 | + |
| 48 | + model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True) |
| 49 | + |
| 50 | + |
| 51 | +class BmsBotKeywordButton(BaseModel): |
| 52 | + """BK: 봇 키워드 버튼.""" |
| 53 | + |
| 54 | + link_type: Literal["BK"] = "BK" |
| 55 | + name: str |
| 56 | + chat_extra: Optional[str] = None |
| 57 | + |
| 58 | + model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True) |
| 59 | + |
| 60 | + |
| 61 | +class BmsMessageDeliveryButton(BaseModel): |
| 62 | + """MD: 메시지 전달 버튼.""" |
| 63 | + |
| 64 | + link_type: Literal["MD"] = "MD" |
| 65 | + name: str |
| 66 | + chat_extra: Optional[str] = None |
| 67 | + |
| 68 | + model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True) |
| 69 | + |
| 70 | + |
| 71 | +class BmsConsultButton(BaseModel): |
| 72 | + """BC: 상담 요청 버튼.""" |
| 73 | + |
| 74 | + link_type: Literal["BC"] = "BC" |
| 75 | + name: str |
| 76 | + chat_extra: Optional[str] = None |
| 77 | + |
| 78 | + model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True) |
| 79 | + |
| 80 | + |
| 81 | +class BmsBotTransferButton(BaseModel): |
| 82 | + """BT: 봇 전환 버튼.""" |
| 83 | + |
| 84 | + link_type: Literal["BT"] = "BT" |
| 85 | + name: str |
| 86 | + chat_extra: Optional[str] = None |
| 87 | + |
| 88 | + model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True) |
| 89 | + |
| 90 | + |
| 91 | +class BmsBusinessFormButton(BaseModel): |
| 92 | + """BF: 비즈니스폼 버튼.""" |
| 93 | + |
| 94 | + link_type: Literal["BF"] = "BF" |
| 95 | + name: str |
| 96 | + |
| 97 | + model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True) |
| 98 | + |
| 99 | + |
| 100 | +BmsButton = Annotated[ |
| 101 | + Union[ |
| 102 | + BmsWebButton, |
| 103 | + BmsAppButton, |
| 104 | + BmsChannelAddButton, |
| 105 | + BmsBotKeywordButton, |
| 106 | + BmsMessageDeliveryButton, |
| 107 | + BmsConsultButton, |
| 108 | + BmsBotTransferButton, |
| 109 | + BmsBusinessFormButton, |
| 110 | + ], |
| 111 | + "BMS 버튼 통합 타입 (linkType으로 구분)", |
| 112 | +] |
| 113 | + |
| 114 | +BmsLinkButton = Annotated[ |
| 115 | + Union[BmsWebButton, BmsAppButton], |
| 116 | + "BMS 링크 버튼 (WL, AL만 허용) - 캐러셀 등에서 사용", |
| 117 | +] |
0 commit comments