@wishcbg/bobcode
Version:
基於店家同步功能的需求,讓店家能夠在不同的店家之間同步各項功能設定,並且能夠檢視各項功能的異動情況。 規劃出一套店家設定即程式碼的機制,讓店家能夠以 config file (.sac) 來定義各項功能設定,並且能夠還原店家各項功能設定。 暫且稱這個機制為「Settings as Code」「店家設定即程式碼」。
102 lines (101 loc) • 5.42 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ResourceItemResourceSchema = void 0;
const zod_1 = require("zod");
const resourceItemBusinessTimeByTypes = ['shop', 'branch'];
const businessTimeExcludeTimeRuleTypes = ['once', 'weekly', 'monthly', 'yearly'];
const timeOffConfigSchema = zod_1.z.object({
months: zod_1.z.array(zod_1.z.number().int().min(1).max(12)).default([]).describe('特定月份 1~12'),
weekdays: zod_1.z.array(zod_1.z.number().int().min(0).max(6)).default([]).describe('特定星期 0~6'),
dateRangeSettings: zod_1.z.array(zod_1.z.object({
start: zod_1.z.coerce.date().describe('開始日期'),
end: zod_1.z.coerce.date().describe('結束日期'),
})).default([]).describe('特定日期區間'),
timeRangeSettings: zod_1.z.array(zod_1.z.object({
start: zod_1.z.coerce.date().describe('開始時間'),
end: zod_1.z.coerce.date().describe('結束時間'),
})).default([]).describe('特定時段'),
});
const businessTimeExcludeTimeRuleSchema = zod_1.z.object({
type: zod_1.z.enum(businessTimeExcludeTimeRuleTypes).describe('排除時間規則類型'),
onceSetting: zod_1.z.object({
startAt: zod_1.z.coerce.date().describe('開始時間'),
endAt: zod_1.z.coerce.date().describe('結束時間'),
}).optional(),
weeklySetting: zod_1.z.object({
week: zod_1.z.number().int().min(0).max(6).describe('星期(0: 星期日, 1: 星期一, 2: 星期二, 3: 星期三, 4: 星期四, 5: 星期五, 6: 星期六)'),
startTime: zod_1.z.number().int().min(0).max(24 * 60).describe('開始時間(HH * 60 + mm 分鐘)'),
endTime: zod_1.z.number().int().min(0).max(24 * 60).describe('結束時間(HH * 60 + mm 分鐘)'),
}).optional(),
monthlySetting: zod_1.z.object({
startDay: zod_1.z.number().int().min(1).max(31).describe('開始日期'),
startTime: zod_1.z.number().int().min(0).max(24 * 60).describe('開始時間(HH * 60 + mm 分鐘)'),
endDay: zod_1.z.number().int().min(1).max(31).describe('結束日期'),
endTime: zod_1.z.number().int().min(0).max(24 * 60).describe('結束時間(HH * 60 + mm 分鐘)'),
}).optional(),
yearlySetting: zod_1.z.object({
startMonth: zod_1.z.number().int().min(1).max(12).describe('開始月份'),
startDay: zod_1.z.number().int().min(1).max(31).describe('開始日期'),
startTime: zod_1.z.number().int().min(0).max(1440).describe('開始時間(HH * 60 + mm 分鐘)'),
endMonth: zod_1.z.number().int().min(1).max(12).describe('結束月份'),
endDay: zod_1.z.number().int().min(1).max(31).describe('結束日期'),
endTime: zod_1.z.number().int().min(0).max(1440).describe('結束時間(HH * 60 + mm 分鐘)'),
}).optional(),
});
const resourceItemResourceSettingSchema = zod_1.z.object({
enabled: zod_1.z.boolean().describe('是否啟用'),
name: zod_1.z.string().describe('設備名稱'),
bookingMax: zod_1.z.number().int().describe('時段同時可服務上限'),
enableTimeOff: zod_1.z.boolean().default(false).describe('是否啟用排除時段'),
businessTimeBy: zod_1.z.enum(resourceItemBusinessTimeByTypes).describe('營業時間模式'),
timeOffConfig: timeOffConfigSchema.optional().describe('排除時段設定'),
excludeTimeRules: zod_1.z.array(businessTimeExcludeTimeRuleSchema).optional().describe('排除時間規則'),
order: zod_1.z.number().int().optional().describe('清單排序'),
image: zod_1.z.string().optional().describe('圖片ID'),
appointmentServiceLogicIds: zod_1.z.array(zod_1.z.string()).describe('預約服務ID'),
resourceItemCategoryLogicIds: zod_1.z.array(zod_1.z.string()).describe('設備類別ID'),
businessTimeBranchLogicId: zod_1.z.string().describe('營業時間綁定門市ID'),
}).describe('設備管理');
// 改成export一個 config 而不是class
exports.ResourceItemResourceSchema = {
// —— 基本欄位
resourceType: 'resourceItem',
resourceName: '設備管理',
resourceSettingSchema: resourceItemResourceSettingSchema,
// —— 關聯
relationScope: 'shop',
relationType: 'multi',
relationResources: [
{
resourceType: 'image',
useLogicIdToResourceId: false,
settingSchemaField: 'image',
logicIdToResourceIdNewField: 'image',
relationType: 'single',
acceptsNullValue: true,
},
{
resourceType: 'appointmentService',
settingSchemaField: 'appointmentServiceLogicIds',
logicIdToResourceIdNewField: 'appointmentServices',
relationType: 'multi',
},
{
resourceType: 'resourceItemCategory',
settingSchemaField: 'resourceItemCategoryLogicIds',
logicIdToResourceIdNewField: 'resourceItemCategoryIds',
relationType: 'multi',
},
{
resourceType: 'branch',
settingSchemaField: 'businessTimeBranchLogicId',
logicIdToResourceIdNewField: 'businessTimeBranchId',
relationType: 'single',
},
],
// —— apply API path
applySingleUpdateApiPath: null,
applyCreateApiPath: '/:shopId/resourceItem',
applyUpdateApiPath: '/:shopId/resourceItem/:resourceId',
applyDestroyApiPath: '/:shopId/resourceItem/:resourceId',
};