@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,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PUT = 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 updateBuyXGetYCampaignWorkflow_1 = require("../../../../workflows/custom-campaign/updateBuyXGetYCampaignWorkflow");
|
|
8
|
+
const custom_campaigns_1 = require("../../../../modules/custom-campaigns");
|
|
9
|
+
/**
|
|
10
|
+
* GET handler for fetching a specific Buy X Get Y campaign by ID
|
|
11
|
+
*/
|
|
12
|
+
const GET = async (req, res) => {
|
|
13
|
+
const { id } = req.params;
|
|
14
|
+
if (!id) {
|
|
15
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Campaign ID is required");
|
|
16
|
+
}
|
|
17
|
+
const query = framework_1.container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
18
|
+
const productService = framework_1.container.resolve(utils_1.Modules.PRODUCT);
|
|
19
|
+
const customCampaignModuleService = framework_1.container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
|
|
20
|
+
try {
|
|
21
|
+
// Find the custom campaign type by campaign ID
|
|
22
|
+
const { data: [customCampaignTypes], } = await query.graph({
|
|
23
|
+
entity: "custom_campaign_type",
|
|
24
|
+
fields: [
|
|
25
|
+
"id",
|
|
26
|
+
"campaign.*",
|
|
27
|
+
"campaign.promotions.*",
|
|
28
|
+
],
|
|
29
|
+
filters: {
|
|
30
|
+
type: campaign_type_enum_1.CampaignTypeEnum.BuyXGetY,
|
|
31
|
+
campaign_id: id,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
const campaign = customCampaignTypes?.campaign;
|
|
35
|
+
if (!campaign) {
|
|
36
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Buy X Get Y campaign with ID ${id} not found`);
|
|
37
|
+
}
|
|
38
|
+
// Fetch Buy X Get Y configurations for the campaign
|
|
39
|
+
const buyXGetYConfigs = await customCampaignModuleService.listBuyXGetYConfigs({
|
|
40
|
+
campaign_id: id,
|
|
41
|
+
});
|
|
42
|
+
// Process configurations to extract product information
|
|
43
|
+
const rules = [];
|
|
44
|
+
for (const config of buyXGetYConfigs) {
|
|
45
|
+
const triggerProduct = await productService.retrieveProduct(config.trigger_product_id);
|
|
46
|
+
const rewardProduct = await productService.retrieveProduct(config.reward_product_id);
|
|
47
|
+
rules.push({
|
|
48
|
+
triggerProduct: {
|
|
49
|
+
id: triggerProduct.id,
|
|
50
|
+
title: triggerProduct.title,
|
|
51
|
+
},
|
|
52
|
+
triggerQuantity: config.trigger_quantity,
|
|
53
|
+
rewardProduct: {
|
|
54
|
+
id: rewardProduct.id,
|
|
55
|
+
title: rewardProduct.title,
|
|
56
|
+
},
|
|
57
|
+
rewardQuantity: config.reward_quantity,
|
|
58
|
+
rewardType: config.reward_type,
|
|
59
|
+
rewardValue: config.reward_value ?? undefined,
|
|
60
|
+
limit: config.limit ?? undefined,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
res.status(200).json({
|
|
64
|
+
...campaign,
|
|
65
|
+
type: campaign_type_enum_1.CampaignTypeEnum.BuyXGetY,
|
|
66
|
+
rules,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (error instanceof utils_1.MedusaError) {
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
console.error("Error fetching Buy X Get Y campaign:", error);
|
|
74
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "An error occurred while fetching the Buy X Get Y campaign");
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
exports.GET = GET;
|
|
78
|
+
/**
|
|
79
|
+
* PUT handler for updating a specific Buy X Get Y campaign by ID
|
|
80
|
+
*/
|
|
81
|
+
const PUT = async (req, res) => {
|
|
82
|
+
const { id } = req.params;
|
|
83
|
+
const body = req.body;
|
|
84
|
+
if (!id) {
|
|
85
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Campaign ID is required");
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
// Check if start date is before end date
|
|
89
|
+
if (new Date(body.ends_at) < new Date(body.starts_at)) {
|
|
90
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "End date must be after start date");
|
|
91
|
+
}
|
|
92
|
+
// Validate reward types
|
|
93
|
+
for (const rule of body.rules) {
|
|
94
|
+
if (rule.rewardType !== "free" && !rule.rewardValue) {
|
|
95
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Reward value is required for percentage and fixed reward types");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Update the Buy X Get Y campaign
|
|
99
|
+
const result = await updateBuyXGetYCampaignWorkflow_1.updateBuyXGetYCampaignWorkflow.run({
|
|
100
|
+
input: {
|
|
101
|
+
...body,
|
|
102
|
+
id,
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
res.status(200).json(result.result);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
if (error instanceof utils_1.MedusaError) {
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
console.error("Error updating Buy X Get Y campaign:", error);
|
|
112
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "An error occurred while updating the Buy X Get Y campaign");
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
exports.PUT = PUT;
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2J1eS14LWdldC15L1tpZF0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQStFO0FBQy9FLHFEQUltQztBQUNuQyxzR0FBaUc7QUFFakcseUhBQXNIO0FBQ3RILDJFQUE4RTtBQUc5RTs7R0FFRztBQUNJLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNuRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUUxQixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDUixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix5QkFBeUIsQ0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRSxNQUFNLGNBQWMsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUQsTUFBTSwyQkFBMkIsR0FDL0IscUJBQVMsQ0FBQyxPQUFPLENBQThCLHlDQUFzQixDQUFDLENBQUM7SUFFekUsSUFBSSxDQUFDO1FBQ0gsK0NBQStDO1FBQy9DLE1BQU0sRUFDSixJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxHQUM1QixHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNwQixNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLE1BQU0sRUFBRTtnQkFDTixJQUFJO2dCQUNKLFlBQVk7Z0JBQ1osdUJBQXVCO2FBQ3hCO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxxQ0FBZ0IsQ0FBQyxRQUFRO2dCQUMvQixXQUFXLEVBQUUs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
|
|
@@ -0,0 +1,83 @@
|
|
|
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.GET = exports.POST = exports.GetBuyXGetYCampaignsSchema = exports.createBuyXGetYCampaignSchema = void 0;
|
|
7
|
+
const framework_1 = require("@medusajs/framework");
|
|
8
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
9
|
+
const validators_1 = require("@medusajs/medusa/api/utils/validators");
|
|
10
|
+
const zod_1 = __importDefault(require("zod"));
|
|
11
|
+
const campaign_type_enum_1 = require("../../../modules/custom-campaigns/types/campaign-type.enum");
|
|
12
|
+
const createBuyXGetYCampaignWorkflow_1 = require("../../../workflows/custom-campaign/createBuyXGetYCampaignWorkflow");
|
|
13
|
+
exports.createBuyXGetYCampaignSchema = zod_1.default.object({
|
|
14
|
+
name: zod_1.default.string().min(1, "Name is required"),
|
|
15
|
+
description: zod_1.default.string().min(1, "Description is required"),
|
|
16
|
+
type: zod_1.default.literal(campaign_type_enum_1.CampaignTypeEnum.BuyXGetY),
|
|
17
|
+
starts_at: zod_1.default.coerce.date(),
|
|
18
|
+
ends_at: zod_1.default.coerce.date(),
|
|
19
|
+
rules: zod_1.default
|
|
20
|
+
.array(zod_1.default.object({
|
|
21
|
+
triggerProduct: zod_1.default.object({
|
|
22
|
+
id: zod_1.default.string(),
|
|
23
|
+
title: zod_1.default.string(),
|
|
24
|
+
}),
|
|
25
|
+
triggerQuantity: zod_1.default.number().min(1, "Trigger quantity must be at least 1"),
|
|
26
|
+
rewardProduct: zod_1.default.object({
|
|
27
|
+
id: zod_1.default.string(),
|
|
28
|
+
title: zod_1.default.string(),
|
|
29
|
+
}),
|
|
30
|
+
rewardQuantity: zod_1.default.number().min(1, "Reward quantity must be at least 1"),
|
|
31
|
+
rewardType: zod_1.default.enum(["free", "percentage", "fixed"]),
|
|
32
|
+
rewardValue: zod_1.default.number().optional(),
|
|
33
|
+
limit: zod_1.default.number().min(1).optional(),
|
|
34
|
+
}))
|
|
35
|
+
.min(1, "At least one rule is required"),
|
|
36
|
+
});
|
|
37
|
+
exports.GetBuyXGetYCampaignsSchema = (0, validators_1.createFindParams)({
|
|
38
|
+
order: "-created_at",
|
|
39
|
+
});
|
|
40
|
+
const POST = async (req, res) => {
|
|
41
|
+
const body = req.body;
|
|
42
|
+
if (new Date(body.ends_at) < new Date(body.starts_at)) {
|
|
43
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "End date must be after start date");
|
|
44
|
+
}
|
|
45
|
+
// Validate reward types
|
|
46
|
+
for (const rule of body.rules) {
|
|
47
|
+
if (rule.rewardType !== "free" && !rule.rewardValue) {
|
|
48
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Reward value is required for percentage and fixed reward types");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const campaign = await createBuyXGetYCampaignWorkflow_1.createBuyXGetYCampaignWorkflow.run({
|
|
52
|
+
input: body,
|
|
53
|
+
});
|
|
54
|
+
res.status(200).json(campaign);
|
|
55
|
+
};
|
|
56
|
+
exports.POST = POST;
|
|
57
|
+
const GET = async (req, res) => {
|
|
58
|
+
const query = framework_1.container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
59
|
+
const { data: customCampaigns, metadata: { count, take, skip } = {
|
|
60
|
+
count: 0,
|
|
61
|
+
take: 20,
|
|
62
|
+
skip: 0,
|
|
63
|
+
}, } = await query.graph({
|
|
64
|
+
entity: "custom_campaign_type",
|
|
65
|
+
...req.queryConfig,
|
|
66
|
+
fields: [
|
|
67
|
+
"id",
|
|
68
|
+
"campaign.*",
|
|
69
|
+
"campaign.promotions.*",
|
|
70
|
+
"campaign.promotions.application_method.*",
|
|
71
|
+
],
|
|
72
|
+
filters: { type: campaign_type_enum_1.CampaignTypeEnum.BuyXGetY },
|
|
73
|
+
});
|
|
74
|
+
const campaigns = customCampaigns.map((campaign) => campaign.campaign);
|
|
75
|
+
res.status(200).json({
|
|
76
|
+
campaigns,
|
|
77
|
+
count,
|
|
78
|
+
limit: take,
|
|
79
|
+
offset: skip,
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
exports.GET = GET;
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2J1eS14LWdldC15L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUErRTtBQUMvRSxxREFHbUM7QUFDbkMsc0VBQXlFO0FBQ3pFLDhDQUFvQjtBQUNwQixtR0FBOEY7QUFDOUYsc0hBRzJFO0FBRTlELFFBQUEsNEJBQTRCLEdBQUcsYUFBQyxDQUFDLE1BQU0sQ0FBQztJQUNuRCxJQUFJLEVBQUUsYUFBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUM7SUFDM0MsV0FBVyxFQUFFLGFBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLHlCQUF5QixDQUFDO0lBQ3pELElBQUksRUFBRSxhQUFDLENBQUMsT0FBTyxDQUFDLHFDQUFnQixDQUFDLFFBQVEsQ0FBQztJQUMxQyxTQUFTLEVBQUUsYUFBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7SUFDMUIsT0FBTyxFQUFFLGFBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO0lBQ3hCLEtBQUssRUFBRSxhQUFDO1NBQ0wsS0FBSyxDQUNKLGFBQUMsQ0FBQyxNQUFNLENBQUM7UUFDUCxjQUFjLEVBQUUsYUFBQyxDQUFDLE1BQU0sQ0FBQztZQUN2QixFQUFFLEVBQUUsYUFBQyxDQUFDLE1BQU0sRUFBRTtZQUNkLEtBQUssRUFBRSxhQUFDLENBQUMsTUFBTSxFQUFFO1NBQ2xCLENBQUM7UUFDRixlQUFlLEVBQUUsYUFBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUscUNBQXFDLENBQUM7UUFDekUsYUFBYSxFQUFFLGFBQUMsQ0FBQyxNQUFNLENBQUM7WUFDdEIsRUFBRSxFQUFFLGFBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDZCxLQUFLLEVBQUUsYUFBQyxDQUFD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
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = exports.POST = void 0;
|
|
4
|
+
const framework_1 = require("@medusajs/framework");
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
7
|
+
/**
|
|
8
|
+
* POST handler to fix campaign dates - makes all campaigns active for testing
|
|
9
|
+
*/
|
|
10
|
+
const POST = async (req, res) => {
|
|
11
|
+
const promotionService = framework_1.container.resolve(utils_1.Modules.PROMOTION);
|
|
12
|
+
try {
|
|
13
|
+
// Get all campaigns
|
|
14
|
+
const allCampaigns = await promotionService.listCampaigns({});
|
|
15
|
+
console.log(`Found ${allCampaigns.length} campaigns to fix`);
|
|
16
|
+
const updatedCampaigns = [];
|
|
17
|
+
// Update each campaign to be active for the whole year
|
|
18
|
+
for (const campaign of allCampaigns) {
|
|
19
|
+
try {
|
|
20
|
+
const result = await core_flows_1.updateCampaignsWorkflow.run({
|
|
21
|
+
input: {
|
|
22
|
+
campaignsData: [
|
|
23
|
+
{
|
|
24
|
+
id: campaign.id,
|
|
25
|
+
starts_at: new Date("2024-01-01T00:00:00Z"),
|
|
26
|
+
ends_at: new Date("2025-12-31T23:59:59Z"),
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
updatedCampaigns.push({
|
|
32
|
+
id: campaign.id,
|
|
33
|
+
name: campaign.name,
|
|
34
|
+
old_starts_at: campaign.starts_at,
|
|
35
|
+
old_ends_at: campaign.ends_at,
|
|
36
|
+
new_starts_at: "2024-01-01T00:00:00Z",
|
|
37
|
+
new_ends_at: "2025-12-31T23:59:59Z",
|
|
38
|
+
});
|
|
39
|
+
console.log(`✅ Fixed dates for campaign: ${campaign.name}`);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.error(`❌ Failed to update campaign ${campaign.id}:`, error);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
res.status(200).json({
|
|
46
|
+
success: true,
|
|
47
|
+
message: `Updated ${updatedCampaigns.length} campaigns`,
|
|
48
|
+
campaigns: updatedCampaigns,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
console.error("Error fixing campaign dates:", error);
|
|
53
|
+
res.status(500).json({
|
|
54
|
+
error: "Failed to fix campaign dates",
|
|
55
|
+
details: error instanceof Error ? error.message : String(error),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
exports.POST = POST;
|
|
60
|
+
/**
|
|
61
|
+
* GET handler to show current campaign dates
|
|
62
|
+
*/
|
|
63
|
+
const GET = async (req, res) => {
|
|
64
|
+
const promotionService = framework_1.container.resolve(utils_1.Modules.PROMOTION);
|
|
65
|
+
const now = new Date();
|
|
66
|
+
try {
|
|
67
|
+
const allCampaigns = await promotionService.listCampaigns({});
|
|
68
|
+
const campaignDates = allCampaigns.map((campaign) => {
|
|
69
|
+
const startsAt = new Date(campaign.starts_at);
|
|
70
|
+
const endsAt = new Date(campaign.ends_at);
|
|
71
|
+
const isActive = startsAt <= now && endsAt >= now;
|
|
72
|
+
return {
|
|
73
|
+
id: campaign.id,
|
|
74
|
+
name: campaign.name,
|
|
75
|
+
starts_at: campaign.starts_at,
|
|
76
|
+
ends_at: campaign.ends_at,
|
|
77
|
+
isActive,
|
|
78
|
+
reason: !isActive
|
|
79
|
+
? (startsAt > now ? "Not started yet" : "Already ended")
|
|
80
|
+
: "Active",
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
res.status(200).json({
|
|
84
|
+
currentTime: now.toISOString(),
|
|
85
|
+
campaigns: campaignDates,
|
|
86
|
+
summary: {
|
|
87
|
+
total: campaignDates.length,
|
|
88
|
+
active: campaignDates.filter((c) => c.isActive).length,
|
|
89
|
+
notStarted: campaignDates.filter((c) => c.reason === "Not started yet").length,
|
|
90
|
+
ended: campaignDates.filter((c) => c.reason === "Already ended").length,
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error("Error checking campaign dates:", error);
|
|
96
|
+
res.status(500).json({
|
|
97
|
+
error: "Failed to check campaign dates",
|
|
98
|
+
details: error instanceof Error ? error.message : String(error),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
exports.GET = GET;
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2NhbXBhaWducy9maXgtZGF0ZXMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQStFO0FBQy9FLHFEQUFvRDtBQUNwRCw0REFBc0U7QUFFdEU7O0dBRUc7QUFDSSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsTUFBTSxnQkFBZ0IsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFOUQsSUFBSSxDQUFDO1FBQ0gsb0JBQW9CO1FBQ3BCLE1BQU0sWUFBWSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTlELE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxZQUFZLENBQUMsTUFBTSxtQkFBbUIsQ0FBQyxDQUFDO1FBRTdELE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBRTVCLHVEQUF1RDtRQUN2RCxLQUFLLE1BQU0sUUFBUSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQztnQkFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLG9DQUF1QixDQUFDLEdBQUcsQ0FBQztvQkFDL0MsS0FBSyxFQUFFO3dCQUNMLGFBQWEsRUFBRTs0QkFDYjtnQ0FDRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUU7Z0NBQ2YsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDO2dDQUMzQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUM7NkJBQzFDO3lCQUNGO3FCQUNGO2lCQUNGLENBQUMsQ0FBQztnQkFFSCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7b0JBQ3BCLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTtvQkFDZixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7b0JBQ25CLGFBQWEsRUFBRSxRQUFRLENBQUMsU0FBUztvQkFDakMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxPQUFPO29CQUM3QixhQUFhLEVBQUUsc0JBQXNCO29CQUNyQyxXQUFXLEVBQUUsc0JBQXNCO2lCQUNwQyxDQUFDLENBQUM7Z0JBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUQsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsUUFBUSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RFLENBQUM7UUFDSCxDQUFDO1FBRUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUUsV0FBVyxnQkFBZ0IsQ0FBQyxNQUFNLFlBQVk7WUFDdkQsU0FBUyxFQUFFLGdCQUFnQjtTQUM1QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsS0FBSyxFQUFFLDhCQUE4QjtZQUNyQyxPQUFPLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUNoRSxDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBckRXLFFBQUEsSUFBSSxRQXFEZjtBQUVGOztHQUVHO0FBQ0ksTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0sZ0JBQWdCLEdBQUcscUJBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFFdkIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxZQUFZLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFOUQsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQ3ZELE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QyxNQUFNLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsTUFBTSxRQUFRLEdBQUcsUUFBUSxJQUFJLEdBQUcsSUFBSSxNQUFNLElBQUksR0FBRyxDQUFDO1lBRWxELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFO2dCQUNmLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTO2dCQUM3QixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87Z0JBQ3pCLFFBQVE7Z0JBQ1IsTUFBTSxFQUFFLENBQUMsUUFBUTtvQkFDZixDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO29CQUN4RCxDQUFDLENBQUMsUUFBUTthQUNiLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25CLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFO1lBQzlCLFNBQVMsRUFBRSxhQUFhO1lBQ3hCLE9BQU8sRUFBRTtnQkFDUCxLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU07Z0JBQzNCLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTTtnQkFDM0QsVUFBVSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssaUJBQWlCLENBQUMsQ0FBQyxNQUFNO2dCQUNuRixLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxlQUFlLENBQUMsQ0FBQyxNQUFNO2FBQzdFO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25CLEtBQUssRUFBRSxnQ0FBZ0M7WUFDdkMsT0FBTyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDaEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQztBQXpDVyxRQUFBLEdBQUcsT0F5Q2QifQ==
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = exports.POST = void 0;
|
|
4
|
+
const framework_1 = require("@medusajs/framework");
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const custom_campaigns_1 = require("../../../../modules/custom-campaigns");
|
|
7
|
+
const campaign_type_enum_1 = require("../../../../modules/custom-campaigns/types/campaign-type.enum");
|
|
8
|
+
/**
|
|
9
|
+
* POST handler to sync existing campaigns with custom campaign types
|
|
10
|
+
* This creates the missing custom_campaign_type records for existing campaigns
|
|
11
|
+
*/
|
|
12
|
+
const POST = async (req, res) => {
|
|
13
|
+
const customCampaignModuleService = framework_1.container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
|
|
14
|
+
const promotionService = framework_1.container.resolve(utils_1.Modules.PROMOTION);
|
|
15
|
+
try {
|
|
16
|
+
// Get all campaigns from promotion service
|
|
17
|
+
const allCampaigns = await promotionService.listCampaigns({});
|
|
18
|
+
console.log(`Found ${allCampaigns.length} total campaigns`);
|
|
19
|
+
// Get existing custom campaign types
|
|
20
|
+
const existingTypes = await customCampaignModuleService.listCustomCampaignTypes({});
|
|
21
|
+
const existingCampaignIds = new Set(existingTypes.map((ct) => ct.campaign_id));
|
|
22
|
+
console.log(`Found ${existingTypes.length} existing custom campaign types`);
|
|
23
|
+
const created = [];
|
|
24
|
+
const skipped = [];
|
|
25
|
+
// Create custom campaign types for campaigns that don't have them
|
|
26
|
+
for (const campaign of allCampaigns) {
|
|
27
|
+
if (existingCampaignIds.has(campaign.id)) {
|
|
28
|
+
skipped.push({
|
|
29
|
+
id: campaign.id,
|
|
30
|
+
name: campaign.name,
|
|
31
|
+
reason: "Already has custom campaign type",
|
|
32
|
+
});
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
// Determine type based on campaign name or identifier
|
|
37
|
+
let type = campaign_type_enum_1.CampaignTypeEnum.FlashSale; // Default to flash sale
|
|
38
|
+
const nameLower = campaign.name?.toLowerCase() || "";
|
|
39
|
+
const identifierLower = campaign.campaign_identifier?.toLowerCase() || "";
|
|
40
|
+
if (nameLower.includes("bogo") ||
|
|
41
|
+
nameLower.includes("buy") && nameLower.includes("get") ||
|
|
42
|
+
identifierLower.includes("buy-x-get-y")) {
|
|
43
|
+
type = campaign_type_enum_1.CampaignTypeEnum.BuyXGetY;
|
|
44
|
+
}
|
|
45
|
+
const result = await customCampaignModuleService.createCustomCampaignTypes({
|
|
46
|
+
campaign_id: campaign.id,
|
|
47
|
+
type: type,
|
|
48
|
+
});
|
|
49
|
+
created.push({
|
|
50
|
+
id: campaign.id,
|
|
51
|
+
name: campaign.name,
|
|
52
|
+
type: type,
|
|
53
|
+
custom_type_id: result.id,
|
|
54
|
+
});
|
|
55
|
+
console.log(`✅ Created custom type for campaign: ${campaign.name} (${type})`);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error(`❌ Failed to create custom type for campaign ${campaign.id}:`, error);
|
|
59
|
+
skipped.push({
|
|
60
|
+
id: campaign.id,
|
|
61
|
+
name: campaign.name,
|
|
62
|
+
reason: error instanceof Error ? error.message : "Unknown error",
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
res.status(200).json({
|
|
67
|
+
success: true,
|
|
68
|
+
message: `Synced ${created.length} campaigns`,
|
|
69
|
+
created,
|
|
70
|
+
skipped,
|
|
71
|
+
summary: {
|
|
72
|
+
totalCampaigns: allCampaigns.length,
|
|
73
|
+
existingTypes: existingTypes.length,
|
|
74
|
+
newlyCreated: created.length,
|
|
75
|
+
skipped: skipped.length,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
console.error("Error syncing campaigns:", error);
|
|
81
|
+
res.status(500).json({
|
|
82
|
+
error: "Failed to sync campaigns",
|
|
83
|
+
details: error instanceof Error ? error.message : String(error),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
exports.POST = POST;
|
|
88
|
+
/**
|
|
89
|
+
* GET handler to check sync status
|
|
90
|
+
*/
|
|
91
|
+
const GET = async (req, res) => {
|
|
92
|
+
const customCampaignModuleService = framework_1.container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
|
|
93
|
+
const promotionService = framework_1.container.resolve(utils_1.Modules.PROMOTION);
|
|
94
|
+
try {
|
|
95
|
+
// Get all campaigns and custom types
|
|
96
|
+
const allCampaigns = await promotionService.listCampaigns({});
|
|
97
|
+
const customTypes = await customCampaignModuleService.listCustomCampaignTypes({});
|
|
98
|
+
// Map custom types by campaign ID
|
|
99
|
+
const typeMap = new Map(customTypes.map((ct) => [ct.campaign_id, ct]));
|
|
100
|
+
// Check which campaigns have custom types
|
|
101
|
+
const campaignStatus = allCampaigns.map((campaign) => {
|
|
102
|
+
const customType = typeMap.get(campaign.id);
|
|
103
|
+
return {
|
|
104
|
+
id: campaign.id,
|
|
105
|
+
name: campaign.name,
|
|
106
|
+
campaign_identifier: campaign.campaign_identifier,
|
|
107
|
+
hasCustomType: !!customType,
|
|
108
|
+
customType: customType ? {
|
|
109
|
+
id: customType.id,
|
|
110
|
+
type: customType.type,
|
|
111
|
+
} : null,
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
const withCustomType = campaignStatus.filter((c) => c.hasCustomType);
|
|
115
|
+
const withoutCustomType = campaignStatus.filter((c) => !c.hasCustomType);
|
|
116
|
+
res.status(200).json({
|
|
117
|
+
summary: {
|
|
118
|
+
totalCampaigns: allCampaigns.length,
|
|
119
|
+
withCustomType: withCustomType.length,
|
|
120
|
+
withoutCustomType: withoutCustomType.length,
|
|
121
|
+
},
|
|
122
|
+
withCustomType,
|
|
123
|
+
withoutCustomType,
|
|
124
|
+
recommendation: withoutCustomType.length > 0
|
|
125
|
+
? "Run POST /admin/campaigns/sync to create missing custom types"
|
|
126
|
+
: "All campaigns have custom types",
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
console.error("Error checking sync status:", error);
|
|
131
|
+
res.status(500).json({
|
|
132
|
+
error: "Failed to check sync status",
|
|
133
|
+
details: error instanceof Error ? error.message : String(error),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
exports.GET = GET;
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2NhbXBhaWducy9zeW5jL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUErRTtBQUMvRSxxREFBb0Q7QUFDcEQsMkVBQThFO0FBRTlFLHNHQUFpRztBQUVqRzs7O0dBR0c7QUFDSSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsTUFBTSwyQkFBMkIsR0FDL0IscUJBQVMsQ0FBQyxPQUFPLENBQThCLHlDQUFzQixDQUFDLENBQUM7SUFDekUsTUFBTSxnQkFBZ0IsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFOUQsSUFBSSxDQUFDO1FBQ0gsMkNBQTJDO1FBQzNDLE1BQU0sWUFBWSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxZQUFZLENBQUMsTUFBTSxrQkFBa0IsQ0FBQyxDQUFDO1FBRTVELHFDQUFxQztRQUNyQyxNQUFNLGFBQWEsR0FBRyxNQUFNLDJCQUEyQixDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDL0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLGFBQWEsQ0FBQyxNQUFNLGlDQUFpQyxDQUFDLENBQUM7UUFFNUUsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25CLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUVuQixrRUFBa0U7UUFDbEUsS0FBSyxNQUFNLFFB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
|
|
@@ -5,6 +5,7 @@ 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
7
|
const updateCustomFlashSaleWorkflow_1 = require("../../../../workflows/custom-campaign/updateCustomFlashSaleWorkflow");
|
|
8
|
+
const custom_campaigns_1 = require("../../../../modules/custom-campaigns");
|
|
8
9
|
/**
|
|
9
10
|
* GET handler for fetching a specific flash sale by ID
|
|
10
11
|
*/
|
|
@@ -13,61 +14,75 @@ const GET = async (req, res) => {
|
|
|
13
14
|
if (!id) {
|
|
14
15
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Campaign ID is required");
|
|
15
16
|
}
|
|
16
|
-
const
|
|
17
|
+
const customCampaignModuleService = framework_1.container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
|
|
17
18
|
const productService = framework_1.container.resolve(utils_1.Modules.PRODUCT);
|
|
19
|
+
const promotionService = framework_1.container.resolve(utils_1.Modules.PROMOTION);
|
|
18
20
|
try {
|
|
21
|
+
console.log(`Fetching flash sale with ID: ${id}`);
|
|
19
22
|
// First, find the custom campaign type by campaign ID
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
campaign_id: id,
|
|
32
|
-
},
|
|
23
|
+
const customCampaignTypes = await customCampaignModuleService.listCustomCampaignTypes({
|
|
24
|
+
type: campaign_type_enum_1.CampaignTypeEnum.FlashSale,
|
|
25
|
+
campaign_id: id,
|
|
26
|
+
});
|
|
27
|
+
console.log(`Found ${customCampaignTypes.length} campaign types for ID ${id}`);
|
|
28
|
+
if (customCampaignTypes.length === 0) {
|
|
29
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Flash sale with ID ${id} not found`);
|
|
30
|
+
}
|
|
31
|
+
// Fetch the campaign from promotion service
|
|
32
|
+
const campaign = await promotionService.retrieveCampaign(id, {
|
|
33
|
+
relations: ["promotions", "promotions.application_method", "promotions.application_method.target_rules"],
|
|
33
34
|
});
|
|
34
|
-
const campaign = customCampaignTypes.campaign;
|
|
35
35
|
if (!campaign) {
|
|
36
36
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Flash sale with ID ${id} not found`);
|
|
37
37
|
}
|
|
38
38
|
// Fetch promotion usage limits for the campaign
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
filters: {
|
|
43
|
-
campaign_id: id,
|
|
44
|
-
},
|
|
39
|
+
console.log(`Fetching promotion usage limits for campaign ${id}`);
|
|
40
|
+
const promotionUsageLimits = await customCampaignModuleService.listPromotionUsageLimits({
|
|
41
|
+
campaign_id: id,
|
|
45
42
|
});
|
|
43
|
+
console.log(`Found ${promotionUsageLimits.length} promotion usage limits`);
|
|
46
44
|
// Create a map of promotion usage limits by promotion ID
|
|
47
45
|
const promotionLimitsMap = new Map();
|
|
48
46
|
promotionUsageLimits.forEach((limit) => {
|
|
49
47
|
promotionLimitsMap.set(limit.promotion_id, limit);
|
|
48
|
+
console.log(` Limit for promotion ${limit.promotion_id}: ${limit.limit} (used: ${limit.used})`);
|
|
50
49
|
});
|
|
51
50
|
// Process promotions to extract product information
|
|
52
51
|
const products = [];
|
|
53
52
|
for await (const promotion of campaign.promotions ?? []) {
|
|
53
|
+
console.log(`Processing promotion ${promotion.id}`);
|
|
54
54
|
if (!promotion.application_method?.target_rules?.length) {
|
|
55
|
+
console.log(` No target rules for promotion ${promotion.id}`);
|
|
55
56
|
continue;
|
|
56
57
|
}
|
|
57
58
|
const productRule = promotion.application_method.target_rules.find((rule) => rule.attribute === "items.product.id" && rule.operator === "eq");
|
|
58
59
|
const promotionLimit = promotionLimitsMap.get(promotion.id);
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
60
|
+
if (!promotionLimit) {
|
|
61
|
+
console.log(` No usage limit found for promotion ${promotion.id}`);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (!promotionLimit.product_id) {
|
|
65
|
+
console.log(` No product_id in usage limit for promotion ${promotion.id}`);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const product = await productService.retrieveProduct(promotionLimit.product_id);
|
|
70
|
+
if (productRule && promotion.application_method.value !== undefined) {
|
|
71
|
+
products.push({
|
|
72
|
+
product: {
|
|
73
|
+
id: product.id,
|
|
74
|
+
title: product.title,
|
|
75
|
+
},
|
|
76
|
+
discountType: promotion.application_method?.type,
|
|
77
|
+
discountValue: promotion.application_method?.value,
|
|
78
|
+
maxQty: promotion.application_method?.max_quantity,
|
|
79
|
+
limit: promotionLimit?.limit,
|
|
80
|
+
});
|
|
81
|
+
console.log(` Added product ${product.title} to response`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (productError) {
|
|
85
|
+
console.error(` Error fetching product ${promotionLimit.product_id}:`, productError);
|
|
71
86
|
}
|
|
72
87
|
}
|
|
73
88
|
res.status(200).json({
|
|
@@ -116,4 +131,4 @@ const PUT = async (req, res) => {
|
|
|
116
131
|
}
|
|
117
132
|
};
|
|
118
133
|
exports.PUT = PUT;
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ZsYXNoLXNhbGVzL1tpZF0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQStFO0FBQy9FLHFEQUltQztBQUNuQyxzR0FBaUc7QUFFakcsdUhBQW9IO0FBQ3BILDJFQUE4RTtBQUc5RTs7R0FFRztBQUNJLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNuRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUUxQixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDUixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix5QkFBeUIsQ0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLDJCQUEyQixHQUMvQixxQkFBUyxDQUFDLE9BQU8sQ0FBOEIseUNBQXNCLENBQUMsQ0FBQztJQUN6RSxNQUFNLGNBQWMsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUQsTUFBTSxnQkFBZ0IsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFOUQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVsRCxzREFBc0Q7UUFDdEQsTUFBTSxtQkFBbUIsR0FDdkIsTUFBTSwyQkFBMkIsQ0FBQyx1QkFBdUIsQ0FBQztZQUN4RCxJQUFJLEVBQUUscUNBQWdCLENBQUMsU0FBUztZQUNoQyxXQUFXLEVBQUUsRUFBRTtTQUNoQixDQUFDLENBQUM7UUFFTCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsbUJBQW1CLENBQUMsTUFBTSww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
|