UNPKG

@prakrit_m/tmn-voucher

Version:

ไลบรารี TypeScript สำหรับการแลกคูปองอั่งเปา TrueMoney Wallet

1 lines 11.7 kB
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/checkMaintenance.ts","../src/validateInput.ts","../src/utils.ts","../src/validateVoucher.ts"],"sourcesContent":["import { BASE_URL } from \"./constants\";\r\nimport { checkMaintenance } from \"./checkMaintenance\";\r\nimport { validateInput } from \"./validateInput\";\r\nimport { bahtToSatang } from \"./utils\";\r\nimport { isValidVoucher } from \"./validateVoucher\";\r\nimport type {\r\n RedeemVoucherResponse,\r\n ReturnData,\r\n Options,\r\n StatusCode,\r\n} from \"./types\";\r\n\r\n/**\r\n * แลกคูปอง TrueMoney Wallet\r\n * @param phoneNumber - เบอร์โทรศัพท์ผู้รับเงิน\r\n * @param voucherUrl - URL ของคูปอง\r\n * @param options - ตัวเลือกเพิ่มเติม\r\n * @returns Promise<ReturnData>\r\n * @throws {TmnVoucherError}\r\n */\r\nexport default async function redeemvouchers(\r\n phoneNumber: string,\r\n voucherUrl: string,\r\n options?: Options\r\n): Promise<ReturnData> {\r\n const urlParams = new URLSearchParams(new URL(voucherUrl).search);\r\n const voucherCode = urlParams.get('v');\r\n\r\n\r\n // Validate input\r\n const inputValidation = await validateInput(phoneNumber, voucherUrl, options);\r\n if (!inputValidation.success) {\r\n return inputValidation;\r\n }\r\n\r\n // Check maintenance\r\n const maintenance = await checkMaintenance();\r\n if (!maintenance.success) {\r\n return maintenance;\r\n }\r\n\r\n if (options) {\r\n const verifyResponse: RedeemVoucherResponse = await fetch(\r\n BASE_URL + \"/campaign/vouchers/\" + voucherCode + \"/verify\"\r\n ).then((response) => response.json());\r\n\r\n if (!verifyResponse.data || verifyResponse.status.code !== \"SUCCESS\") {\r\n return {\r\n success: false,\r\n code: verifyResponse.status.code as Exclude<StatusCode, \"SUCCESS\">,\r\n message: verifyResponse.status.message,\r\n };\r\n }\r\n\r\n const { voucher } = verifyResponse.data;\r\n\r\n // Validate voucher conditions\r\n if (!isValidVoucher(voucher, options)) {\r\n return {\r\n success: false,\r\n code: \"CONDITION_NOT_MET\",\r\n message: \"ไม่ตรงเงื่อนไข\",\r\n };\r\n }\r\n }\r\n\r\n const redeemResponse: RedeemVoucherResponse = await fetch(\r\n BASE_URL + \"/campaign/vouchers/\" + voucherCode + \"/redeem\",\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({\r\n mobile: phoneNumber,\r\n voucher_hash: voucherCode,\r\n }),\r\n }\r\n ).then((response) => response.json());\r\n\r\n if (redeemResponse.status.code === \"SUCCESS\") {\r\n const successResponse = redeemResponse as Extract<\r\n RedeemVoucherResponse,\r\n { status: { code: \"SUCCESS\" } }\r\n >;\r\n return {\r\n success: true,\r\n code: \"SUCCESS\",\r\n message: redeemResponse.status.message,\r\n amount: bahtToSatang(successResponse.data.my_ticket.amount_baht),\r\n data: successResponse.data,\r\n };\r\n }\r\n\r\n return {\r\n success: false,\r\n code: redeemResponse.status.code,\r\n message: redeemResponse.status.message,\r\n data: redeemResponse.data,\r\n };\r\n}","export const BASE_URL = \"https://gift.truemoney.com\" as const;","import { BASE_URL } from \"./constants\";\r\nimport type { MaintenanceResponse } from \"./types\";\r\n\r\nexport async function checkMaintenance(): Promise<MaintenanceResponse> {\r\n const response = await fetch(BASE_URL + \"/campaign/vouchers/configuration\");\r\n const data = await response.json();\r\n\r\n if (data?.status?.code === \"SUCCESS\") {\r\n return {\r\n success: true,\r\n code: \"SUCCESS\",\r\n };\r\n }\r\n\r\n console.log(\"!ทรูมันนี่ปิดปรับปรุงระบบ\");\r\n return {\r\n success: false,\r\n code: \"MAINTEINANCE\",\r\n message: data.data.ma.title_th,\r\n };\r\n}\r\n","import z from \"zod\";\r\nimport { BASE_URL } from \"./constants\";\r\nimport type { ValidateInputResponse, Options } from \"./types\";\r\n\r\nconst inputSchema = z.object({\r\n phoneNumber: z\r\n .string()\r\n .length(10, \"หมายเลขโทรศัพท์ต้องมี 10 หลัก\")\r\n .refine((x) => /^\\d+$/.test(x), \"หมายเลขโทรศัพท์ต้องเป็นตัวเลข\")\r\n .refine((x) => x.startsWith(\"0\"), \"หมายเลขโทรศัพท์ต้องขึ้นต้นด้วย 0\"),\r\n voucherUrl: z\r\n .string()\r\n .refine(\r\n (x) => x.startsWith(BASE_URL + \"/campaign/?v=\") || \r\n x.startsWith(BASE_URL + \"/campaign?v=\") || \r\n x.startsWith(BASE_URL + \"/campaign/voucher_detail?v=\") || \r\n x.startsWith(BASE_URL + \"/campaign/voucher_detail/?v=\"),\r\n \"รูปแบบ URL Voucher ไม่ถูกต้อง\"\r\n )\r\n .refine(\r\n (x) => /^https:\\/\\/gift\\.truemoney\\.com\\/campaign(\\/voucher_detail)?(\\?v=|\\/\\?v=)[A-Za-z0-9]+$/.test(x),\r\n \"รูปแบบ URL Voucher ไม่ถูกต้อง\"\r\n ),\r\n});\r\n\r\nconst optionsSchema = z.object({\r\n amount: z\r\n .number()\r\n .int(\"amount: ต้องเป็นจำนวนเต็ม\")\r\n .positive()\r\n .min(100, \"amount: จำนวนเงินขั้นต่ำ 100 บาท\")\r\n .max(20000000, \"amount: จำนวนเงินต้องไม่เกิน 200,000 บาท\"),\r\n});\r\n\r\nexport async function validateInput(\r\n phoneNumber: string,\r\n voucherUrl: string,\r\n options?: Options\r\n): Promise<ValidateInputResponse> {\r\n const validationResult = inputSchema.safeParse({ phoneNumber, voucherUrl });\r\n if (!validationResult.success) {\r\n return {\r\n success: false,\r\n code: \"INVALID_INPUT\",\r\n message: validationResult.error.errors[0].message,\r\n };\r\n }\r\n\r\n if (options) {\r\n const optionsValidationResult = optionsSchema.safeParse(options);\r\n if (!optionsValidationResult.success) {\r\n optionsValidationResult.error.errors.map((error) => {\r\n console.log(error.message);\r\n });\r\n return {\r\n success: false,\r\n code: \"INVALID_INPUT\",\r\n message: optionsValidationResult.error.errors[0].message,\r\n };\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n code: \"SUCCESS\",\r\n };\r\n}\r\n","export function satangToBaht(satang: number): string {\r\n const baht = satang / 100;\r\n return baht.toFixed(2);\r\n}\r\n\r\nexport function bahtToSatang(bahtStr: string): number {\r\n // แปลงสตริงเป็นจำนวนทศนิยมโดยตรง\r\n const bahtFloat = parseFloat(bahtStr);\r\n // คูณด้วย 100 เพื่อแปลงเป็นสตางค์\r\n const satang = bahtFloat * 100;\r\n // ปัดเศษเป็นจำนวนเต็ม\r\n return Math.round(satang);\r\n}\r\n","import { satangToBaht, bahtToSatang } from \"./utils\";\r\nimport type { Options, Voucher } from \"./types\";\r\n\r\n// Utility function to validate voucher conditions\r\nexport function isValidVoucher(voucher: Voucher, options: Options): boolean {\r\n const { amount_baht, redeemed_amount_baht, available, type, member } =\r\n voucher;\r\n\r\n const amountInSatang = bahtToSatang(amount_baht); // จำนวนเงินในซองทั้งหมด\r\n\r\n if (member === 1) {\r\n return satangToBaht(options.amount) === amount_baht;\r\n }\r\n\r\n if (member > 1) {\r\n // ถ้าซองเป็น สุ่มจำนวน\r\n if (type === \"R\") {\r\n const balance = amountInSatang - bahtToSatang(redeemed_amount_baht);\r\n return available === 1 && options.amount === balance;\r\n }\r\n\r\n // ถ้าซองเป็น แบ่งเท่ากัน\r\n if (type === \"F\") {\r\n const balance = amountInSatang / member;\r\n return options.amount === balance;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,WAAW;;;ACGxB,eAAsB,mBAAiD;AACrE,QAAM,WAAW,MAAM,MAAM,WAAW,kCAAkC;AAC1E,QAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,MAAI,MAAM,QAAQ,SAAS,WAAW;AACpC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AAEA,UAAQ,IAAI,mJAA2B;AACvC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS,KAAK,KAAK,GAAG;AAAA,EACxB;AACF;;;ACpBA,iBAAc;AAId,IAAM,cAAc,WAAAA,QAAE,OAAO;AAAA,EAC3B,aAAa,WAAAA,QACV,OAAO,EACP,OAAO,IAAI,4JAA+B,EAC1C,OAAO,CAAC,MAAM,QAAQ,KAAK,CAAC,GAAG,gLAA+B,EAC9D,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,GAAG,wLAAkC;AAAA,EACtE,YAAY,WAAAA,QACT,OAAO,EACP;AAAA,IACC,CAAC,MAAM,EAAE,WAAW,WAAW,eAAe,KACtC,EAAE,WAAW,WAAW,cAAc,KACtC,EAAE,WAAW,WAAW,6BAA6B,KACrD,EAAE,WAAW,WAAW,8BAA8B;AAAA,IAC9D;AAAA,EACF,EACC;AAAA,IACC,CAAC,MAAM,yFAAyF,KAAK,CAAC;AAAA,IACtG;AAAA,EACF;AACJ,CAAC;AAED,IAAM,gBAAgB,WAAAA,QAAE,OAAO;AAAA,EAC7B,QAAQ,WAAAA,QACL,OAAO,EACP,IAAI,gHAA2B,EAC/B,SAAS,EACT,IAAI,KAAK,iIAAkC,EAC3C,IAAI,KAAU,6JAA0C;AAC7D,CAAC;AAED,eAAsB,cACpB,aACA,YACA,SACgC;AAChC,QAAM,mBAAmB,YAAY,UAAU,EAAE,aAAa,WAAW,CAAC;AAC1E,MAAI,CAAC,iBAAiB,SAAS;AAC7B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS,iBAAiB,MAAM,OAAO,CAAC,EAAE;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,SAAS;AACX,UAAM,0BAA0B,cAAc,UAAU,OAAO;AAC/D,QAAI,CAAC,wBAAwB,SAAS;AACpC,8BAAwB,MAAM,OAAO,IAAI,CAAC,UAAU;AAClD,gBAAQ,IAAI,MAAM,OAAO;AAAA,MAC3B,CAAC;AACD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS,wBAAwB,MAAM,OAAO,CAAC,EAAE;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AACF;;;AClEO,SAAS,aAAa,QAAwB;AACnD,QAAM,OAAO,SAAS;AACtB,SAAO,KAAK,QAAQ,CAAC;AACvB;AAEO,SAAS,aAAa,SAAyB;AAEpD,QAAM,YAAY,WAAW,OAAO;AAEpC,QAAM,SAAS,YAAY;AAE3B,SAAO,KAAK,MAAM,MAAM;AAC1B;;;ACRO,SAAS,eAAe,SAAkB,SAA2B;AAC1E,QAAM,EAAE,aAAa,sBAAsB,WAAW,MAAM,OAAO,IACjE;AAEF,QAAM,iBAAiB,aAAa,WAAW;AAE/C,MAAI,WAAW,GAAG;AAChB,WAAO,aAAa,QAAQ,MAAM,MAAM;AAAA,EAC1C;AAEA,MAAI,SAAS,GAAG;AAEd,QAAI,SAAS,KAAK;AAChB,YAAM,UAAU,iBAAiB,aAAa,oBAAoB;AAClE,aAAO,cAAc,KAAK,QAAQ,WAAW;AAAA,IAC/C;AAGA,QAAI,SAAS,KAAK;AAChB,YAAM,UAAU,iBAAiB;AACjC,aAAO,QAAQ,WAAW;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO;AACT;;;ALTA,eAAO,eACL,aACA,YACA,SACqB;AACrB,QAAM,YAAY,IAAI,gBAAgB,IAAI,IAAI,UAAU,EAAE,MAAM;AAChE,QAAM,cAAc,UAAU,IAAI,GAAG;AAIrC,QAAM,kBAAkB,MAAM,cAAc,aAAa,YAAY,OAAO;AAC5E,MAAI,CAAC,gBAAgB,SAAS;AAC5B,WAAO;AAAA,EACT;AAGA,QAAM,cAAc,MAAM,iBAAiB;AAC3C,MAAI,CAAC,YAAY,SAAS;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AACX,UAAM,iBAAwC,MAAM;AAAA,MAClD,WAAW,wBAAwB,cAAc;AAAA,IACnD,EAAE,KAAK,CAAC,aAAa,SAAS,KAAK,CAAC;AAEpC,QAAI,CAAC,eAAe,QAAQ,eAAe,OAAO,SAAS,WAAW;AACpE,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,eAAe,OAAO;AAAA,QAC5B,SAAS,eAAe,OAAO;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,EAAE,QAAQ,IAAI,eAAe;AAGnC,QAAI,CAAC,eAAe,SAAS,OAAO,GAAG;AACrC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAwC,MAAM;AAAA,IAClD,WAAW,wBAAwB,cAAc;AAAA,IACjD;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF,EAAE,KAAK,CAAC,aAAa,SAAS,KAAK,CAAC;AAEpC,MAAI,eAAe,OAAO,SAAS,WAAW;AAC5C,UAAM,kBAAkB;AAIxB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS,eAAe,OAAO;AAAA,MAC/B,QAAQ,aAAa,gBAAgB,KAAK,UAAU,WAAW;AAAA,MAC/D,MAAM,gBAAgB;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM,eAAe,OAAO;AAAA,IAC5B,SAAS,eAAe,OAAO;AAAA,IAC/B,MAAM,eAAe;AAAA,EACvB;AACF;","names":["z"]}