UNPKG

@wishcbg/bobcode

Version:

基於店家同步功能的需求,讓店家能夠在不同的店家之間同步各項功能設定,並且能夠檢視各項功能的異動情況。 規劃出一套店家設定即程式碼的機制,讓店家能夠以 config file (.sac) 來定義各項功能設定,並且能夠還原店家各項功能設定。 暫且稱這個機制為「Settings as Code」「店家設定即程式碼」。

102 lines (101 loc) 5.42 kB
"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', };