@lodashventure/medusa-campaign 1.1.5 → 1.1.7

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.
Files changed (50) hide show
  1. package/.medusa/server/src/api/admin/buy-x-get-y/[id]/route.js +116 -0
  2. package/.medusa/server/src/api/admin/buy-x-get-y/route.js +83 -0
  3. package/.medusa/server/src/api/admin/campaigns/fix-dates/route.js +103 -0
  4. package/.medusa/server/src/api/admin/campaigns/sync/route.js +138 -0
  5. package/.medusa/server/src/api/admin/flash-sales/[id]/route.js +49 -34
  6. package/.medusa/server/src/api/admin/flash-sales/route.js +46 -19
  7. package/.medusa/server/src/api/admin/force-fix/route.js +176 -0
  8. package/.medusa/server/src/api/admin/test-campaign/route.js +132 -0
  9. package/.medusa/server/src/api/store/buy-x-get-y/[id]/route.js +109 -0
  10. package/.medusa/server/src/api/store/buy-x-get-y/products/[productId]/route.js +94 -0
  11. package/.medusa/server/src/api/store/buy-x-get-y/route.js +114 -0
  12. package/.medusa/server/src/api/store/campaigns/[id]/route.js +132 -70
  13. package/.medusa/server/src/api/store/campaigns/route.js +119 -26
  14. package/.medusa/server/src/index.js +15 -0
  15. package/.medusa/server/src/modules/custom-campaigns/migrations/Migration20251018000000.js +40 -0
  16. package/.medusa/server/src/modules/custom-campaigns/models/buy-x-get-y-config.js +20 -0
  17. package/.medusa/server/src/modules/custom-campaigns/service.js +3 -1
  18. package/.medusa/server/src/modules/custom-campaigns/types/campaign-type.enum.js +2 -1
  19. package/.medusa/server/src/subscribers/cart-updated.js +23 -0
  20. package/.medusa/server/src/subscribers/order-placed.js +9 -2
  21. package/.medusa/server/src/workflows/buy-x-get-y/applyBuyXGetYToCartWorkflow.js +150 -0
  22. package/.medusa/server/src/workflows/custom-campaign/createBuyXGetYCampaignWorkflow.js +127 -0
  23. package/.medusa/server/src/workflows/custom-campaign/updateBuyXGetYCampaignWorkflow.js +114 -0
  24. package/.medusa/server/src/workflows/custom-campaign/updateBuyXGetYUsageWorkflow.js +51 -0
  25. package/package.json +2 -2
  26. package/src/admin/components/BuyXGetYForm.tsx +422 -0
  27. package/src/api/admin/buy-x-get-y/[id]/route.ts +164 -0
  28. package/src/api/admin/buy-x-get-y/route.ts +104 -0
  29. package/src/api/admin/campaigns/fix-dates/route.ts +107 -0
  30. package/src/api/admin/campaigns/sync/route.ts +153 -0
  31. package/src/api/admin/flash-sales/[id]/route.ts +62 -36
  32. package/src/api/admin/flash-sales/route.ts +57 -21
  33. package/src/api/admin/force-fix/route.ts +184 -0
  34. package/src/api/admin/test-campaign/route.ts +141 -0
  35. package/src/api/store/buy-x-get-y/[id]/route.ts +146 -0
  36. package/src/api/store/buy-x-get-y/products/[productId]/route.ts +129 -0
  37. package/src/api/store/buy-x-get-y/route.ts +134 -0
  38. package/src/api/store/campaigns/[id]/route.ts +159 -79
  39. package/src/api/store/campaigns/route.ts +141 -30
  40. package/src/index.ts +10 -0
  41. package/src/modules/custom-campaigns/migrations/Migration20251018000000.ts +42 -0
  42. package/src/modules/custom-campaigns/models/buy-x-get-y-config.ts +19 -0
  43. package/src/modules/custom-campaigns/service.ts +2 -0
  44. package/src/modules/custom-campaigns/types/campaign-type.enum.ts +1 -0
  45. package/src/subscribers/cart-updated.ts +23 -0
  46. package/src/subscribers/order-placed.ts +9 -1
  47. package/src/workflows/buy-x-get-y/applyBuyXGetYToCartWorkflow.ts +222 -0
  48. package/src/workflows/custom-campaign/createBuyXGetYCampaignWorkflow.ts +210 -0
  49. package/src/workflows/custom-campaign/updateBuyXGetYCampaignWorkflow.ts +190 -0
  50. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2NhbXBhaWducy9maXgtZGF0ZXMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQStFO0FBQy9FLHFEQUFvRDtBQUNwRCw0REFBc0U7QUFFdEU7O0dBRUc7QUFDSSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsTUFBTSxnQkFBZ0IsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFOUQsSUFBSSxDQUFDO1FBQ0gsb0JBQW9CO1FBQ3BCLE1BQU0sWUFBWSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTlELE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxZQUFZLENBQUMsTUFBTSxtQkFBbUIsQ0FBQyxDQUFDO1FBRTdELE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBRTVCLHVEQUF1RDtRQUN2RCxLQUFLLE1BQU0sUUFBUSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQztnQkFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLG9DQUF1QixDQUFDLEdBQUcsQ0FBQztvQkFDL0MsS0FBSyxFQUFFO3dCQUNMLGFBQWEsRUFBRTs0QkFDYjtnQ0FDRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUU7Z0NBQ2YsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDO2dDQUMzQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUM7NkJBQzFDO3lCQUNGO3FCQUNGO2lCQUNGLENBQUMsQ0FBQztnQkFFSCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7b0JBQ3BCLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTtvQkFDZixJQUFJLEVBQUUs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
@@ -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 query = framework_1.container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
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 { data: [customCampaignTypes], } = await query.graph({
21
- entity: "custom_campaign_type",
22
- fields: [
23
- "id",
24
- "campaign.*",
25
- "campaign.promotions.*",
26
- "campaign.promotions.application_method.*",
27
- "campaign.promotions.application_method.target_rules.*",
28
- ],
29
- filters: {
30
- type: campaign_type_enum_1.CampaignTypeEnum.FlashSale,
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
- const { data: promotionUsageLimits } = await query.graph({
40
- entity: "promotion_usage_limit",
41
- fields: ["id", "promotion_id", "product_id", "limit", "used"],
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
- const product = await productService.retrieveProduct(promotionLimit?.product_id);
60
- if (productRule && promotion.application_method.value) {
61
- products.push({
62
- product: {
63
- id: product.id,
64
- title: product.title,
65
- },
66
- discountType: promotion.application_method?.type,
67
- discountValue: promotion.application_method?.value,
68
- maxQty: promotion.application_method?.max_quantity,
69
- limit: promotionLimitsMap.get(promotion.id)?.limit,
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ZsYXNoLXNhbGVzL1tpZF0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQStFO0FBQy9FLHFEQUltQztBQUNuQyxzR0FBaUc7QUFFakcsdUhBQW9IO0FBRXBIOztHQUVHO0FBQ0ksTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBRTFCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNSLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHlCQUF5QixDQUMxQixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLHFCQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sY0FBYyxHQUFHLHFCQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUxRCxJQUFJLENBQUM7UUFDSCxzREFBc0Q7UUFDdEQsTUFBTSxFQUNKLElBQUksRUFBRSxDQUFDLG1CQUFtQixDQUFDLEdBQzVCLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3BCLE1BQU0sRUFBRSxzQkFBc0I7WUFDOUIsTUFBTSxFQUFFO2dCQUNOLElBQUk7Z0JBQ0osWUFBWTtnQkFDWix1QkFBdUI7Z0JBQ3ZCLDBDQUEwQztnQkFDMUMsdURBQXVEO2FBQ3hEO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxxQ0FBZ0IsQ0FBQyxTQUFTO2dCQUNoQyxXQUFXLEVBQUUsRUFBRTthQUNoQjtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxHQUFHLG1C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
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ZsYXNoLXNhbGVzL1tpZF0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQStFO0FBQy9FLHFEQUltQztBQUNuQyxzR0FBaUc7QUFFakcsdUhBQW9IO0FBQ3BILDJFQUE4RTtBQUc5RTs7R0FFRztBQUNJLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNuRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUUxQixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDUixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix5QkFBeUIsQ0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLDJCQUEyQixHQUMvQixxQkFBUyxDQUFDLE9BQU8sQ0FBOEIseUNBQXNCLENBQUMsQ0FBQztJQUN6RSxNQUFNLGNBQWMsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUQsTUFBTSxnQkFBZ0IsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFOUQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVsRCxzREFBc0Q7UUFDdEQsTUFBTSxtQkFBbUIsR0FDdkIsTUFBTSwyQkFBMkIsQ0FBQyx1QkFBdUIsQ0FBQztZQUN4RCxJQUFJLEVBQUUscUNBQWdCLENBQUMsU0FBUztZQUNoQyxXQUFXLEVBQUUsRUFBRTtTQUNoQixDQUFDLENBQUM7UUFFTCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsbUJBQW1CLENBQUMsTUFBTSww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