@lodashventure/medusa-campaign 1.4.22 → 1.4.24

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.
@@ -5,13 +5,26 @@ 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 custom_campaigns_1 = require("../../../modules/custom-campaigns");
8
+ const USABLE_PROMO_MODULE = "usable_promotion";
9
+ const PROMOTION_CACHE_MODULE = "promotion_cache";
10
+ const resolveOptional = (token) => {
11
+ try {
12
+ return framework_1.container.resolve(token);
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ };
8
18
  /**
9
- * GET handler for listing all active campaigns (Flash Sales + Buy X Get Y) for storefront
19
+ * GET handler for listing all active campaigns (Flash Sales + Buy X Get Y + Coupon) for storefront
10
20
  */
11
21
  const GET = async (req, res) => {
12
22
  const customCampaignModuleService = framework_1.container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
13
23
  const promotionService = framework_1.container.resolve(utils_1.Modules.PROMOTION);
14
24
  const productService = framework_1.container.resolve(utils_1.Modules.PRODUCT);
25
+ const usablePromoService = resolveOptional(USABLE_PROMO_MODULE);
26
+ const promotionCacheService = resolveOptional(PROMOTION_CACHE_MODULE);
27
+ const customerId = req?.auth_context?.actor_id;
15
28
  const now = new Date();
16
29
  try {
17
30
  // Get the campaign type filter from query params (optional)
@@ -80,6 +93,54 @@ const GET = async (req, res) => {
80
93
  });
81
94
  // Create a map of campaign_id to campaign_type
82
95
  const campaignTypeMap = new Map(customCampaignTypes.map((ct) => [ct.campaign_id, ct.type]));
96
+ const campaignDetails = await customCampaignModuleService.listCampaignDetails({
97
+ campaign_id: campaignIds,
98
+ });
99
+ const campaignDetailMap = new Map(campaignDetails.map((detail) => [detail.campaign_id, detail]));
100
+ const couponCampaignIds = customCampaignTypes
101
+ .filter((ct) => ct.type === campaign_type_enum_1.CampaignTypeEnum.Coupon)
102
+ .map((ct) => ct.campaign_id);
103
+ const couponPromotionsByCampaign = new Map();
104
+ let couponPromotionIds = [];
105
+ if (couponCampaignIds.length > 0) {
106
+ const couponPromotions = await promotionService.listPromotions({
107
+ campaign_id: { $in: couponCampaignIds },
108
+ }, {
109
+ relations: ["application_method"],
110
+ });
111
+ couponPromotionIds = couponPromotions.map((promotion) => promotion.id);
112
+ couponPromotions.forEach((promotion) => {
113
+ if (!promotion.campaign_id) {
114
+ return;
115
+ }
116
+ const existing = couponPromotionsByCampaign.get(promotion.campaign_id);
117
+ if (existing) {
118
+ existing.push(promotion);
119
+ }
120
+ else {
121
+ couponPromotionsByCampaign.set(promotion.campaign_id, [promotion]);
122
+ }
123
+ });
124
+ }
125
+ const usablePromotions = usablePromoService
126
+ ? await usablePromoService.listUsablePromotions({
127
+ promotion_id: couponPromotionIds,
128
+ })
129
+ : [];
130
+ const usableMap = new Map(usablePromotions.map((usable) => [usable.promotion_id, usable.enabled]));
131
+ const collectedMap = new Map();
132
+ if (customerId && promotionCacheService) {
133
+ await Promise.all(couponPromotionIds.map(async (promotionId) => {
134
+ try {
135
+ const cacheKey = `user:${customerId}:promotion:${promotionId}`;
136
+ const collected = await promotionCacheService.exists(cacheKey);
137
+ collectedMap.set(promotionId, collected);
138
+ }
139
+ catch (error) {
140
+ console.error(`[Campaign] Failed to determine collected status for promotion ${promotionId}:`, error);
141
+ }
142
+ }));
143
+ }
83
144
  // Process ALL campaigns first (without date filter) for debugging
84
145
  const allProcessedCampaigns = await Promise.all(campaigns.map(async (campaign) => {
85
146
  const startsAt = new Date(campaign.starts_at);
@@ -91,7 +152,9 @@ const GET = async (req, res) => {
91
152
  console.log(` Active: ${isActive}`);
92
153
  const campaignType = campaignTypeMap.get(campaign.id);
93
154
  // Fetch products for flash-sale campaigns
94
- let products = [];
155
+ let products;
156
+ let summary;
157
+ let coupons;
95
158
  if (campaignType === campaign_type_enum_1.CampaignTypeEnum.FlashSale) {
96
159
  try {
97
160
  // Fetch promotion usage limits for this campaign
@@ -103,6 +166,7 @@ const GET = async (req, res) => {
103
166
  promotionUsageLimits.forEach((limit) => {
104
167
  promotionLimitsMap.set(limit.promotion_id, limit);
105
168
  });
169
+ const flashSaleProducts = [];
106
170
  // Process promotions to extract product information
107
171
  for (const promotion of campaign.promotions ?? []) {
108
172
  if (!promotion.application_method?.target_rules?.length) {
@@ -118,7 +182,7 @@ const GET = async (req, res) => {
118
182
  relations: ["images"],
119
183
  });
120
184
  if (promotion.application_method.value !== undefined) {
121
- products.push({
185
+ flashSaleProducts.push({
122
186
  product: {
123
187
  id: product.id,
124
188
  title: product.title,
@@ -132,6 +196,10 @@ const GET = async (req, res) => {
132
196
  maxQty: promotion.application_method?.max_quantity ?? 0,
133
197
  limit: promotionLimit?.limit ?? 0,
134
198
  used: promotionLimit?.used ?? 0,
199
+ remaining: typeof promotionLimit?.limit === "number" &&
200
+ typeof promotionLimit?.used === "number"
201
+ ? Math.max(promotionLimit.limit - promotionLimit.used, 0)
202
+ : null,
135
203
  });
136
204
  }
137
205
  }
@@ -139,11 +207,75 @@ const GET = async (req, res) => {
139
207
  console.error(`Error fetching product ${promotionLimit.product_id}:`, error);
140
208
  }
141
209
  }
210
+ products = flashSaleProducts;
211
+ const aggregate = promotionUsageLimits.reduce((acc, limit) => {
212
+ acc.product_count += 1;
213
+ acc.total_limit += limit.limit ?? 0;
214
+ acc.total_used += limit.used ?? 0;
215
+ if (typeof limit.limit === "number" &&
216
+ typeof limit.used === "number") {
217
+ const remaining = Math.max(limit.limit - limit.used, 0);
218
+ acc.total_remaining += remaining;
219
+ if (remaining > 0) {
220
+ acc.active_product_count += 1;
221
+ }
222
+ }
223
+ return acc;
224
+ }, {
225
+ product_count: 0,
226
+ active_product_count: 0,
227
+ total_limit: 0,
228
+ total_used: 0,
229
+ total_remaining: 0,
230
+ });
231
+ summary = {
232
+ type: "flash-sale",
233
+ ...aggregate,
234
+ };
142
235
  }
143
236
  catch (error) {
144
237
  console.error(`Error fetching products for campaign ${campaign.id}:`, error);
145
238
  }
146
239
  }
240
+ else if (campaignType === campaign_type_enum_1.CampaignTypeEnum.Coupon) {
241
+ try {
242
+ const campaignCoupons = couponPromotionsByCampaign.get(campaign.id) ?? [];
243
+ const availableCoupons = campaignCoupons
244
+ .filter((promotion) => promotion.status === "active" && !promotion.is_automatic)
245
+ .map((promotion) => {
246
+ const isCollectable = usableMap.has(promotion.id)
247
+ ? usableMap.get(promotion.id)
248
+ : true;
249
+ const isCollected = collectedMap.get(promotion.id) ?? false;
250
+ return {
251
+ id: promotion.id,
252
+ code: promotion.code,
253
+ description: campaign.description,
254
+ discount_type: promotion.application_method?.type,
255
+ discount_value: promotion.application_method?.value,
256
+ allocation: promotion.application_method?.allocation,
257
+ target_type: promotion.application_method?.target_type,
258
+ currency_code: promotion.application_method?.currency_code,
259
+ is_collectable: isCollectable,
260
+ is_collected: isCollected,
261
+ collect_endpoint: "/store/customers/me/coupons",
262
+ collect_payload: {
263
+ coupon_id: promotion.id,
264
+ },
265
+ };
266
+ });
267
+ coupons = availableCoupons;
268
+ summary = {
269
+ type: "coupon",
270
+ coupon_count: availableCoupons.length,
271
+ collectable_count: availableCoupons.filter((coupon) => coupon.is_collectable && !coupon.is_collected).length,
272
+ collected_count: availableCoupons.filter((coupon) => coupon.is_collected).length,
273
+ };
274
+ }
275
+ catch (error) {
276
+ console.error(`Error building coupons for campaign ${campaign.id}:`, error);
277
+ }
278
+ }
147
279
  return {
148
280
  id: campaign.id,
149
281
  name: campaign.name,
@@ -154,6 +286,9 @@ const GET = async (req, res) => {
154
286
  campaign_type: campaignType,
155
287
  is_active: isActive,
156
288
  products,
289
+ coupons,
290
+ summary,
291
+ campaign_detail: campaignDetailMap.get(campaign.id) ?? null,
157
292
  };
158
293
  }));
159
294
  // Filter for active campaigns
@@ -196,4 +331,4 @@ const GET = async (req, res) => {
196
331
  }
197
332
  };
198
333
  exports.GET = GET;
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2NhbXBhaWducy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBK0U7QUFDL0UscURBQW9EO0FBQ3BELG1HQUE4RjtBQUM5Rix3RUFBMkU7QUFHM0U7O0dBRUc7QUFDSSxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDbkUsTUFBTSwyQkFBMkIsR0FDL0IscUJBQVMsQ0FBQyxPQUFPLENBQThCLHlDQUFzQixDQUFDLENBQUM7SUFDekUsTUFBTSxnQkFBZ0IsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUQsTUFBTSxjQUFjLEdBQUcscUJBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFELE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFFdkIsSUFBSSxDQUFDO1FBQ0gsNERBQTREO1FBQzVELE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBb0MsQ0FBQztRQUVyRSxNQUFNLE9BQU8sR0FBUSxFQUFFLENBQUM7UUFDeEIsSUFBSSxZQUFZLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxxQ0FBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzNFLE9BQU8sQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO1FBQzlCLENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsRUFBRSxZQUFZLENBQUMs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
334
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2NhbXBhaWducy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBK0U7QUFDL0UscURBQW9EO0FBQ3BELG1HQUE4RjtBQUM5Rix3RUFBMkU7QUFpQjNFLE1BQU0sbUJBQW1CLEdBQUcsa0JBQWtCLENBQUM7QUFDL0MsTUFBTSxzQkFBc0IsR0FBRyxpQkFBaUIsQ0FBQztBQUVqRCxNQUFNLGVBQWUsR0FBRyxDQUFJLEtBQWEsRUFBWSxFQUFFO0lBQ3JELElBQUksQ0FBQztRQUNILE9BQU8scUJBQVMsQ0FBQyxPQUFPLENBQUksS0FBSyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0ksTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0sMkJBQTJCLEdBQy9CLHFCQUFTLENBQUMsT0FBTyxDQUE4Qix5Q0FBc0IsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sZ0JBQWdCLEdBQUcscUJBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlELE1BQU0sY0FBYyxHQUFHLHFCQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxRCxNQUFNLGtCQUFrQixHQUN0QixlQUFlLENBQTJCLG1CQUFtQixDQUFDLENBQUM7SUFDakUsTUFBTSxxQkFBcUIsR0FDekIsZUFBZSxDQUF3QixzQkFBc0IsQ0FBQyxDQUFDO0lBRWpFLE1BQU0sVUFBVSxHQUNkLEdBQ0QsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDO0lBQzFCLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFF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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lodashventure/medusa-campaign",
3
- "version": "1.4.22",
3
+ "version": "1.4.24",
4
4
  "description": "A starter for Medusa plugins.",
5
5
  "author": "Medusa (https://medusajs.com)",
6
6
  "license": "MIT",
@@ -101,9 +101,61 @@ export const GET = async (req: MedusaRequest, res: MedusaResponse) => {
101
101
 
102
102
  console.log(`Found ${campaigns.length} campaigns from promotion service`);
103
103
 
104
+ const promotionUsageLimits =
105
+ await customCampaignModuleService.listPromotionUsageLimits({
106
+ campaign_id: campaignIds,
107
+ });
108
+
109
+ const usageSummaryByCampaign = new Map<
110
+ string,
111
+ {
112
+ product_count: number;
113
+ active_product_count: number;
114
+ total_limit: number;
115
+ total_used: number;
116
+ total_remaining: number;
117
+ }
118
+ >();
119
+
120
+ for (const limit of promotionUsageLimits) {
121
+ const summary =
122
+ usageSummaryByCampaign.get(limit.campaign_id) ?? {
123
+ product_count: 0,
124
+ active_product_count: 0,
125
+ total_limit: 0,
126
+ total_used: 0,
127
+ total_remaining: 0,
128
+ };
129
+
130
+ summary.product_count += 1;
131
+ summary.total_limit += limit.limit ?? 0;
132
+ summary.total_used += limit.used ?? 0;
133
+ if (typeof limit.limit === "number" && typeof limit.used === "number") {
134
+ const remaining = Math.max(limit.limit - limit.used, 0);
135
+ summary.total_remaining += remaining;
136
+ if (remaining > 0) {
137
+ summary.active_product_count += 1;
138
+ }
139
+ }
140
+
141
+ usageSummaryByCampaign.set(limit.campaign_id, summary);
142
+ }
143
+
144
+ const campaignsWithUsage = campaigns.map((campaign) => ({
145
+ ...campaign,
146
+ flash_sale_summary:
147
+ usageSummaryByCampaign.get(campaign.id) ?? {
148
+ product_count: 0,
149
+ active_product_count: 0,
150
+ total_limit: 0,
151
+ total_used: 0,
152
+ total_remaining: 0,
153
+ },
154
+ }));
155
+
104
156
  res.status(200).json({
105
- campaigns,
106
- count: campaigns.length,
157
+ campaigns: campaignsWithUsage,
158
+ count: campaignsWithUsage.length,
107
159
  limit: 20,
108
160
  offset: 0,
109
161
  });
@@ -0,0 +1,243 @@
1
+ import { container } from "@medusajs/framework";
2
+ import type {
3
+ MedusaNextFunction,
4
+ MedusaRequest,
5
+ MedusaResponse,
6
+ } from "@medusajs/framework/http";
7
+ import { Modules } from "@medusajs/framework/utils";
8
+ import { CUSTOM_CAMPAIGN_MODULE } from "../../modules/custom-campaigns";
9
+ import { CampaignTypeEnum } from "../../modules/custom-campaigns/types/campaign-type.enum";
10
+ import CustomCampaignModuleService from "../../modules/custom-campaigns/service";
11
+
12
+ type FlashSaleHighlight = {
13
+ campaign_id: string;
14
+ campaign_identifier?: string | null;
15
+ campaign_type: CampaignTypeEnum;
16
+ name?: string | null;
17
+ description?: string | null;
18
+ starts_at?: string | Date | null;
19
+ ends_at?: string | Date | null;
20
+ discount_type?: string | null;
21
+ discount_value?: number | null;
22
+ max_quantity?: number | null;
23
+ limit?: number | null;
24
+ used?: number | null;
25
+ remaining?: number | null;
26
+ is_sold_out: boolean;
27
+ };
28
+
29
+ export async function addFlashSaleHighlights(
30
+ req: MedusaRequest,
31
+ res: MedusaResponse,
32
+ next: MedusaNextFunction,
33
+ ) {
34
+ try {
35
+ const originalJson = res.json.bind(res);
36
+
37
+ (res as any).json = async function (payload: any) {
38
+ try {
39
+ const productIds = collectProductIds(payload);
40
+
41
+ if (productIds.length > 0) {
42
+ const highlightMap = await fetchFlashSaleHighlights(productIds);
43
+
44
+ if (payload?.product && payload.product.id) {
45
+ payload.product = enrichProductWithHighlight(
46
+ payload.product,
47
+ highlightMap.get(payload.product.id),
48
+ );
49
+ }
50
+
51
+ if (Array.isArray(payload?.products)) {
52
+ payload.products = payload.products.map((product: any) =>
53
+ enrichProductWithHighlight(
54
+ product,
55
+ product?.id ? highlightMap.get(product.id) : undefined,
56
+ ),
57
+ );
58
+ }
59
+ }
60
+ } catch (error) {
61
+ console.error(
62
+ "[Campaign] Failed to attach flash sale highlights:",
63
+ error instanceof Error ? error.message : error,
64
+ );
65
+ }
66
+
67
+ return originalJson(payload);
68
+ };
69
+
70
+ next();
71
+ } catch (middlewareError) {
72
+ console.error(
73
+ "[Campaign] addFlashSaleHighlights middleware error:",
74
+ middlewareError,
75
+ );
76
+ next(middlewareError);
77
+ }
78
+ }
79
+
80
+ function collectProductIds(payload: any): string[] {
81
+ const ids = new Set<string>();
82
+
83
+ if (payload?.product?.id) {
84
+ ids.add(payload.product.id);
85
+ }
86
+
87
+ if (Array.isArray(payload?.products)) {
88
+ for (const product of payload.products) {
89
+ if (product?.id) {
90
+ ids.add(product.id);
91
+ }
92
+ }
93
+ }
94
+
95
+ return Array.from(ids);
96
+ }
97
+
98
+ async function fetchFlashSaleHighlights(productIds: string[]) {
99
+ const result = new Map<string, FlashSaleHighlight>();
100
+
101
+ if (productIds.length === 0) {
102
+ return result;
103
+ }
104
+
105
+ const customCampaignModuleService =
106
+ container.resolve<CustomCampaignModuleService>(CUSTOM_CAMPAIGN_MODULE);
107
+
108
+ const [flashSaleTypes, promotionUsageLimits] = await Promise.all([
109
+ customCampaignModuleService.listCustomCampaignTypes({
110
+ type: CampaignTypeEnum.FlashSale,
111
+ }),
112
+ customCampaignModuleService.listPromotionUsageLimits({
113
+ product_id: productIds,
114
+ }),
115
+ ]);
116
+
117
+ const activeFlashSaleCampaignIds = new Set(
118
+ flashSaleTypes
119
+ .filter((type) => !type.deleted_at)
120
+ .map((type) => type.campaign_id),
121
+ );
122
+
123
+ if (activeFlashSaleCampaignIds.size === 0) {
124
+ return result;
125
+ }
126
+
127
+ const relevantUsageLimits = promotionUsageLimits.filter((limit) =>
128
+ activeFlashSaleCampaignIds.has(limit.campaign_id),
129
+ );
130
+
131
+ if (relevantUsageLimits.length === 0) {
132
+ return result;
133
+ }
134
+
135
+ const campaignIds = Array.from(
136
+ new Set(relevantUsageLimits.map((limit) => limit.campaign_id)),
137
+ );
138
+
139
+ const promotionService = container.resolve(Modules.PROMOTION);
140
+ const campaigns = await promotionService.listCampaigns(
141
+ { id: campaignIds },
142
+ {
143
+ relations: ["promotions", "promotions.application_method"],
144
+ },
145
+ );
146
+
147
+ const now = new Date();
148
+
149
+ for (const campaign of campaigns) {
150
+ const startsAt = campaign.starts_at ? new Date(campaign.starts_at) : null;
151
+ const endsAt = campaign.ends_at ? new Date(campaign.ends_at) : null;
152
+
153
+ if ((startsAt && startsAt > now) || (endsAt && endsAt < now)) {
154
+ continue;
155
+ }
156
+
157
+ const campaignUsageLimits = relevantUsageLimits.filter(
158
+ (limit) => limit.campaign_id === campaign.id,
159
+ );
160
+
161
+ for (const promotion of campaign.promotions ?? []) {
162
+ if (!promotion?.application_method) {
163
+ continue;
164
+ }
165
+
166
+ const usageLimit = campaignUsageLimits.find(
167
+ (limit) => limit.promotion_id === promotion.id,
168
+ );
169
+
170
+ if (!usageLimit) {
171
+ continue;
172
+ }
173
+
174
+ const canComputeRemainder =
175
+ typeof usageLimit.limit === "number" &&
176
+ typeof usageLimit.used === "number";
177
+
178
+ const remaining = canComputeRemainder
179
+ ? Math.max(usageLimit.limit - usageLimit.used, 0)
180
+ : null;
181
+
182
+ const isSoldOut =
183
+ canComputeRemainder && usageLimit.used >= usageLimit.limit;
184
+
185
+ const highlight: FlashSaleHighlight = {
186
+ campaign_id: campaign.id,
187
+ campaign_identifier: campaign.campaign_identifier,
188
+ campaign_type: CampaignTypeEnum.FlashSale,
189
+ name: campaign.name,
190
+ description: campaign.description,
191
+ starts_at: campaign.starts_at,
192
+ ends_at: campaign.ends_at,
193
+ discount_type: promotion.application_method.type,
194
+ discount_value: promotion.application_method.value,
195
+ max_quantity: promotion.application_method.max_quantity ?? null,
196
+ limit: usageLimit.limit,
197
+ used: usageLimit.used,
198
+ remaining,
199
+ is_sold_out: isSoldOut,
200
+ };
201
+
202
+ const currentHighlight = result.get(usageLimit.product_id);
203
+ if (!currentHighlight) {
204
+ result.set(usageLimit.product_id, highlight);
205
+ continue;
206
+ }
207
+
208
+ const currentEnds = currentHighlight.ends_at
209
+ ? new Date(currentHighlight.ends_at)
210
+ : null;
211
+ const incomingEnds = highlight.ends_at ? new Date(highlight.ends_at) : null;
212
+
213
+ const shouldReplace =
214
+ // Prefer highlights that end sooner (urgency)
215
+ (incomingEnds && !currentEnds) ||
216
+ (incomingEnds &&
217
+ currentEnds &&
218
+ incomingEnds.getTime() < currentEnds.getTime()) ||
219
+ // Otherwise prefer higher discount value
220
+ ((highlight.discount_value ?? 0) > (currentHighlight.discount_value ?? 0));
221
+
222
+ if (shouldReplace) {
223
+ result.set(usageLimit.product_id, highlight);
224
+ }
225
+ }
226
+ }
227
+
228
+ return result;
229
+ }
230
+
231
+ function enrichProductWithHighlight(
232
+ product: any,
233
+ highlight?: FlashSaleHighlight,
234
+ ) {
235
+ if (!product) {
236
+ return product;
237
+ }
238
+
239
+ return {
240
+ ...product,
241
+ flash_sale: highlight ?? null,
242
+ };
243
+ }
@@ -7,12 +7,13 @@ import {
7
7
  createCustomCampaignSchema,
8
8
  GetFlashSalesSchema,
9
9
  } from "./admin/flash-sales/route";
10
+ import multer from "multer";
10
11
  import {
11
12
  createCouponCampaignSchema,
12
13
  GetCouponCampaignsSchema,
13
14
  } from "./admin/coupons/route";
14
- import multer from "multer";
15
15
  import { collectCouponSchema } from "./store/customers/me/coupons/route";
16
+ import { addFlashSaleHighlights } from "./middlewares/add-flash-sale-highlights";
16
17
 
17
18
  const upload = multer({
18
19
  storage: multer.memoryStorage(),
@@ -84,4 +85,14 @@ export default defineMiddlewares([
84
85
  matcher: "/store/customers/me/coupons",
85
86
  middlewares: [validateAndTransformBody(collectCouponSchema as any)],
86
87
  },
88
+ {
89
+ methods: ["GET"],
90
+ matcher: "/store/products",
91
+ middlewares: [addFlashSaleHighlights],
92
+ },
93
+ {
94
+ methods: ["GET"],
95
+ matcher: "/store/products/:id",
96
+ middlewares: [addFlashSaleHighlights],
97
+ },
87
98
  ]);