@wishcbg/bobcode
Version:
基於店家同步功能的需求,讓店家能夠在不同的店家之間同步各項功能設定,並且能夠檢視各項功能的異動情況。 規劃出一套店家設定即程式碼的機制,讓店家能夠以 config file (.sac) 來定義各項功能設定,並且能夠還原店家各項功能設定。 暫且稱這個機制為「Settings as Code」「店家設定即程式碼」。
94 lines (93 loc) • 5.34 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CouponResourceSchema = exports.couponResourceSettingSchema = void 0;
const zod_1 = require("zod");
const couponTypes = ['coupon', 'exchange'];
const couponExpTypes = ['expAt', 'expDay', 'endOfPeriod'];
const couponEndOfPeriodUnits = ['day', 'week', 'month', 'quarter', 'year'];
const couponExchangeTypes = ['share', 'single'];
const extraStatusSchema = zod_1.z.object({
opentixEcouponId: zod_1.z.string().describe('opentix 票券 ID').optional(),
opentixIsDisabled: zod_1.z.boolean().describe('opentix 是否停用').optional(),
pospalEcouponId: zod_1.z.string().describe('pospal 票券 ID').optional(),
pospalIsDisabled: zod_1.z.boolean().describe('pospal 是否停用').optional(),
}).optional();
const openTixConfigSchema = zod_1.z.object({
startTime: zod_1.z.coerce.date().describe('開始時間'),
endTime: zod_1.z.coerce.date().describe('結束時間'),
currentDiscount: zod_1.z.number().optional().describe('折數'),
currentPrice: zod_1.z.number().optional().describe('折抵金額'),
quantityPerMember: zod_1.z.number().describe('每位會員張數限制'),
priceMinLimit: zod_1.z.number().optional().describe('最低消費金額'),
priceMaxLimit: zod_1.z.number().optional().describe('最高消費金額'),
description: zod_1.z.string().optional().describe('描述'),
note: zod_1.z.string().optional().describe('備註'),
organizers: zod_1.z.array(zod_1.z.string()).describe('限定主辦單位(主辦單位代碼)'),
programs: zod_1.z.array(zod_1.z.string()).describe('限定節目(節目代碼)'),
events: zod_1.z.array(zod_1.z.string()).describe('限定場次(場次代碼)'),
}).describe('opentix 票券設定');
const posPalConfigSchema = zod_1.z.object({
couponDataHash: zod_1.z.string().describe('hash 物件用來比對不同'),
startDate: zod_1.z.coerce.date().describe('開始時間'),
endDate: zod_1.z.coerce.date().describe('結束時間'),
description: zod_1.z.string().optional().describe('描述'),
beginDays: zod_1.z.number().describe('發放後幾天生效'),
avaliableDays: zod_1.z.number().describe('發放後有效天數'),
avaliableQuantity: zod_1.z.number().describe('可用數量'),
usedQuantity: zod_1.z.number().describe('已用數量'),
createdQuantity: zod_1.z.number().describe('創建數量'),
usageLimitType: zod_1.z.string().optional().describe('使用限制類型'),
usageLimitTimes: zod_1.z.number().describe('使用限制次數'),
usageLimitAmountType: zod_1.z.boolean().optional().describe('是否使用限制金額'),
usageLimitAmount: zod_1.z.number().describe('使用限制金額'),
makeStartDate: zod_1.z.coerce.date().describe('製卷開始時間'),
makeEndDate: zod_1.z.coerce.date().describe('製卷結束時間'),
}).describe('pospal 票券設定');
const extraSettingSchema = zod_1.z.object({
openTixConfig: openTixConfigSchema.optional(),
posPalConfig: posPalConfigSchema.optional(),
}).optional();
exports.couponResourceSettingSchema = zod_1.z.object({
type: zod_1.z.enum(couponTypes).describe('票券類型'),
name: zod_1.z.string().describe('票券名稱'),
expType: zod_1.z.enum(couponExpTypes).default('expDay').describe('到期類型'),
expDay: zod_1.z.number().int().optional().describe('固定天數:到期天數'),
expAt: zod_1.z.date().optional().describe('固定日期:到期日期'),
endOfPeriodUnit: zod_1.z.enum(couponEndOfPeriodUnits).optional().describe('當期結束單位'),
showMinute: zod_1.z.number().int().optional().describe('使用後顯示時間(分鐘)'),
notice: zod_1.z.string().optional().describe('注意事項'),
exchangeLink: zod_1.z.string().optional().describe('兌換券外部連結'),
exchangeType: zod_1.z.enum(couponExchangeTypes).optional().describe('兌換碼種類設定(設定用)'),
systemRedeem: zod_1.z.boolean().default(false).describe('系統兌換(是否立即核銷設定)'),
sentCount: zod_1.z.number().int().default(0).describe('已發送數量'),
firstSentLimit: zod_1.z.number().int().optional().describe('第一次設定發送上限(null 為無限制)'),
sentLimit: zod_1.z.number().int().optional().describe('發送上限(null 為無限制)'),
extraStatus: extraStatusSchema,
extraSetting: extraSettingSchema,
imageId: zod_1.z.string().describe('預約類別圖片ID').optional(),
}).describe('票券設定');
// 改成export一個 config 而不是class
exports.CouponResourceSchema = {
// —— 基本欄位
resourceType: 'coupon',
resourceName: '票券設定',
resourceSettingSchema: exports.couponResourceSettingSchema,
// —— 關聯
relationScope: 'shop',
relationType: 'multi',
relationResources: [
{
resourceType: 'image',
useLogicIdToResourceId: false,
settingSchemaField: 'imageId',
logicIdToResourceIdNewField: 'image',
relationType: 'single',
acceptsNullValue: false,
},
],
// —— apply API path
applySingleUpdateApiPath: null,
applyCreateApiPath: '/:shopId/coupon',
applyUpdateApiPath: '/:shopId/coupon/:resourceId',
applyDestroyApiPath: '/:shopId/coupon/:resourceId',
};