@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,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
- // First, find the custom campaign type by campaign ID
16
- const { data: [customCampaignTypes], } = await query.graph({
17
- entity: "custom_campaign_type",
18
- fields: [
19
- "id",
20
- "campaign.*",
21
- "campaign.promotions.*",
22
- "campaign.promotions.application_method.*",
23
- "campaign.promotions.application_method.target_rules.*",
24
- ],
25
- filters: {
26
- type: campaign_type_enum_1.CampaignTypeEnum.FlashSale,
27
- campaign_id: id,
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, `Flash sale with ID ${id} 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
- // Fetch promotion usage limits for the campaign
35
- const { data: promotionUsageLimits } = await query.graph({
36
- entity: "promotion_usage_limit",
37
- fields: ["id", "promotion_id", "product_id", "limit", "used"],
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
- // Create a map of promotion usage limits by promotion ID
43
- const promotionLimitsMap = new Map();
44
- promotionUsageLimits.forEach((limit) => {
45
- promotionLimitsMap.set(limit.promotion_id, limit);
46
- });
47
- // Process promotions to extract product information
48
- const products = [];
49
- for await (const promotion of campaign.promotions ?? []) {
50
- if (!promotion.application_method?.target_rules?.length) {
51
- continue;
52
- }
53
- const productRule = promotion.application_method.target_rules.find((rule) => rule.attribute === "items.product.id" && rule.operator === "eq");
54
- const promotionLimit = promotionLimitsMap.get(promotion.id);
55
- const product = await productService.retrieveProduct(promotionLimit?.product_id);
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 flash sale:", error);
95
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "An error occurred while fetching the flash sale");
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2NhbXBhaWducy9baWRdL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUErRTtBQUMvRSxxREFJbUM7QUFDbkMsc0dBQWlHO0FBRzFGLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBa0MsRUFDbEMsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBRTFCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNSLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHlCQUF5QixDQUMxQixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLHFCQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sY0FBYyxHQUFHLHFCQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUxRCxJQUFJLENBQUM7UUFDSCxzREFBc0Q7UUFDdEQsTUFBTSxFQUNKLElBQUksRUFBRSxDQUFDLG1CQUFtQixDQUFDLEdBQzVCLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3BCLE1BQU0sRUFBRSxzQkFBc0I7WUFDOUIsTUFBTSxFQUFFO2dCQUNOLElBQUk7Z0JBQ0osWUFBWTtnQkFDWix1QkFBdUI7Z0JBQ3ZCLDBDQUEwQztnQkFDMUMsdURBQXVEO2FBQ3hEO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxxQ0FBZ0IsQ0FBQyxTQUFTO2dCQUNoQyxXQUFXLEVBQUUsRUFBRTthQUNoQjtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztRQUU5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
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 query = framework_1.container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
9
- const { data: customCampaigns, metadata: { count, take, skip } = {
10
- count: 0,
11
- take: 20,
12
- skip: 0,
13
- }, } = await query.graph({
14
- entity: "custom_campaign_type",
15
- ...req.queryConfig,
16
- fields: [
17
- "id",
18
- "campaign.name",
19
- "campaign.description",
20
- "campaign.type",
21
- "campaign.starts_at",
22
- "campaign.ends_at",
23
- ],
24
- filters: { type: campaign_type_enum_1.CampaignTypeEnum.FlashSale },
25
- });
26
- const campaigns = customCampaigns.map((campaign) => campaign.campaign);
27
- res.status(200).json({
28
- campaigns,
29
- count,
30
- limit: take,
31
- offset: skip,
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2NhbXBhaWducy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBK0U7QUFDL0UscURBQXNFO0FBQ3RFLG1HQUE4RjtBQUV2RixNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDbkUsTUFBTSxLQUFLLEdBQUcscUJBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakUsTUFBTSxFQUNKLElBQUksRUFBRSxlQUFlLEVBQ3JCLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUc7UUFDaEMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLEVBQUUsRUFBRTtRQUNSLElBQUksRUFBRSxDQUFDO0tBQ1IsR0FDRixHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztRQUNwQixNQUFNLEVBQUUsc0JBQXNCO1FBQzlCLEdBQUcsR0FBRyxDQUFDLFdBQVc7UUFDbEIsTUFBTSxFQUFFO1lBQ04sSUFBSTtZQUNKLGVBQWU7WUFDZixzQkFBc0I7WUFDdEIsZUFBZTtZQUNmLG9CQUFvQjtZQUNwQixrQkFBa0I7U0FDbkI7UUFDRCxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUscUNBQWdCLENBQUMsU0FBUyxFQUFFO0tBQzlDLENBQUMsQ0FBQztJQUVILE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV2RSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNuQixTQUFTO1FBQ1QsS0FBSztRQUNMLEtBQUssRUFBRSxJQUFJO1FBQ1gsTUFBTSxFQUFFLElBQUk7S0FDYixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUEvQlcsUUFBQSxHQUFHLE9BK0JkIn0=
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=