@lyxa.ai/marketing 1.0.30 → 1.0.31

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 (149) hide show
  1. package/dist/lib/event/event-initializations.d.ts +2 -0
  2. package/dist/lib/event/event-initializations.d.ts.map +1 -0
  3. package/dist/lib/event/event-initializations.js +8 -0
  4. package/dist/lib/event/event-initializations.js.map +1 -0
  5. package/dist/lib/event/event-listeners/event-listeners.d.ts +2 -0
  6. package/dist/lib/event/event-listeners/event-listeners.d.ts.map +1 -0
  7. package/dist/lib/event/event-listeners/event-listeners.js +12 -0
  8. package/dist/lib/event/event-listeners/event-listeners.js.map +1 -0
  9. package/dist/lib/index.d.ts +78 -57
  10. package/dist/lib/index.d.ts.map +1 -1
  11. package/dist/lib/index.js +17 -17
  12. package/dist/lib/index.js.map +1 -1
  13. package/dist/lib/modules/coupon/routers/coupon.router.d.ts +54 -54
  14. package/dist/lib/modules/coupon/routers/coupon.router.d.ts.map +1 -1
  15. package/dist/lib/modules/coupon/services/coupon.service.d.ts.map +1 -1
  16. package/dist/lib/modules/coupon/services/coupon.service.js +1 -0
  17. package/dist/lib/modules/coupon/services/coupon.service.js.map +1 -1
  18. package/dist/lib/modules/coupon/services/helper.service.js +1 -1
  19. package/dist/lib/modules/coupon/services/helper.service.js.map +1 -1
  20. package/dist/lib/modules/coupon/services/individual-store-coupon.service.js +1 -1
  21. package/dist/lib/modules/coupon/services/individual-store-coupon.service.js.map +1 -1
  22. package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.d.ts +1 -0
  23. package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.d.ts.map +1 -1
  24. package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js +123 -5
  25. package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js.map +1 -1
  26. package/dist/lib/modules/coupon/services/referral-reward-coupon.service.d.ts.map +1 -1
  27. package/dist/lib/modules/coupon/services/referral-reward-coupon.service.js +4 -2
  28. package/dist/lib/modules/coupon/services/referral-reward-coupon.service.js.map +1 -1
  29. package/dist/lib/modules/coupon/services/shops-categories-coupon.service.js +1 -1
  30. package/dist/lib/modules/coupon/services/shops-categories-coupon.service.js.map +1 -1
  31. package/dist/lib/modules/coupon/validations/all-coupons.validation.d.ts +153 -153
  32. package/dist/lib/modules/coupon/validations/coupon.validation.d.ts +12 -12
  33. package/dist/lib/modules/coupon/validations/coupon.validation.d.ts.map +1 -1
  34. package/dist/lib/modules/coupon/validations/coupon.validation.js +2 -1
  35. package/dist/lib/modules/coupon/validations/coupon.validation.js.map +1 -1
  36. package/dist/lib/modules/coupon/validations/custom-coupon.validation.d.ts +8 -8
  37. package/dist/lib/modules/coupon/validations/global-coupon.validation.d.ts +8 -8
  38. package/dist/lib/modules/coupon/validations/individual-store-coupon.validation.d.ts +10 -10
  39. package/dist/lib/modules/coupon/validations/individual-user-coupon.validation.d.ts +8 -8
  40. package/dist/lib/modules/coupon/validations/referral-reward-coupon.validation.d.ts +9 -9
  41. package/dist/lib/modules/coupon/validations/shops-categories-coupon.validation.d.ts +8 -8
  42. package/dist/lib/modules/deal-setting/validations/deal-setting.validation.d.ts +1 -1
  43. package/dist/lib/modules/marketing/routers/marketing.router.d.ts +21 -0
  44. package/dist/lib/modules/marketing/routers/marketing.router.d.ts.map +1 -1
  45. package/dist/lib/modules/marketing/routers/marketing.router.js +14 -0
  46. package/dist/lib/modules/marketing/routers/marketing.router.js.map +1 -1
  47. package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.d.ts +2 -1
  48. package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.d.ts.map +1 -1
  49. package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.js +45 -110
  50. package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.js.map +1 -1
  51. package/dist/lib/modules/marketing/services/discount-marketing.service.d.ts +2 -1
  52. package/dist/lib/modules/marketing/services/discount-marketing.service.d.ts.map +1 -1
  53. package/dist/lib/modules/marketing/services/discount-marketing.service.js +54 -171
  54. package/dist/lib/modules/marketing/services/discount-marketing.service.js.map +1 -1
  55. package/dist/lib/modules/marketing/services/featured-marketing.service.d.ts +2 -0
  56. package/dist/lib/modules/marketing/services/featured-marketing.service.d.ts.map +1 -1
  57. package/dist/lib/modules/marketing/services/featured-marketing.service.js +30 -2
  58. package/dist/lib/modules/marketing/services/featured-marketing.service.js.map +1 -1
  59. package/dist/lib/modules/marketing/services/free-delivery-marketing.service.d.ts.map +1 -1
  60. package/dist/lib/modules/marketing/services/free-delivery-marketing.service.js +6 -1
  61. package/dist/lib/modules/marketing/services/free-delivery-marketing.service.js.map +1 -1
  62. package/dist/lib/modules/marketing/services/index.d.ts +1 -0
  63. package/dist/lib/modules/marketing/services/index.d.ts.map +1 -1
  64. package/dist/lib/modules/marketing/services/index.js +1 -0
  65. package/dist/lib/modules/marketing/services/index.js.map +1 -1
  66. package/dist/lib/modules/marketing/services/marketing.service.d.ts +5 -0
  67. package/dist/lib/modules/marketing/services/marketing.service.d.ts.map +1 -1
  68. package/dist/lib/modules/marketing/services/marketing.service.js +207 -5
  69. package/dist/lib/modules/marketing/services/marketing.service.js.map +1 -1
  70. package/dist/lib/modules/marketing/services/product-marketing.service.d.ts +1 -0
  71. package/dist/lib/modules/marketing/services/product-marketing.service.d.ts.map +1 -1
  72. package/dist/lib/modules/marketing/services/product-marketing.service.js +21 -3
  73. package/dist/lib/modules/marketing/services/product-marketing.service.js.map +1 -1
  74. package/dist/lib/modules/marketing/services/punch-marketing.service.d.ts.map +1 -1
  75. package/dist/lib/modules/marketing/services/punch-marketing.service.js +6 -1
  76. package/dist/lib/modules/marketing/services/punch-marketing.service.js.map +1 -1
  77. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.d.ts +14 -0
  78. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.d.ts.map +1 -0
  79. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.js +209 -0
  80. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.js.map +1 -0
  81. package/dist/lib/modules/marketing/transformers/buy1-get1-marketing.transformer.d.ts +2 -2
  82. package/dist/lib/modules/marketing/transformers/discount-marketing.transformer.d.ts +2 -2
  83. package/dist/lib/modules/marketing/validations/buy1-get1-marketing.validation.d.ts +58 -58
  84. package/dist/lib/modules/marketing/validations/discount-marketing.validation.d.ts +68 -68
  85. package/dist/lib/modules/marketing/validations/featured-marketing.validation.d.ts +21 -21
  86. package/dist/lib/modules/marketing/validations/free-delivery-marketing.validation.d.ts +18 -18
  87. package/dist/lib/modules/marketing/validations/marketing.validation.d.ts +14 -7
  88. package/dist/lib/modules/marketing/validations/marketing.validation.d.ts.map +1 -1
  89. package/dist/lib/modules/marketing/validations/marketing.validation.js +4 -1
  90. package/dist/lib/modules/marketing/validations/marketing.validation.js.map +1 -1
  91. package/dist/lib/modules/marketing/validations/product-marketing.validation.d.ts +4 -4
  92. package/dist/lib/modules/marketing/validations/punch-marketing.validation.d.ts +22 -22
  93. package/dist/lib/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts +3 -3
  94. package/dist/lib/modules/punch-marketing-history/services/punch-marketing-history.service.js +2 -2
  95. package/dist/lib/modules/punch-marketing-history/services/punch-marketing-history.service.js.map +1 -1
  96. package/dist/lib/modules/punch-marketing-history/validations/punch-marketing-history.validation.d.ts +6 -6
  97. package/dist/types/event/event-initializations.d.ts +2 -0
  98. package/dist/types/event/event-initializations.d.ts.map +1 -0
  99. package/dist/types/event/event-listeners/event-listeners.d.ts +2 -0
  100. package/dist/types/event/event-listeners/event-listeners.d.ts.map +1 -0
  101. package/dist/types/index.d.ts +78 -57
  102. package/dist/types/index.d.ts.map +1 -1
  103. package/dist/types/modules/coupon/routers/coupon.router.d.ts +54 -54
  104. package/dist/types/modules/coupon/routers/coupon.router.d.ts.map +1 -1
  105. package/dist/types/modules/coupon/services/coupon.service.d.ts.map +1 -1
  106. package/dist/types/modules/coupon/services/patterns/repository/CouponRepository.d.ts +1 -0
  107. package/dist/types/modules/coupon/services/patterns/repository/CouponRepository.d.ts.map +1 -1
  108. package/dist/types/modules/coupon/services/referral-reward-coupon.service.d.ts.map +1 -1
  109. package/dist/types/modules/coupon/validations/all-coupons.validation.d.ts +153 -153
  110. package/dist/types/modules/coupon/validations/coupon.validation.d.ts +12 -12
  111. package/dist/types/modules/coupon/validations/coupon.validation.d.ts.map +1 -1
  112. package/dist/types/modules/coupon/validations/custom-coupon.validation.d.ts +8 -8
  113. package/dist/types/modules/coupon/validations/global-coupon.validation.d.ts +8 -8
  114. package/dist/types/modules/coupon/validations/individual-store-coupon.validation.d.ts +10 -10
  115. package/dist/types/modules/coupon/validations/individual-user-coupon.validation.d.ts +8 -8
  116. package/dist/types/modules/coupon/validations/referral-reward-coupon.validation.d.ts +9 -9
  117. package/dist/types/modules/coupon/validations/shops-categories-coupon.validation.d.ts +8 -8
  118. package/dist/types/modules/deal-setting/validations/deal-setting.validation.d.ts +1 -1
  119. package/dist/types/modules/marketing/routers/marketing.router.d.ts +21 -0
  120. package/dist/types/modules/marketing/routers/marketing.router.d.ts.map +1 -1
  121. package/dist/types/modules/marketing/services/buy1-get1-marketing.service.d.ts +2 -1
  122. package/dist/types/modules/marketing/services/buy1-get1-marketing.service.d.ts.map +1 -1
  123. package/dist/types/modules/marketing/services/discount-marketing.service.d.ts +2 -1
  124. package/dist/types/modules/marketing/services/discount-marketing.service.d.ts.map +1 -1
  125. package/dist/types/modules/marketing/services/featured-marketing.service.d.ts +2 -0
  126. package/dist/types/modules/marketing/services/featured-marketing.service.d.ts.map +1 -1
  127. package/dist/types/modules/marketing/services/free-delivery-marketing.service.d.ts.map +1 -1
  128. package/dist/types/modules/marketing/services/index.d.ts +1 -0
  129. package/dist/types/modules/marketing/services/index.d.ts.map +1 -1
  130. package/dist/types/modules/marketing/services/marketing.service.d.ts +5 -0
  131. package/dist/types/modules/marketing/services/marketing.service.d.ts.map +1 -1
  132. package/dist/types/modules/marketing/services/product-marketing.service.d.ts +1 -0
  133. package/dist/types/modules/marketing/services/product-marketing.service.d.ts.map +1 -1
  134. package/dist/types/modules/marketing/services/punch-marketing.service.d.ts.map +1 -1
  135. package/dist/types/modules/marketing/services/synchronize-product-marketing.service.d.ts +14 -0
  136. package/dist/types/modules/marketing/services/synchronize-product-marketing.service.d.ts.map +1 -0
  137. package/dist/types/modules/marketing/transformers/buy1-get1-marketing.transformer.d.ts +2 -2
  138. package/dist/types/modules/marketing/transformers/discount-marketing.transformer.d.ts +2 -2
  139. package/dist/types/modules/marketing/validations/buy1-get1-marketing.validation.d.ts +58 -58
  140. package/dist/types/modules/marketing/validations/discount-marketing.validation.d.ts +68 -68
  141. package/dist/types/modules/marketing/validations/featured-marketing.validation.d.ts +21 -21
  142. package/dist/types/modules/marketing/validations/free-delivery-marketing.validation.d.ts +18 -18
  143. package/dist/types/modules/marketing/validations/marketing.validation.d.ts +14 -7
  144. package/dist/types/modules/marketing/validations/marketing.validation.d.ts.map +1 -1
  145. package/dist/types/modules/marketing/validations/product-marketing.validation.d.ts +4 -4
  146. package/dist/types/modules/marketing/validations/punch-marketing.validation.d.ts +22 -22
  147. package/dist/types/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts +3 -3
  148. package/dist/types/modules/punch-marketing-history/validations/punch-marketing-history.validation.d.ts +6 -6
  149. package/package.json +2 -2
@@ -45,16 +45,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
45
45
  exports.productMarketingService = exports.ProductMarketingService = void 0;
46
46
  const typedi_1 = __importStar(require("typedi"));
47
47
  const server_1 = require("@trpc/server");
48
+ const typegoose_1 = require("@typegoose/typegoose");
48
49
  const models_1 = require("@lyxa.ai/core/dist/libraries/mongo/models/");
49
50
  const pagination_1 = require("@lyxa.ai/core/dist/utilities/pagination");
50
51
  const enum_1 = require("@lyxa.ai/core/dist/utilities/enum");
52
+ const synchronize_product_marketing_service_1 = require("./synchronize-product-marketing.service");
53
+ const error_common_1 = require("@lyxa.ai/core/dist/utilities/error-common");
51
54
  let ProductMarketingService = class ProductMarketingService {
52
55
  model;
56
+ syncProductsMarketingInfoService;
53
57
  constructor() {
54
58
  this.model = models_1.ProductMarketingModel;
59
+ this.syncProductsMarketingInfoService = synchronize_product_marketing_service_1.synchronizeProductMarketingService;
55
60
  }
56
61
  async create(data) {
57
- return await this.model.create(data);
62
+ const result = await this.model.create(data);
63
+ if (!result)
64
+ (0, error_common_1.badRequestError)('Product marketing creation failed');
65
+ await this.syncProductsMarketingInfoService.syncProductMarketingInfoByProductId(data.product);
66
+ return result;
58
67
  }
59
68
  async findById(id) {
60
69
  const result = await this.model.findOne({
@@ -104,7 +113,16 @@ let ProductMarketingService = class ProductMarketingService {
104
113
  return 'Records updated successfully';
105
114
  }
106
115
  async deleteMany(filter, softDelete) {
107
- const result = await this.model.deleteRecords(filter, softDelete);
116
+ const productMarketings = await this.model.find(filter);
117
+ await this.model.deleteRecords(filter, softDelete);
118
+ const productIds = productMarketings
119
+ .map((r) => r.product)
120
+ .filter((p) => !!p)
121
+ .map((p) => (p instanceof typegoose_1.mongoose.Types.ObjectId ? p : new typegoose_1.mongoose.Types.ObjectId(p)));
122
+ const uniqueProductIds = [...new Set(productIds.map((id) => id.toString()))];
123
+ for (const productId of uniqueProductIds) {
124
+ await this.syncProductsMarketingInfoService.syncProductMarketingInfoByProductId(new typegoose_1.mongoose.Types.ObjectId(productId));
125
+ }
108
126
  return 'Record deleted successfully';
109
127
  }
110
128
  async deleteMultipleProducts(filter, softDelete) {
@@ -118,7 +136,7 @@ let ProductMarketingService = class ProductMarketingService {
118
136
  const now = new Date();
119
137
  const result = await this.model.aggregate([
120
138
  {
121
- $match: { product: { $in: products } },
139
+ $match: { product: { $in: products }, deletedAt: null },
122
140
  },
123
141
  {
124
142
  $lookup: {
@@ -1 +1 @@
1
- {"version":3,"file":"product-marketing.service.js","sourceRoot":"/","sources":["modules/marketing/services/product-marketing.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { TRPCError } from '@trpc/server';\nimport { DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose';\nimport { ProductMarketingModel, ProductMarketing as Model } from '@lyxa.ai/core/dist/libraries/mongo/models/';\nimport {\n\tCreateProductMarketingDTO as CreateDTO,\n\tQueryProductMarketingDTO as QueryDTO,\n\tQueryMultipleProductMarketingDTO,\n\tUpdateProductMarketingDTO as UpdateDTO,\n\tUpdateMultipleProductMarketingDTO,\n} from '@modules/marketing/validations';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { FilterDTO, PaginatedResponse, DeleteDTO } from '@lyxa.ai/core/dist/utilities/validation';\nimport { createRawDocumentPaginatorObject, PaginatorOptions } from '@lyxa.ai/core/dist/utilities/pagination';\nimport { ModelType } from '@typegoose/typegoose/lib/types';\nimport { MarketingStatus } from '@lyxa.ai/core/dist/utilities/enum';\n\n@Service()\nexport class ProductMarketingService {\n\tprivate model: typeof ProductMarketingModel & SoftDeleteModel<Model>;\n\n\tconstructor() {\n\t\tthis.model = ProductMarketingModel as typeof ProductMarketingModel & SoftDeleteModel<Model>;\n\t}\n\n\t/**\n\t * Create a new record\n\t * @param data Data for the new record\n\t */\n\tpublic async create(data: CreateDTO): Promise<DocumentType<Model>> {\n\t\treturn await this.model.create(data);\n\t}\n\n\t/**\n\t * Get record by ID\n\t * @param id ID of the record\n\t */\n\tpublic async findById(id: string | mongoose.Types.ObjectId): Promise<DocumentType<Model>> {\n\t\tconst result = await this.model.findOne({\n\t\t\t_id: id,\n\t\t\tdeletedAt: null,\n\t\t});\n\t\tif (!result) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Record not found',\n\t\t\t});\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get records\n\t * @param query Query to find records\n\t */\n\tpublic async find(data?: Partial<FilterDTO>): Promise<PaginatedResponse<DocumentType<ModelType<Model>>>> {\n\t\ttry {\n\t\t\tconst paginate = createRawDocumentPaginatorObject(this.model as ReturnModelType<typeof this.model>);\n\t\t\tconst options: PaginatorOptions<typeof Model> = {\n\t\t\t\tpage: data?.page,\n\t\t\t\tsize: data?.size,\n\t\t\t\tsort: data?.sort,\n\t\t\t\tquery: data?.query,\n\t\t\t\tselect: data?.select,\n\t\t\t\tpopulate: data?.populate,\n\t\t\t};\n\t\t\tconst paginatedResult = await paginate(options);\n\t\t\treturn paginatedResult;\n\t\t} catch (err) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: `err: ${err}`,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Update single record based on query\n\t * @param query Query to find the record\n\t * @param data Data to update\n\t */\n\tpublic async updateOne(query: QueryDTO, data: UpdateDTO): Promise<string> {\n\t\tconst record = await this.model.findOneAndUpdate(query, data, {\n\t\t\tnew: true,\n\t\t\trunValidators: true,\n\t\t});\n\n\t\tif (!record) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: `Record not found`,\n\t\t\t});\n\t\t}\n\n\t\treturn 'Records updated successfully';\n\t}\n\n\t/**\n\t * Delete record\n\t * @param data Data for delete\n\t */\n\tpublic async deleteMany(filter: QueryDTO, softDelete: boolean): Promise<string> {\n\t\tconst result = await this.model.deleteRecords(filter, softDelete);\n\n\t\treturn 'Record deleted successfully';\n\t}\n\n\t/**\n\t * Delete record\n\t * @param data Data for delete\n\t */\n\tpublic async deleteMultipleProducts(\n\t\tfilter: QueryMultipleProductMarketingDTO,\n\t\tsoftDelete: boolean\n\t): Promise<string> {\n\t\tconst result = await this.model.deleteRecords(\n\t\t\t{\n\t\t\t\tmarketing: filter.marketing,\n\t\t\t\tproduct: { $in: filter.products },\n\t\t\t},\n\t\t\tsoftDelete\n\t\t);\n\n\t\treturn 'Record deleted successfully';\n\t}\n\n\t/**\n\t * Check if products are available for marketing\n\t * @param products Array of product IDs\n\t */\n\tpublic async checkProductMarketingAvailability(products: mongoose.Types.ObjectId[]): Promise<boolean> {\n\t\tconst now = new Date();\n\n\t\tconst result = await this.model.aggregate([\n\t\t\t{\n\t\t\t\t$match: { product: { $in: products } },\n\t\t\t},\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'marketings',\n\t\t\t\t\tlocalField: 'marketing',\n\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\tas: 'marketingDoc',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ $unwind: '$marketingDoc' },\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t'marketingDoc.status': MarketingStatus.ACTIVE,\n\t\t\t\t\t'marketingDoc.duration.start': { $lt: now },\n\t\t\t\t\t'marketingDoc.duration.end': { $gt: now },\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ $limit: 1 }, // stop as soon as one match is found\n\t\t]);\n\n\t\tconst anyExist = result.length > 0;\n\n\t\treturn !anyExist;\n\t}\n}\n\nexport const productMarketingService = Container.get(ProductMarketingService);\n"]}
1
+ {"version":3,"file":"product-marketing.service.js","sourceRoot":"/","sources":["modules/marketing/services/product-marketing.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { TRPCError } from '@trpc/server';\nimport { DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose';\nimport { ProductMarketingModel, ProductMarketing as Model } from '@lyxa.ai/core/dist/libraries/mongo/models/';\nimport {\n\tCreateProductMarketingDTO as CreateDTO,\n\tQueryProductMarketingDTO as QueryDTO,\n\tQueryMultipleProductMarketingDTO,\n\tUpdateProductMarketingDTO as UpdateDTO,\n} from '@modules/marketing/validations';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { FilterDTO, PaginatedResponse } from '@lyxa.ai/core/dist/utilities/validation';\nimport { createRawDocumentPaginatorObject, PaginatorOptions } from '@lyxa.ai/core/dist/utilities/pagination';\nimport { ModelType } from '@typegoose/typegoose/lib/types';\nimport { MarketingStatus } from '@lyxa.ai/core/dist/utilities/enum';\nimport {\n\tSynchronizeProductMarketingService,\n\tsynchronizeProductMarketingService,\n} from './synchronize-product-marketing.service';\nimport { badRequestError } from '@lyxa.ai/core/dist/utilities/error-common';\n\n@Service()\nexport class ProductMarketingService {\n\tprivate model: typeof ProductMarketingModel & SoftDeleteModel<Model>;\n\n\tprivate syncProductsMarketingInfoService: SynchronizeProductMarketingService;\n\n\tconstructor() {\n\t\tthis.model = ProductMarketingModel as typeof ProductMarketingModel & SoftDeleteModel<Model>;\n\n\t\tthis.syncProductsMarketingInfoService = synchronizeProductMarketingService;\n\t}\n\n\t/**\n\t * Create a new record\n\t * @param data Data for the new record\n\t */\n\tpublic async create(data: CreateDTO): Promise<DocumentType<Model>> {\n\t\tconst result = await this.model.create(data);\n\t\tif (!result) badRequestError('Product marketing creation failed');\n\t\tawait this.syncProductsMarketingInfoService.syncProductMarketingInfoByProductId(data.product);\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get record by ID\n\t * @param id ID of the record\n\t */\n\tpublic async findById(id: string | mongoose.Types.ObjectId): Promise<DocumentType<Model>> {\n\t\tconst result = await this.model.findOne({\n\t\t\t_id: id,\n\t\t\tdeletedAt: null,\n\t\t});\n\t\tif (!result) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Record not found',\n\t\t\t});\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get records\n\t * @param query Query to find records\n\t */\n\tpublic async find(data?: Partial<FilterDTO>): Promise<PaginatedResponse<DocumentType<ModelType<Model>>>> {\n\t\ttry {\n\t\t\tconst paginate = createRawDocumentPaginatorObject(this.model as ReturnModelType<typeof this.model>);\n\t\t\tconst options: PaginatorOptions<typeof Model> = {\n\t\t\t\tpage: data?.page,\n\t\t\t\tsize: data?.size,\n\t\t\t\tsort: data?.sort,\n\t\t\t\tquery: data?.query,\n\t\t\t\tselect: data?.select,\n\t\t\t\tpopulate: data?.populate,\n\t\t\t};\n\t\t\tconst paginatedResult = await paginate(options);\n\t\t\treturn paginatedResult;\n\t\t} catch (err) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: `err: ${err}`,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Update single record based on query\n\t * @param query Query to find the record\n\t * @param data Data to update\n\t */\n\tpublic async updateOne(query: QueryDTO, data: UpdateDTO): Promise<string> {\n\t\tconst record = await this.model.findOneAndUpdate(query, data, {\n\t\t\tnew: true,\n\t\t\trunValidators: true,\n\t\t});\n\n\t\tif (!record) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: `Record not found`,\n\t\t\t});\n\t\t}\n\n\t\treturn 'Records updated successfully';\n\t}\n\n\t/**\n\t * Delete record\n\t * @param data Data for delete\n\t */\n\tpublic async deleteMany(filter: QueryDTO, softDelete: boolean): Promise<string> {\n\t\tconst productMarketings = await this.model.find(filter);\n\t\t\n\t\tawait this.model.deleteRecords(filter, softDelete);\n\n\t\tconst productIds: mongoose.Types.ObjectId[] = productMarketings\n\t\t\t.map((r: any) => r.product)\n\t\t\t.filter((p: any): p is mongoose.Types.ObjectId | string => !!p) // filter out null/undefined\n\t\t\t.map((p: any) => (p instanceof mongoose.Types.ObjectId ? p : new mongoose.Types.ObjectId(p))); // convert to ObjectId\n\n\t\tconst uniqueProductIds = [...new Set(productIds.map((id: any) => id.toString()))];\n\t\tfor (const productId of uniqueProductIds) {\n\t\t\tawait this.syncProductsMarketingInfoService.syncProductMarketingInfoByProductId(\n\t\t\t\tnew mongoose.Types.ObjectId(productId)\n\t\t\t);\n\t\t}\n\t\treturn 'Record deleted successfully';\n\t}\n\n\t/**\n\t * Delete record\n\t * @param data Data for delete\n\t */\n\tpublic async deleteMultipleProducts(\n\t\tfilter: QueryMultipleProductMarketingDTO,\n\t\tsoftDelete: boolean\n\t): Promise<string> {\n\t\tconst result = await this.model.deleteRecords(\n\t\t\t{\n\t\t\t\tmarketing: filter.marketing,\n\t\t\t\tproduct: { $in: filter.products },\n\t\t\t},\n\t\t\tsoftDelete\n\t\t);\n\t\t// sync\n\t\treturn 'Record deleted successfully';\n\t}\n\n\t/**\n\t * Check if products are available for marketing\n\t * @param products Array of product IDs\n\t */\n\tpublic async checkProductMarketingAvailability(products: mongoose.Types.ObjectId[]): Promise<boolean> {\n\t\tconst now = new Date();\n\n\t\tconst result = await this.model.aggregate([\n\t\t\t{\n\t\t\t\t$match: { product: { $in: products }, deletedAt: null },\n\t\t\t},\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'marketings',\n\t\t\t\t\tlocalField: 'marketing',\n\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\tas: 'marketingDoc',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ $unwind: '$marketingDoc' },\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t'marketingDoc.status': MarketingStatus.ACTIVE,\n\t\t\t\t\t'marketingDoc.duration.start': { $lt: now },\n\t\t\t\t\t'marketingDoc.duration.end': { $gt: now },\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ $limit: 1 }, // stop as soon as one match is found\n\t\t]);\n\n\t\tconst anyExist = result.length > 0;\n\n\t\treturn !anyExist;\n\t}\n}\n\nexport const productMarketingService = Container.get(ProductMarketingService);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"punch-marketing.service.d.ts","sourceRoot":"/","sources":["modules/marketing/services/punch-marketing.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAuB,cAAc,IAAI,KAAK,EAAE,MAAM,2CAA2C,CAAC;AACzG,OAAO,EACN,uBAAuB,IAAI,SAAS,EACpC,uBAAuB,IAAI,SAAS,EACpC,MAAM,gCAAgC,CAAC;AAExC,qBACa,qBAAqB;IACjC,OAAO,CAAC,KAAK,CAAC;;IAUD,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IASrD,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;CAsB/F;AAED,eAAO,MAAM,qBAAqB,uBAAuC,CAAC"}
1
+ {"version":3,"file":"punch-marketing.service.d.ts","sourceRoot":"/","sources":["modules/marketing/services/punch-marketing.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAuB,cAAc,IAAI,KAAK,EAAE,MAAM,2CAA2C,CAAC;AACzG,OAAO,EACN,uBAAuB,IAAI,SAAS,EACpC,uBAAuB,IAAI,SAAS,EACpC,MAAM,gCAAgC,CAAC;AAExC,qBACa,qBAAqB;IACjC,OAAO,CAAC,KAAK,CAAC;;IAUD,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IASrD,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;CA2B/F;AAED,eAAO,MAAM,qBAAqB,uBAAuC,CAAC"}
@@ -55,12 +55,17 @@ let PunchMarketingService = class PunchMarketingService {
55
55
  return await this.model.create(data);
56
56
  }
57
57
  async update(id, data) {
58
- const record = await this.model.findOneAndUpdate({
58
+ const record = await this.model
59
+ .findOneAndUpdate({
59
60
  _id: id,
60
61
  deletedAt: null,
61
62
  }, data, {
62
63
  new: true,
63
64
  runValidators: true,
65
+ })
66
+ .populate({
67
+ path: 'shop',
68
+ select: '_id name shopId',
64
69
  });
65
70
  if (!record) {
66
71
  throw new server_1.TRPCError({
@@ -1 +1 @@
1
- {"version":3,"file":"punch-marketing.service.js","sourceRoot":"/","sources":["modules/marketing/services/punch-marketing.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAA4C;AAC5C,yCAAyC;AAEzC,sEAAyG;AAOlG,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACzB,KAAK,CAAC;IAEd;QACC,IAAI,CAAC,KAAK,GAAG,4BAAmB,CAAC;IAClC,CAAC;IAMM,KAAK,CAAC,MAAM,CAAC,IAAe;QAClC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAOM,KAAK,CAAC,MAAM,CAAC,EAA2B,EAAE,IAAe;QAC/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAC/C;YACC,GAAG,EAAE,EAAE;YACP,SAAS,EAAE,IAAI;SACf,EACD,IAAI,EACJ;YACC,GAAG,EAAE,IAAI;YACT,aAAa,EAAE,IAAI;SACnB,CACD,CAAC;QAEF,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,kBAAkB;aAC3B,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IACf,CAAC;CACD,CAAA;AA1CY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,gBAAO,GAAE;;GACG,qBAAqB,CA0CjC;AAEY,QAAA,qBAAqB,GAAG,gBAAS,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC","sourcesContent":["import Container, { Service } from 'typedi';\nimport { TRPCError } from '@trpc/server';\nimport { DocumentType, mongoose } from '@typegoose/typegoose';\nimport { PunchMarketingModel, PunchMarketing as Model } from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport {\n\tCreatePunchMarketingDTO as CreateDTO,\n\tUpdatePunchMarketingDTO as UpdateDTO,\n} from '@modules/marketing/validations';\n\n@Service()\nexport class PunchMarketingService {\n\tprivate model;\n\n\tconstructor() {\n\t\tthis.model = PunchMarketingModel;\n\t}\n\n\t/**\n\t * Create a new record\n\t * @param data Data for the new record\n\t */\n\tpublic async create(data: CreateDTO): Promise<DocumentType<Model>> {\n\t\treturn await this.model.create(data);\n\t}\n\n\t/**\n\t * Update record\n\t * @param id ID of the record\n\t * @param data Data to update\n\t */\n\tpublic async update(id: mongoose.Types.ObjectId, data: UpdateDTO): Promise<DocumentType<Model>> {\n\t\tconst record = await this.model.findOneAndUpdate(\n\t\t\t{\n\t\t\t\t_id: id,\n\t\t\t\tdeletedAt: null,\n\t\t\t},\n\t\t\tdata,\n\t\t\t{\n\t\t\t\tnew: true,\n\t\t\t\trunValidators: true,\n\t\t\t}\n\t\t);\n\n\t\tif (!record) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: `Record not found`,\n\t\t\t});\n\t\t}\n\n\t\treturn record;\n\t}\n}\n\nexport const punchMarketingService = Container.get(PunchMarketingService);\n"]}
1
+ {"version":3,"file":"punch-marketing.service.js","sourceRoot":"/","sources":["modules/marketing/services/punch-marketing.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAA4C;AAC5C,yCAAyC;AAEzC,sEAAyG;AAOlG,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACzB,KAAK,CAAC;IAEd;QACC,IAAI,CAAC,KAAK,GAAG,4BAAmB,CAAC;IAClC,CAAC;IAMM,KAAK,CAAC,MAAM,CAAC,IAAe;QAClC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAOM,KAAK,CAAC,MAAM,CAAC,EAA2B,EAAE,IAAe;QAC/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK;aAC7B,gBAAgB,CAChB;YACC,GAAG,EAAE,EAAE;YACP,SAAS,EAAE,IAAI;SACf,EACD,IAAI,EACJ;YACC,GAAG,EAAE,IAAI;YACT,aAAa,EAAE,IAAI;SACnB,CACD;aACA,QAAQ,CAAC;YACT,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,iBAAiB;SACzB,CAAC,CAAC;QAEJ,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,kBAAkB;aAC3B,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IACf,CAAC;CACD,CAAA;AA/CY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,gBAAO,GAAE;;GACG,qBAAqB,CA+CjC;AAEY,QAAA,qBAAqB,GAAG,gBAAS,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC","sourcesContent":["import Container, { Service } from 'typedi';\nimport { TRPCError } from '@trpc/server';\nimport { DocumentType, mongoose } from '@typegoose/typegoose';\nimport { PunchMarketingModel, PunchMarketing as Model } from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport {\n\tCreatePunchMarketingDTO as CreateDTO,\n\tUpdatePunchMarketingDTO as UpdateDTO,\n} from '@modules/marketing/validations';\n\n@Service()\nexport class PunchMarketingService {\n\tprivate model;\n\n\tconstructor() {\n\t\tthis.model = PunchMarketingModel;\n\t}\n\n\t/**\n\t * Create a new record\n\t * @param data Data for the new record\n\t */\n\tpublic async create(data: CreateDTO): Promise<DocumentType<Model>> {\n\t\treturn await this.model.create(data);\n\t}\n\n\t/**\n\t * Update record\n\t * @param id ID of the record\n\t * @param data Data to update\n\t */\n\tpublic async update(id: mongoose.Types.ObjectId, data: UpdateDTO): Promise<DocumentType<Model>> {\n\t\tconst record = await this.model\n\t\t\t.findOneAndUpdate(\n\t\t\t\t{\n\t\t\t\t\t_id: id,\n\t\t\t\t\tdeletedAt: null,\n\t\t\t\t},\n\t\t\t\tdata,\n\t\t\t\t{\n\t\t\t\t\tnew: true,\n\t\t\t\t\trunValidators: true,\n\t\t\t\t}\n\t\t\t)\n\t\t\t.populate({\n\t\t\t\tpath: 'shop',\n\t\t\t\tselect: '_id name shopId',\n\t\t\t});\n\n\t\tif (!record) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: `Record not found`,\n\t\t\t});\n\t\t}\n\n\t\treturn record;\n\t}\n}\n\nexport const punchMarketingService = Container.get(PunchMarketingService);\n"]}
@@ -0,0 +1,14 @@
1
+ import { mongoose } from '@typegoose/typegoose';
2
+ import { SynchronizeAllProductsProductMarketingInfoDTO } from '@lyxa.ai/core/dist/libraries/event/events/sync-all-products-product-marketing-info-event';
3
+ export declare class SynchronizeProductMarketingService {
4
+ private productModel;
5
+ constructor();
6
+ publishAllProductsProductMarketingInfoProcessEvent(): Promise<string>;
7
+ processAllProductsProductMarketingInfoEvent(payload: SynchronizeAllProductsProductMarketingInfoDTO): string;
8
+ syncAllProductsMarketingInfo: () => Promise<any>;
9
+ private processProductsBatch;
10
+ private getProductMarketingInfoByProductId;
11
+ syncProductMarketingInfoByProductId(productId: mongoose.Types.ObjectId): Promise<string>;
12
+ }
13
+ export declare const synchronizeProductMarketingService: SynchronizeProductMarketingService;
14
+ //# sourceMappingURL=synchronize-product-marketing.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synchronize-product-marketing.service.d.ts","sourceRoot":"/","sources":["modules/marketing/services/synchronize-product-marketing.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKhD,OAAO,EAAE,6CAA6C,EAAE,MAAM,0FAA0F,CAAC;AACzJ,qBACa,kCAAkC;IAC9C,OAAO,CAAC,YAAY,CAA+C;;IAMtD,kDAAkD;IAKxD,2CAA2C,CACjD,OAAO,EAAE,6CAA6C,GACpD,MAAM;IAKF,4BAA4B,QAAa,OAAO,CAAC,GAAG,CAAC,CAsD1D;YAEY,oBAAoB;YAsDpB,kCAAkC;IAqCnC,mCAAmC,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ;CAqCnF;AAED,eAAO,MAAM,kCAAkC,oCAAoD,CAAC"}
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.synchronizeProductMarketingService = exports.SynchronizeProductMarketingService = void 0;
46
+ const typedi_1 = __importStar(require("typedi"));
47
+ const core_1 = require("@lyxa.ai/core");
48
+ const models_1 = require("@lyxa.ai/core/dist/libraries/mongo/models");
49
+ const product_pipeline_stages_1 = require("@lyxa.ai/core/dist/utilities/pipelines/product-pipeline-stages");
50
+ const events_common_methods_1 = require("@lyxa.ai/core/dist/utilities/events-common-methods");
51
+ let SynchronizeProductMarketingService = class SynchronizeProductMarketingService {
52
+ productModel;
53
+ constructor() {
54
+ this.productModel = models_1.ProductModel;
55
+ }
56
+ async publishAllProductsProductMarketingInfoProcessEvent() {
57
+ await (0, events_common_methods_1.publishAllProductsProductMarketingInfoProcessEvent)({});
58
+ return 'Processing all products product marketing information! ';
59
+ }
60
+ processAllProductsProductMarketingInfoEvent(payload) {
61
+ this.syncAllProductsMarketingInfo();
62
+ return 'Processing all products product marketing information! ';
63
+ }
64
+ syncAllProductsMarketingInfo = async () => {
65
+ const CHUNK_SIZE = 500;
66
+ console.time('TOTAL_SYNC_TIME');
67
+ console.log('[SYNC] Starting product marketing info sync');
68
+ const cursor = this.productModel.find().select('_id shop price priceBreakdowns').lean().cursor();
69
+ const adminSettings = (await (0, core_1.getLibraries)().getCachedSettingsService().getSettings());
70
+ const exchangeRate = adminSettings?.currencySetting?.exchangeRate ?? 0;
71
+ const secondaryCurrencyName = adminSettings?.currencySetting?.secondaryCurrency?.name ?? 'LBP';
72
+ let batch = [];
73
+ let batchIndex = 0;
74
+ let totalProcessed = 0;
75
+ for await (const product of cursor) {
76
+ batch.push(product);
77
+ if (batch.length === CHUNK_SIZE) {
78
+ batchIndex++;
79
+ totalProcessed += batch.length;
80
+ console.log(`[SYNC][BATCH ${batchIndex}] Processing ${batch.length} products (Total processed: ${totalProcessed})`);
81
+ console.time(`[BATCH ${batchIndex}] TIME`);
82
+ await this.processProductsBatch(batch, exchangeRate, secondaryCurrencyName, batchIndex);
83
+ console.timeEnd(`[BATCH ${batchIndex}] TIME`);
84
+ batch = [];
85
+ }
86
+ }
87
+ if (batch.length) {
88
+ batchIndex++;
89
+ totalProcessed += batch.length;
90
+ console.log(`[SYNC][BATCH ${batchIndex}] Processing remaining ${batch.length} products (Total processed: ${totalProcessed})`);
91
+ console.time(`[BATCH ${batchIndex}] TIME`);
92
+ await this.processProductsBatch(batch, exchangeRate, secondaryCurrencyName, batchIndex);
93
+ console.timeEnd(`[BATCH ${batchIndex}] TIME`);
94
+ }
95
+ console.log(`[SYNC] Completed. Total batches: ${batchIndex}, Total products: ${totalProcessed}`);
96
+ console.timeEnd('TOTAL_SYNC_TIME');
97
+ return 'Bulk product marketing info sync completed';
98
+ };
99
+ async processProductsBatch(productsBatch, exchangeRate, secondaryCurrencyName, batchIndex) {
100
+ const productIds = productsBatch.map(p => p._id);
101
+ console.log(`[BATCH ${batchIndex}] Aggregating marketing info for ${productIds.length} products`, `| First ID: ${productIds[0]}`, `| Last ID: ${productIds[productIds.length - 1]}`);
102
+ const results = await this.productModel.aggregate([
103
+ { $match: { _id: { $in: productIds } } },
104
+ ...(0, product_pipeline_stages_1.addProductMarketingInfo)(exchangeRate, secondaryCurrencyName),
105
+ {
106
+ $group: {
107
+ _id: '$_id',
108
+ productMarketingInfo: { $push: '$productMarketing' },
109
+ },
110
+ },
111
+ ]);
112
+ console.log(`[BATCH ${batchIndex}] Aggregation completed. Result count: ${results.length}`);
113
+ const bulkOps = results.map(r => ({
114
+ updateOne: {
115
+ filter: { _id: r._id },
116
+ update: {
117
+ $set: {
118
+ productMarketingInfo: (r.productMarketingInfo ?? []).filter(Boolean).map((pm) => ({
119
+ marketing: pm.marketingInfo,
120
+ isBuy1Get1: pm.isBuy1Get1,
121
+ valueType: pm.valueType,
122
+ value: pm.value,
123
+ secondaryCurrencyValue: pm.secondaryCurrencyValue,
124
+ label: pm.label,
125
+ })),
126
+ },
127
+ },
128
+ },
129
+ }));
130
+ if (bulkOps.length) {
131
+ console.log(`[BATCH ${batchIndex}] bulkWrite started (${bulkOps.length} ops)`);
132
+ await this.productModel.bulkWrite(bulkOps, { ordered: false });
133
+ console.log(`[BATCH ${batchIndex}] bulkWrite completed`);
134
+ }
135
+ else {
136
+ console.log(`[BATCH ${batchIndex}] No bulk operations to write`);
137
+ }
138
+ }
139
+ async getProductMarketingInfoByProductId(productId) {
140
+ const adminSettings = (await (0, core_1.getLibraries)().getCachedSettingsService().getSettings());
141
+ const exchangeRate = adminSettings?.currencySetting?.exchangeRate ?? 0;
142
+ const secondaryCurrencyName = adminSettings?.currencySetting?.secondaryCurrency?.name ?? 'LBP';
143
+ const result = await this.productModel.aggregate([
144
+ {
145
+ $match: { _id: productId },
146
+ },
147
+ ...(0, product_pipeline_stages_1.addProductMarketingInfo)(exchangeRate, secondaryCurrencyName),
148
+ {
149
+ $group: {
150
+ _id: '$_id',
151
+ productMarketingInfo: {
152
+ $push: '$productMarketing',
153
+ },
154
+ },
155
+ },
156
+ ]);
157
+ const productMarketingInfo = result?.[0]?.productMarketing
158
+ ? [
159
+ {
160
+ marketing: result?.[0].productMarketing.marketingInfo,
161
+ isBuy1Get1: result?.[0].productMarketing.isBuy1Get1,
162
+ valueType: result?.[0].productMarketing.valueType,
163
+ value: result?.[0].productMarketing.value,
164
+ secondaryCurrencyValue: result?.[0].productMarketing.secondaryCurrencyValue,
165
+ label: result?.[0].productMarketing.label,
166
+ },
167
+ ]
168
+ : [];
169
+ return productMarketingInfo;
170
+ }
171
+ async syncProductMarketingInfoByProductId(productId) {
172
+ const adminSettings = (await (0, core_1.getLibraries)().getCachedSettingsService().getSettings());
173
+ const exchangeRate = adminSettings?.currencySetting?.exchangeRate ?? 0;
174
+ const secondaryCurrencyName = adminSettings?.currencySetting?.secondaryCurrency?.name ?? 'LBP';
175
+ const result = await this.productModel.aggregate([
176
+ {
177
+ $match: {
178
+ _id: productId,
179
+ },
180
+ },
181
+ ...(0, product_pipeline_stages_1.addProductMarketingInfo)(exchangeRate, secondaryCurrencyName),
182
+ ]);
183
+ const productMarketingInfo = result?.[0]?.productMarketing
184
+ ? [
185
+ {
186
+ marketing: result?.[0].productMarketing.marketingInfo,
187
+ isBuy1Get1: result?.[0].productMarketing.isBuy1Get1,
188
+ valueType: result?.[0].productMarketing.valueType,
189
+ value: result?.[0].productMarketing.value,
190
+ secondaryCurrencyValue: result?.[0].productMarketing.secondaryCurrencyValue,
191
+ label: result?.[0].productMarketing.label,
192
+ },
193
+ ]
194
+ : [];
195
+ await this.productModel.updateOne({ _id: productId }, {
196
+ $set: {
197
+ productMarketingInfo,
198
+ },
199
+ });
200
+ return 'Synchronized product marketing info';
201
+ }
202
+ };
203
+ exports.SynchronizeProductMarketingService = SynchronizeProductMarketingService;
204
+ exports.SynchronizeProductMarketingService = SynchronizeProductMarketingService = __decorate([
205
+ (0, typedi_1.Service)(),
206
+ __metadata("design:paramtypes", [])
207
+ ], SynchronizeProductMarketingService);
208
+ exports.synchronizeProductMarketingService = typedi_1.default.get(SynchronizeProductMarketingService);
209
+ //# sourceMappingURL=synchronize-product-marketing.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synchronize-product-marketing.service.js","sourceRoot":"/","sources":["modules/marketing/services/synchronize-product-marketing.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { getLibraries } from '@lyxa.ai/core';\nimport { mongoose } from '@typegoose/typegoose';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { ProductModel, Product as Model, Setting } from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport { addProductMarketingInfo } from '@lyxa.ai/core/dist/utilities/pipelines/product-pipeline-stages';\nimport { publishAllProductsProductMarketingInfoProcessEvent } from '@lyxa.ai/core/dist/utilities/events-common-methods';\nimport { SynchronizeAllProductsProductMarketingInfoDTO } from '@lyxa.ai/core/dist/libraries/event/events/sync-all-products-product-marketing-info-event';\n@Service()\nexport class SynchronizeProductMarketingService {\n\tprivate productModel: typeof ProductModel & SoftDeleteModel<Model>;\n\n\tconstructor() {\n\t\tthis.productModel = ProductModel as typeof ProductModel & SoftDeleteModel<Model>;\n\t}\n\n\tpublic async publishAllProductsProductMarketingInfoProcessEvent() {\n\t\tawait publishAllProductsProductMarketingInfoProcessEvent({});\n\t\treturn 'Processing all products product marketing information! ';\n\t}\n\n\tpublic processAllProductsProductMarketingInfoEvent(\n\t\tpayload: SynchronizeAllProductsProductMarketingInfoDTO\n\t): string {\n\t\tthis.syncAllProductsMarketingInfo();\n\t\treturn 'Processing all products product marketing information! ';\n\t}\n\n\tpublic syncAllProductsMarketingInfo = async (): Promise<any> => {\n\t\tconst CHUNK_SIZE = 500;\n\n\t\tconsole.time('TOTAL_SYNC_TIME');\n\t\tconsole.log('[SYNC] Starting product marketing info sync');\n\n\t\tconst cursor = this.productModel.find().select('_id shop price priceBreakdowns').lean().cursor();\n\n\t\tconst adminSettings = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\n\t\tconst exchangeRate = adminSettings?.currencySetting?.exchangeRate ?? 0;\n\t\tconst secondaryCurrencyName = adminSettings?.currencySetting?.secondaryCurrency?.name ?? 'LBP';\n\n\t\tlet batch: any[] = [];\n\t\tlet batchIndex = 0;\n\t\tlet totalProcessed = 0;\n\n\t\tfor await (const product of cursor) {\n\t\t\tbatch.push(product);\n\n\t\t\tif (batch.length === CHUNK_SIZE) {\n\t\t\t\tbatchIndex++;\n\t\t\t\ttotalProcessed += batch.length;\n\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[SYNC][BATCH ${batchIndex}] Processing ${batch.length} products (Total processed: ${totalProcessed})`\n\t\t\t\t);\n\n\t\t\t\tconsole.time(`[BATCH ${batchIndex}] TIME`);\n\t\t\t\tawait this.processProductsBatch(batch, exchangeRate, secondaryCurrencyName, batchIndex);\n\t\t\t\tconsole.timeEnd(`[BATCH ${batchIndex}] TIME`);\n\n\t\t\t\tbatch = [];\n\t\t\t}\n\t\t}\n\n\t\t// Process remaining products\n\t\tif (batch.length) {\n\t\t\tbatchIndex++;\n\t\t\ttotalProcessed += batch.length;\n\n\t\t\tconsole.log(\n\t\t\t\t`[SYNC][BATCH ${batchIndex}] Processing remaining ${batch.length} products (Total processed: ${totalProcessed})`\n\t\t\t);\n\n\t\t\tconsole.time(`[BATCH ${batchIndex}] TIME`);\n\t\t\tawait this.processProductsBatch(batch, exchangeRate, secondaryCurrencyName, batchIndex);\n\t\t\tconsole.timeEnd(`[BATCH ${batchIndex}] TIME`);\n\t\t}\n\n\t\tconsole.log(`[SYNC] Completed. Total batches: ${batchIndex}, Total products: ${totalProcessed}`);\n\t\tconsole.timeEnd('TOTAL_SYNC_TIME');\n\n\t\treturn 'Bulk product marketing info sync completed';\n\t};\n\n\tprivate async processProductsBatch(\n\t\tproductsBatch: any[],\n\t\texchangeRate: number,\n\t\tsecondaryCurrencyName: string,\n\t\tbatchIndex: number\n\t): Promise<void> {\n\t\tconst productIds = productsBatch.map(p => p._id);\n\n\t\tconsole.log(\n\t\t\t`[BATCH ${batchIndex}] Aggregating marketing info for ${productIds.length} products`,\n\t\t\t`| First ID: ${productIds[0]}`,\n\t\t\t`| Last ID: ${productIds[productIds.length - 1]}`\n\t\t);\n\n\t\tconst results = await this.productModel.aggregate([\n\t\t\t{ $match: { _id: { $in: productIds } } },\n\t\t\t...addProductMarketingInfo(exchangeRate, secondaryCurrencyName),\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$_id',\n\t\t\t\t\tproductMarketingInfo: { $push: '$productMarketing' },\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\n\t\tconsole.log(`[BATCH ${batchIndex}] Aggregation completed. Result count: ${results.length}`);\n\n\t\tconst bulkOps = results.map(r => ({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: { _id: r._id },\n\t\t\t\tupdate: {\n\t\t\t\t\t$set: {\n\t\t\t\t\t\tproductMarketingInfo: (r.productMarketingInfo ?? []).filter(Boolean).map((pm: any) => ({\n\t\t\t\t\t\t\tmarketing: pm.marketingInfo,\n\t\t\t\t\t\t\tisBuy1Get1: pm.isBuy1Get1,\n\t\t\t\t\t\t\tvalueType: pm.valueType,\n\t\t\t\t\t\t\tvalue: pm.value,\n\t\t\t\t\t\t\tsecondaryCurrencyValue: pm.secondaryCurrencyValue,\n\t\t\t\t\t\t\tlabel: pm.label,\n\t\t\t\t\t\t})),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}));\n\n\t\tif (bulkOps.length) {\n\t\t\tconsole.log(`[BATCH ${batchIndex}] bulkWrite started (${bulkOps.length} ops)`);\n\t\t\tawait this.productModel.bulkWrite(bulkOps, { ordered: false });\n\t\t\tconsole.log(`[BATCH ${batchIndex}] bulkWrite completed`);\n\t\t} else {\n\t\t\tconsole.log(`[BATCH ${batchIndex}] No bulk operations to write`);\n\t\t}\n\t}\n\n\tprivate async getProductMarketingInfoByProductId(productId: mongoose.Types.ObjectId): Promise<any[]> {\n\t\tconst adminSettings = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\n\t\tconst exchangeRate = adminSettings?.currencySetting?.exchangeRate ?? 0;\n\t\tconst secondaryCurrencyName = adminSettings?.currencySetting?.secondaryCurrency?.name ?? 'LBP';\n\n\t\tconst result = await this.productModel.aggregate([\n\t\t\t{\n\t\t\t\t$match: { _id: productId },\n\t\t\t},\n\t\t\t...addProductMarketingInfo(exchangeRate, secondaryCurrencyName),\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$_id',\n\t\t\t\t\tproductMarketingInfo: {\n\t\t\t\t\t\t$push: '$productMarketing',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\n\t\tconst productMarketingInfo = result?.[0]?.productMarketing\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\tmarketing: result?.[0].productMarketing.marketingInfo,\n\t\t\t\t\t\tisBuy1Get1: result?.[0].productMarketing.isBuy1Get1,\n\t\t\t\t\t\tvalueType: result?.[0].productMarketing.valueType,\n\t\t\t\t\t\tvalue: result?.[0].productMarketing.value,\n\t\t\t\t\t\tsecondaryCurrencyValue: result?.[0].productMarketing.secondaryCurrencyValue,\n\t\t\t\t\t\tlabel: result?.[0].productMarketing.label,\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t: [];\n\n\t\treturn productMarketingInfo;\n\t}\n\n\tpublic async syncProductMarketingInfoByProductId(productId: mongoose.Types.ObjectId) {\n\t\tconst adminSettings = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\t\tconst exchangeRate = adminSettings?.currencySetting?.exchangeRate ?? 0;\n\n\t\tconst secondaryCurrencyName = adminSettings?.currencySetting?.secondaryCurrency?.name ?? 'LBP';\n\t\tconst result = await this.productModel.aggregate([\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t_id: productId,\n\t\t\t\t},\n\t\t\t},\n\t\t\t...addProductMarketingInfo(exchangeRate, secondaryCurrencyName),\n\t\t]);\n\n\t\tconst productMarketingInfo = result?.[0]?.productMarketing\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\tmarketing: result?.[0].productMarketing.marketingInfo,\n\t\t\t\t\t\tisBuy1Get1: result?.[0].productMarketing.isBuy1Get1,\n\t\t\t\t\t\tvalueType: result?.[0].productMarketing.valueType,\n\t\t\t\t\t\tvalue: result?.[0].productMarketing.value,\n\t\t\t\t\t\tsecondaryCurrencyValue: result?.[0].productMarketing.secondaryCurrencyValue,\n\t\t\t\t\t\tlabel: result?.[0].productMarketing.label,\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t: [];\n\n\t\tawait this.productModel.updateOne(\n\t\t\t{ _id: productId },\n\t\t\t{\n\t\t\t\t$set: {\n\t\t\t\t\tproductMarketingInfo,\n\t\t\t\t},\n\t\t\t}\n\t\t);\n\t\treturn 'Synchronized product marketing info';\n\t}\n}\n\nexport const synchronizeProductMarketingService = Container.get(SynchronizeProductMarketingService);\n"]}
@@ -12,15 +12,15 @@ export declare const buy1Get1MarketingTransformer: import("@lyxa.ai/core/dist/ut
12
12
  }, "strip", import("zod").ZodTypeAny, {
13
13
  product: import("mongoose").Types.ObjectId;
14
14
  value?: number | undefined;
15
+ valueType?: import("@lyxa.ai/core/dist/utilities/enum").ValueType | null | undefined;
15
16
  marketing?: import("mongoose").Types.ObjectId | undefined;
16
17
  isBuy1Get1?: boolean | undefined;
17
- valueType?: import("@lyxa.ai/core/dist/utilities/enum").ValueType | null | undefined;
18
18
  }, {
19
19
  product: string | import("mongoose").Types.ObjectId;
20
20
  value?: number | undefined;
21
+ valueType?: import("@lyxa.ai/core/dist/utilities/enum").ValueType | null | undefined;
21
22
  marketing?: string | import("mongoose").Types.ObjectId | undefined;
22
23
  isBuy1Get1?: boolean | undefined;
23
- valueType?: import("@lyxa.ai/core/dist/utilities/enum").ValueType | null | undefined;
24
24
  }>, "many">>>>;
25
25
  excludeProducts: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, import("mongoose").Types.ObjectId, string>, import("zod").ZodType<import("mongoose").Types.ObjectId, import("zod").ZodTypeDef, import("mongoose").Types.ObjectId>]>, "many">>>>;
26
26
  spendLimit: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodNumber>>;
@@ -16,15 +16,15 @@ export declare const discountMarketingTransformer: import("@lyxa.ai/core/dist/ut
16
16
  }, "strip", import("zod").ZodTypeAny, {
17
17
  product: import("mongoose").Types.ObjectId;
18
18
  value?: number | undefined;
19
+ valueType?: import("@lyxa.ai/core/dist/utilities/enum").ValueType | null | undefined;
19
20
  marketing?: import("mongoose").Types.ObjectId | undefined;
20
21
  isBuy1Get1?: boolean | undefined;
21
- valueType?: import("@lyxa.ai/core/dist/utilities/enum").ValueType | null | undefined;
22
22
  }, {
23
23
  product: string | import("mongoose").Types.ObjectId;
24
24
  value?: number | undefined;
25
+ valueType?: import("@lyxa.ai/core/dist/utilities/enum").ValueType | null | undefined;
25
26
  marketing?: string | import("mongoose").Types.ObjectId | undefined;
26
27
  isBuy1Get1?: boolean | undefined;
27
- valueType?: import("@lyxa.ai/core/dist/utilities/enum").ValueType | null | undefined;
28
28
  }>, "many">>>>;
29
29
  excludeProducts: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, import("mongoose").Types.ObjectId, string>, import("zod").ZodType<import("mongoose").Types.ObjectId, import("zod").ZodTypeDef, import("mongoose").Types.ObjectId>]>, "many">>>>;
30
30
  maxDiscountPerOrder: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodNumber>>;