medusa-product-helper 0.0.18 → 0.0.19

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.
@@ -14,18 +14,44 @@ class DynamicFilterService {
14
14
  async applyFilters(options) {
15
15
  const { filterParams, options: pluginOptions, pagination, projection, context = {} } = options;
16
16
  const filterContext = { ...context, options: pluginOptions };
17
- const { queryFilters, priceRangeFilter, promotionFilter } = await this.processFilters(filterParams, filterContext);
18
- const fields = this.buildFields(projection?.fields);
17
+ console.log(`[DynamicFilterService] applyFilters called with context:`, {
18
+ hasPricingContext: !!context.pricingContext,
19
+ pricingContextKeys: context.pricingContext ? Object.keys(context.pricingContext) : []
20
+ });
21
+ const { queryFilters, priceRangeFilter, promotionFilter, metadataFilter } = await this.processFilters(filterParams, filterContext);
22
+ // Check if pricing context has currency_code before including calculated_price
23
+ const pricingContext = context?.pricingContext;
24
+ console.log(`[DynamicFilterService] Pricing context check:`, {
25
+ hasPricingContext: !!pricingContext,
26
+ currencyCode: pricingContext?.currency_code,
27
+ currencyCodeType: typeof pricingContext?.currency_code
28
+ });
29
+ const hasValidPricingContext = !!pricingContext && typeof pricingContext.currency_code === "string" && pricingContext.currency_code.trim().length > 0;
30
+ console.log(`[DynamicFilterService] Has valid pricing context:`, hasValidPricingContext);
31
+ // Build query context first to verify it's valid
19
32
  const queryContext = this.buildQueryContext(context);
33
+ console.log(`[DynamicFilterService] Query context built:`, {
34
+ hasVariants: !!queryContext.variants,
35
+ hasCalculatedPrice: !!queryContext.variants?.calculated_price,
36
+ calculatedPriceKeys: queryContext.variants?.calculated_price ? Object.keys(queryContext.variants.calculated_price) : []
37
+ });
38
+ // Only include calculated_price in fields if query context has the proper structure
39
+ // This ensures we don't request calculated_price if currency_code is missing
40
+ const hasValidQueryContext = !!(queryContext.variants?.calculated_price);
41
+ console.log(`[DynamicFilterService] Has valid query context for calculated_price:`, hasValidQueryContext);
42
+ const fields = this.buildFields(projection?.fields, hasValidQueryContext);
43
+ console.log(`[DynamicFilterService] Fields built, includes calculated_price:`, fields.some(f => f.includes("calculated_price")));
20
44
  const queryOptions = this.buildQueryOptions(queryFilters, fields, pagination, queryContext);
21
45
  const result = await this.query.graph(queryOptions);
22
46
  const { data: productsRaw = [], metadata } = result;
23
47
  let products = this.normalizeProducts(productsRaw);
24
- products = await this.applyPostQueryFilters(products, priceRangeFilter, promotionFilter);
48
+ // Extract currency_code from pricing context for currency filtering
49
+ const currencyCode = pricingContext?.currency_code;
50
+ products = await this.applyPostQueryFilters(products, priceRangeFilter, promotionFilter, metadataFilter, currencyCode);
25
51
  // Count should reflect filtered products, not initial query count
26
52
  // If post-query filters were applied, use filtered products length
27
53
  // Otherwise, use metadata count or products length
28
- const hasPostQueryFilters = priceRangeFilter || promotionFilter;
54
+ const hasPostQueryFilters = priceRangeFilter || promotionFilter || metadataFilter;
29
55
  const count = hasPostQueryFilters
30
56
  ? products.length
31
57
  : await this.getCount(queryFilters, metadata, products.length);
@@ -62,6 +88,7 @@ class DynamicFilterService {
62
88
  let queryFilters = {};
63
89
  let priceRangeFilter;
64
90
  let promotionFilter;
91
+ let metadataFilter;
65
92
  for (const [identifier, value] of Object.entries(filterParams)) {
66
93
  if (value == null)
67
94
  continue;
@@ -74,16 +101,26 @@ class DynamicFilterService {
74
101
  this.validateWithProvider(provider, value);
75
102
  const result = await Promise.resolve(provider.apply(queryFilters, value, filterContext));
76
103
  queryFilters = result;
77
- priceRangeFilter = queryFilters.__price_range_filter__;
78
- promotionFilter = queryFilters.__promotion_filter__;
104
+ // Extract special filter keys, but preserve existing values if not set by this provider
105
+ // This ensures filters work independently - each filter can be applied alone or with others
106
+ if (queryFilters.__price_range_filter__ !== undefined) {
107
+ priceRangeFilter = queryFilters.__price_range_filter__;
108
+ }
109
+ if (queryFilters.__promotion_filter__ !== undefined) {
110
+ promotionFilter = queryFilters.__promotion_filter__;
111
+ }
112
+ if (queryFilters.__metadata_filter__ !== undefined) {
113
+ metadataFilter = queryFilters.__metadata_filter__;
114
+ }
79
115
  delete queryFilters.__price_range_filter__;
80
116
  delete queryFilters.__promotion_filter__;
117
+ delete queryFilters.__metadata_filter__;
81
118
  }
82
119
  catch (error) {
83
120
  throw new Error(`Error applying filter "${identifier}": ${error}`);
84
121
  }
85
122
  }
86
- return { queryFilters, priceRangeFilter, promotionFilter };
123
+ return { queryFilters, priceRangeFilter, promotionFilter, metadataFilter };
87
124
  }
88
125
  validateWithProvider(provider, value) {
89
126
  if (provider.validate) {
@@ -94,19 +131,50 @@ class DynamicFilterService {
94
131
  }
95
132
  }
96
133
  }
97
- buildFields(requestedFields) {
134
+ buildFields(requestedFields, hasPricingContext) {
135
+ console.log(`[DynamicFilterService] buildFields called:`, {
136
+ hasPricingContext,
137
+ requestedFieldsCount: requestedFields?.length || 0
138
+ });
98
139
  const essentialRelations = [
99
- "variants.*", "variants.prices.*",
140
+ "variants.*", "variants.prices.*", // Always include all prices for multi-currency support
100
141
  "options.*", "options.values.*",
101
142
  "images.*", "collection.*", "type.*"
102
143
  ];
144
+ // Include calculated_price ONLY if pricing context is available AND valid
145
+ // This is a critical check - we should never include calculated_price without currency_code
146
+ if (hasPricingContext) {
147
+ essentialRelations.push("variants.calculated_price.*");
148
+ console.log(`[DynamicFilterService] Added calculated_price.* to essential relations`);
149
+ }
150
+ else {
151
+ console.log(`[DynamicFilterService] NOT adding calculated_price.* (hasPricingContext=false)`);
152
+ }
103
153
  if (!requestedFields?.length || requestedFields.includes("*")) {
104
- return ["*", ...essentialRelations];
154
+ const result = ["*", ...essentialRelations];
155
+ console.log(`[DynamicFilterService] Returning all fields with essential relations, includes calculated_price:`, result.some(f => f.includes("calculated_price")));
156
+ return result;
105
157
  }
106
158
  const fields = [...requestedFields];
107
159
  const has = (prefix) => fields.some(f => f.startsWith(prefix));
108
- if (!has("variants"))
109
- fields.push("variants.*", "variants.prices.*");
160
+ if (!has("variants")) {
161
+ fields.push("variants.*", "variants.prices.*"); // Always include all prices
162
+ if (hasPricingContext) {
163
+ fields.push("variants.calculated_price.*");
164
+ console.log(`[DynamicFilterService] Added calculated_price.* to fields`);
165
+ }
166
+ }
167
+ else {
168
+ // Even if variants are requested, ensure prices are included
169
+ if (!has("variants.prices")) {
170
+ fields.push("variants.prices.*");
171
+ }
172
+ // Check if calculated_price is already in requested fields
173
+ if (hasPricingContext && !has("variants.calculated_price")) {
174
+ fields.push("variants.calculated_price.*");
175
+ console.log(`[DynamicFilterService] Added calculated_price.* to fields (variants already present)`);
176
+ }
177
+ }
110
178
  if (!has("options"))
111
179
  fields.push("options.*", "options.values.*");
112
180
  if (!has("images"))
@@ -115,15 +183,66 @@ class DynamicFilterService {
115
183
  fields.push("collection.*");
116
184
  if (!has("type"))
117
185
  fields.push("type.*");
186
+ const includesCalculatedPrice = fields.some(f => f.includes("calculated_price"));
187
+ console.log(`[DynamicFilterService] Final fields include calculated_price:`, includesCalculatedPrice);
118
188
  return fields;
119
189
  }
120
190
  buildQueryContext(context) {
121
- if (context?.pricingContext) {
122
- return { variants: { calculated_price: context.pricingContext } };
191
+ const pricingContext = context?.pricingContext;
192
+ // Only include calculated_price if currency_code is present and valid in pricing context
193
+ // Medusa's calculatePrices method requires currency_code to be a non-empty string
194
+ if (pricingContext) {
195
+ const currencyCode = pricingContext.currency_code;
196
+ if (typeof currencyCode === "string" && currencyCode.trim().length > 0) {
197
+ // Ensure currency_code is trimmed and set in the context we pass to Medusa
198
+ const validPricingContext = {
199
+ ...pricingContext,
200
+ currency_code: currencyCode.trim()
201
+ };
202
+ // Double-check currency_code is present before returning
203
+ if (validPricingContext.currency_code) {
204
+ // Use QueryContext() helper to properly wrap the pricing context
205
+ // This is required by Medusa's query.graph() for calculated_price
206
+ const pricingContextForLogging = validPricingContext;
207
+ console.log(`[DynamicFilterService] Wrapping pricing context with QueryContext():`, {
208
+ currency_code: pricingContextForLogging.currency_code,
209
+ region_id: pricingContextForLogging.region_id,
210
+ allKeys: Object.keys(pricingContextForLogging)
211
+ });
212
+ const wrappedContext = (0, utils_1.QueryContext)(validPricingContext);
213
+ console.log(`[DynamicFilterService] QueryContext() returned:`, {
214
+ type: typeof wrappedContext,
215
+ isFunction: typeof wrappedContext === "function",
216
+ keys: typeof wrappedContext === "object" && wrappedContext !== null ? Object.keys(wrappedContext) : "N/A"
217
+ });
218
+ return {
219
+ variants: {
220
+ calculated_price: wrappedContext
221
+ }
222
+ };
223
+ }
224
+ }
225
+ else {
226
+ console.warn("[DynamicFilterService] Pricing context exists but currency_code is missing or invalid:", {
227
+ hasPricingContext: !!pricingContext,
228
+ currencyCodeType: typeof currencyCode,
229
+ currencyCodeValue: currencyCode
230
+ });
231
+ }
123
232
  }
124
233
  return {};
125
234
  }
126
235
  buildQueryOptions(filters, fields, pagination, queryContext) {
236
+ console.log(`[DynamicFilterService] buildQueryOptions called`);
237
+ // Note: QueryContext() wraps the pricing context, so we can't directly access currency_code
238
+ // from the wrapped object. We trust that buildQueryContext() already validated it.
239
+ // If queryContext has calculated_price, it means currency_code was validated before wrapping.
240
+ let safeQueryContext = queryContext;
241
+ if (queryContext?.variants?.calculated_price) {
242
+ // QueryContext() wraps the context, so we can't check currency_code here
243
+ // But we know it was validated in buildQueryContext() before wrapping
244
+ console.log(`[DynamicFilterService] Query context includes calculated_price (wrapped with QueryContext())`);
245
+ }
127
246
  const options = {
128
247
  entity: "product",
129
248
  fields,
@@ -150,9 +269,20 @@ class DynamicFilterService {
150
269
  skip: 0
151
270
  };
152
271
  }
153
- if (queryContext && Object.keys(queryContext).length > 0) {
154
- options.context = queryContext;
272
+ if (safeQueryContext && Object.keys(safeQueryContext).length > 0) {
273
+ options.context = safeQueryContext;
274
+ console.log(`[DynamicFilterService] Query options include context with calculated_price:`, !!safeQueryContext.variants?.calculated_price);
155
275
  }
276
+ else {
277
+ console.log(`[DynamicFilterService] Query options do not include context`);
278
+ }
279
+ console.log(`[DynamicFilterService] Final query options:`, {
280
+ entity: options.entity,
281
+ fieldsCount: options.fields?.length || 0,
282
+ hasContext: !!options.context,
283
+ hasCalculatedPrice: !!options.context?.variants?.calculated_price,
284
+ filtersCount: Object.keys(options.filters || {}).length
285
+ });
156
286
  return options;
157
287
  }
158
288
  normalizeProducts(productsRaw) {
@@ -162,46 +292,166 @@ class DynamicFilterService {
162
292
  console.warn("[DynamicFilterService] Unexpected data structure from query.graph()");
163
293
  return [];
164
294
  }
165
- async applyPostQueryFilters(products, priceRangeFilter, promotionFilter) {
295
+ async applyPostQueryFilters(products, priceRangeFilter, promotionFilter, metadataFilter, currencyCode) {
166
296
  let filteredProducts = products;
297
+ // Apply currency filter first - only include products available in the selected currency
298
+ if (currencyCode && filteredProducts.length > 0) {
299
+ console.log(`[DynamicFilterService] Applying currency filter: ${currencyCode} to ${filteredProducts.length} products`);
300
+ filteredProducts = this.filterByCurrency(filteredProducts, currencyCode);
301
+ console.log(`[DynamicFilterService] Filtered to ${filteredProducts.length} products available in ${currencyCode}`);
302
+ }
303
+ if (metadataFilter && filteredProducts.length > 0) {
304
+ filteredProducts = this.filterByMetadata(filteredProducts, metadataFilter);
305
+ }
167
306
  if (priceRangeFilter && filteredProducts.length > 0) {
168
- filteredProducts = this.filterByPriceRange(filteredProducts, priceRangeFilter);
307
+ console.log(`[DynamicFilterService] Applying price range filter:`, priceRangeFilter, `to ${filteredProducts.length} products`);
308
+ filteredProducts = this.filterByPriceRange(filteredProducts, priceRangeFilter, currencyCode);
309
+ console.log(`[DynamicFilterService] Filtered to ${filteredProducts.length} products`);
169
310
  }
170
311
  if (promotionFilter && filteredProducts.length > 0) {
171
312
  filteredProducts = await this.filterByPromotion(filteredProducts, promotionFilter);
172
313
  }
173
314
  return filteredProducts;
174
315
  }
175
- filterByPriceRange(products, priceRangeFilter) {
316
+ filterByMetadata(products, metadataFilter) {
176
317
  return products.filter(product => {
318
+ const productMetadata = product.metadata || {};
319
+ // Check each metadata filter criteria
320
+ for (const [key, filterValue] of Object.entries(metadataFilter)) {
321
+ const productValue = productMetadata[key];
322
+ // If product doesn't have this metadata key, it doesn't match
323
+ if (productValue === undefined || productValue === null) {
324
+ return false;
325
+ }
326
+ // Handle array filter values (e.g., metadata[color]=["red","blue"])
327
+ if (Array.isArray(filterValue)) {
328
+ // Product value should be in the filter array
329
+ if (Array.isArray(productValue)) {
330
+ // Both are arrays - check if any product value matches any filter value
331
+ const matches = productValue.some((pv) => filterValue.some((fv) => this.metadataValuesMatch(pv, fv)));
332
+ if (!matches)
333
+ return false;
334
+ }
335
+ else {
336
+ // Product value is single, filter is array - check if product value matches any filter value
337
+ const matches = filterValue.some((fv) => this.metadataValuesMatch(productValue, fv));
338
+ if (!matches)
339
+ return false;
340
+ }
341
+ }
342
+ else {
343
+ // Single value filter
344
+ if (Array.isArray(productValue)) {
345
+ // Product value is array, filter is single - check if any product value matches filter
346
+ const matches = productValue.some((pv) => this.metadataValuesMatch(pv, filterValue));
347
+ if (!matches)
348
+ return false;
349
+ }
350
+ else {
351
+ // Both are single values - direct comparison
352
+ if (!this.metadataValuesMatch(productValue, filterValue)) {
353
+ return false;
354
+ }
355
+ }
356
+ }
357
+ }
358
+ return true;
359
+ });
360
+ }
361
+ metadataValuesMatch(productValue, filterValue) {
362
+ // Normalize string comparison (case-insensitive)
363
+ if (typeof productValue === "string" && typeof filterValue === "string") {
364
+ return productValue.toLowerCase() === filterValue.toLowerCase();
365
+ }
366
+ // Direct equality for numbers and booleans
367
+ return productValue === filterValue;
368
+ }
369
+ filterByPriceRange(products, priceRangeFilter, currencyCode) {
370
+ const { min, max } = priceRangeFilter;
371
+ // Use currency_code from filter, context, or parameter (priority: filter > parameter > context)
372
+ const targetCurrency = priceRangeFilter.currency_code || currencyCode;
373
+ console.log(`[DynamicFilterService] Filtering ${products.length} products by price range: min=${min}, max=${max}, currency=${targetCurrency}`);
374
+ const filtered = products.filter(product => {
177
375
  if (!product.variants?.length)
178
376
  return false;
179
377
  return product.variants.some((variant) => {
180
- const priceInfo = this.getPriceInfo(variant);
181
- if (!priceInfo.price)
378
+ // Get all prices for this variant
379
+ const prices = variant.prices || [];
380
+ // Find price matching the target currency
381
+ const matchingPrice = prices.find((price) => {
382
+ if (!targetCurrency)
383
+ return true; // If no currency specified, use first price
384
+ return price.currency_code === targetCurrency;
385
+ });
386
+ // If no matching price found and currency is required, exclude this variant
387
+ if (targetCurrency && !matchingPrice) {
388
+ return false;
389
+ }
390
+ // Use calculated_price if available (includes price list overrides)
391
+ let priceToUse;
392
+ let currencyToUse;
393
+ if (variant.calculated_price?.calculated_amount !== undefined) {
394
+ // Only use calculated_price if it matches the target currency
395
+ if (!targetCurrency || variant.calculated_price.currency_code === targetCurrency) {
396
+ priceToUse = variant.calculated_price.calculated_amount;
397
+ currencyToUse = variant.calculated_price.currency_code;
398
+ }
399
+ }
400
+ // Fall back to regular price if calculated_price not available or doesn't match
401
+ if (priceToUse === undefined && matchingPrice) {
402
+ priceToUse = matchingPrice.amount;
403
+ currencyToUse = matchingPrice.currency_code;
404
+ }
405
+ if (priceToUse === undefined)
182
406
  return false;
183
- if (priceRangeFilter.currency_code && priceInfo.currency !== priceRangeFilter.currency_code) {
407
+ // Ensure currency matches if target currency is specified
408
+ if (targetCurrency && currencyToUse !== targetCurrency) {
184
409
  return false;
185
410
  }
186
- const { min, max } = priceRangeFilter;
187
- if (min !== undefined && priceInfo.price < min)
411
+ if (min !== undefined && priceToUse < min)
188
412
  return false;
189
- if (max !== undefined && priceInfo.price > max)
413
+ if (max !== undefined && priceToUse > max)
190
414
  return false;
191
415
  return true;
192
416
  });
193
417
  });
418
+ console.log(`[DynamicFilterService] Filtered ${products.length} products down to ${filtered.length} matching price range`);
419
+ return filtered;
420
+ }
421
+ filterByCurrency(products, currencyCode) {
422
+ console.log(`[DynamicFilterService] Filtering ${products.length} products by currency: ${currencyCode}`);
423
+ const filtered = products.filter(product => {
424
+ if (!product.variants?.length)
425
+ return false;
426
+ // Check if at least one variant has a price in the target currency
427
+ return product.variants.some((variant) => {
428
+ // Check calculated_price first (if available and matches currency)
429
+ if (variant.calculated_price?.currency_code === currencyCode) {
430
+ return true;
431
+ }
432
+ // Check regular prices
433
+ const prices = variant.prices || [];
434
+ return prices.some((price) => price.currency_code === currencyCode);
435
+ });
436
+ });
437
+ console.log(`[DynamicFilterService] Filtered ${products.length} products down to ${filtered.length} available in ${currencyCode}`);
438
+ return filtered;
194
439
  }
195
440
  getPriceInfo(variant) {
441
+ // Prioritize calculated_price if available (includes price list overrides when pricing context is provided)
196
442
  if (variant.calculated_price?.calculated_amount !== undefined) {
197
443
  return {
198
444
  price: variant.calculated_price.calculated_amount,
199
445
  currency: variant.calculated_price.currency_code
200
446
  };
201
447
  }
448
+ // Fall back to regular price if calculated_price is not available
202
449
  if (variant.prices?.[0]) {
203
450
  const price = variant.prices[0];
204
- return { price: price.amount, currency: price.currency_code };
451
+ return {
452
+ price: price.amount,
453
+ currency: price.currency_code
454
+ };
205
455
  }
206
456
  return {};
207
457
  }
@@ -219,6 +469,18 @@ class DynamicFilterService {
219
469
  console.log(`[DynamicFilterService] Extracted ${productPromotionData.productIds.size} unique product IDs from promotions`);
220
470
  console.log(`[DynamicFilterService] Found discounts for ${productPromotionData.discounts.size} products`);
221
471
  console.log(`[DynamicFilterService] Has universal promotions (no rules): ${productPromotionData.hasUniversalPromotions}`);
472
+ if (productPromotionData.universalDiscount !== undefined) {
473
+ console.log(`[DynamicFilterService] Universal discount: ${productPromotionData.universalDiscount}%`);
474
+ }
475
+ // Log discount filter criteria
476
+ if (promotionFilter.min_discount_percentage !== undefined || promotionFilter.max_discount_percentage !== undefined) {
477
+ console.log(`[DynamicFilterService] Filtering by discount: min=${promotionFilter.min_discount_percentage}, max=${promotionFilter.max_discount_percentage}`);
478
+ }
479
+ // Log sample discounts for debugging
480
+ if (productPromotionData.discounts.size > 0) {
481
+ const sampleDiscounts = Array.from(productPromotionData.discounts.entries()).slice(0, 5);
482
+ console.log(`[DynamicFilterService] Sample product discounts:`, sampleDiscounts.map(([id, discount]) => `${id.substring(0, 8)}...: ${discount}%`).join(", "));
483
+ }
222
484
  // If we have universal promotions (no rules = applies to all products)
223
485
  // or if we have product IDs, filter accordingly
224
486
  const hasProductIds = productPromotionData.productIds.size > 0;
@@ -231,22 +493,43 @@ class DynamicFilterService {
231
493
  const productId = product?.id;
232
494
  if (!productId)
233
495
  return false;
234
- // If promotion has no rules (universal), it applies to all products
235
- // Otherwise, check if product is in the promotion's product list
236
- if (hasProductIds && !productPromotionData.productIds.has(productId)) {
496
+ // Determine if this product should be included based on promotion rules
497
+ let shouldInclude = false;
498
+ let discount;
499
+ if (hasProductIds) {
500
+ // If promotion has product-specific rules, only include products in the promotion
501
+ if (productPromotionData.productIds.has(productId)) {
502
+ shouldInclude = true;
503
+ // Get discount for this product (from specific promotion)
504
+ // Don't default to 0 - if discount is undefined, the product should be excluded
505
+ discount = productPromotionData.discounts.get(productId);
506
+ }
507
+ }
508
+ else if (hasUniversalPromotions) {
509
+ // If promotion is universal (no product-specific rules), it applies to all products
510
+ // Use the universal discount - don't default to 0
511
+ discount = productPromotionData.universalDiscount;
512
+ shouldInclude = true;
513
+ }
514
+ // If product is not in any promotion, exclude it
515
+ if (!shouldInclude) {
516
+ console.log(`[DynamicFilterService] Product ${productId} is not in any promotion`);
237
517
  return false;
238
518
  }
239
- // Get discount for this product (from specific promotion or universal promotion)
240
- let discount = productPromotionData.discounts.get(productId) || 0;
241
- // If no specific discount found but we have universal promotions, use the universal discount
242
- if (discount === 0 && hasUniversalPromotions) {
243
- // Use the discount from the first universal promotion
244
- discount = productPromotionData.universalDiscount || 0;
519
+ // If product is in promotion but discount is undefined, exclude it
520
+ // This happens when discount calculation failed or promotion has no valid discount
521
+ if (discount === undefined) {
522
+ console.log(`[DynamicFilterService] Product ${productId} is in promotion but has no valid discount - excluding`);
523
+ return false;
245
524
  }
525
+ // Check if discount meets the filter criteria
246
526
  const meetsCriteria = this.meetsDiscountCriteria(discount, promotionFilter);
247
527
  if (!meetsCriteria) {
248
528
  console.log(`[DynamicFilterService] Product ${productId} discount ${discount}% does not meet criteria (min: ${promotionFilter.min_discount_percentage}, max: ${promotionFilter.max_discount_percentage})`);
249
529
  }
530
+ else {
531
+ console.log(`[DynamicFilterService] Product ${productId} discount ${discount}% meets criteria (min: ${promotionFilter.min_discount_percentage}, max: ${promotionFilter.max_discount_percentage})`);
532
+ }
250
533
  return meetsCriteria;
251
534
  });
252
535
  console.log(`[DynamicFilterService] Filtered ${products.length} products down to ${filtered.length} matching promotion criteria`);
@@ -261,7 +544,9 @@ class DynamicFilterService {
261
544
  const queryOptions = {
262
545
  entity: "promotion",
263
546
  fields: [
264
- "id", "code", "type", "application_method.*", "campaign.*",
547
+ "id", "code", "type", "application_method.*", "application_method.target_rules.*",
548
+ "application_method.target_rules.values.*", "application_method.buy_rules.*",
549
+ "application_method.buy_rules.values.*", "campaign.*",
265
550
  "rules.*", "rules.values.*", "starts_at", "ends_at", "status", "metadata"
266
551
  ],
267
552
  };
@@ -333,7 +618,7 @@ class DynamicFilterService {
333
618
  const productIds = new Set();
334
619
  const discounts = new Map();
335
620
  let hasUniversalPromotions = false;
336
- let universalDiscount = 0;
621
+ let universalDiscount = undefined;
337
622
  for (const promotion of promotions) {
338
623
  const discount = this.calculateDiscountPercentage(promotion);
339
624
  // Debug: Log full promotion structure for first promotion
@@ -352,8 +637,14 @@ class DynamicFilterService {
352
637
  if (hasNoRules) {
353
638
  console.log(`[DynamicFilterService] Promotion ${promotion.id || promotion.code} has no rules - applies to all products`);
354
639
  hasUniversalPromotions = true;
355
- if (discount !== undefined && discount > universalDiscount) {
356
- universalDiscount = discount;
640
+ // Only update universal discount if it's valid and greater than current
641
+ if (discount !== undefined) {
642
+ if (universalDiscount === undefined || discount > universalDiscount) {
643
+ universalDiscount = discount;
644
+ }
645
+ }
646
+ else {
647
+ console.warn(`[DynamicFilterService] Universal promotion ${promotion.id || promotion.code} has no valid discount - products will be excluded if filtering by discount`);
357
648
  }
358
649
  }
359
650
  const ids = await this.extractProductIdsFromPromotion(promotion);
@@ -367,16 +658,36 @@ class DynamicFilterService {
367
658
  console.warn(`[DynamicFilterService] No product IDs extracted from promotion ${promotion.id || promotion.code}`);
368
659
  }
369
660
  }
370
- // Only add product IDs if promotion has rules
371
- // Universal promotions (no rules) apply to all products
372
- if (!hasNoRules) {
661
+ // If we found product IDs (from rules, target_rules, or buy_rules), this is NOT a universal promotion
662
+ // Only treat as universal if there are no rules AND no product IDs found
663
+ const isActuallyUniversal = hasNoRules && ids.length === 0;
664
+ if (isActuallyUniversal) {
665
+ // Universal promotion - applies to all products
666
+ console.log(`[DynamicFilterService] Promotion ${promotion.id || promotion.code} is universal (no rules, no product IDs)`);
667
+ }
668
+ else {
669
+ // Product-specific promotion - only apply to the specified products
373
670
  ids.forEach(id => {
374
671
  productIds.add(id);
672
+ // Only store discount if it's valid (not undefined)
673
+ // When multiple promotions apply to the same product, use the maximum discount
375
674
  if (discount !== undefined) {
376
- const currentMax = discounts.get(id) || 0;
377
- discounts.set(id, Math.max(currentMax, discount));
675
+ const currentDiscount = discounts.get(id);
676
+ if (currentDiscount === undefined) {
677
+ discounts.set(id, discount);
678
+ }
679
+ else {
680
+ discounts.set(id, Math.max(currentDiscount, discount));
681
+ }
682
+ }
683
+ else {
684
+ console.warn(`[DynamicFilterService] Promotion ${promotion.id || promotion.code} has product ${id} but discount is undefined - product will be excluded if filtering by discount`);
378
685
  }
379
686
  });
687
+ // If we found product IDs, this is not a universal promotion
688
+ if (ids.length > 0) {
689
+ hasUniversalPromotions = false;
690
+ }
380
691
  }
381
692
  }
382
693
  return { productIds, discounts, hasUniversalPromotions, universalDiscount };
@@ -408,8 +719,103 @@ class DynamicFilterService {
408
719
  console.log(`[DynamicFilterService] Promotion ${promotion.id || promotion.code}: Could not calculate discount percentage. type=${promotion.type}, appMethod.type=${appMethod.type}, appMethod.value=${appMethod.value}`);
409
720
  return undefined;
410
721
  }
722
+ extractIdsFromRuleValues(values) {
723
+ const ids = [];
724
+ if (!values)
725
+ return ids;
726
+ let valueArray = [];
727
+ if (Array.isArray(values)) {
728
+ valueArray = values;
729
+ }
730
+ else {
731
+ valueArray = [values];
732
+ }
733
+ for (const value of valueArray) {
734
+ if (typeof value === "string") {
735
+ if (value.length > 0) {
736
+ ids.push(value);
737
+ }
738
+ }
739
+ else if (typeof value === "object" && value !== null) {
740
+ // Prioritize "value" property if it looks like a product ID (starts with "prod_")
741
+ // This handles Medusa v2 promotion rule values where product IDs are in the "value" field
742
+ if ("value" in value && typeof value.value === "string" && value.value.startsWith("prod_")) {
743
+ ids.push(value.value);
744
+ }
745
+ else if ("product_id" in value && typeof value.product_id === "string") {
746
+ ids.push(value.product_id);
747
+ }
748
+ else if ("id" in value && typeof value.id === "string") {
749
+ // Only use "id" if it looks like a product ID, otherwise it might be a rule value ID
750
+ if (value.id.startsWith("prod_")) {
751
+ ids.push(value.id);
752
+ }
753
+ }
754
+ else {
755
+ // Try to extract any string field that looks like a product ID
756
+ for (const [key, val] of Object.entries(value)) {
757
+ if (typeof val === "string" && val.length > 0 && val.startsWith("prod_")) {
758
+ ids.push(val);
759
+ break; // Found product ID, no need to check other fields
760
+ }
761
+ }
762
+ }
763
+ }
764
+ }
765
+ return ids;
766
+ }
411
767
  async extractProductIdsFromPromotion(promotion) {
412
768
  const productIds = new Set();
769
+ // Check application_method.target_rules for product IDs (Medusa v2 stores product selections here)
770
+ // This is where products are stored when you select "items" in the promotion configuration
771
+ if (promotion.application_method?.target_rules?.length) {
772
+ console.log(`[DynamicFilterService] Processing ${promotion.application_method.target_rules.length} target_rules for promotion ${promotion.id || promotion.code}`);
773
+ for (const rule of promotion.application_method.target_rules) {
774
+ const ruleType = rule.attribute || rule.type || "";
775
+ const normalizedType = String(ruleType).toLowerCase();
776
+ console.log(`[DynamicFilterService] Target rule: attribute=${ruleType}, values=`, rule.values);
777
+ // Extract product IDs from target_rules
778
+ // Attribute can be "items", "items.product.id", "product", etc.
779
+ // If it contains "item" or "product", extract IDs from values
780
+ if (rule.values && (normalizedType.includes("item") || normalizedType.includes("product"))) {
781
+ const extracted = this.extractIdsFromRuleValues(rule.values);
782
+ extracted.forEach(id => productIds.add(id));
783
+ console.log(`[DynamicFilterService] Extracted ${extracted.length} product IDs from target_rules (attribute: ${ruleType})`);
784
+ }
785
+ else if (rule.values) {
786
+ // Even if attribute doesn't match, try extracting IDs anyway (might be product-related)
787
+ const extracted = this.extractIdsFromRuleValues(rule.values);
788
+ if (extracted.length > 0) {
789
+ console.log(`[DynamicFilterService] Extracted ${extracted.length} product IDs from target_rules (unknown attribute: ${ruleType})`);
790
+ extracted.forEach(id => productIds.add(id));
791
+ }
792
+ }
793
+ }
794
+ }
795
+ // Check application_method.buy_rules for product IDs (buy-x-get-y promotions)
796
+ if (promotion.application_method?.buy_rules?.length) {
797
+ console.log(`[DynamicFilterService] Processing ${promotion.application_method.buy_rules.length} buy_rules for promotion ${promotion.id || promotion.code}`);
798
+ for (const rule of promotion.application_method.buy_rules) {
799
+ const ruleType = rule.attribute || rule.type || "";
800
+ const normalizedType = String(ruleType).toLowerCase();
801
+ console.log(`[DynamicFilterService] Buy rule: attribute=${ruleType}, values=`, rule.values);
802
+ // Extract product IDs from buy_rules
803
+ // Attribute can be "items", "items.product.id", "product", etc.
804
+ if (rule.values && (normalizedType.includes("item") || normalizedType.includes("product"))) {
805
+ const extracted = this.extractIdsFromRuleValues(rule.values);
806
+ extracted.forEach(id => productIds.add(id));
807
+ console.log(`[DynamicFilterService] Extracted ${extracted.length} product IDs from buy_rules`);
808
+ }
809
+ else if (rule.values) {
810
+ // Even if attribute doesn't match, try extracting IDs anyway
811
+ const extracted = this.extractIdsFromRuleValues(rule.values);
812
+ if (extracted.length > 0) {
813
+ extracted.forEach(id => productIds.add(id));
814
+ console.log(`[DynamicFilterService] Extracted ${extracted.length} product IDs from buy_rules (unknown attribute: ${ruleType})`);
815
+ }
816
+ }
817
+ }
818
+ }
413
819
  // Debug: Log rule structure
414
820
  if (promotion.rules?.length) {
415
821
  console.log(`[DynamicFilterService] Processing ${promotion.rules.length} rules for promotion ${promotion.id || promotion.code}`);
@@ -428,52 +834,10 @@ class DynamicFilterService {
428
834
  continue;
429
835
  }
430
836
  // Process all other rules (including product-related ones)
431
- // In Medusa v2, rules.values can be:
432
- // - An array of strings (product IDs)
433
- // - An array of objects with id/value fields
434
- // - A single value
435
- let values = [];
436
- if (Array.isArray(rule.values)) {
437
- values = rule.values;
438
- }
439
- else if (rule.values !== undefined && rule.values !== null) {
440
- values = [rule.values];
441
- }
442
- console.log(`[DynamicFilterService] Processing ${values.length} values from rule ${ruleType}`);
443
- for (const value of values) {
444
- if (typeof value === "string") {
445
- // String values could be product IDs
446
- if (value.length > 0) {
447
- console.log(`[DynamicFilterService] Adding product ID from string: ${value}`);
448
- productIds.add(value);
449
- }
450
- }
451
- else if (typeof value === "object" && value !== null) {
452
- // Handle object values - could be { id: "prod_123" } or similar
453
- console.log(`[DynamicFilterService] Processing object value:`, value);
454
- if ("id" in value && typeof value.id === "string") {
455
- console.log(`[DynamicFilterService] Adding product ID from object.id: ${value.id}`);
456
- productIds.add(value.id);
457
- }
458
- else if ("value" in value && typeof value.value === "string") {
459
- console.log(`[DynamicFilterService] Adding product ID from object.value: ${value.value}`);
460
- productIds.add(value.value);
461
- }
462
- else if ("product_id" in value && typeof value.product_id === "string") {
463
- console.log(`[DynamicFilterService] Adding product ID from object.product_id: ${value.product_id}`);
464
- productIds.add(value.product_id);
465
- }
466
- else {
467
- // Try to extract any string field that looks like an ID
468
- for (const [key, val] of Object.entries(value)) {
469
- if (typeof val === "string" && val.length > 0 && (val.startsWith("prod_") || key.toLowerCase().includes("id"))) {
470
- console.log(`[DynamicFilterService] Adding product ID from object.${key}: ${val}`);
471
- productIds.add(val);
472
- }
473
- }
474
- }
475
- }
476
- }
837
+ // Extract product IDs from rule values
838
+ const extracted = this.extractIdsFromRuleValues(rule.values);
839
+ extracted.forEach(id => productIds.add(id));
840
+ console.log(`[DynamicFilterService] Extracted ${extracted.length} product IDs from rule ${ruleType}`);
477
841
  }
478
842
  }
479
843
  else {
@@ -493,13 +857,24 @@ class DynamicFilterService {
493
857
  return result;
494
858
  }
495
859
  meetsDiscountCriteria(discount, promotionFilter) {
496
- if (promotionFilter.min_discount_percentage !== undefined &&
497
- discount < promotionFilter.min_discount_percentage) {
860
+ // Validate discount is a valid number
861
+ if (typeof discount !== "number" || Number.isNaN(discount)) {
862
+ console.warn(`[DynamicFilterService] Invalid discount value: ${discount}`);
498
863
  return false;
499
864
  }
500
- if (promotionFilter.max_discount_percentage !== undefined &&
501
- discount > promotionFilter.max_discount_percentage) {
502
- return false;
865
+ // Check minimum discount percentage
866
+ if (promotionFilter.min_discount_percentage !== undefined) {
867
+ const minDiscount = Number(promotionFilter.min_discount_percentage);
868
+ if (!Number.isNaN(minDiscount) && discount < minDiscount) {
869
+ return false;
870
+ }
871
+ }
872
+ // Check maximum discount percentage
873
+ if (promotionFilter.max_discount_percentage !== undefined) {
874
+ const maxDiscount = Number(promotionFilter.max_discount_percentage);
875
+ if (!Number.isNaN(maxDiscount) && discount > maxDiscount) {
876
+ return false;
877
+ }
503
878
  }
504
879
  return true;
505
880
  }
@@ -522,4 +897,4 @@ class DynamicFilterService {
522
897
  }
523
898
  }
524
899
  exports.DynamicFilterService = DynamicFilterService;
525
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWx0ZXItc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9keW5hbWljLWZpbHRlci1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFxRTtBQUNyRSx5RUFBbUU7QUFrQm5FLE1BQWEsb0JBQW9CO0lBSS9CLFlBQVksU0FBMEI7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBUSxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN4RSxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtJQUN0QixDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUE0QjtRQUM3QyxNQUFNLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFBO1FBQzlGLE1BQU0sYUFBYSxHQUFrQixFQUFFLEdBQUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQTtRQUUzRSxNQUFNLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFFbEgsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDbkQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3BELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFF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
900
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWx0ZXItc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9keW5hbWljLWZpbHRlci1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFtRjtBQUNuRix5RUFBbUU7QUFrQm5FLE1BQWEsb0JBQW9CO0lBSS9CLFlBQVksU0FBMEI7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBUSxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN4RSxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtJQUN0QixDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUE0QjtRQUM3QyxNQUFNLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFBO1FBQzlGLE1BQU0sYUFBYSxHQUFrQixFQUFFLEdBQUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQTtRQUUzRSxPQUFPLENBQUMsR0FBRyxDQUFDLDBEQUEwRCxFQUFFO1lBQ3RFLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYztZQUMzQyxrQkFBa0IsRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtTQUN0RixDQUFDLENBQUE7UUFFRixNQUFNLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENB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