|
1
|
-
var{defineProperty:j,getOwnPropertyNames:P,getOwnPropertyDescriptor:R}=Object,K=Object.prototype.hasOwnProperty;var O=new WeakMap,I=(f)=>{var k=O.get(f),q;if(k)return k;if(k=j({},"__esModule",{value:!0}),f&&typeof f==="object"||typeof f==="function")P(f).map((A)=>!K.call(k,A)&&j(k,A,{get:()=>f[A],enumerable:!(q=R(f,A))||q.enumerable}));return O.set(f,k),k};var M=(f,k)=>{for(var q in k)j(f,q,{get:k[q],enumerable:!0,configurable:!0,set:(A)=>k[q]=()=>A})};var x={};M(x,{TemplateLifecycleService:()=>B});module.exports=I(x);var U;((F)=>{F.INVALID_REQUEST="INVALID_REQUEST";F.AUTHENTICATION_FAILED="AUTHENTICATION_FAILED";F.INSUFFICIENT_BALANCE="INSUFFICIENT_BALANCE";F.TEMPLATE_NOT_FOUND="TEMPLATE_NOT_FOUND";F.RATE_LIMIT_EXCEEDED="RATE_LIMIT_EXCEEDED";F.NETWORK_ERROR="NETWORK_ERROR";F.NETWORK_TIMEOUT="NETWORK_TIMEOUT";F.NETWORK_SERVICE_UNAVAILABLE="NETWORK_SERVICE_UNAVAILABLE";F.PROVIDER_ERROR="PROVIDER_ERROR";F.MESSAGE_SEND_FAILED="MESSAGE_SEND_FAILED";F.CRYPTO_CONFIG_ERROR="CRYPTO_CONFIG_ERROR";F.CRYPTO_ENCRYPT_FAILED="CRYPTO_ENCRYPT_FAILED";F.CRYPTO_DECRYPT_FAILED="CRYPTO_DECRYPT_FAILED";F.CRYPTO_HASH_FAILED="CRYPTO_HASH_FAILED";F.CRYPTO_POLICY_VIOLATION="CRYPTO_POLICY_VIOLATION";F.UNKNOWN_ERROR="UNKNOWN_ERROR"})(U||={});var g={["INVALID_REQUEST"]:{ko:"잘못된 요청입니다",en:"Invalid request"},["AUTHENTICATION_FAILED"]:{ko:"인증에 실패했습니다",en:"Authentication failed"},["INSUFFICIENT_BALANCE"]:{ko:"잔액이 부족합니다",en:"Insufficient balance"},["TEMPLATE_NOT_FOUND"]:{ko:"템플릿을 찾을 수 없습니다",en:"Template not found"},["RATE_LIMIT_EXCEEDED"]:{ko:"요청 한도를 초과했습니다",en:"Rate limit exceeded"},["NETWORK_ERROR"]:{ko:"네트워크 오류가 발생했습니다",en:"Network error"},["NETWORK_TIMEOUT"]:{ko:"네트워크 요청 시간이 초과되었습니다",en:"Network timeout"},["NETWORK_SERVICE_UNAVAILABLE"]:{ko:"서비스를 일시적으로 사용할 수 없습니다",en:"Service temporarily unavailable"},["PROVIDER_ERROR"]:{ko:"제공자 오류가 발생했습니다",en:"Provider error"},["MESSAGE_SEND_FAILED"]:{ko:"메시지 전송에 실패했습니다",en:"Message send failed"},["CRYPTO_CONFIG_ERROR"]:{ko:"암호화 설정 오류가 발생했습니다",en:"Crypto configuration error"},["CRYPTO_ENCRYPT_FAILED"]:{ko:"암호화에 실패했습니다",en:"Encryption failed"},["CRYPTO_DECRYPT_FAILED"]:{ko:"복호화에 실패했습니다",en:"Decryption failed"},["CRYPTO_HASH_FAILED"]:{ko:"해시 생성에 실패했습니다",en:"Hash generation failed"},["CRYPTO_POLICY_VIOLATION"]:{ko:"암호화 정책 위반이 발생했습니다",en:"Crypto policy violation"},["UNKNOWN_ERROR"]:{ko:"알 수 없는 오류가 발생했습니다",en:"Unknown error"}},p=new Set(Object.values(U));var N=(f)=>{if(typeof f!=="number"||Number.isNaN(f)||!Number.isFinite(f))return;return Math.trunc(f)};class W extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(f,k,q,A={}){super(k);if(this.name="KMsgError",this.code=f,this.details=q,this.providerErrorCode=A.providerErrorCode,this.providerErrorText=A.providerErrorText,this.httpStatus=N(A.httpStatus),this.requestId=typeof A.requestId==="string"?A.requestId:void 0,this.retryAfterMs=N(A.retryAfterMs),this.attempt=N(A.attempt),Array.isArray(A.causeChain))this.causeChain=A.causeChain;else if(A.causeChain!==void 0)this.causeChain=[A.causeChain];if(Error.captureStackTrace)Error.captureStackTrace(this,W)}getLocalizedMessage(f="ko"){let k=g[this.code];if(k?.[f])return k[f];return this.message}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details,providerErrorCode:this.providerErrorCode,providerErrorText:this.providerErrorText,httpStatus:this.httpStatus,requestId:this.requestId,retryAfterMs:this.retryAfterMs,attempt:this.attempt,causeChain:this.causeChain}}}var w=(f)=>({isSuccess:!0,isFailure:!1,value:f}),$=(f)=>({isSuccess:!1,isFailure:!0,error:f});class J{static validateButtons(f){let k=[];if(f.length>5)k.push("Maximum 5 buttons are allowed");for(let q=0;q<f.length;q++){let A=f[q],T=q+1;if(!A.name||A.name.trim().length===0)k.push(`Button ${T}: name is required`);else if(A.name.length>14)k.push(`Button ${T}: name cannot exceed 14 characters`);J.validateButtonByType(A,T,k)}return{isValid:k.length===0,errors:k}}static validateButtonByType(f,k,q){switch(f.type){case"WL":J.validateWebLinkButton(f,k,q);break;case"AL":J.validateAppLinkButton(f,k,q);break;case"DS":J.validateDeliveryButton(f,k,q);break;case"BK":J.validateBotKeywordButton(f,k,q);break;case"MD":J.validateMessageDeliveryButton(f,k,q);break;default:q.push(`Button ${k}: invalid button type '${f.type}'`)}}static validateWebLinkButton(f,k,q){if(!f.linkMobile&&!f.linkPc)q.push(`Button ${k}: web link button must have at least mobile or PC link`);if(f.linkMobile&&!J.isValidUrl(f.linkMobile))q.push(`Button ${k}: invalid mobile link URL`);if(f.linkPc&&!J.isValidUrl(f.linkPc))q.push(`Button ${k}: invalid PC link URL`)}static validateAppLinkButton(f,k,q){if(!(f.linkIos||f.linkAndroid||f.schemeIos||f.schemeAndroid))q.push(`Button ${k}: app link button must have at least one app link or scheme`);if(f.linkIos&&!J.isValidUrl(f.linkIos))q.push(`Button ${k}: invalid iOS link URL`);if(f.linkAndroid&&!J.isValidUrl(f.linkAndroid))q.push(`Button ${k}: invalid Android link URL`)}static validateDeliveryButton(f,k,q){}static validateBotKeywordButton(f,k,q){}static validateMessageDeliveryButton(f,k,q){}static isValidUrl(f){try{return new URL(f),!0}catch{return!1}}static serializeButtons(f){let k=f.map((q)=>({name:q.name,type:q.type,url_mobile:q.linkMobile,url_pc:q.linkPc,url_ios:q.linkIos,url_android:q.linkAndroid,scheme_ios:q.schemeIos,scheme_android:q.schemeAndroid}));return JSON.stringify(k)}static deserializeButtons(f){try{return JSON.parse(f).map((q)=>({name:q.name,type:q.type,linkMobile:q.url_mobile,linkPc:q.url_pc,linkIos:q.url_ios,linkAndroid:q.url_android,schemeIos:q.scheme_ios,schemeAndroid:q.scheme_android}))}catch(k){throw Error(`Failed to parse buttons JSON: ${k}`)}}}var y=new Set(["WL","AL","DS","BK","MD"]);function Q(f){return new W("INVALID_REQUEST",f)}function S(f){if(!f||typeof f!=="object"||Array.isArray(f))return;return f}function z(f){try{return w(JSON.parse(f))}catch(k){return $(Q(`Invalid JSON for buttons: ${k instanceof Error?k.message:String(k)}`))}}function Z(f,k,q){for(let A of k){if(!(A in f))continue;let T=f[A];if(T===null||T===void 0||T==="")return w(void 0);if(typeof T!=="string")return $(Q(`buttons.${q} must be a string`));return w(T)}return w(void 0)}function h(f,k){let q=S(f);if(!q)return $(Q(`buttons[${k}] must be an object with type/name`));let A=q.type;if(typeof A!=="string"||!y.has(A))return $(Q(`buttons[${k}].type must be one of WL, AL, DS, BK, MD`));let T=A,V=q.name;if(typeof V!=="string"||V.trim().length===0)return $(Q(`buttons[${k}].name is required`));let X=Z(q,["linkMobile","url_mobile","urlMobile"],"linkMobile");if(X.isFailure)return X;let D=Z(q,["linkPc","url_pc","urlPc"],"linkPc");if(D.isFailure)return D;let G=Z(q,["linkIos","url_ios","urlIos"],"linkIos");if(G.isFailure)return G;let Y=Z(q,["linkAndroid","url_android","urlAndroid"],"linkAndroid");if(Y.isFailure)return Y;let H=Z(q,["schemeIos","scheme_ios"],"schemeIos");if(H.isFailure)return H;let _=Z(q,["schemeAndroid","scheme_android"],"schemeAndroid");if(_.isFailure)return _;return w({type:T,name:V,...X.value?{linkMobile:X.value}:{},...D.value?{linkPc:D.value}:{},...G.value?{linkIos:G.value}:{},...Y.value?{linkAndroid:Y.value}:{},...H.value?{schemeIos:H.value}:{},..._.value?{schemeAndroid:_.value}:{}})}function E(f){if(f===void 0||f===null)return w(void 0);let k=f;if(typeof k==="string"){let V=z(k);if(V.isFailure)return V;k=V.value}let q=S(k);if(q&&Array.isArray(q.button))k=q.button;if(!Array.isArray(k))return $(Q("buttons must be a JSON array"));let A=[];for(let[V,X]of k.entries()){let D=h(X,V);if(D.isFailure)return D;A.push(D.value)}let T=J.validateButtons(A);if(!T.isValid)return $(Q(`Invalid template buttons: ${T.errors.join(", ")}`));return w(A)}function L(f,k={}){let q=k.requireName??!0,A=k.requireContent??!0,T={};if(f.name===void 0||f.name===null){if(q)return $(Q("name is required"))}else if(typeof f.name!=="string"||f.name.trim().length===0)return $(Q(q?"name is required":"name must be a non-empty string"));else T.name=f.name.trim();if(f.content===void 0||f.content===null){if(A)return $(Q("content is required"))}else if(typeof f.content!=="string"||f.content.trim().length===0)return $(Q(A?"content is required":"content must be a non-empty string"));else T.content=f.content;let V=E(f.buttons);if(V.isFailure)return V;if(V.value!==void 0)T.buttons=V.value;return w(T)}function C(f,k){if(k)return k;let q=f;if(typeof q.requestTemplateInspection==="function")return{requestTemplateInspection:q.requestTemplateInspection.bind(f)};return}class B{provider;inspectionProvider;constructor(f,k){this.provider=f;this.inspectionProvider=C(f,k)}async create(f,k){let q=L(f,{requireName:!0,requireContent:!0});if(q.isFailure)return q;let A={...f,...q.value.name?{name:q.value.name}:{},...q.value.content?{content:q.value.content}:{},...q.value.buttons!==void 0?{buttons:q.value.buttons}:{}};return this.provider.createTemplate(A,k)}async update(f,k,q){if(!f||f.trim().length===0)return $(new W("INVALID_REQUEST","Template code is required"));let A=L(k,{requireName:!1,requireContent:!1});if(A.isFailure)return A;let T={...k,...A.value.name!==void 0?{name:A.value.name}:{},...A.value.content!==void 0?{content:A.value.content}:{},...A.value.buttons!==void 0?{buttons:A.value.buttons}:{}};return this.provider.updateTemplate(f,T,q)}async delete(f,k){if(!f||f.trim().length===0)return $(new W("INVALID_REQUEST","Template code is required"));return this.provider.deleteTemplate(f,k)}async get(f,k){if(!f||f.trim().length===0)return $(new W("INVALID_REQUEST","Template code is required"));return this.provider.getTemplate(f,k)}async list(f,k){return this.provider.listTemplates(f,k)}async requestInspection(f,k){if(!f||f.trim().length===0)return $(new W("INVALID_REQUEST","Template code is required"));if(!this.inspectionProvider)return $(new W("INVALID_REQUEST","Template inspection is not supported by this provider"));return this.inspectionProvider.requestTemplateInspection(f,k)}}
|