@lodashventure/medusa-campaign 1.1.4 → 1.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/api/admin/buy-x-get-y/[id]/route.js +116 -0
- package/.medusa/server/src/api/admin/buy-x-get-y/route.js +83 -0
- package/.medusa/server/src/api/admin/campaigns/fix-dates/route.js +103 -0
- package/.medusa/server/src/api/admin/campaigns/sync/route.js +138 -0
- package/.medusa/server/src/api/admin/flash-sales/[id]/route.js +49 -34
- package/.medusa/server/src/api/admin/flash-sales/route.js +46 -19
- package/.medusa/server/src/api/admin/force-fix/route.js +176 -0
- package/.medusa/server/src/api/admin/test-campaign/route.js +132 -0
- package/.medusa/server/src/api/store/buy-x-get-y/[id]/route.js +109 -0
- package/.medusa/server/src/api/store/buy-x-get-y/products/[productId]/route.js +94 -0
- package/.medusa/server/src/api/store/buy-x-get-y/route.js +114 -0
- package/.medusa/server/src/api/store/campaigns/[id]/route.js +132 -70
- package/.medusa/server/src/api/store/campaigns/route.js +119 -26
- package/.medusa/server/src/index.js +15 -0
- package/.medusa/server/src/modules/custom-campaigns/migrations/Migration20251018000000.js +40 -0
- package/.medusa/server/src/modules/custom-campaigns/models/buy-x-get-y-config.js +20 -0
- package/.medusa/server/src/modules/custom-campaigns/service.js +3 -1
- package/.medusa/server/src/modules/custom-campaigns/types/campaign-type.enum.js +2 -1
- package/.medusa/server/src/subscribers/cart-updated.js +23 -0
- package/.medusa/server/src/subscribers/order-placed.js +9 -2
- package/.medusa/server/src/workflows/buy-x-get-y/applyBuyXGetYToCartWorkflow.js +150 -0
- package/.medusa/server/src/workflows/custom-campaign/createBuyXGetYCampaignWorkflow.js +127 -0
- package/.medusa/server/src/workflows/custom-campaign/updateBuyXGetYCampaignWorkflow.js +114 -0
- package/.medusa/server/src/workflows/custom-campaign/updateBuyXGetYUsageWorkflow.js +51 -0
- package/package.json +2 -2
- package/src/admin/components/BuyXGetYForm.tsx +422 -0
- package/src/api/admin/buy-x-get-y/[id]/route.ts +164 -0
- package/src/api/admin/buy-x-get-y/route.ts +104 -0
- package/src/api/admin/campaigns/fix-dates/route.ts +107 -0
- package/src/api/admin/campaigns/sync/route.ts +153 -0
- package/src/api/admin/flash-sales/[id]/route.ts +62 -36
- package/src/api/admin/flash-sales/route.ts +57 -21
- package/src/api/admin/force-fix/route.ts +184 -0
- package/src/api/admin/test-campaign/route.ts +141 -0
- package/src/api/store/buy-x-get-y/[id]/route.ts +146 -0
- package/src/api/store/buy-x-get-y/products/[productId]/route.ts +129 -0
- package/src/api/store/buy-x-get-y/route.ts +134 -0
- package/src/api/store/campaigns/[id]/route.ts +159 -79
- package/src/api/store/campaigns/route.ts +141 -30
- package/src/index.ts +10 -0
- package/src/modules/custom-campaigns/migrations/Migration20251018000000.ts +42 -0
- package/src/modules/custom-campaigns/models/buy-x-get-y-config.ts +19 -0
- package/src/modules/custom-campaigns/service.ts +2 -0
- package/src/modules/custom-campaigns/types/campaign-type.enum.ts +1 -0
- package/src/subscribers/cart-updated.ts +23 -0
- package/src/subscribers/order-placed.ts +9 -1
- package/src/workflows/buy-x-get-y/applyBuyXGetYToCartWorkflow.ts +222 -0
- package/src/workflows/custom-campaign/createBuyXGetYCampaignWorkflow.ts +210 -0
- package/src/workflows/custom-campaign/updateBuyXGetYCampaignWorkflow.ts +190 -0
- package/src/workflows/custom-campaign/updateBuyXGetYUsageWorkflow.ts +86 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = void 0;
|
|
4
|
+
const framework_1 = require("@medusajs/framework");
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const campaign_type_enum_1 = require("../../../modules/custom-campaigns/types/campaign-type.enum");
|
|
7
|
+
const custom_campaigns_1 = require("../../../modules/custom-campaigns");
|
|
8
|
+
/**
|
|
9
|
+
* GET handler for listing active Buy X Get Y campaigns for storefront
|
|
10
|
+
*/
|
|
11
|
+
const GET = async (req, res) => {
|
|
12
|
+
const customCampaignModuleService = framework_1.container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
|
|
13
|
+
const productService = framework_1.container.resolve(utils_1.Modules.PRODUCT);
|
|
14
|
+
const promotionService = framework_1.container.resolve(utils_1.Modules.PROMOTION);
|
|
15
|
+
try {
|
|
16
|
+
const now = new Date();
|
|
17
|
+
// Get all Buy X Get Y campaign types
|
|
18
|
+
const customCampaignTypes = await customCampaignModuleService.listCustomCampaignTypes({
|
|
19
|
+
type: campaign_type_enum_1.CampaignTypeEnum.BuyXGetY,
|
|
20
|
+
});
|
|
21
|
+
console.log(`Found ${customCampaignTypes.length} Buy X Get Y campaign types`);
|
|
22
|
+
if (customCampaignTypes.length === 0) {
|
|
23
|
+
return res.status(200).json({
|
|
24
|
+
campaigns: [],
|
|
25
|
+
count: 0,
|
|
26
|
+
limit: 20,
|
|
27
|
+
offset: 0,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
// Get campaign IDs
|
|
31
|
+
const campaignIds = customCampaignTypes.map((ct) => ct.campaign_id);
|
|
32
|
+
// Fetch campaigns from promotion service
|
|
33
|
+
const allCampaigns = await promotionService.listCampaigns({
|
|
34
|
+
id: campaignIds,
|
|
35
|
+
});
|
|
36
|
+
// Filter for active campaigns only (time-based)
|
|
37
|
+
const activeCampaigns = allCampaigns.filter((campaign) => {
|
|
38
|
+
const startsAt = new Date(campaign.starts_at);
|
|
39
|
+
const endsAt = new Date(campaign.ends_at);
|
|
40
|
+
return startsAt <= now && endsAt >= now;
|
|
41
|
+
});
|
|
42
|
+
// Enrich with BOGO configuration details
|
|
43
|
+
const enrichedCampaigns = await Promise.all(activeCampaigns.map(async (campaign) => {
|
|
44
|
+
// Get BOGO configs for this campaign
|
|
45
|
+
const buyXGetYConfigs = await customCampaignModuleService.listBuyXGetYConfigs({
|
|
46
|
+
campaign_id: campaign.id,
|
|
47
|
+
});
|
|
48
|
+
// Filter out configs that have reached their limit
|
|
49
|
+
const availableConfigs = buyXGetYConfigs.filter((config) => !config.limit || config.used < config.limit);
|
|
50
|
+
if (availableConfigs.length === 0) {
|
|
51
|
+
return null; // Skip campaigns with no available rules
|
|
52
|
+
}
|
|
53
|
+
// Build rules with product details
|
|
54
|
+
const rules = await Promise.all(availableConfigs.map(async (config) => {
|
|
55
|
+
const [triggerProduct, rewardProduct] = await Promise.all([
|
|
56
|
+
productService.retrieveProduct(config.trigger_product_id, {
|
|
57
|
+
select: ["id", "title", "thumbnail", "handle"],
|
|
58
|
+
}),
|
|
59
|
+
productService.retrieveProduct(config.reward_product_id, {
|
|
60
|
+
select: ["id", "title", "thumbnail", "handle"],
|
|
61
|
+
}),
|
|
62
|
+
]);
|
|
63
|
+
return {
|
|
64
|
+
id: config.id,
|
|
65
|
+
triggerProduct: {
|
|
66
|
+
id: triggerProduct.id,
|
|
67
|
+
title: triggerProduct.title,
|
|
68
|
+
thumbnail: triggerProduct.thumbnail,
|
|
69
|
+
handle: triggerProduct.handle,
|
|
70
|
+
},
|
|
71
|
+
triggerQuantity: config.trigger_quantity,
|
|
72
|
+
rewardProduct: {
|
|
73
|
+
id: rewardProduct.id,
|
|
74
|
+
title: rewardProduct.title,
|
|
75
|
+
thumbnail: rewardProduct.thumbnail,
|
|
76
|
+
handle: rewardProduct.handle,
|
|
77
|
+
},
|
|
78
|
+
rewardQuantity: config.reward_quantity,
|
|
79
|
+
rewardType: config.reward_type,
|
|
80
|
+
rewardValue: config.reward_value,
|
|
81
|
+
remaining: config.limit ? config.limit - config.used : null,
|
|
82
|
+
};
|
|
83
|
+
}));
|
|
84
|
+
return {
|
|
85
|
+
id: campaign.id,
|
|
86
|
+
name: campaign.name,
|
|
87
|
+
description: campaign.description,
|
|
88
|
+
starts_at: campaign.starts_at,
|
|
89
|
+
ends_at: campaign.ends_at,
|
|
90
|
+
rules,
|
|
91
|
+
};
|
|
92
|
+
}));
|
|
93
|
+
// Filter out null campaigns (those with no available rules)
|
|
94
|
+
const validCampaigns = enrichedCampaigns.filter((c) => c !== null);
|
|
95
|
+
res.status(200).json({
|
|
96
|
+
campaigns: validCampaigns,
|
|
97
|
+
count: validCampaigns.length,
|
|
98
|
+
limit: take,
|
|
99
|
+
offset: skip,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error("Error fetching Buy X Get Y campaigns for storefront:", error);
|
|
104
|
+
res.status(500).json({
|
|
105
|
+
campaigns: [],
|
|
106
|
+
count: 0,
|
|
107
|
+
limit: 20,
|
|
108
|
+
offset: 0,
|
|
109
|
+
error: "Failed to fetch campaigns",
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
exports.GET = GET;
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2J1eS14LWdldC15L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUErRTtBQUMvRSxxREFBb0Q7QUFDcEQsbUdBQThGO0FBQzlGLHdFQUEyRTtBQUczRTs7R0FFRztBQUNJLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNuRSxNQUFNLDJCQUEyQixHQUMvQixxQkFBUyxDQUFDLE9BQU8sQ0FBOEIseUNBQXNCLENBQUMsQ0FBQztJQUN6RSxNQUFNLGNBQWMsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUQsTUFBTSxnQkFBZ0IsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFOUQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUV2QixxQ0FBcUM7UUFDckMsTUFBTSxtQkFBbUIsR0FDdkIsTUFBTSwyQkFBMkIsQ0FBQyx1QkFBdUIsQ0FBQztZQUN4RCxJQUFJLEVBQUUscUNBQWdCLENBQUMsUUFBUTtTQUNoQyxDQUFDLENBQUM7UUFFTCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsbUJBQW1CLENBQUMsTUFBTSw2QkFBNkIsQ0FBQyxDQUFDO1FBRTlFLElBQUksbUJBQW1CLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsRUFBRSxFQUFFO2dCQUNiLEtBQUssRUFBRSxDQUFDO2dCQUNSLEtBQUssRUFBRSxFQUFFO2dCQUNULE1BQU0sRUFBRSxDQUFDO2FBQ1YsQ0FBQyxDQUFDO1FB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
|
|
@@ -4,6 +4,7 @@ exports.GET = void 0;
|
|
|
4
4
|
const framework_1 = require("@medusajs/framework");
|
|
5
5
|
const utils_1 = require("@medusajs/framework/utils");
|
|
6
6
|
const campaign_type_enum_1 = require("../../../../modules/custom-campaigns/types/campaign-type.enum");
|
|
7
|
+
const custom_campaigns_1 = require("../../../../modules/custom-campaigns");
|
|
7
8
|
const GET = async (req, res) => {
|
|
8
9
|
const { id } = req.params;
|
|
9
10
|
if (!id) {
|
|
@@ -11,89 +12,150 @@ const GET = async (req, res) => {
|
|
|
11
12
|
}
|
|
12
13
|
const query = framework_1.container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
13
14
|
const productService = framework_1.container.resolve(utils_1.Modules.PRODUCT);
|
|
15
|
+
const customCampaignModuleService = framework_1.container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
|
|
14
16
|
try {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
},
|
|
17
|
+
const now = new Date();
|
|
18
|
+
// Find the custom campaign type by campaign ID
|
|
19
|
+
const customCampaignTypes = await customCampaignModuleService.listCustomCampaignTypes({
|
|
20
|
+
campaign_id: id,
|
|
21
|
+
});
|
|
22
|
+
if (customCampaignTypes.length === 0) {
|
|
23
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Campaign with ID ${id} not found`);
|
|
24
|
+
}
|
|
25
|
+
const campaignType = customCampaignTypes[0].type;
|
|
26
|
+
// Get campaign from promotion service
|
|
27
|
+
const promotionService = framework_1.container.resolve(utils_1.Modules.PROMOTION);
|
|
28
|
+
const campaign = await promotionService.retrieveCampaign(id, {
|
|
29
|
+
relations: ["promotions", "promotions.application_method", "promotions.application_method.target_rules"],
|
|
29
30
|
});
|
|
30
|
-
const campaign = customCampaignTypes.campaign;
|
|
31
31
|
if (!campaign) {
|
|
32
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `
|
|
32
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Campaign with ID ${id} not found`);
|
|
33
|
+
}
|
|
34
|
+
// Check if campaign is active
|
|
35
|
+
const startsAt = new Date(campaign.starts_at);
|
|
36
|
+
const endsAt = new Date(campaign.ends_at);
|
|
37
|
+
const isActive = startsAt <= now && endsAt >= now;
|
|
38
|
+
if (!isActive) {
|
|
39
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "This campaign is not currently active");
|
|
33
40
|
}
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
filters: {
|
|
41
|
+
// Handle different campaign types
|
|
42
|
+
if (campaignType === campaign_type_enum_1.CampaignTypeEnum.FlashSale) {
|
|
43
|
+
// Fetch promotion usage limits for Flash Sale
|
|
44
|
+
const promotionUsageLimits = await customCampaignModuleService.listPromotionUsageLimits({
|
|
39
45
|
campaign_id: id,
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if (productRule && promotion.application_method.value) {
|
|
57
|
-
products.push({
|
|
58
|
-
product: {
|
|
59
|
-
id: product.id,
|
|
60
|
-
title: product.title,
|
|
61
|
-
},
|
|
62
|
-
discountType: promotion.application_method?.type,
|
|
63
|
-
discountValue: promotion.application_method?.value,
|
|
64
|
-
maxQty: promotion.application_method?.max_quantity,
|
|
65
|
-
limit: promotionLimitsMap.get(promotion.id)?.limit,
|
|
46
|
+
});
|
|
47
|
+
// Create a map of promotion usage limits by promotion ID
|
|
48
|
+
const promotionLimitsMap = new Map();
|
|
49
|
+
promotionUsageLimits.forEach((limit) => {
|
|
50
|
+
promotionLimitsMap.set(limit.promotion_id, limit);
|
|
51
|
+
});
|
|
52
|
+
// Process promotions to extract product information
|
|
53
|
+
const products = [];
|
|
54
|
+
for await (const promotion of campaign.promotions ?? []) {
|
|
55
|
+
if (!promotion.application_method?.target_rules?.length) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const promotionLimit = promotionLimitsMap.get(promotion.id);
|
|
59
|
+
const product = await productService.retrieveProduct(promotionLimit?.product_id, {
|
|
60
|
+
select: ["id", "title", "thumbnail", "handle", "description"],
|
|
61
|
+
relations: ["images"],
|
|
66
62
|
});
|
|
63
|
+
if (promotion.application_method.value !== undefined) {
|
|
64
|
+
products.push({
|
|
65
|
+
product: {
|
|
66
|
+
id: product.id,
|
|
67
|
+
title: product.title,
|
|
68
|
+
thumbnail: product.thumbnail,
|
|
69
|
+
handle: product.handle,
|
|
70
|
+
description: product.description,
|
|
71
|
+
images: product.images,
|
|
72
|
+
},
|
|
73
|
+
discountType: promotion.application_method?.type,
|
|
74
|
+
discountValue: promotion.application_method?.value,
|
|
75
|
+
maxQty: promotion.application_method?.max_quantity,
|
|
76
|
+
limit: promotionLimit?.limit,
|
|
77
|
+
used: promotionLimit?.used,
|
|
78
|
+
remaining: promotionLimit?.limit
|
|
79
|
+
? promotionLimit.limit - promotionLimit.used
|
|
80
|
+
: null,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
67
83
|
}
|
|
84
|
+
res.status(200).json({
|
|
85
|
+
id: campaign.id,
|
|
86
|
+
name: campaign.name,
|
|
87
|
+
description: campaign.description,
|
|
88
|
+
type: campaignType,
|
|
89
|
+
starts_at: campaign.starts_at,
|
|
90
|
+
ends_at: campaign.ends_at,
|
|
91
|
+
products,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else if (campaignType === campaign_type_enum_1.CampaignTypeEnum.BuyXGetY) {
|
|
95
|
+
// Get BOGO configs for this campaign
|
|
96
|
+
const buyXGetYConfigs = await customCampaignModuleService.listBuyXGetYConfigs({
|
|
97
|
+
campaign_id: id,
|
|
98
|
+
});
|
|
99
|
+
// Filter out configs that have reached their limit
|
|
100
|
+
const availableConfigs = buyXGetYConfigs.filter((config) => !config.limit || config.used < config.limit);
|
|
101
|
+
// Build rules with product details
|
|
102
|
+
const rules = await Promise.all(availableConfigs.map(async (config) => {
|
|
103
|
+
const [triggerProduct, rewardProduct] = await Promise.all([
|
|
104
|
+
productService.retrieveProduct(config.trigger_product_id, {
|
|
105
|
+
select: ["id", "title", "description", "thumbnail", "handle"],
|
|
106
|
+
relations: ["images"],
|
|
107
|
+
}),
|
|
108
|
+
productService.retrieveProduct(config.reward_product_id, {
|
|
109
|
+
select: ["id", "title", "description", "thumbnail", "handle"],
|
|
110
|
+
relations: ["images"],
|
|
111
|
+
}),
|
|
112
|
+
]);
|
|
113
|
+
return {
|
|
114
|
+
id: config.id,
|
|
115
|
+
triggerProduct: {
|
|
116
|
+
id: triggerProduct.id,
|
|
117
|
+
title: triggerProduct.title,
|
|
118
|
+
description: triggerProduct.description,
|
|
119
|
+
thumbnail: triggerProduct.thumbnail,
|
|
120
|
+
handle: triggerProduct.handle,
|
|
121
|
+
images: triggerProduct.images,
|
|
122
|
+
},
|
|
123
|
+
triggerQuantity: config.trigger_quantity,
|
|
124
|
+
rewardProduct: {
|
|
125
|
+
id: rewardProduct.id,
|
|
126
|
+
title: rewardProduct.title,
|
|
127
|
+
description: rewardProduct.description,
|
|
128
|
+
thumbnail: rewardProduct.thumbnail,
|
|
129
|
+
handle: rewardProduct.handle,
|
|
130
|
+
images: rewardProduct.images,
|
|
131
|
+
},
|
|
132
|
+
rewardQuantity: config.reward_quantity,
|
|
133
|
+
rewardType: config.reward_type,
|
|
134
|
+
rewardValue: config.reward_value,
|
|
135
|
+
remaining: config.limit ? config.limit - config.used : null,
|
|
136
|
+
};
|
|
137
|
+
}));
|
|
138
|
+
res.status(200).json({
|
|
139
|
+
id: campaign.id,
|
|
140
|
+
name: campaign.name,
|
|
141
|
+
description: campaign.description,
|
|
142
|
+
type: campaignType,
|
|
143
|
+
starts_at: campaign.starts_at,
|
|
144
|
+
ends_at: campaign.ends_at,
|
|
145
|
+
rules,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Unknown campaign type");
|
|
68
150
|
}
|
|
69
|
-
const campaignData = {
|
|
70
|
-
id: campaign.id,
|
|
71
|
-
name: campaign.name,
|
|
72
|
-
description: campaign.description,
|
|
73
|
-
type: campaign.type,
|
|
74
|
-
startsAt: campaign.starts_at,
|
|
75
|
-
endsAt: campaign.ends_at,
|
|
76
|
-
};
|
|
77
|
-
const productData = products.map((product) => ({
|
|
78
|
-
id: product.product.id,
|
|
79
|
-
title: product.product.title,
|
|
80
|
-
discountType: product.discountType,
|
|
81
|
-
discountValue: product.discountValue,
|
|
82
|
-
maxQty: product.maxQty,
|
|
83
|
-
limit: product.limit,
|
|
84
|
-
}));
|
|
85
|
-
res.status(200).json({
|
|
86
|
-
...campaignData,
|
|
87
|
-
products: productData,
|
|
88
|
-
});
|
|
89
151
|
}
|
|
90
152
|
catch (error) {
|
|
91
153
|
if (error instanceof utils_1.MedusaError) {
|
|
92
154
|
throw error;
|
|
93
155
|
}
|
|
94
|
-
console.error("Error fetching
|
|
95
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "An error occurred while fetching the
|
|
156
|
+
console.error("Error fetching campaign:", error);
|
|
157
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "An error occurred while fetching the campaign");
|
|
96
158
|
}
|
|
97
159
|
};
|
|
98
160
|
exports.GET = GET;
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2NhbXBhaWducy9baWRdL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUErRTtBQUMvRSxxREFJbUM7QUFDbkMsc0dBQWlHO0FBRWpHLDJFQUE4RTtBQUd2RSxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQ3RCLEdBQWtDLEVBQ2xDLEdBQW1CLEVBQ25CLEVBQUU7SUFDRixNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUUxQixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDUixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix5QkFBeUIsQ0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRSxNQUFNLGNBQWMsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUQsTUFBTSwyQkFBMkIsR0FDL0IscUJBQVMsQ0FBQyxPQUFPLENBQThCLHlDQUFzQixDQUFDLENBQUM7SUFFekUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUV2QiwrQ0FBK0M7UUFDL0MsTUFBTSxtQkFBbUIsR0FDdkIsTUFBTSwyQkFBMkIsQ0FBQyx1QkFBdUIsQ0FBQztZQUN4RCxXQUFXLEVBQUUsRUFBRTtTQUNoQixDQUFDLENBQUM7UUFFTCxJQUFJLG1CQUFtQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQixvQkFBb0IsRUFB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
|
|
@@ -4,32 +4,125 @@ exports.GET = void 0;
|
|
|
4
4
|
const framework_1 = require("@medusajs/framework");
|
|
5
5
|
const utils_1 = require("@medusajs/framework/utils");
|
|
6
6
|
const campaign_type_enum_1 = require("../../../modules/custom-campaigns/types/campaign-type.enum");
|
|
7
|
+
const custom_campaigns_1 = require("../../../modules/custom-campaigns");
|
|
8
|
+
/**
|
|
9
|
+
* GET handler for listing all active campaigns (Flash Sales + Buy X Get Y) for storefront
|
|
10
|
+
*/
|
|
7
11
|
const GET = async (req, res) => {
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
12
|
+
const customCampaignModuleService = framework_1.container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
|
|
13
|
+
const promotionService = framework_1.container.resolve(utils_1.Modules.PROMOTION);
|
|
14
|
+
const now = new Date();
|
|
15
|
+
try {
|
|
16
|
+
// Get the campaign type filter from query params (optional)
|
|
17
|
+
const campaignType = req.query?.type;
|
|
18
|
+
const filters = {};
|
|
19
|
+
if (campaignType && Object.values(campaign_type_enum_1.CampaignTypeEnum).includes(campaignType)) {
|
|
20
|
+
filters.type = campaignType;
|
|
21
|
+
}
|
|
22
|
+
console.log("=== Store Campaigns Debug ===");
|
|
23
|
+
console.log("Current time:", now.toISOString());
|
|
24
|
+
console.log("Requested type filter:", campaignType);
|
|
25
|
+
// Get all custom campaign types (including soft deleted check)
|
|
26
|
+
const allCustomCampaignTypes = await customCampaignModuleService.listCustomCampaignTypes({});
|
|
27
|
+
console.log(`Total custom campaign types (unfiltered): ${allCustomCampaignTypes.length}`);
|
|
28
|
+
allCustomCampaignTypes.forEach(ct => {
|
|
29
|
+
console.log(` - Type: ${ct.type}, Campaign ID: ${ct.campaign_id}, Deleted: ${ct.deleted_at}`);
|
|
30
|
+
});
|
|
31
|
+
// Apply filters
|
|
32
|
+
const customCampaignTypes = filters.type
|
|
33
|
+
? allCustomCampaignTypes.filter(ct => ct.type === filters.type && !ct.deleted_at)
|
|
34
|
+
: allCustomCampaignTypes.filter(ct => !ct.deleted_at);
|
|
35
|
+
console.log(`Filtered custom campaign types: ${customCampaignTypes.length}`);
|
|
36
|
+
if (customCampaignTypes.length === 0) {
|
|
37
|
+
console.log("No custom campaign types found after filtering");
|
|
38
|
+
return res.status(200).json({
|
|
39
|
+
campaigns: [],
|
|
40
|
+
count: 0,
|
|
41
|
+
limit: 20,
|
|
42
|
+
offset: 0,
|
|
43
|
+
debug: {
|
|
44
|
+
message: "No custom campaign types found",
|
|
45
|
+
filters: filters,
|
|
46
|
+
totalUnfiltered: allCustomCampaignTypes.length
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
// Get campaign IDs
|
|
51
|
+
const campaignIds = customCampaignTypes.map((ct) => ct.campaign_id);
|
|
52
|
+
console.log("Campaign IDs to fetch:", JSON.stringify(campaignIds));
|
|
53
|
+
// Fetch ALL campaigns first for debugging
|
|
54
|
+
const allCampaigns = await promotionService.listCampaigns({});
|
|
55
|
+
console.log(`Total campaigns in system: ${allCampaigns.length}`);
|
|
56
|
+
// Then fetch specific campaigns
|
|
57
|
+
const campaigns = campaignIds.length > 0
|
|
58
|
+
? allCampaigns.filter((c) => campaignIds.includes(c.id))
|
|
59
|
+
: [];
|
|
60
|
+
console.log(`Found ${campaigns.length} matching campaigns`);
|
|
61
|
+
campaigns.forEach((c) => {
|
|
62
|
+
console.log(` Campaign: ${c.name} (${c.id})`);
|
|
63
|
+
console.log(` Starts: ${c.starts_at}`);
|
|
64
|
+
console.log(` Ends: ${c.ends_at}`);
|
|
65
|
+
});
|
|
66
|
+
// Create a map of campaign_id to campaign_type
|
|
67
|
+
const campaignTypeMap = new Map(customCampaignTypes.map((ct) => [ct.campaign_id, ct.type]));
|
|
68
|
+
// Process ALL campaigns first (without date filter) for debugging
|
|
69
|
+
const allProcessedCampaigns = campaigns.map((campaign) => {
|
|
70
|
+
const startsAt = new Date(campaign.starts_at);
|
|
71
|
+
const endsAt = new Date(campaign.ends_at);
|
|
72
|
+
const isActive = startsAt <= now && endsAt >= now;
|
|
73
|
+
console.log(` Checking campaign "${campaign.name}":`);
|
|
74
|
+
console.log(` Start: ${startsAt.toISOString()} (${startsAt <= now ? 'started' : 'not started'})`);
|
|
75
|
+
console.log(` End: ${endsAt.toISOString()} (${endsAt >= now ? 'not ended' : 'ended'})`);
|
|
76
|
+
console.log(` Active: ${isActive}`);
|
|
77
|
+
return {
|
|
78
|
+
id: campaign.id,
|
|
79
|
+
name: campaign.name,
|
|
80
|
+
description: campaign.description,
|
|
81
|
+
campaign_identifier: campaign.campaign_identifier,
|
|
82
|
+
starts_at: campaign.starts_at,
|
|
83
|
+
ends_at: campaign.ends_at,
|
|
84
|
+
campaign_type: campaignTypeMap.get(campaign.id),
|
|
85
|
+
is_active: isActive
|
|
86
|
+
};
|
|
87
|
+
});
|
|
88
|
+
// Filter for active campaigns
|
|
89
|
+
const activeCampaigns = allProcessedCampaigns.filter(c => c.is_active);
|
|
90
|
+
console.log(`Returning ${activeCampaigns.length} active campaigns out of ${allProcessedCampaigns.length} total`);
|
|
91
|
+
res.status(200).json({
|
|
92
|
+
campaigns: activeCampaigns,
|
|
93
|
+
count: activeCampaigns.length,
|
|
94
|
+
limit: 20,
|
|
95
|
+
offset: 0,
|
|
96
|
+
debug: {
|
|
97
|
+
currentTime: now.toISOString(),
|
|
98
|
+
totalCustomCampaignTypes: allCustomCampaignTypes.length,
|
|
99
|
+
filteredCustomCampaignTypes: customCampaignTypes.length,
|
|
100
|
+
totalCampaigns: allCampaigns.length,
|
|
101
|
+
matchingCampaigns: campaigns.length,
|
|
102
|
+
allProcessedCampaigns: allProcessedCampaigns.length,
|
|
103
|
+
activeCampaigns: activeCampaigns.length,
|
|
104
|
+
inactiveCampaigns: allProcessedCampaigns.filter(c => !c.is_active).map(c => ({
|
|
105
|
+
name: c.name,
|
|
106
|
+
starts_at: c.starts_at,
|
|
107
|
+
ends_at: c.ends_at,
|
|
108
|
+
reason: new Date(c.starts_at) > now ? 'not_started' : 'ended'
|
|
109
|
+
}))
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
console.error("Error fetching campaigns for storefront:", error);
|
|
115
|
+
console.error("Stack:", error instanceof Error ? error.stack : 'No stack');
|
|
116
|
+
res.status(500).json({
|
|
117
|
+
campaigns: [],
|
|
118
|
+
count: 0,
|
|
119
|
+
limit: 20,
|
|
120
|
+
offset: 0,
|
|
121
|
+
error: "Failed to fetch campaigns",
|
|
122
|
+
details: error instanceof Error ? error.message : String(error),
|
|
123
|
+
stack: error instanceof Error ? error.stack : undefined
|
|
124
|
+
});
|
|
125
|
+
}
|
|
33
126
|
};
|
|
34
127
|
exports.GET = GET;
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2NhbXBhaWducy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBK0U7QUFDL0UscURBQStFO0FBQy9FLG1HQUE4RjtBQUM5Rix3RUFBMkU7QUFHM0U7O0dBRUc7QUFDSSxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDbkUsTUFBTSwyQkFBMkIsR0FDL0IscUJBQVMsQ0FBQyxPQUFPLENBQThCLHlDQUFzQixDQUFDLENBQUM7SUFDekUsTUFBTSxnQkFBZ0IsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUV2QixJQUFJLENBQUM7UUFDSCw0REFBNEQ7UUFDNUQsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFvQyxDQUFDO1FBRXJFLE1BQU0sT0FBTyxHQUFRLEVBQUUsQ0FBQztRQUN4QixJQUFJLFlBQVksSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLHFDQUFnQixDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDM0UsT0FBTyxDQUFDLElBQUksR0FBRyxZQUFZLENBQUM7UUFDOUIsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXBELCtEQUErRDtRQUMvRCxNQUFNLHNCQUFzQixHQUMxQixNQUFNLDJCQUEyQixDQUFDLHVCQUF1QixD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
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CUSTOM_CAMPAIGN_MODULE = exports.CustomCampaignModule = void 0;
|
|
7
|
+
const custom_campaigns_1 = __importDefault(require("./modules/custom-campaigns"));
|
|
8
|
+
exports.CustomCampaignModule = custom_campaigns_1.default;
|
|
9
|
+
// Export the module so MedusaJS can load it
|
|
10
|
+
exports.default = {
|
|
11
|
+
modules: [custom_campaigns_1.default],
|
|
12
|
+
};
|
|
13
|
+
var custom_campaigns_2 = require("./modules/custom-campaigns");
|
|
14
|
+
Object.defineProperty(exports, "CUSTOM_CAMPAIGN_MODULE", { enumerable: true, get: function () { return custom_campaigns_2.CUSTOM_CAMPAIGN_MODULE; } });
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0ZBQThEO0FBUXJELCtCQVJGLDBCQUFvQixDQVFFO0FBTjdCLDRDQUE0QztBQUM1QyxrQkFBZTtJQUNiLE9BQU8sRUFBRSxDQUFDLDBCQUFvQixDQUFDO0NBQ2hDLENBQUM7QUFJRiwrREFBb0U7QUFBM0QsMEhBQUEsc0JBQXNCLE9BQUEifQ==
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20251018000000 = void 0;
|
|
4
|
+
const migrations_1 = require("@mikro-orm/migrations");
|
|
5
|
+
class Migration20251018000000 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
// Update custom_campaign_type enum to include 'buy-x-get-y'
|
|
8
|
+
this.addSql(`alter table if exists "custom_campaign_type" drop constraint if exists "custom_campaign_type_type_check";`);
|
|
9
|
+
this.addSql(`alter table if exists "custom_campaign_type" add constraint "custom_campaign_type_type_check" check ("type" in ('flash-sale', 'buy-x-get-y'));`);
|
|
10
|
+
// Create buy_x_get_y_config table
|
|
11
|
+
this.addSql(`create table if not exists "buy_x_get_y_config" (
|
|
12
|
+
"id" text not null,
|
|
13
|
+
"campaign_id" text not null,
|
|
14
|
+
"promotion_id" text not null,
|
|
15
|
+
"trigger_product_id" text not null,
|
|
16
|
+
"trigger_quantity" integer not null,
|
|
17
|
+
"reward_product_id" text not null,
|
|
18
|
+
"reward_quantity" integer not null,
|
|
19
|
+
"reward_type" text check ("reward_type" in ('free', 'percentage', 'fixed')) not null,
|
|
20
|
+
"reward_value" integer null,
|
|
21
|
+
"limit" integer null,
|
|
22
|
+
"used" integer not null default 0,
|
|
23
|
+
"created_at" timestamptz not null default now(),
|
|
24
|
+
"updated_at" timestamptz not null default now(),
|
|
25
|
+
"deleted_at" timestamptz null,
|
|
26
|
+
constraint "buy_x_get_y_config_pkey" primary key ("id")
|
|
27
|
+
);`);
|
|
28
|
+
this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_buy_x_get_y_config_campaign_promotion" ON "buy_x_get_y_config" (campaign_id, promotion_id) WHERE deleted_at IS NULL;`);
|
|
29
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_buy_x_get_y_config_deleted_at" ON "buy_x_get_y_config" (deleted_at) WHERE deleted_at IS NULL;`);
|
|
30
|
+
}
|
|
31
|
+
async down() {
|
|
32
|
+
// Drop buy_x_get_y_config table
|
|
33
|
+
this.addSql(`drop table if exists "buy_x_get_y_config" cascade;`);
|
|
34
|
+
// Revert custom_campaign_type enum
|
|
35
|
+
this.addSql(`alter table if exists "custom_campaign_type" drop constraint if exists "custom_campaign_type_type_check";`);
|
|
36
|
+
this.addSql(`alter table if exists "custom_campaign_type" add constraint "custom_campaign_type_type_check" check ("type" in ('flash-sale'));`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.Migration20251018000000 = Migration20251018000000;
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTEwMTgwMDAwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jdXN0b20tY2FtcGFpZ25zL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNTEwMTgwMDAwMDAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQWtEO0FBRWxELE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFFM0MsS0FBSyxDQUFDLEVBQUU7UUFDZiw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQywyR0FBMkcsQ0FBQyxDQUFDO1FBQ3pILElBQUksQ0FBQyxNQUFNLENBQUMsZ0pBQWdKLENBQUMsQ0FBQztRQUU5SixrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztPQWdCVCxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsTUFBTSxDQUFDLDZKQUE2SixDQUFDLENBQUM7UUFDM0ssSUFBSSxDQUFDLE1BQU0sQ0FBQywrSEFBK0gsQ0FBQyxDQUFDO0lBQy9JLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBRWxFLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLDJHQUEyRyxDQUFDLENBQUM7UUFDekgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpSUFBaUksQ0FBQyxDQUFDO0lBQ2pKLENBQUM7Q0FFRjtBQXZDRCwwREF1Q0MifQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const BuyXGetYConfig = utils_1.model
|
|
5
|
+
.define("buy_x_get_y_config", {
|
|
6
|
+
id: utils_1.model.id().primaryKey(),
|
|
7
|
+
campaign_id: utils_1.model.text(),
|
|
8
|
+
promotion_id: utils_1.model.text(),
|
|
9
|
+
trigger_product_id: utils_1.model.text(),
|
|
10
|
+
trigger_quantity: utils_1.model.number(),
|
|
11
|
+
reward_product_id: utils_1.model.text(),
|
|
12
|
+
reward_quantity: utils_1.model.number(),
|
|
13
|
+
reward_type: utils_1.model.enum(["free", "percentage", "fixed"]),
|
|
14
|
+
reward_value: utils_1.model.number().nullable(),
|
|
15
|
+
limit: utils_1.model.number().nullable(),
|
|
16
|
+
used: utils_1.model.number().default(0),
|
|
17
|
+
})
|
|
18
|
+
.indexes([{ on: ["campaign_id", "promotion_id"], unique: true }]);
|
|
19
|
+
exports.default = BuyXGetYConfig;
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV5LXgtZ2V0LXktY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvY3VzdG9tLWNhbXBhaWducy9tb2RlbHMvYnV5LXgtZ2V0LXktY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscURBQWtEO0FBRWxELE1BQU0sY0FBYyxHQUFHLGFBQUs7S0FDekIsTUFBTSxDQUFDLG9CQUFvQixFQUFFO0lBQzVCLEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLFdBQVcsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3pCLFlBQVksRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQzFCLGtCQUFrQixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDaEMsZ0JBQWdCLEVBQUUsYUFBSyxDQUFDLE1BQU0sRUFBRTtJQUNoQyxpQkFBaUIsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQy9CLGVBQWUsRUFBRSxhQUFLLENBQUMsTUFBTSxFQUFFO0lBQy9CLFdBQVcsRUFBRSxhQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RCxZQUFZLEVBQUUsYUFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUN2QyxLQUFLLEVBQUUsYUFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNoQyxJQUFJLEVBQUUsYUFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Q0FDaEMsQ0FBQztLQUNELE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFcEUsa0JBQWUsY0FBYyxDQUFDIn0=
|