@lyxa.ai/marketing 1.0.60 → 1.0.61

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 (378) hide show
  1. package/dist/lib/event/event-initializations.d.ts.map +1 -1
  2. package/dist/lib/event/event-initializations.js +2 -0
  3. package/dist/lib/event/event-initializations.js.map +1 -1
  4. package/dist/lib/event/event-listeners/event-listeners.d.ts +2 -0
  5. package/dist/lib/event/event-listeners/event-listeners.d.ts.map +1 -1
  6. package/dist/lib/event/event-listeners/event-listeners.js +69 -12
  7. package/dist/lib/event/event-listeners/event-listeners.js.map +1 -1
  8. package/dist/lib/event/events/marketing-product-seed.event.d.ts +1 -2
  9. package/dist/lib/event/events/marketing-product-seed.event.d.ts.map +1 -1
  10. package/dist/lib/event/events/marketing-product-seed.event.js.map +1 -1
  11. package/dist/lib/event/events/marketing-product-sync.event.d.ts +11 -0
  12. package/dist/lib/event/events/marketing-product-sync.event.d.ts.map +1 -0
  13. package/dist/lib/event/events/marketing-product-sync.event.js +12 -0
  14. package/dist/lib/event/events/marketing-product-sync.event.js.map +1 -0
  15. package/dist/lib/index.d.ts +8175 -33
  16. package/dist/lib/index.d.ts.map +1 -1
  17. package/dist/lib/index.js +4 -0
  18. package/dist/lib/index.js.map +1 -1
  19. package/dist/lib/modules/coupon/routers/coupon.router.d.ts +7630 -2
  20. package/dist/lib/modules/coupon/routers/coupon.router.d.ts.map +1 -1
  21. package/dist/lib/modules/coupon/routers/coupon.router.js +0 -7
  22. package/dist/lib/modules/coupon/routers/coupon.router.js.map +1 -1
  23. package/dist/lib/modules/coupon/services/coupon.service.d.ts +0 -1
  24. package/dist/lib/modules/coupon/services/coupon.service.d.ts.map +1 -1
  25. package/dist/lib/modules/coupon/services/coupon.service.js +3 -4
  26. package/dist/lib/modules/coupon/services/coupon.service.js.map +1 -1
  27. package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js +2 -2
  28. package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js.map +1 -1
  29. package/dist/lib/modules/coupon/validations/coupon.validation.d.ts +6 -6
  30. package/dist/lib/modules/coupon/validations/coupon.validation.js +2 -2
  31. package/dist/lib/modules/coupon/validations/coupon.validation.js.map +1 -1
  32. package/dist/lib/modules/coupon/validations/create-coupon.validation.d.ts.map +1 -1
  33. package/dist/lib/modules/coupon/validations/create-coupon.validation.js +4 -1
  34. package/dist/lib/modules/coupon/validations/create-coupon.validation.js.map +1 -1
  35. package/dist/lib/modules/deal-setting/services/deal-setting.service.d.ts.map +1 -1
  36. package/dist/lib/modules/deal-setting/services/deal-setting.service.js +4 -1
  37. package/dist/lib/modules/deal-setting/services/deal-setting.service.js.map +1 -1
  38. package/dist/lib/modules/featured-setting/services/featured-setting.service.d.ts.map +1 -1
  39. package/dist/lib/modules/featured-setting/services/featured-setting.service.js +3 -0
  40. package/dist/lib/modules/featured-setting/services/featured-setting.service.js.map +1 -1
  41. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.d.ts +54 -8
  42. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.d.ts.map +1 -1
  43. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.js +11 -0
  44. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.js.map +1 -1
  45. package/dist/lib/modules/limited-time-offer/campaign/jobs/index.d.ts.map +1 -1
  46. package/dist/lib/modules/limited-time-offer/campaign/jobs/index.js +6 -0
  47. package/dist/lib/modules/limited-time-offer/campaign/jobs/index.js.map +1 -1
  48. package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts +0 -1
  49. package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts.map +1 -1
  50. package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.js +2 -6
  51. package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.js.map +1 -1
  52. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.d.ts +16 -3
  53. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.d.ts.map +1 -1
  54. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.js +22 -3
  55. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.js.map +1 -1
  56. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.d.ts +2 -0
  57. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.d.ts.map +1 -1
  58. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.js +12 -0
  59. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.js.map +1 -1
  60. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts +242 -35
  61. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts.map +1 -1
  62. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.js +19 -1
  63. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.js.map +1 -1
  64. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts +8 -1
  65. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts.map +1 -1
  66. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.js +64 -1
  67. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.js.map +1 -1
  68. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts +3 -0
  69. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts.map +1 -1
  70. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.js +66 -8
  71. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.js.map +1 -1
  72. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts +1 -1
  73. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts.map +1 -1
  74. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.js +37 -19
  75. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.js.map +1 -1
  76. package/dist/lib/modules/limited-time-offer/limited-time-offer.router.d.ts +249 -18
  77. package/dist/lib/modules/limited-time-offer/limited-time-offer.router.d.ts.map +1 -1
  78. package/dist/lib/modules/limited-time-offer/limited-time-offer.service.d.ts +2 -0
  79. package/dist/lib/modules/limited-time-offer/limited-time-offer.service.d.ts.map +1 -1
  80. package/dist/lib/modules/limited-time-offer/limited-time-offer.service.js +15 -3
  81. package/dist/lib/modules/limited-time-offer/limited-time-offer.service.js.map +1 -1
  82. package/dist/lib/modules/limited-time-offer/notification/limited-time-offer-notification.constants.d.ts +1 -1
  83. package/dist/lib/modules/limited-time-offer/notification/limited-time-offer-notification.constants.js +1 -1
  84. package/dist/lib/modules/limited-time-offer/notification/limited-time-offer-notification.constants.js.map +1 -1
  85. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.builder.d.ts +24 -3
  86. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.builder.d.ts.map +1 -1
  87. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.builder.js +19 -1
  88. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.builder.js.map +1 -1
  89. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.repository.d.ts +10 -0
  90. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.repository.d.ts.map +1 -1
  91. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.repository.js +43 -0
  92. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.repository.js.map +1 -1
  93. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts +195 -10
  94. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts.map +1 -1
  95. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.js +29 -0
  96. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.js.map +1 -1
  97. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts +428 -33
  98. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts.map +1 -1
  99. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.js +16 -6
  100. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.js.map +1 -1
  101. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts +7 -4
  102. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts.map +1 -1
  103. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.js +42 -7
  104. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.js.map +1 -1
  105. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts +14 -3
  106. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts.map +1 -1
  107. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.js +76 -16
  108. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.js.map +1 -1
  109. package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.repository.d.ts +13 -0
  110. package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.repository.d.ts.map +1 -0
  111. package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.repository.js +75 -0
  112. package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.repository.js.map +1 -0
  113. package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.service.d.ts +21 -0
  114. package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.service.d.ts.map +1 -0
  115. package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.service.js +83 -0
  116. package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.service.js.map +1 -0
  117. package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts +1 -0
  118. package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts.map +1 -1
  119. package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.js +29 -0
  120. package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.js.map +1 -1
  121. package/dist/lib/modules/marketing/routers/marketing.router.d.ts +14 -0
  122. package/dist/lib/modules/marketing/routers/marketing.router.d.ts.map +1 -1
  123. package/dist/lib/modules/marketing/routers/marketing.router.js +5 -0
  124. package/dist/lib/modules/marketing/routers/marketing.router.js.map +1 -1
  125. package/dist/lib/modules/marketing/services/index.d.ts +3 -0
  126. package/dist/lib/modules/marketing/services/index.d.ts.map +1 -1
  127. package/dist/lib/modules/marketing/services/index.js +3 -0
  128. package/dist/lib/modules/marketing/services/index.js.map +1 -1
  129. package/dist/lib/modules/marketing/services/marketing-conflict.repository.d.ts +9 -0
  130. package/dist/lib/modules/marketing/services/marketing-conflict.repository.d.ts.map +1 -0
  131. package/dist/lib/modules/marketing/services/marketing-conflict.repository.js +63 -0
  132. package/dist/lib/modules/marketing/services/marketing-conflict.repository.js.map +1 -0
  133. package/dist/lib/modules/marketing/services/marketing-conflict.service.d.ts +27 -0
  134. package/dist/lib/modules/marketing/services/marketing-conflict.service.d.ts.map +1 -0
  135. package/dist/lib/modules/marketing/services/marketing-conflict.service.js +135 -0
  136. package/dist/lib/modules/marketing/services/marketing-conflict.service.js.map +1 -0
  137. package/dist/lib/modules/marketing/services/marketing.service.d.ts +7 -2
  138. package/dist/lib/modules/marketing/services/marketing.service.d.ts.map +1 -1
  139. package/dist/lib/modules/marketing/services/marketing.service.js +97 -51
  140. package/dist/lib/modules/marketing/services/marketing.service.js.map +1 -1
  141. package/dist/lib/modules/marketing/services/product-marketing.service.d.ts +2 -3
  142. package/dist/lib/modules/marketing/services/product-marketing.service.d.ts.map +1 -1
  143. package/dist/lib/modules/marketing/services/product-marketing.service.js +42 -13
  144. package/dist/lib/modules/marketing/services/product-marketing.service.js.map +1 -1
  145. package/dist/lib/modules/marketing/services/spend-to-get-marketing.repository.d.ts +14 -0
  146. package/dist/lib/modules/marketing/services/spend-to-get-marketing.repository.d.ts.map +1 -0
  147. package/dist/lib/modules/marketing/services/spend-to-get-marketing.repository.js +82 -0
  148. package/dist/lib/modules/marketing/services/spend-to-get-marketing.repository.js.map +1 -0
  149. package/dist/lib/modules/marketing/services/spend-to-get-marketing.service.d.ts +11 -0
  150. package/dist/lib/modules/marketing/services/spend-to-get-marketing.service.d.ts.map +1 -0
  151. package/dist/lib/modules/marketing/services/spend-to-get-marketing.service.js +99 -0
  152. package/dist/lib/modules/marketing/services/spend-to-get-marketing.service.js.map +1 -0
  153. package/dist/lib/modules/marketing/services/spend-to-get-progress.repository.d.ts +9 -0
  154. package/dist/lib/modules/marketing/services/spend-to-get-progress.repository.d.ts.map +1 -0
  155. package/dist/lib/modules/marketing/services/spend-to-get-progress.repository.js +69 -0
  156. package/dist/lib/modules/marketing/services/spend-to-get-progress.repository.js.map +1 -0
  157. package/dist/lib/modules/marketing/services/spend-to-get-progress.service.d.ts +31 -0
  158. package/dist/lib/modules/marketing/services/spend-to-get-progress.service.d.ts.map +1 -0
  159. package/dist/lib/modules/marketing/services/spend-to-get-progress.service.js +123 -0
  160. package/dist/lib/modules/marketing/services/spend-to-get-progress.service.js.map +1 -0
  161. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.d.ts.map +1 -1
  162. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.js +95 -27
  163. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.js.map +1 -1
  164. package/dist/lib/modules/marketing/validations/all-marketings.validation.d.ts.map +1 -1
  165. package/dist/lib/modules/marketing/validations/all-marketings.validation.js +3 -0
  166. package/dist/lib/modules/marketing/validations/all-marketings.validation.js.map +1 -1
  167. package/dist/lib/modules/marketing/validations/buy1-get1-marketing.validation.d.ts +3 -3
  168. package/dist/lib/modules/marketing/validations/discount-marketing.validation.d.ts +3 -3
  169. package/dist/lib/modules/marketing/validations/index.d.ts +1 -0
  170. package/dist/lib/modules/marketing/validations/index.d.ts.map +1 -1
  171. package/dist/lib/modules/marketing/validations/index.js +1 -0
  172. package/dist/lib/modules/marketing/validations/index.js.map +1 -1
  173. package/dist/lib/modules/marketing/validations/marketing.validation.d.ts +17 -0
  174. package/dist/lib/modules/marketing/validations/marketing.validation.d.ts.map +1 -1
  175. package/dist/lib/modules/marketing/validations/marketing.validation.js +7 -1
  176. package/dist/lib/modules/marketing/validations/marketing.validation.js.map +1 -1
  177. package/dist/lib/modules/marketing/validations/product-marketing.validation.d.ts +2 -2
  178. package/dist/lib/modules/marketing/validations/spend-to-get-marketing.validation.d.ts +617 -0
  179. package/dist/lib/modules/marketing/validations/spend-to-get-marketing.validation.d.ts.map +1 -0
  180. package/dist/lib/modules/marketing/validations/spend-to-get-marketing.validation.js +119 -0
  181. package/dist/lib/modules/marketing/validations/spend-to-get-marketing.validation.js.map +1 -0
  182. package/dist/lib/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts +1 -1
  183. package/dist/lib/modules/punch-marketing-history/services/punch-marketing-history.service.d.ts +0 -1
  184. package/dist/lib/modules/punch-marketing-history/services/punch-marketing-history.service.d.ts.map +1 -1
  185. package/dist/lib/modules/punch-marketing-history/services/punch-marketing-history.service.js +2 -49
  186. package/dist/lib/modules/punch-marketing-history/services/punch-marketing-history.service.js.map +1 -1
  187. package/dist/lib/modules/punch-marketing-history/validations/punch-marketing-history.validation.d.ts +2 -2
  188. package/dist/lib/modules/spend-to-get-history/routers/index.d.ts +2 -0
  189. package/dist/lib/modules/spend-to-get-history/routers/index.d.ts.map +1 -0
  190. package/dist/lib/modules/spend-to-get-history/routers/index.js +18 -0
  191. package/dist/lib/modules/spend-to-get-history/routers/index.js.map +1 -0
  192. package/dist/lib/modules/spend-to-get-history/routers/spend-to-get-history.router.js +62 -0
  193. package/dist/lib/modules/spend-to-get-history/routers/spend-to-get-history.router.js.map +1 -0
  194. package/dist/lib/modules/spend-to-get-history/services/index.d.ts +2 -0
  195. package/dist/lib/modules/spend-to-get-history/services/index.d.ts.map +1 -0
  196. package/dist/lib/modules/spend-to-get-history/services/index.js +18 -0
  197. package/dist/lib/modules/spend-to-get-history/services/index.js.map +1 -0
  198. package/dist/lib/modules/spend-to-get-history/services/spend-to-get-history.service.d.ts +24 -0
  199. package/dist/lib/modules/spend-to-get-history/services/spend-to-get-history.service.d.ts.map +1 -0
  200. package/dist/lib/modules/spend-to-get-history/services/spend-to-get-history.service.js +136 -0
  201. package/dist/lib/modules/spend-to-get-history/services/spend-to-get-history.service.js.map +1 -0
  202. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.repository.d.ts +24 -0
  203. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.repository.d.ts.map +1 -0
  204. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.repository.js +97 -0
  205. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.repository.js.map +1 -0
  206. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.router.d.ts +271 -0
  207. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.router.d.ts.map +1 -0
  208. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.router.js +62 -0
  209. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.router.js.map +1 -0
  210. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.service.d.ts +24 -0
  211. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.service.d.ts.map +1 -0
  212. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.service.js +116 -0
  213. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.service.js.map +1 -0
  214. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.validation.d.ts +232 -0
  215. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.validation.d.ts.map +1 -0
  216. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.validation.js +30 -0
  217. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.validation.js.map +1 -0
  218. package/dist/lib/modules/spend-to-get-history/validations/index.d.ts +2 -0
  219. package/dist/lib/modules/spend-to-get-history/validations/index.d.ts.map +1 -0
  220. package/dist/lib/modules/spend-to-get-history/validations/index.js +18 -0
  221. package/dist/lib/modules/spend-to-get-history/validations/index.js.map +1 -0
  222. package/dist/lib/modules/spend-to-get-history/validations/spend-to-get-history.validation.d.ts +232 -0
  223. package/dist/lib/modules/spend-to-get-history/validations/spend-to-get-history.validation.d.ts.map +1 -0
  224. package/dist/lib/modules/spend-to-get-history/validations/spend-to-get-history.validation.js +30 -0
  225. package/dist/lib/modules/spend-to-get-history/validations/spend-to-get-history.validation.js.map +1 -0
  226. package/dist/lib/modules/tournament/match/events/match-ended.consumer.d.ts +2 -0
  227. package/dist/lib/modules/tournament/match/events/match-ended.consumer.d.ts.map +1 -0
  228. package/dist/lib/modules/tournament/match/events/match-ended.consumer.js +15 -0
  229. package/dist/lib/modules/tournament/match/events/match-ended.consumer.js.map +1 -0
  230. package/dist/lib/modules/tournament/match/events/match-ended.event.d.ts +14 -0
  231. package/dist/lib/modules/tournament/match/events/match-ended.event.d.ts.map +1 -0
  232. package/dist/lib/modules/tournament/match/events/match-ended.event.js +12 -0
  233. package/dist/lib/modules/tournament/match/events/match-ended.event.js.map +1 -0
  234. package/dist/lib/modules/tournament/notification/jobs/notification.producer.d.ts +10 -0
  235. package/dist/lib/modules/tournament/notification/jobs/notification.producer.d.ts.map +1 -0
  236. package/dist/lib/modules/tournament/notification/jobs/notification.producer.js +23 -0
  237. package/dist/lib/modules/tournament/notification/jobs/notification.producer.js.map +1 -0
  238. package/dist/lib/modules/tournament/notification/jobs/notification.worker.d.ts +9 -0
  239. package/dist/lib/modules/tournament/notification/jobs/notification.worker.d.ts.map +1 -0
  240. package/dist/lib/modules/tournament/notification/jobs/notification.worker.js +82 -0
  241. package/dist/lib/modules/tournament/notification/jobs/notification.worker.js.map +1 -0
  242. package/dist/lib/modules/tournament/notification/notification.schedule.config.d.ts +10 -0
  243. package/dist/lib/modules/tournament/notification/notification.schedule.config.d.ts.map +1 -0
  244. package/dist/lib/modules/tournament/notification/notification.schedule.config.js +15 -0
  245. package/dist/lib/modules/tournament/notification/notification.schedule.config.js.map +1 -0
  246. package/dist/lib/modules/tournament/notification/notification.scheduler.service.d.ts +10 -0
  247. package/dist/lib/modules/tournament/notification/notification.scheduler.service.d.ts.map +1 -0
  248. package/dist/lib/modules/tournament/notification/notification.scheduler.service.js +73 -0
  249. package/dist/lib/modules/tournament/notification/notification.scheduler.service.js.map +1 -0
  250. package/dist/types/event/event-initializations.d.ts.map +1 -1
  251. package/dist/types/event/event-listeners/event-listeners.d.ts +2 -0
  252. package/dist/types/event/event-listeners/event-listeners.d.ts.map +1 -1
  253. package/dist/types/event/events/marketing-product-seed.event.d.ts +1 -2
  254. package/dist/types/event/events/marketing-product-seed.event.d.ts.map +1 -1
  255. package/dist/types/event/events/marketing-product-sync.event.d.ts +11 -0
  256. package/dist/types/event/events/marketing-product-sync.event.d.ts.map +1 -0
  257. package/dist/types/events/event-initializations.d.ts +2 -0
  258. package/dist/types/events/event-initializations.d.ts.map +1 -0
  259. package/dist/types/index.d.ts +8175 -33
  260. package/dist/types/index.d.ts.map +1 -1
  261. package/dist/types/modules/coupon/routers/coupon.router.d.ts +7630 -2
  262. package/dist/types/modules/coupon/routers/coupon.router.d.ts.map +1 -1
  263. package/dist/types/modules/coupon/services/coupon.service.d.ts +0 -1
  264. package/dist/types/modules/coupon/services/coupon.service.d.ts.map +1 -1
  265. package/dist/types/modules/coupon/validations/coupon.validation.d.ts +6 -6
  266. package/dist/types/modules/coupon/validations/create-coupon.validation.d.ts.map +1 -1
  267. package/dist/types/modules/deal-setting/services/deal-setting.service.d.ts.map +1 -1
  268. package/dist/types/modules/featured-setting/services/featured-setting.service.d.ts.map +1 -1
  269. package/dist/types/modules/limited-time-offer/campaign/campaign.router.d.ts +54 -8
  270. package/dist/types/modules/limited-time-offer/campaign/campaign.router.d.ts.map +1 -1
  271. package/dist/types/modules/limited-time-offer/campaign/jobs/index.d.ts.map +1 -1
  272. package/dist/types/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts +0 -1
  273. package/dist/types/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts.map +1 -1
  274. package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.d.ts +16 -3
  275. package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.d.ts.map +1 -1
  276. package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.d.ts +2 -0
  277. package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.d.ts.map +1 -1
  278. package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts +242 -35
  279. package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts.map +1 -1
  280. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts +8 -1
  281. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts.map +1 -1
  282. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts +3 -0
  283. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts.map +1 -1
  284. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts +1 -1
  285. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts.map +1 -1
  286. package/dist/types/modules/limited-time-offer/limited-time-offer.router.d.ts +249 -18
  287. package/dist/types/modules/limited-time-offer/limited-time-offer.router.d.ts.map +1 -1
  288. package/dist/types/modules/limited-time-offer/limited-time-offer.service.d.ts +2 -0
  289. package/dist/types/modules/limited-time-offer/limited-time-offer.service.d.ts.map +1 -1
  290. package/dist/types/modules/limited-time-offer/notification/limited-time-offer-notification.constants.d.ts +1 -1
  291. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.builder.d.ts +24 -3
  292. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.builder.d.ts.map +1 -1
  293. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.repository.d.ts +10 -0
  294. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.repository.d.ts.map +1 -1
  295. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts +195 -10
  296. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts.map +1 -1
  297. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts +1 -0
  298. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts.map +1 -0
  299. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts +428 -33
  300. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts.map +1 -1
  301. package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts +7 -4
  302. package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts.map +1 -1
  303. package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts +14 -3
  304. package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts.map +1 -1
  305. package/dist/types/modules/limited-time-offer/session/limited-time-offer-campaign-session.repository.d.ts +13 -0
  306. package/dist/types/modules/limited-time-offer/session/limited-time-offer-campaign-session.repository.d.ts.map +1 -0
  307. package/dist/types/modules/limited-time-offer/session/limited-time-offer-campaign-session.service.d.ts +21 -0
  308. package/dist/types/modules/limited-time-offer/session/limited-time-offer-campaign-session.service.d.ts.map +1 -0
  309. package/dist/types/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts +1 -0
  310. package/dist/types/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts.map +1 -1
  311. package/dist/types/modules/marketing/routers/marketing.router.d.ts +14 -0
  312. package/dist/types/modules/marketing/routers/marketing.router.d.ts.map +1 -1
  313. package/dist/types/modules/marketing/services/index.d.ts +3 -0
  314. package/dist/types/modules/marketing/services/index.d.ts.map +1 -1
  315. package/dist/types/modules/marketing/services/marketing-conflict.repository.d.ts +9 -0
  316. package/dist/types/modules/marketing/services/marketing-conflict.repository.d.ts.map +1 -0
  317. package/dist/types/modules/marketing/services/marketing-conflict.service.d.ts +41 -0
  318. package/dist/types/modules/marketing/services/marketing-conflict.service.d.ts.map +1 -0
  319. package/dist/types/modules/marketing/services/marketing.service.d.ts +7 -2
  320. package/dist/types/modules/marketing/services/marketing.service.d.ts.map +1 -1
  321. package/dist/types/modules/marketing/services/product-marketing.service.d.ts +7 -3
  322. package/dist/types/modules/marketing/services/product-marketing.service.d.ts.map +1 -1
  323. package/dist/types/modules/marketing/services/spend-to-get-marketing.repository.d.ts +14 -0
  324. package/dist/types/modules/marketing/services/spend-to-get-marketing.repository.d.ts.map +1 -0
  325. package/dist/types/modules/marketing/services/spend-to-get-marketing.service.d.ts +20 -0
  326. package/dist/types/modules/marketing/services/spend-to-get-marketing.service.d.ts.map +1 -0
  327. package/dist/types/modules/marketing/services/spend-to-get-progress.repository.d.ts +9 -0
  328. package/dist/types/modules/marketing/services/spend-to-get-progress.repository.d.ts.map +1 -0
  329. package/dist/types/modules/marketing/services/spend-to-get-progress.service.d.ts +37 -0
  330. package/dist/types/modules/marketing/services/spend-to-get-progress.service.d.ts.map +1 -0
  331. package/dist/types/modules/marketing/services/synchronize-product-marketing.service.d.ts.map +1 -1
  332. package/dist/types/modules/marketing/validations/all-marketings.validation.d.ts.map +1 -1
  333. package/dist/types/modules/marketing/validations/buy1-get1-marketing.validation.d.ts +3 -3
  334. package/dist/types/modules/marketing/validations/discount-marketing.validation.d.ts +3 -3
  335. package/dist/types/modules/marketing/validations/index.d.ts +1 -0
  336. package/dist/types/modules/marketing/validations/index.d.ts.map +1 -1
  337. package/dist/types/modules/marketing/validations/marketing.validation.d.ts +17 -0
  338. package/dist/types/modules/marketing/validations/marketing.validation.d.ts.map +1 -1
  339. package/dist/types/modules/marketing/validations/product-marketing.validation.d.ts +2 -2
  340. package/dist/types/modules/marketing/validations/spend-to-get-marketing.validation.d.ts +630 -0
  341. package/dist/types/modules/marketing/validations/spend-to-get-marketing.validation.d.ts.map +1 -0
  342. package/dist/types/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts +1 -1
  343. package/dist/types/modules/punch-marketing-history/services/punch-marketing-history.service.d.ts +0 -5
  344. package/dist/types/modules/punch-marketing-history/services/punch-marketing-history.service.d.ts.map +1 -1
  345. package/dist/types/modules/punch-marketing-history/validations/punch-marketing-history.validation.d.ts +2 -2
  346. package/dist/types/modules/spend-to-get-history/routers/index.d.ts +2 -0
  347. package/dist/types/modules/spend-to-get-history/routers/index.d.ts.map +1 -0
  348. package/dist/types/modules/spend-to-get-history/services/index.d.ts +2 -0
  349. package/dist/types/modules/spend-to-get-history/services/index.d.ts.map +1 -0
  350. package/dist/types/modules/spend-to-get-history/services/spend-to-get-history.service.d.ts +56 -0
  351. package/dist/types/modules/spend-to-get-history/services/spend-to-get-history.service.d.ts.map +1 -0
  352. package/dist/types/modules/spend-to-get-history/spend-to-get-history.repository.d.ts +24 -0
  353. package/dist/types/modules/spend-to-get-history/spend-to-get-history.repository.d.ts.map +1 -0
  354. package/dist/types/modules/spend-to-get-history/spend-to-get-history.router.d.ts +271 -0
  355. package/dist/types/modules/spend-to-get-history/spend-to-get-history.router.d.ts.map +1 -0
  356. package/dist/types/modules/spend-to-get-history/spend-to-get-history.service.d.ts +56 -0
  357. package/dist/types/modules/spend-to-get-history/spend-to-get-history.service.d.ts.map +1 -0
  358. package/dist/types/modules/spend-to-get-history/spend-to-get-history.validation.d.ts +241 -0
  359. package/dist/types/modules/spend-to-get-history/spend-to-get-history.validation.d.ts.map +1 -0
  360. package/dist/types/modules/spend-to-get-history/validations/index.d.ts +2 -0
  361. package/dist/types/modules/spend-to-get-history/validations/index.d.ts.map +1 -0
  362. package/dist/types/modules/spend-to-get-history/validations/spend-to-get-history.validation.d.ts +241 -0
  363. package/dist/types/modules/spend-to-get-history/validations/spend-to-get-history.validation.d.ts.map +1 -0
  364. package/dist/types/modules/tournament/config/tournament-config.validation.d.ts +201 -0
  365. package/dist/types/modules/tournament/config/tournament-config.validation.d.ts.map +1 -0
  366. package/dist/types/modules/tournament/match/events/match-ended.consumer.d.ts +2 -0
  367. package/dist/types/modules/tournament/match/events/match-ended.consumer.d.ts.map +1 -0
  368. package/dist/types/modules/tournament/match/events/match-ended.event.d.ts +14 -0
  369. package/dist/types/modules/tournament/match/events/match-ended.event.d.ts.map +1 -0
  370. package/dist/types/modules/tournament/notification/jobs/notification.producer.d.ts +10 -0
  371. package/dist/types/modules/tournament/notification/jobs/notification.producer.d.ts.map +1 -0
  372. package/dist/types/modules/tournament/notification/jobs/notification.worker.d.ts +9 -0
  373. package/dist/types/modules/tournament/notification/jobs/notification.worker.d.ts.map +1 -0
  374. package/dist/types/modules/tournament/notification/notification.schedule.config.d.ts +10 -0
  375. package/dist/types/modules/tournament/notification/notification.schedule.config.d.ts.map +1 -0
  376. package/dist/types/modules/tournament/notification/notification.scheduler.service.d.ts +10 -0
  377. package/dist/types/modules/tournament/notification/notification.scheduler.service.d.ts.map +1 -0
  378. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"limited-time-offer-participant.validation.d.ts","sourceRoot":"/","sources":["modules/limited-time-offer/participant/limited-time-offer-participant.validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAuB,GAAG,EAAgB,MAAM,yCAAyC,CAAC;AAEjG,oBAAY,YAAY;IACpB,IAAI,SAAS;IACb,SAAS,cAAc;IACvB,IAAI,SAAS;IACb,MAAM,WAAW;CACpB;AAED,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgC5B,CAAC;AAEP,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAe5B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;EAQhC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;EASnC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIlC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAA0C,CAAC;AACjF,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAgD,CAAC;AAE7F,MAAM,MAAM,kBAAkB,GAAG,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACnE,MAAM,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC3D,MAAM,MAAM,kBAAkB,GAAG,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACnE,MAAM,MAAM,qBAAqB,GAAG,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC;AACzE,MAAM,MAAM,oBAAoB,GAAG,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACvE,MAAM,MAAM,6BAA6B,GAAG,IAAI,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAC;AAGvF,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,GAAG;IAAC,SAAS,EAAE,qBAAqB,CAAC,aAAa,CAAC,CAAA;CAAC,CAAC"}
1
+ {"version":3,"file":"limited-time-offer-participant.validation.d.ts","sourceRoot":"/","sources":["modules/limited-time-offer/participant/limited-time-offer-participant.validation.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ParticipantStatusResponseSchema = exports.ParticipantResponseSchema = exports.ParticipantStatusSchema = exports.ParticipantSummarySchema = exports.CampaignSummarySchema = exports.ParticipantSchema = exports.JoinLtoCampaignSchema = exports.LtoCardState = void 0;
3
+ exports.AdminGetParticipantByShopSchema = exports.AdminWithdrawShopSchema = exports.AdminUpdateShopSchema = exports.AdminJoinParticipantsResponseSchema = exports.AdminEnrollShopsSchema = exports.AdminEnrollShopEntrySchema = exports.ParticipantStatusResponseSchema = exports.ParticipantResponseSchema = exports.ParticipantStatusSchema = exports.ParticipantSummarySchema = exports.CampaignSummarySchema = exports.ParticipantSchema = exports.JoinLtoCampaignSchema = exports.LtoCardState = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const validation_1 = require("@lyxa.ai/core/dist/utilities/validation");
6
6
  var LtoCardState;
@@ -10,8 +10,7 @@ var LtoCardState;
10
10
  LtoCardState["LIVE"] = "LIVE";
11
11
  LtoCardState["JOINED"] = "JOINED";
12
12
  })(LtoCardState || (exports.LtoCardState = LtoCardState = {}));
13
- exports.JoinLtoCampaignSchema = zod_1.z
14
- .object({
13
+ const joinLtoCampaignBase = zod_1.z.object({
15
14
  isEntireMenu: zod_1.z.boolean(),
16
15
  products: zod_1.z.array(validation_1.ZodValidation.objectId()).default([]),
17
16
  shopCategories: zod_1.z.array(validation_1.ZodValidation.objectId()).default([]),
@@ -19,8 +18,8 @@ exports.JoinLtoCampaignSchema = zod_1.z
19
18
  maxDiscountCap: validation_1.ZodValidation.number('Max discount cap'),
20
19
  isOrderCapacityEnabled: zod_1.z.boolean(),
21
20
  maxOrderCapacity: validation_1.ZodValidation.number('Max order capacity').optional(),
22
- })
23
- .superRefine((d, ctx) => {
21
+ });
22
+ const joinRefinement = (d, ctx) => {
24
23
  if (!d.isEntireMenu && d.products.length === 0 && d.shopCategories.length === 0) {
25
24
  ctx.addIssue({
26
25
  code: zod_1.z.ZodIssueCode.custom,
@@ -42,7 +41,8 @@ exports.JoinLtoCampaignSchema = zod_1.z
42
41
  path: ['maxOrderCapacity']
43
42
  });
44
43
  }
45
- });
44
+ };
45
+ exports.JoinLtoCampaignSchema = joinLtoCampaignBase.superRefine(joinRefinement);
46
46
  exports.ParticipantSchema = zod_1.z.object({
47
47
  _id: validation_1.ZodValidation.objectId(),
48
48
  campaign: validation_1.ZodValidation.objectId(),
@@ -85,4 +85,14 @@ exports.ParticipantStatusSchema = zod_1.z.object({
85
85
  });
86
86
  exports.ParticipantResponseSchema = (0, validation_1.createResponseSchema)(exports.ParticipantSchema);
87
87
  exports.ParticipantStatusResponseSchema = (0, validation_1.createResponseSchema)(exports.ParticipantStatusSchema);
88
+ exports.AdminEnrollShopEntrySchema = joinLtoCampaignBase
89
+ .extend({ shopId: validation_1.ZodValidation.objectId() })
90
+ .superRefine(joinRefinement);
91
+ exports.AdminEnrollShopsSchema = zod_1.z.object({
92
+ shops: zod_1.z.array(exports.AdminEnrollShopEntrySchema).min(1),
93
+ });
94
+ exports.AdminJoinParticipantsResponseSchema = (0, validation_1.createResponseSchema)(zod_1.z.array(exports.ParticipantSchema));
95
+ exports.AdminUpdateShopSchema = exports.AdminEnrollShopEntrySchema;
96
+ exports.AdminWithdrawShopSchema = zod_1.z.object({ shopId: validation_1.ZodValidation.objectId() });
97
+ exports.AdminGetParticipantByShopSchema = zod_1.z.object({ shopId: validation_1.ZodValidation.objectId() });
88
98
  //# sourceMappingURL=limited-time-offer-participant.validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"limited-time-offer-participant.validation.js","sourceRoot":"/","sources":["modules/limited-time-offer/participant/limited-time-offer-participant.validation.ts"],"names":[],"mappings":"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","sourcesContent":["import {z} from 'zod';\nimport {createResponseSchema, DTO, ZodValidation} from '@lyxa.ai/core/dist/utilities/validation';\n\nexport enum LtoCardState {\n NONE = 'NONE',\n SCHEDULED = 'SCHEDULED',\n LIVE = 'LIVE',\n JOINED = 'JOINED',\n}\n\nexport const JoinLtoCampaignSchema = z\n .object({\n isEntireMenu: z.boolean(),\n products: z.array(ZodValidation.objectId()).default([]),\n shopCategories: z.array(ZodValidation.objectId()).default([]),\n discountPercentage: ZodValidation.number('Discount percentage'),\n maxDiscountCap: ZodValidation.number('Max discount cap'),\n isOrderCapacityEnabled: z.boolean(),\n maxOrderCapacity: ZodValidation.number('Max order capacity').optional(),\n })\n .superRefine((d, ctx) => {\n if (!d.isEntireMenu && d.products.length === 0 && d.shopCategories.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'At least one product or category must be selected',\n path: ['products']\n });\n }\n if (d.isOrderCapacityEnabled && !d.maxOrderCapacity) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Max order capacity is required when capacity is enabled',\n path: ['maxOrderCapacity']\n });\n }\n if (d.isOrderCapacityEnabled && d.maxOrderCapacity !== undefined && d.maxOrderCapacity <= 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Max order capacity must be greater than 0',\n path: ['maxOrderCapacity']\n });\n }\n });\n\nexport const ParticipantSchema = z.object({\n _id: ZodValidation.objectId(),\n campaign: ZodValidation.objectId(),\n shop: ZodValidation.objectId(),\n joinedAt: z.date(),\n products: z.array(ZodValidation.objectId()).default([]),\n isEntireMenu: z.boolean(),\n discountPercentage: ZodValidation.number('Discount percentage').optional(),\n maxDiscountCap: ZodValidation.number('Max discount cap').optional(),\n isOrderCapacityEnabled: z.boolean(),\n maxOrderCapacity: ZodValidation.number('Max order capacity').optional(),\n isWithdrawn: z.boolean(),\n withdrawnAt: z.date().nullable().optional(),\n createdAt: z.date().nullable().optional(),\n updatedAt: z.date().nullable().optional(),\n});\n\nexport const CampaignSummarySchema = z.object({\n _id: ZodValidation.objectId(),\n title: ZodValidation.string('Title').optional(),\n subTitle: ZodValidation.string('Subtitle').optional(),\n startDate: z.date().nullable().optional(),\n endDate: z.date().nullable().optional(),\n discountOptions: z.array(ZodValidation.number('Discount option')).default([]),\n maxDiscountCaps: z.array(ZodValidation.number('Max discount cap')).default([]),\n});\n\nexport const ParticipantSummarySchema = z.object({\n discountPercentage: ZodValidation.number('Discount percentage').optional(),\n maxDiscountCap: ZodValidation.number('Max discount cap').optional(),\n joinedAt: z.date(),\n isEntireMenu: z.boolean(),\n isOrderCapacityEnabled: z.boolean(),\n maxOrderCapacity: ZodValidation.number('Max order capacity').optional(),\n productIds: z.array(ZodValidation.objectId()).default([]),\n marketingId: ZodValidation.objectId().optional(),\n});\n\nexport const ParticipantStatusSchema = z.object({\n campaignState: z.nativeEnum(LtoCardState),\n campaign: CampaignSummarySchema.optional(),\n participant: ParticipantSummarySchema.optional(),\n});\n\nexport const ParticipantResponseSchema = createResponseSchema(ParticipantSchema);\nexport const ParticipantStatusResponseSchema = createResponseSchema(ParticipantStatusSchema);\n\nexport type JoinLtoCampaignDTO = DTO<typeof JoinLtoCampaignSchema>;\nexport type ParticipantDTO = DTO<typeof ParticipantSchema>;\nexport type CampaignSummaryDTO = DTO<typeof CampaignSummarySchema>;\nexport type ParticipantSummaryDTO = DTO<typeof ParticipantSummarySchema>;\nexport type ParticipantStatusDTO = DTO<typeof ParticipantStatusSchema>;\nexport type ActiveParticipantMarketingDTO = Pick<ParticipantSummaryDTO, 'marketingId'>;\n// shopCategories are intentionally excluded: the participant record does not persist category\n// selections — they live on the linked marketing doc and are derived from there for display.\nexport type UpdateParticipantDataDTO = Omit<JoinLtoCampaignDTO, 'shopCategories'> & {marketing: ParticipantSummaryDTO['marketingId']};\n"]}
1
+ {"version":3,"file":"limited-time-offer-participant.validation.js","sourceRoot":"/","sources":["modules/limited-time-offer/participant/limited-time-offer-participant.validation.ts"],"names":[],"mappings":"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","sourcesContent":["import {z} from 'zod';\nimport {createResponseSchema, DTO, ZodValidation} from '@lyxa.ai/core/dist/utilities/validation';\n\nexport enum LtoCardState {\n NONE = 'NONE',\n SCHEDULED = 'SCHEDULED',\n LIVE = 'LIVE',\n JOINED = 'JOINED',\n}\n\nconst joinLtoCampaignBase = z.object({\n isEntireMenu: z.boolean(),\n products: z.array(ZodValidation.objectId()).default([]),\n shopCategories: z.array(ZodValidation.objectId()).default([]),\n discountPercentage: ZodValidation.number('Discount percentage'),\n maxDiscountCap: ZodValidation.number('Max discount cap'),\n isOrderCapacityEnabled: z.boolean(),\n maxOrderCapacity: ZodValidation.number('Max order capacity').optional(),\n});\n\ntype JoinLtoCampaignBase = z.infer<typeof joinLtoCampaignBase>;\n\nconst joinRefinement = (d: JoinLtoCampaignBase, ctx: z.RefinementCtx) => {\n if (!d.isEntireMenu && d.products.length === 0 && d.shopCategories.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'At least one product or category must be selected',\n path: ['products']\n });\n }\n if (d.isOrderCapacityEnabled && !d.maxOrderCapacity) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Max order capacity is required when capacity is enabled',\n path: ['maxOrderCapacity']\n });\n }\n if (d.isOrderCapacityEnabled && d.maxOrderCapacity !== undefined && d.maxOrderCapacity <= 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Max order capacity must be greater than 0',\n path: ['maxOrderCapacity']\n });\n }\n};\n\nexport const JoinLtoCampaignSchema = joinLtoCampaignBase.superRefine(joinRefinement);\n\nexport const ParticipantSchema = z.object({\n _id: ZodValidation.objectId(),\n campaign: ZodValidation.objectId(),\n shop: ZodValidation.objectId(),\n joinedAt: z.date(),\n products: z.array(ZodValidation.objectId()).default([]),\n isEntireMenu: z.boolean(),\n discountPercentage: ZodValidation.number('Discount percentage').optional(),\n maxDiscountCap: ZodValidation.number('Max discount cap').optional(),\n isOrderCapacityEnabled: z.boolean(),\n maxOrderCapacity: ZodValidation.number('Max order capacity').optional(),\n isWithdrawn: z.boolean(),\n withdrawnAt: z.date().nullable().optional(),\n createdAt: z.date().nullable().optional(),\n updatedAt: z.date().nullable().optional(),\n});\n\nexport const CampaignSummarySchema = z.object({\n _id: ZodValidation.objectId(),\n title: ZodValidation.string('Title').optional(),\n subTitle: ZodValidation.string('Subtitle').optional(),\n startDate: z.date().nullable().optional(),\n endDate: z.date().nullable().optional(),\n discountOptions: z.array(ZodValidation.number('Discount option')).default([]),\n maxDiscountCaps: z.array(ZodValidation.number('Max discount cap')).default([]),\n});\n\nexport const ParticipantSummarySchema = z.object({\n discountPercentage: ZodValidation.number('Discount percentage').optional(),\n maxDiscountCap: ZodValidation.number('Max discount cap').optional(),\n joinedAt: z.date(),\n isEntireMenu: z.boolean(),\n isOrderCapacityEnabled: z.boolean(),\n maxOrderCapacity: ZodValidation.number('Max order capacity').optional(),\n productIds: z.array(ZodValidation.objectId()).default([]),\n marketingId: ZodValidation.objectId().optional(),\n});\n\nexport const ParticipantStatusSchema = z.object({\n campaignState: z.nativeEnum(LtoCardState),\n campaign: CampaignSummarySchema.optional(),\n participant: ParticipantSummarySchema.optional(),\n});\n\nexport const ParticipantResponseSchema = createResponseSchema(ParticipantSchema);\nexport const ParticipantStatusResponseSchema = createResponseSchema(ParticipantStatusSchema);\n\nexport const AdminEnrollShopEntrySchema = joinLtoCampaignBase\n .extend({ shopId: ZodValidation.objectId() })\n .superRefine(joinRefinement);\n\nexport const AdminEnrollShopsSchema = z.object({\n shops: z.array(AdminEnrollShopEntrySchema).min(1),\n});\n\nexport const AdminJoinParticipantsResponseSchema = createResponseSchema(z.array(ParticipantSchema));\n\n// Admin edit reuses the enroll entry shape (shopId + join fields); withdraw and get-by-shop only need the shop.\nexport const AdminUpdateShopSchema = AdminEnrollShopEntrySchema;\nexport const AdminWithdrawShopSchema = z.object({shopId: ZodValidation.objectId()});\nexport const AdminGetParticipantByShopSchema = z.object({shopId: ZodValidation.objectId()});\n\nexport type AdminWithdrawShopDTO = DTO<typeof AdminWithdrawShopSchema>;\nexport type AdminEnrollShopEntryDTO = DTO<typeof AdminEnrollShopEntrySchema>;\nexport type AdminEnrollShopsDTO = DTO<typeof AdminEnrollShopsSchema>;\nexport type JoinLtoCampaignDTO = DTO<typeof JoinLtoCampaignSchema>;\nexport type ParticipantDTO = DTO<typeof ParticipantSchema>;\nexport type CampaignSummaryDTO = DTO<typeof CampaignSummarySchema>;\nexport type ParticipantSummaryDTO = DTO<typeof ParticipantSummarySchema>;\nexport type ParticipantStatusDTO = DTO<typeof ParticipantStatusSchema>;\nexport type ActiveParticipantMarketingDTO = Pick<ParticipantSummaryDTO, 'marketingId'>;\n// shopCategories are intentionally excluded: the participant record does not persist category\n// selections — they live on the linked marketing doc and are derived from there for display.\nexport type UpdateParticipantDataDTO = Omit<JoinLtoCampaignDTO, 'shopCategories'> & {marketing: ParticipantSummaryDTO['marketingId']};\n"]}
@@ -1,17 +1,20 @@
1
1
  import { mongoose } from '@typegoose/typegoose';
2
2
  import { LimitedTimeOfferCampaign } from '@lyxa.ai/core/dist/libraries/mongo/models';
3
+ import { MarketingType } from '@lyxa.ai/core/dist/utilities/enum';
3
4
  import { JoinLtoCampaignDTO } from '../limited-time-offer-participant.validation';
4
5
  export declare class LtoParticipantMarketingService {
5
6
  private repository;
6
7
  constructor();
7
8
  applyMarketing(shopId: mongoose.Types.ObjectId, campaign: LimitedTimeOfferCampaign & {
8
9
  _id: mongoose.Types.ObjectId;
9
- }, dto: JoinLtoCampaignDTO): Promise<mongoose.Types.ObjectId>;
10
+ }, dto: JoinLtoCampaignDTO): Promise<{
11
+ marketingId: mongoose.Types.ObjectId;
12
+ pausedMarketingIds: mongoose.Types.ObjectId[];
13
+ }>;
10
14
  removeMarketing(marketingId: mongoose.Types.ObjectId): Promise<void>;
11
- replaceMarketing(oldMarketingId: mongoose.Types.ObjectId, shopId: mongoose.Types.ObjectId, campaign: LimitedTimeOfferCampaign & {
12
- _id: mongoose.Types.ObjectId;
13
- }, dto: JoinLtoCampaignDTO): Promise<mongoose.Types.ObjectId>;
14
15
  removeAllCampaignMarketings(campaignId: mongoose.Types.ObjectId): Promise<void>;
16
+ pauseActiveShopMarketings(shopId: mongoose.Types.ObjectId, marketingType: MarketingType): Promise<mongoose.Types.ObjectId[]>;
17
+ resumeMarketings(marketingIds: mongoose.Types.ObjectId[]): Promise<void>;
15
18
  }
16
19
  export declare const ltoParticipantMarketingService: LtoParticipantMarketingService;
17
20
  //# sourceMappingURL=limited-time-offer-participant-marketing.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"limited-time-offer-participant-marketing.service.d.ts","sourceRoot":"/","sources":["modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAC,wBAAwB,EAAC,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAC,kBAAkB,EAAC,MAAM,8CAA8C,CAAC;AAIhF,qBACa,8BAA8B;IACvC,OAAO,CAAC,UAAU,CAA2B;;IAMhC,cAAc,CACvB,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAC/B,QAAQ,EAAE,wBAAwB,GAAG;QAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAA;KAAC,EACnE,GAAG,EAAE,kBAAkB,GACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;IAOtB,eAAe,CAAC,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE,gBAAgB,CACzB,cAAc,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EACvC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAC/B,QAAQ,EAAE,wBAAwB,GAAG;QAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAA;KAAC,EACnE,GAAG,EAAE,kBAAkB,GACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;IAKtB,2BAA2B,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAI/F;AAED,eAAO,MAAM,8BAA8B,gCAAgD,CAAC"}
1
+ {"version":3,"file":"limited-time-offer-participant-marketing.service.d.ts","sourceRoot":"/","sources":["modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAG9C,OAAO,EAAC,wBAAwB,EAAC,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAkB,aAAa,EAAC,MAAM,mCAAmC,CAAC;AAGjF,OAAO,EAAC,kBAAkB,EAAC,MAAM,8CAA8C,CAAC;AAIhF,qBACa,8BAA8B;IACvC,OAAO,CAAC,UAAU,CAA2B;;IAMhC,cAAc,CACvB,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAC/B,QAAQ,EAAE,wBAAwB,GAAG;QAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAA;KAAC,EACnE,GAAG,EAAE,kBAAkB,GACxB,OAAO,CAAC;QAAC,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAC,kBAAkB,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAA;KAAC,CAAC;IAqBpF,eAAe,CAAC,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAapE,2BAA2B,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/E,yBAAyB,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAQ5H,gBAAgB,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAQxF;AAED,eAAO,MAAM,8BAA8B,gCAAgD,CAAC"}
@@ -44,7 +44,9 @@ var __metadata = (this && this.__metadata) || function (k, v) {
44
44
  Object.defineProperty(exports, "__esModule", { value: true });
45
45
  exports.ltoParticipantMarketingService = exports.LtoParticipantMarketingService = void 0;
46
46
  const typedi_1 = __importStar(require("typedi"));
47
+ const server_1 = require("@trpc/server");
47
48
  const services_1 = require("../../../marketing/services");
49
+ const enum_1 = require("@lyxa.ai/core/dist/utilities/enum");
48
50
  const limited_time_offer_participant_builder_1 = require("../limited-time-offer-participant.builder");
49
51
  const limited_time_offer_participant_repository_1 = require("../limited-time-offer-participant.repository");
50
52
  let LtoParticipantMarketingService = class LtoParticipantMarketingService {
@@ -53,20 +55,53 @@ let LtoParticipantMarketingService = class LtoParticipantMarketingService {
53
55
  this.repository = typedi_1.default.get(limited_time_offer_participant_repository_1.LtoParticipantRepository);
54
56
  }
55
57
  async applyMarketing(shopId, campaign, dto) {
56
- const marketing = await services_1.marketingService.create(limited_time_offer_participant_builder_1.LtoParticipantQueryBuilder.buildMarketingInput(shopId, campaign, dto));
57
- return marketing._id;
58
+ const productIds = dto.isEntireMenu ? [] : (dto.products ?? []);
59
+ const pausedMarketingIds = dto.isEntireMenu
60
+ ? await this.pauseActiveShopMarketings(shopId, enum_1.MarketingType.DISCOUNT)
61
+ : productIds.length
62
+ ? await services_1.productMarketingService.pauseConflictingMarketings(productIds)
63
+ : [];
64
+ try {
65
+ const marketing = await services_1.marketingService.create(limited_time_offer_participant_builder_1.LtoParticipantQueryBuilder.buildMarketingInput(shopId, campaign, dto), undefined, { skipLimitedTimeOfferGuard: true });
66
+ return { marketingId: marketing._id, pausedMarketingIds };
67
+ }
68
+ catch (err) {
69
+ await this.resumeMarketings(pausedMarketingIds);
70
+ throw err;
71
+ }
58
72
  }
59
73
  async removeMarketing(marketingId) {
60
- await services_1.marketingService.deleteById({ _id: marketingId, softDelete: true });
61
- }
62
- async replaceMarketing(oldMarketingId, shopId, campaign, dto) {
63
- await this.removeMarketing(oldMarketingId);
64
- return this.applyMarketing(shopId, campaign, dto);
74
+ try {
75
+ await services_1.marketingService.deleteById({ _id: marketingId, softDelete: true }, undefined, { skipLimitedTimeOfferGuard: true });
76
+ }
77
+ catch (err) {
78
+ if (err instanceof server_1.TRPCError && err.code === 'NOT_FOUND')
79
+ return;
80
+ throw err;
81
+ }
65
82
  }
66
83
  async removeAllCampaignMarketings(campaignId) {
67
84
  const marketingIds = await this.repository.findMarketingIdsByCampaign(campaignId);
68
85
  await services_1.marketingService.deleteManyByIds(marketingIds);
69
86
  }
87
+ async pauseActiveShopMarketings(shopId, marketingType) {
88
+ const ids = await this.repository.findActiveMarketingIdsByShop(shopId, marketingType);
89
+ if (!ids.length)
90
+ return [];
91
+ await this.repository.updateMarketingStatus(ids, enum_1.MarketingStatus.PAUSED);
92
+ await services_1.synchronizeProductMarketingService.syncProductMarketingInfoByMarketingIds(ids);
93
+ return ids;
94
+ }
95
+ async resumeMarketings(marketingIds) {
96
+ if (!marketingIds?.length)
97
+ return;
98
+ const revivable = await this.repository.findRevivableMarketings(marketingIds);
99
+ if (!revivable.length)
100
+ return;
101
+ const ids = revivable.map(m => m._id);
102
+ await this.repository.updateMarketingStatus(ids, enum_1.MarketingStatus.ACTIVE);
103
+ await services_1.synchronizeProductMarketingService.syncProductMarketingInfoByMarketingIds(ids);
104
+ }
70
105
  };
71
106
  exports.LtoParticipantMarketingService = LtoParticipantMarketingService;
72
107
  exports.LtoParticipantMarketingService = LtoParticipantMarketingService = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"limited-time-offer-participant-marketing.service.js","sourceRoot":"/","sources":["modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAA0C;AAE1C,0DAA6D;AAG7D,sGAAqF;AACrF,4GAAsF;AAG/E,IAAM,8BAA8B,GAApC,MAAM,8BAA8B;IAC/B,UAAU,CAA2B;IAE7C;QACI,IAAI,CAAC,UAAU,GAAG,gBAAS,CAAC,GAAG,CAAC,oEAAwB,CAAC,CAAC;IAC9D,CAAC;IAEM,KAAK,CAAC,cAAc,CACvB,MAA+B,EAC/B,QAAmE,EACnE,GAAuB;QAEvB,MAAM,SAAS,GAAG,MAAM,2BAAgB,CAAC,MAAM,CAC3C,mEAA0B,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CACxE,CAAC;QACF,OAAO,SAAS,CAAC,GAAG,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,WAAoC;QAC7D,MAAM,2BAAgB,CAAC,UAAU,CAAC,EAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAC,CAAC,CAAC;IAC5E,CAAC;IAEM,KAAK,CAAC,gBAAgB,CACzB,cAAuC,EACvC,MAA+B,EAC/B,QAAmE,EACnE,GAAuB;QAEvB,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;IAEM,KAAK,CAAC,2BAA2B,CAAC,UAAmC;QACxE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,0BAA0B,CAAC,UAAU,CAAC,CAAC;QAClF,MAAM,2BAAgB,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC;CACJ,CAAA;AApCY,wEAA8B;yCAA9B,8BAA8B;IAD1C,IAAA,gBAAO,GAAE;;GACG,8BAA8B,CAoC1C;AAEY,QAAA,8BAA8B,GAAG,gBAAS,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC","sourcesContent":["import Container, {Service} from 'typedi';\nimport {mongoose} from '@typegoose/typegoose';\nimport {marketingService} from '@modules/marketing/services';\nimport {LimitedTimeOfferCampaign} from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport {JoinLtoCampaignDTO} from '../limited-time-offer-participant.validation';\nimport {LtoParticipantQueryBuilder} from '../limited-time-offer-participant.builder';\nimport {LtoParticipantRepository} from '../limited-time-offer-participant.repository';\n\n@Service()\nexport class LtoParticipantMarketingService {\n private repository: LtoParticipantRepository;\n\n constructor() {\n this.repository = Container.get(LtoParticipantRepository);\n }\n\n public async applyMarketing(\n shopId: mongoose.Types.ObjectId,\n campaign: LimitedTimeOfferCampaign & {_id: mongoose.Types.ObjectId},\n dto: JoinLtoCampaignDTO,\n ): Promise<mongoose.Types.ObjectId> {\n const marketing = await marketingService.create(\n LtoParticipantQueryBuilder.buildMarketingInput(shopId, campaign, dto),\n );\n return marketing._id;\n }\n\n public async removeMarketing(marketingId: mongoose.Types.ObjectId): Promise<void> {\n await marketingService.deleteById({_id: marketingId, softDelete: true});\n }\n\n public async replaceMarketing(\n oldMarketingId: mongoose.Types.ObjectId,\n shopId: mongoose.Types.ObjectId,\n campaign: LimitedTimeOfferCampaign & {_id: mongoose.Types.ObjectId},\n dto: JoinLtoCampaignDTO,\n ): Promise<mongoose.Types.ObjectId> {\n await this.removeMarketing(oldMarketingId);\n return this.applyMarketing(shopId, campaign, dto);\n }\n\n public async removeAllCampaignMarketings(campaignId: mongoose.Types.ObjectId): Promise<void> {\n const marketingIds = await this.repository.findMarketingIdsByCampaign(campaignId);\n await marketingService.deleteManyByIds(marketingIds);\n }\n}\n\nexport const ltoParticipantMarketingService = Container.get(LtoParticipantMarketingService);\n"]}
1
+ {"version":3,"file":"limited-time-offer-participant-marketing.service.js","sourceRoot":"/","sources":["modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, {Service} from 'typedi';\nimport {mongoose} from '@typegoose/typegoose';\nimport {TRPCError} from '@trpc/server';\nimport {marketingService, productMarketingService, synchronizeProductMarketingService} from '@modules/marketing/services';\nimport {LimitedTimeOfferCampaign} from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport {MarketingStatus, MarketingType} from '@lyxa.ai/core/dist/utilities/enum';\nimport {publishSyncSingleShopSectionsInCacheProcessEvent} from '@lyxa.ai/core/dist/utilities/events-common-methods';\nimport {ChangeStreamOperationTypes} from '@lyxa.ai/core/dist/libraries/event/events/mongo-stream-changes-batch-process-shops-event';\nimport {JoinLtoCampaignDTO} from '../limited-time-offer-participant.validation';\nimport {LtoParticipantQueryBuilder} from '../limited-time-offer-participant.builder';\nimport {LtoParticipantRepository} from '../limited-time-offer-participant.repository';\n\n@Service()\nexport class LtoParticipantMarketingService {\n private repository: LtoParticipantRepository;\n\n constructor() {\n this.repository = Container.get(LtoParticipantRepository);\n }\n\n public async applyMarketing(\n shopId: mongoose.Types.ObjectId,\n campaign: LimitedTimeOfferCampaign & {_id: mongoose.Types.ObjectId},\n dto: JoinLtoCampaignDTO,\n ): Promise<{marketingId: mongoose.Types.ObjectId; pausedMarketingIds: mongoose.Types.ObjectId[]}> {\n const productIds = dto.isEntireMenu ? [] : (dto.products ?? []);\n const pausedMarketingIds = dto.isEntireMenu\n ? await this.pauseActiveShopMarketings(shopId, MarketingType.DISCOUNT)\n : productIds.length\n ? await productMarketingService.pauseConflictingMarketings(productIds)\n : [];\n\n try {\n const marketing = await marketingService.create(\n LtoParticipantQueryBuilder.buildMarketingInput(shopId, campaign, dto),\n undefined,\n {skipLimitedTimeOfferGuard: true},\n );\n return {marketingId: marketing._id, pausedMarketingIds};\n } catch (err) {\n await this.resumeMarketings(pausedMarketingIds);\n throw err;\n }\n }\n\n public async removeMarketing(marketingId: mongoose.Types.ObjectId): Promise<void> {\n try {\n await marketingService.deleteById(\n {_id: marketingId, softDelete: true},\n undefined,\n {skipLimitedTimeOfferGuard: true},\n );\n } catch (err) {\n if (err instanceof TRPCError && err.code === 'NOT_FOUND') return;\n throw err;\n }\n }\n\n public async removeAllCampaignMarketings(campaignId: mongoose.Types.ObjectId): Promise<void> {\n const marketingIds = await this.repository.findMarketingIdsByCampaign(campaignId);\n await marketingService.deleteManyByIds(marketingIds);\n }\n\n public async pauseActiveShopMarketings(shopId: mongoose.Types.ObjectId, marketingType: MarketingType): Promise<mongoose.Types.ObjectId[]> {\n const ids = await this.repository.findActiveMarketingIdsByShop(shopId, marketingType);\n if (!ids.length) return [];\n await this.repository.updateMarketingStatus(ids, MarketingStatus.PAUSED);\n await synchronizeProductMarketingService.syncProductMarketingInfoByMarketingIds(ids);\n return ids;\n }\n\n public async resumeMarketings(marketingIds: mongoose.Types.ObjectId[]): Promise<void> {\n if (!marketingIds?.length) return;\n const revivable = await this.repository.findRevivableMarketings(marketingIds);\n if (!revivable.length) return;\n const ids = revivable.map(m => m._id);\n await this.repository.updateMarketingStatus(ids, MarketingStatus.ACTIVE);\n await synchronizeProductMarketingService.syncProductMarketingInfoByMarketingIds(ids);\n }\n}\n\nexport const ltoParticipantMarketingService = Container.get(LtoParticipantMarketingService);\n"]}
@@ -1,5 +1,6 @@
1
1
  import { DocumentType, mongoose } from '@typegoose/typegoose';
2
- import { JoinLtoCampaignDTO, ParticipantStatusDTO } from '../limited-time-offer-participant.validation';
2
+ import { LimitedTimeOfferCampaign } from '@lyxa.ai/core/dist/libraries/mongo/models';
3
+ import { AdminEnrollShopEntryDTO, JoinLtoCampaignDTO, ParticipantStatusDTO } from '../limited-time-offer-participant.validation';
3
4
  import { GetLtoCampaignParticipantsDTO } from '../../campaign/limited-time-offer-campaign.validation';
4
5
  export declare class LimitedTimeOfferParticipantService {
5
6
  private repository;
@@ -7,7 +8,16 @@ export declare class LimitedTimeOfferParticipantService {
7
8
  private marketingService;
8
9
  constructor();
9
10
  join(shopId: mongoose.Types.ObjectId, dto: JoinLtoCampaignDTO): Promise<DocumentType<import("@lyxa.ai/core/dist/libraries/mongo/models").LimitedTimeOfferParticipant>>;
11
+ enrollShops(entries: AdminEnrollShopEntryDTO[]): Promise<(mongoose.Document<unknown, import("@typegoose/typegoose/lib/types").BeAnObject, import("@lyxa.ai/core/dist/libraries/mongo/models").LimitedTimeOfferParticipant, Record<string, any>, {}> & import("@lyxa.ai/core/dist/libraries/mongo/models").LimitedTimeOfferParticipant & {
12
+ _id: mongoose.Types.ObjectId;
13
+ } & {
14
+ __v: number;
15
+ } & import("@typegoose/typegoose/lib/types").IObjectWithTypegooseFunction)[]>;
16
+ private joinShop;
17
+ private pauseIfLive;
10
18
  withdraw(shopId: mongoose.Types.ObjectId): Promise<void>;
19
+ cleanupCampaignMarketings(campaignId: mongoose.Types.ObjectId): Promise<void>;
20
+ isActiveParticipant(shopId: mongoose.Types.ObjectId): Promise<boolean>;
11
21
  getStatus(shopId: mongoose.Types.ObjectId): Promise<ParticipantStatusDTO>;
12
22
  update(shopId: mongoose.Types.ObjectId, dto: JoinLtoCampaignDTO): Promise<DocumentType<import("@lyxa.ai/core/dist/libraries/mongo/models").LimitedTimeOfferParticipant> | null>;
13
23
  getParticipants(dto: GetLtoCampaignParticipantsDTO): Promise<{
@@ -15,9 +25,9 @@ export declare class LimitedTimeOfferParticipantService {
15
25
  shopId: mongoose.Types.ObjectId;
16
26
  joinedAt: Date;
17
27
  shopName: string | null;
18
- discountPercentage?: number | undefined;
19
28
  maxDiscountCap?: number | undefined;
20
29
  shopPhoto?: string | null | undefined;
30
+ discountPercentage?: number | undefined;
21
31
  }[];
22
32
  metadata: {
23
33
  page: number;
@@ -31,7 +41,8 @@ export declare class LimitedTimeOfferParticipantService {
31
41
  latitude: number;
32
42
  longitude: number;
33
43
  }): Promise<any[]>;
34
- removeCampaignMarketings(campaignId: mongoose.Types.ObjectId): Promise<void>;
44
+ reactivateMarketings(campaign: DocumentType<LimitedTimeOfferCampaign>): Promise<void>;
45
+ private applyMarketingWithRollback;
35
46
  private fetchCurrentCampaignOrThrow;
36
47
  private assertNotAlreadyJoined;
37
48
  private resolveCategorySelection;
@@ -1 +1 @@
1
- {"version":3,"file":"limited-time-offer-participant.service.d.ts","sourceRoot":"/","sources":["modules/limited-time-offer/participant/services/limited-time-offer-participant.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAE,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAM5D,OAAO,EACN,kBAAkB,EAElB,oBAAoB,EAEpB,MAAM,8CAA8C,CAAC;AAGtD,OAAO,EAAC,6BAA6B,EAAC,MAAM,uDAAuD,CAAC;AAGpG,qBACa,kCAAkC;IAC9C,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,gBAAgB,CAAiC;;IAQ5C,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,kBAAkB;IAsB7D,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWxD,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmBzE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,kBAAkB;IA0B/D,eAAe,CAAC,GAAG,EAAE,6BAA6B;;;;;;;;;;;;;;;;IAalD,6BAA6B,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ;IAIjE,SAAS,CACrB,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EACnC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAOlC,wBAAwB,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YAI3E,2BAA2B;YAQ3B,sBAAsB;YActB,wBAAwB;YAqBxB,0BAA0B;IAexC,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,0BAA0B;CAiBlC;AAED,eAAO,MAAM,qBAAqB,oCAAoD,CAAC"}
1
+ {"version":3,"file":"limited-time-offer-participant.service.d.ts","sourceRoot":"/","sources":["modules/limited-time-offer/participant/services/limited-time-offer-participant.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAE,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAC,wBAAwB,EAAU,MAAM,2CAA2C,CAAC;AAK5F,OAAO,EACN,uBAAuB,EACvB,kBAAkB,EAElB,oBAAoB,EAEpB,MAAM,8CAA8C,CAAC;AAGtD,OAAO,EAAC,6BAA6B,EAAC,MAAM,uDAAuD,CAAC;AAGpG,qBACa,kCAAkC;IAC9C,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,gBAAgB,CAAiC;;IAQ5C,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,kBAAkB;IAK7D,WAAW,CAAC,OAAO,EAAE,uBAAuB,EAAE;;;;;YAK7C,QAAQ;YAqCR,WAAW;IAQZ,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxD,yBAAyB,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7E,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtE,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmBzE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,kBAAkB;IA2B/D,eAAe,CAAC,GAAG,EAAE,6BAA6B;;;;;;;;;;;;;;;;IAQlD,6BAA6B,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ;IAIjE,SAAS,CACrB,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EACnC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAOlC,oBAAoB,CAAC,QAAQ,EAAE,YAAY,CAAC,wBAAwB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YA+BpF,0BAA0B;YAe1B,2BAA2B;YAQ3B,sBAAsB;YActB,wBAAwB;YAqBxB,0BAA0B;IAexC,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,0BAA0B;CAkBlC;AAED,eAAO,MAAM,qBAAqB,oCAAoD,CAAC"}
@@ -63,15 +63,40 @@ let LimitedTimeOfferParticipantService = class LimitedTimeOfferParticipantServic
63
63
  }
64
64
  async join(shopId, dto) {
65
65
  const campaign = await this.fetchCurrentCampaignOrThrow();
66
+ return this.joinShop(campaign, shopId, dto);
67
+ }
68
+ async enrollShops(entries) {
69
+ const campaign = await this.fetchCurrentCampaignOrThrow();
70
+ return Promise.all(entries.map(({ shopId, ...dto }) => this.joinShop(campaign, shopId, dto)));
71
+ }
72
+ async joinShop(campaign, shopId, dto) {
66
73
  await this.assertNotAlreadyJoined(campaign._id, shopId);
67
- this.validateDiscountSelections(campaign, dto.discountPercentage, dto.maxDiscountCap);
74
+ this.validateDiscountSelections({ campaign, discountPercentage: dto.discountPercentage, maxDiscountCap: dto.maxDiscountCap });
68
75
  await this.assertProductsBelongToShop(shopId, dto);
69
76
  const resolvedDto = await this.resolveCategorySelection(shopId, dto);
70
- const marketingId = await this.marketingService.applyMarketing(shopId, campaign, resolvedDto);
71
- const participant = await this.repository.create(limited_time_offer_participant_builder_1.LtoParticipantQueryBuilder.buildCreateInput(campaign._id, shopId, marketingId, resolvedDto));
77
+ const pausedMarketings = await this.pauseIfLive(campaign, shopId);
78
+ const { marketingId, pausedMarketingIds } = await this.applyMarketingWithRollback({
79
+ shopId,
80
+ campaign,
81
+ dto: resolvedDto,
82
+ pausedMarketings,
83
+ });
84
+ const allPausedMarketings = this.uniqueObjectIds([...pausedMarketings, ...pausedMarketingIds]);
85
+ const participant = await this.repository.create(limited_time_offer_participant_builder_1.LtoParticipantQueryBuilder.buildCreateInput({
86
+ campaignId: campaign._id,
87
+ shopId,
88
+ marketingId,
89
+ dto: resolvedDto,
90
+ pausedMarketings: allPausedMarketings,
91
+ }));
72
92
  await this.repository.updateShopOrderCapacity(shopId, resolvedDto.isOrderCapacityEnabled, resolvedDto.maxOrderCapacity);
73
93
  return participant;
74
94
  }
95
+ async pauseIfLive(campaign, shopId) {
96
+ if (campaign.status !== enum_1.LimitedTimeOfferCampaignStatus.ACTIVE)
97
+ return [];
98
+ return this.marketingService.pauseActiveShopMarketings(shopId, enum_1.MarketingType.DISCOUNT);
99
+ }
75
100
  async withdraw(shopId) {
76
101
  const campaign = await this.fetchCurrentCampaignOrThrow();
77
102
  const participant = await this.repository.withdraw(campaign._id, shopId);
@@ -80,6 +105,18 @@ let LimitedTimeOfferParticipantService = class LimitedTimeOfferParticipantServic
80
105
  if (participant.marketing) {
81
106
  await this.marketingService.removeMarketing(participant.marketing);
82
107
  }
108
+ await this.marketingService.resumeMarketings((participant.pausedMarketings ?? []));
109
+ }
110
+ async cleanupCampaignMarketings(campaignId) {
111
+ await this.marketingService.removeAllCampaignMarketings(campaignId);
112
+ const pausedMarketingIds = await this.repository.findPausedMarketingIdsByCampaign(campaignId);
113
+ await this.marketingService.resumeMarketings(pausedMarketingIds);
114
+ }
115
+ async isActiveParticipant(shopId) {
116
+ const campaign = await this.campaignService.getCurrent();
117
+ if (!campaign)
118
+ return false;
119
+ return this.repository.existsActiveByCampaignAndShop(campaign._id, shopId);
83
120
  }
84
121
  async getStatus(shopId) {
85
122
  const campaign = await this.campaignService.getCurrent();
@@ -100,12 +137,13 @@ let LimitedTimeOfferParticipantService = class LimitedTimeOfferParticipantServic
100
137
  const participant = await this.repository.findActiveByCampaignAndShop(campaign._id, shopId);
101
138
  if (!participant)
102
139
  throw (0, error_common_1.notFoundError)('You have not joined this campaign.');
103
- this.validateDiscountSelections(campaign, dto.discountPercentage, dto.maxDiscountCap, participant);
140
+ this.validateDiscountSelections({ campaign, discountPercentage: dto.discountPercentage, maxDiscountCap: dto.maxDiscountCap, participant });
104
141
  await this.assertProductsBelongToShop(shopId, dto);
105
142
  const resolvedDto = await this.resolveCategorySelection(shopId, dto);
106
- const newMarketingId = participant.marketingId
107
- ? await this.marketingService.replaceMarketing(participant.marketingId, shopId, campaign, resolvedDto)
108
- : await this.marketingService.applyMarketing(shopId, campaign, resolvedDto);
143
+ if (participant.marketingId) {
144
+ await this.marketingService.removeMarketing(participant.marketingId);
145
+ }
146
+ const { marketingId: newMarketingId } = await this.marketingService.applyMarketing(shopId, campaign, resolvedDto);
109
147
  return this.repository.updateParticipant(campaign._id, shopId, {
110
148
  products: resolvedDto.products ?? [],
111
149
  isEntireMenu: resolvedDto.isEntireMenu,
@@ -120,12 +158,7 @@ let LimitedTimeOfferParticipantService = class LimitedTimeOfferParticipantServic
120
158
  const { documents, total } = await this.repository.findByCampaign(dto);
121
159
  return {
122
160
  documents,
123
- metadata: {
124
- page: dto.page,
125
- size: dto.size,
126
- totalElements: total,
127
- totalPages: Math.ceil(total / dto.size),
128
- },
161
+ metadata: { page: dto.page, size: dto.size, totalElements: total, totalPages: Math.ceil(total / dto.size) },
129
162
  };
130
163
  }
131
164
  async getParticipantIdsByCampaignId(campaignId) {
@@ -136,8 +169,34 @@ let LimitedTimeOfferParticipantService = class LimitedTimeOfferParticipantServic
136
169
  const nearByShopDistance = settings.nearByShopDistance || 10000;
137
170
  return this.repository.findNearby(campaignId, input, nearByShopDistance);
138
171
  }
139
- async removeCampaignMarketings(campaignId) {
140
- await this.marketingService.removeAllCampaignMarketings(campaignId);
172
+ async reactivateMarketings(campaign) {
173
+ const participants = await this.repository.findAllActiveByCampaign(campaign._id);
174
+ for (const participant of participants) {
175
+ const dto = {
176
+ isEntireMenu: participant.isEntireMenu,
177
+ products: (participant.products ?? []),
178
+ shopCategories: [],
179
+ discountPercentage: participant.discountPercentage ?? 0,
180
+ maxDiscountCap: participant.maxDiscountCap ?? 0,
181
+ isOrderCapacityEnabled: participant.isOrderCapacityEnabled,
182
+ maxOrderCapacity: participant.maxOrderCapacity,
183
+ };
184
+ if (participant.marketing) {
185
+ await this.marketingService.removeMarketing(participant.marketing);
186
+ }
187
+ const { marketingId } = await this.marketingService.applyMarketing(participant.shop, campaign, dto);
188
+ await this.repository.updateParticipant(campaign._id, participant.shop, { ...dto, marketing: marketingId });
189
+ }
190
+ }
191
+ async applyMarketingWithRollback(input) {
192
+ const { shopId, campaign, dto, pausedMarketings } = input;
193
+ try {
194
+ return await this.marketingService.applyMarketing(shopId, campaign, dto);
195
+ }
196
+ catch (err) {
197
+ await this.marketingService.resumeMarketings(pausedMarketings);
198
+ throw err;
199
+ }
141
200
  }
142
201
  async fetchCurrentCampaignOrThrow() {
143
202
  const campaign = await this.campaignService.getCurrent();
@@ -175,7 +234,8 @@ let LimitedTimeOfferParticipantService = class LimitedTimeOfferParticipantServic
175
234
  uniqueObjectIds(ids) {
176
235
  return [...new Map(ids.map(id => [id.toString(), id])).values()];
177
236
  }
178
- validateDiscountSelections(campaign, discountPercentage, maxDiscountCap, participant) {
237
+ validateDiscountSelections(input) {
238
+ const { campaign, discountPercentage, maxDiscountCap, participant } = input;
179
239
  if (!campaign.discountOptions.includes(discountPercentage)) {
180
240
  if (!participant || discountPercentage != participant.discountPercentage) {
181
241
  throw (0, error_common_1.badRequestError)('Selected discount is not an available option for this campaign.');
@@ -1 +1 @@
1
- {"version":3,"file":"limited-time-offer-participant.service.js","sourceRoot":"/","sources":["modules/limited-time-offer/participant/services/limited-time-offer-participant.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, {Service} from 'typedi';\nimport {DocumentType, mongoose} from '@typegoose/typegoose';\nimport {LimitedTimeOfferCampaign, Setting} from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport {LimitedTimeOfferCampaignStatus} from '@lyxa.ai/core/dist/utilities/enum';\nimport {badRequestError, conflictError, notFoundError} from '@lyxa.ai/core/dist/utilities/error-common';\nimport {LtoCampaignService} from '@modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service';\nimport {LtoParticipantMarketingService} from './limited-time-offer-participant-marketing.service';\nimport {\n\tJoinLtoCampaignDTO,\n\tLtoCardState,\n\tParticipantStatusDTO,\n\tParticipantSummaryDTO,\n} from '../limited-time-offer-participant.validation';\nimport {LtoParticipantQueryBuilder} from '../limited-time-offer-participant.builder';\nimport {LtoParticipantRepository} from '../limited-time-offer-participant.repository';\nimport {GetLtoCampaignParticipantsDTO} from '../../campaign/limited-time-offer-campaign.validation';\nimport {getLibraries} from '@lyxa.ai/core';\n\n@Service()\nexport class LimitedTimeOfferParticipantService {\n\tprivate repository: LtoParticipantRepository;\n\tprivate campaignService: LtoCampaignService;\n\tprivate marketingService: LtoParticipantMarketingService;\n\n\tconstructor() {\n\t\tthis.repository = Container.get(LtoParticipantRepository);\n\t\tthis.campaignService = Container.get(LtoCampaignService);\n\t\tthis.marketingService = Container.get(LtoParticipantMarketingService);\n\t}\n\n\tpublic async join(shopId: mongoose.Types.ObjectId, dto: JoinLtoCampaignDTO) {\n\t\tconst campaign = await this.fetchCurrentCampaignOrThrow();\n\n\t\tawait this.assertNotAlreadyJoined(campaign._id, shopId);\n\t\tthis.validateDiscountSelections(campaign, dto.discountPercentage, dto.maxDiscountCap);\n\t\tawait this.assertProductsBelongToShop(shopId, dto);\n\n\t\tconst resolvedDto = await this.resolveCategorySelection(shopId, dto);\n\t\tconst marketingId = await this.marketingService.applyMarketing(shopId, campaign, resolvedDto);\n\n\t\tconst participant = await this.repository.create(\n\t\t\tLtoParticipantQueryBuilder.buildCreateInput(campaign._id, shopId, marketingId, resolvedDto)\n\t\t);\n\t\t// Update shop\n\t\tawait this.repository.updateShopOrderCapacity(\n\t\t\tshopId,\n\t\t\tresolvedDto.isOrderCapacityEnabled,\n\t\t\tresolvedDto.maxOrderCapacity\n\t\t);\n\t\treturn participant;\n\t}\n\n\tpublic async withdraw(shopId: mongoose.Types.ObjectId): Promise<void> {\n\t\tconst campaign = await this.fetchCurrentCampaignOrThrow();\n\n\t\tconst participant = await this.repository.withdraw(campaign._id, shopId);\n\t\tif (!participant) throw notFoundError('You have not joined this campaign.');\n\n\t\tif (participant.marketing) {\n\t\t\tawait this.marketingService.removeMarketing(participant.marketing as mongoose.Types.ObjectId);\n\t\t}\n\t}\n\n\tpublic async getStatus(shopId: mongoose.Types.ObjectId): Promise<ParticipantStatusDTO> {\n\t\tconst campaign = await this.campaignService.getCurrent();\n\n\t\tif (!campaign) return { campaignState: LtoCardState.NONE };\n\n\t\tconst participant = await this.repository.findActiveByCampaignAndShop(campaign._id, shopId);\n\n\t\tconst campaignState =\n\t\t\tcampaign.status === LimitedTimeOfferCampaignStatus.SCHEDULED\n\t\t\t\t? LtoCardState.SCHEDULED\n\t\t\t\t: campaign.status === LimitedTimeOfferCampaignStatus.ACTIVE\n\t\t\t\t\t? LtoCardState.LIVE\n\t\t\t\t\t: LtoCardState.NONE;\n\n\t\treturn participant\n\t\t\t? { campaignState, campaign: campaign as any, participant }\n\t\t\t: { campaignState, campaign: campaign as any };\n\t}\n\n\tpublic async update(shopId: mongoose.Types.ObjectId, dto: JoinLtoCampaignDTO) {\n\t\tconst campaign = await this.fetchCurrentCampaignOrThrow();\n\n\t\tconst participant = await this.repository.findActiveByCampaignAndShop(campaign._id, shopId);\n\t\tif (!participant) throw notFoundError('You have not joined this campaign.');\n\n\t\tthis.validateDiscountSelections(campaign, dto.discountPercentage, dto.maxDiscountCap, participant);\n\t\tawait this.assertProductsBelongToShop(shopId, dto);\n\n\t\tconst resolvedDto = await this.resolveCategorySelection(shopId, dto);\n\n\t\tconst newMarketingId = participant.marketingId\n\t\t\t? await this.marketingService.replaceMarketing(participant.marketingId, shopId, campaign, resolvedDto)\n\t\t\t: await this.marketingService.applyMarketing(shopId, campaign, resolvedDto);\n\n\t\treturn this.repository.updateParticipant(campaign._id, shopId, {\n\t\t\tproducts: resolvedDto.products ?? [],\n\t\t\tisEntireMenu: resolvedDto.isEntireMenu,\n\t\t\tdiscountPercentage: resolvedDto.discountPercentage,\n\t\t\tmaxDiscountCap: resolvedDto.maxDiscountCap,\n\t\t\tisOrderCapacityEnabled: resolvedDto.isOrderCapacityEnabled,\n\t\t\tmaxOrderCapacity: resolvedDto.maxOrderCapacity,\n\t\t\tmarketing: newMarketingId,\n\t\t});\n\t}\n\n\tpublic async getParticipants(dto: GetLtoCampaignParticipantsDTO) {\n\t\tconst { documents, total } = await this.repository.findByCampaign(dto);\n\t\treturn {\n\t\t\tdocuments,\n\t\t\tmetadata: {\n\t\t\t\tpage: dto.page,\n\t\t\t\tsize: dto.size,\n\t\t\t\ttotalElements: total,\n\t\t\t\ttotalPages: Math.ceil(total / dto.size),\n\t\t\t},\n\t\t};\n\t}\n\n\tpublic async getParticipantIdsByCampaignId(campaignId: mongoose.Types.ObjectId) {\n\t\treturn await this.repository.findParticipantIdsByCampaignId(campaignId);\n\t}\n\n\tpublic async getNearby(\n\t\tcampaignId: mongoose.Types.ObjectId,\n\t\tinput: { latitude: number; longitude: number }\n\t) {\n\t\tconst settings = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\t\tconst nearByShopDistance = settings.nearByShopDistance || 10000;\n\t\treturn this.repository.findNearby(campaignId, input, nearByShopDistance);\n\t}\n\n\tpublic async removeCampaignMarketings(campaignId: mongoose.Types.ObjectId): Promise<void> {\n\t\tawait this.marketingService.removeAllCampaignMarketings(campaignId);\n\t}\n\n\tprivate async fetchCurrentCampaignOrThrow(): Promise<DocumentType<LimitedTimeOfferCampaign>> {\n\t\tconst campaign = await this.campaignService.getCurrent();\n\t\tif (!campaign) {\n\t\t\tthrow badRequestError('No campaign active or scheduled.');\n\t\t}\n\t\treturn campaign;\n\t}\n\n\tprivate async assertNotAlreadyJoined(\n\t\tcampaignId: mongoose.Types.ObjectId,\n\t\tshopId: mongoose.Types.ObjectId\n\t): Promise<void> {\n\t\tif (await this.repository.existsActiveByCampaignAndShop(campaignId, shopId)) {\n\t\t\tthrow conflictError('Your shop has already joined this campaign.');\n\t\t}\n\t}\n\n\t/**\n\t * Expands the selected shop categories into their product ids and merges them with any explicitly\n\t * selected products. The marketing layer only ever receives a flat product list, so category\n\t * selection is purely an LTO-side convenience that is resolved here before anything is persisted.\n\t */\n\tprivate async resolveCategorySelection(\n\t\tshopId: mongoose.Types.ObjectId,\n\t\tdto: JoinLtoCampaignDTO\n\t): Promise<JoinLtoCampaignDTO> {\n\t\tif (dto.isEntireMenu || !dto.shopCategories?.length) return dto;\n\n\t\tconst categoryProductIds = await this.repository.findProductIdsByCategories(shopId, dto.shopCategories);\n\t\tconst products = this.uniqueObjectIds([...(dto.products ?? []), ...categoryProductIds]);\n\n\t\tif (products.length === 0) {\n\t\t\tthrow badRequestError('The selected categories do not contain any products.');\n\t\t}\n\n\t\treturn { ...dto, products };\n\t}\n\n\t/**\n\t * Validates that explicitly selected products belong to the shop. Categories are not checked here:\n\t * {@link resolveCategorySelection} fetches their products with a shop-scoped query, so any category\n\t * that does not belong to the shop simply contributes no products.\n\t */\n\tprivate async assertProductsBelongToShop(\n\t\tshopId: mongoose.Types.ObjectId,\n\t\tdto: JoinLtoCampaignDTO\n\t): Promise<void> {\n\t\tif (dto.isEntireMenu) return;\n\n\t\tconst productIds = this.uniqueObjectIds(dto.products ?? []);\n\t\tif (!productIds.length) return;\n\n\t\tconst owned = await this.repository.countShopProducts(shopId, productIds);\n\t\tif (owned !== productIds.length) {\n\t\t\tthrow badRequestError('One or more selected products do not belong to your shop.');\n\t\t}\n\t}\n\n\tprivate uniqueObjectIds(ids: mongoose.Types.ObjectId[]): mongoose.Types.ObjectId[] {\n\t\treturn [...new Map(ids.map(id => [id.toString(), id])).values()];\n\t}\n\n\tprivate validateDiscountSelections(\n\t\tcampaign: DocumentType<LimitedTimeOfferCampaign>,\n\t\tdiscountPercentage: number,\n\t\tmaxDiscountCap: number,\n\t\tparticipant?: ParticipantSummaryDTO\n\t): void {\n\t\tif (!campaign.discountOptions.includes(discountPercentage)) {\n\t\t\tif (!participant || discountPercentage != participant.discountPercentage) {\n\t\t\t\tthrow badRequestError('Selected discount is not an available option for this campaign.');\n\t\t\t}\n\t\t}\n\t\tif (!campaign.maxDiscountCaps.includes(maxDiscountCap)) {\n\t\t\tif (!participant || maxDiscountCap != participant.maxDiscountCap) {\n\t\t\t\tthrow badRequestError('Selected max discount cap is not an available option for this campaign.');\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport const ltoParticipantService = Container.get(LimitedTimeOfferParticipantService);\n"]}
1
+ {"version":3,"file":"limited-time-offer-participant.service.js","sourceRoot":"/","sources":["modules/limited-time-offer/participant/services/limited-time-offer-participant.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, {Service} from 'typedi';\nimport {DocumentType, mongoose} from '@typegoose/typegoose';\nimport {LimitedTimeOfferCampaign, Setting} from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport {LimitedTimeOfferCampaignStatus, MarketingType} from '@lyxa.ai/core/dist/utilities/enum';\nimport {badRequestError, conflictError, notFoundError} from '@lyxa.ai/core/dist/utilities/error-common';\nimport {LtoCampaignService} from '@modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service';\nimport {LtoParticipantMarketingService} from './limited-time-offer-participant-marketing.service';\nimport {\n\tAdminEnrollShopEntryDTO,\n\tJoinLtoCampaignDTO,\n\tLtoCardState,\n\tParticipantStatusDTO,\n\tParticipantSummaryDTO,\n} from '../limited-time-offer-participant.validation';\nimport {LtoParticipantQueryBuilder} from '../limited-time-offer-participant.builder';\nimport {LtoParticipantRepository} from '../limited-time-offer-participant.repository';\nimport {GetLtoCampaignParticipantsDTO} from '../../campaign/limited-time-offer-campaign.validation';\nimport {getLibraries} from '@lyxa.ai/core';\n\n@Service()\nexport class LimitedTimeOfferParticipantService {\n\tprivate repository: LtoParticipantRepository;\n\tprivate campaignService: LtoCampaignService;\n\tprivate marketingService: LtoParticipantMarketingService;\n\n\tconstructor() {\n\t\tthis.repository = Container.get(LtoParticipantRepository);\n\t\tthis.campaignService = Container.get(LtoCampaignService);\n\t\tthis.marketingService = Container.get(LtoParticipantMarketingService);\n\t}\n\n\tpublic async join(shopId: mongoose.Types.ObjectId, dto: JoinLtoCampaignDTO) {\n\t\tconst campaign = await this.fetchCurrentCampaignOrThrow();\n\t\treturn this.joinShop(campaign, shopId, dto);\n\t}\n\n\tpublic async enrollShops(entries: AdminEnrollShopEntryDTO[]) {\n\t\tconst campaign = await this.fetchCurrentCampaignOrThrow();\n\t\treturn Promise.all(entries.map(({shopId, ...dto}) => this.joinShop(campaign, shopId, dto)));\n\t}\n\n\tprivate async joinShop(\n\t\tcampaign: DocumentType<LimitedTimeOfferCampaign>,\n\t\tshopId: mongoose.Types.ObjectId,\n\t\tdto: JoinLtoCampaignDTO\n\t) {\n\t\tawait this.assertNotAlreadyJoined(campaign._id, shopId);\n\t\tthis.validateDiscountSelections({campaign, discountPercentage: dto.discountPercentage, maxDiscountCap: dto.maxDiscountCap});\n\t\tawait this.assertProductsBelongToShop(shopId, dto);\n\n\t\tconst resolvedDto = await this.resolveCategorySelection(shopId, dto);\n\t\tconst pausedMarketings = await this.pauseIfLive(campaign, shopId);\n\n\t\tconst {marketingId, pausedMarketingIds} = await this.applyMarketingWithRollback({\n\t\t\tshopId,\n\t\t\tcampaign,\n\t\t\tdto: resolvedDto,\n\t\t\tpausedMarketings,\n\t\t});\n\t\tconst allPausedMarketings = this.uniqueObjectIds([...pausedMarketings, ...pausedMarketingIds]);\n\n\t\tconst participant = await this.repository.create(\n\t\t\tLtoParticipantQueryBuilder.buildCreateInput({\n\t\t\t\tcampaignId: campaign._id,\n\t\t\t\tshopId,\n\t\t\t\tmarketingId,\n\t\t\t\tdto: resolvedDto,\n\t\t\t\tpausedMarketings: allPausedMarketings,\n\t\t\t})\n\t\t);\n\t\tawait this.repository.updateShopOrderCapacity(\n\t\t\tshopId,\n\t\t\tresolvedDto.isOrderCapacityEnabled,\n\t\t\tresolvedDto.maxOrderCapacity\n\t\t);\n\t\treturn participant;\n\t}\n\n\tprivate async pauseIfLive(\n\t\tcampaign: DocumentType<LimitedTimeOfferCampaign>,\n\t\tshopId: mongoose.Types.ObjectId\n\t): Promise<mongoose.Types.ObjectId[]> {\n\t\tif (campaign.status !== LimitedTimeOfferCampaignStatus.ACTIVE) return [];\n\t\treturn this.marketingService.pauseActiveShopMarketings(shopId, MarketingType.DISCOUNT);\n\t}\n\n\tpublic async withdraw(shopId: mongoose.Types.ObjectId): Promise<void> {\n\t\tconst campaign = await this.fetchCurrentCampaignOrThrow();\n\n\t\tconst participant = await this.repository.withdraw(campaign._id, shopId);\n\t\tif (!participant) throw notFoundError('You have not joined this campaign.');\n\n\t\tif (participant.marketing) {\n\t\t\tawait this.marketingService.removeMarketing(participant.marketing as mongoose.Types.ObjectId);\n\t\t}\n\t\tawait this.marketingService.resumeMarketings(\n\t\t\t(participant.pausedMarketings ?? []) as mongoose.Types.ObjectId[]\n\t\t);\n\t}\n\n\tpublic async cleanupCampaignMarketings(campaignId: mongoose.Types.ObjectId): Promise<void> {\n\t\tawait this.marketingService.removeAllCampaignMarketings(campaignId);\n\t\tconst pausedMarketingIds = await this.repository.findPausedMarketingIdsByCampaign(campaignId);\n\t\tawait this.marketingService.resumeMarketings(pausedMarketingIds);\n\t}\n\n\tpublic async isActiveParticipant(shopId: mongoose.Types.ObjectId): Promise<boolean> {\n\t\tconst campaign = await this.campaignService.getCurrent();\n\t\tif (!campaign) return false;\n\t\treturn this.repository.existsActiveByCampaignAndShop(campaign._id, shopId);\n\t}\n\n\tpublic async getStatus(shopId: mongoose.Types.ObjectId): Promise<ParticipantStatusDTO> {\n\t\tconst campaign = await this.campaignService.getCurrent();\n\n\t\tif (!campaign) return { campaignState: LtoCardState.NONE };\n\n\t\tconst participant = await this.repository.findActiveByCampaignAndShop(campaign._id, shopId);\n\n\t\tconst campaignState =\n\t\t\tcampaign.status === LimitedTimeOfferCampaignStatus.SCHEDULED\n\t\t\t\t? LtoCardState.SCHEDULED\n\t\t\t\t: campaign.status === LimitedTimeOfferCampaignStatus.ACTIVE\n\t\t\t\t\t? LtoCardState.LIVE\n\t\t\t\t\t: LtoCardState.NONE;\n\n\t\treturn participant\n\t\t\t? { campaignState, campaign: campaign as any, participant }\n\t\t\t: { campaignState, campaign: campaign as any };\n\t}\n\n\tpublic async update(shopId: mongoose.Types.ObjectId, dto: JoinLtoCampaignDTO) {\n\t\tconst campaign = await this.fetchCurrentCampaignOrThrow();\n\n\t\tconst participant = await this.repository.findActiveByCampaignAndShop(campaign._id, shopId);\n\t\tif (!participant) throw notFoundError('You have not joined this campaign.');\n\n\t\tthis.validateDiscountSelections({campaign, discountPercentage: dto.discountPercentage, maxDiscountCap: dto.maxDiscountCap, participant});\n\t\tawait this.assertProductsBelongToShop(shopId, dto);\n\n\t\tconst resolvedDto = await this.resolveCategorySelection(shopId, dto);\n\n\t\tif (participant.marketingId) {\n\t\t\tawait this.marketingService.removeMarketing(participant.marketingId);\n\t\t}\n\t\tconst {marketingId: newMarketingId} = await this.marketingService.applyMarketing(shopId, campaign, resolvedDto);\n\n\t\treturn this.repository.updateParticipant(campaign._id, shopId, {\n\t\t\tproducts: resolvedDto.products ?? [],\n\t\t\tisEntireMenu: resolvedDto.isEntireMenu,\n\t\t\tdiscountPercentage: resolvedDto.discountPercentage,\n\t\t\tmaxDiscountCap: resolvedDto.maxDiscountCap,\n\t\t\tisOrderCapacityEnabled: resolvedDto.isOrderCapacityEnabled,\n\t\t\tmaxOrderCapacity: resolvedDto.maxOrderCapacity,\n\t\t\tmarketing: newMarketingId,\n\t\t});\n\t}\n\n\tpublic async getParticipants(dto: GetLtoCampaignParticipantsDTO) {\n\t\tconst {documents, total} = await this.repository.findByCampaign(dto);\n\t\treturn {\n\t\t\tdocuments,\n\t\t\tmetadata: {page: dto.page, size: dto.size, totalElements: total, totalPages: Math.ceil(total / dto.size)},\n\t\t};\n\t}\n\n\tpublic async getParticipantIdsByCampaignId(campaignId: mongoose.Types.ObjectId) {\n\t\treturn await this.repository.findParticipantIdsByCampaignId(campaignId);\n\t}\n\n\tpublic async getNearby(\n\t\tcampaignId: mongoose.Types.ObjectId,\n\t\tinput: { latitude: number; longitude: number }\n\t) {\n\t\tconst settings = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\t\tconst nearByShopDistance = settings.nearByShopDistance || 10000;\n\t\treturn this.repository.findNearby(campaignId, input, nearByShopDistance);\n\t}\n\n\tpublic async reactivateMarketings(campaign: DocumentType<LimitedTimeOfferCampaign>): Promise<void> {\n\t\tconst participants = await this.repository.findAllActiveByCampaign(campaign._id);\n\n\t\tfor (const participant of participants) {\n\t\t\tconst dto: JoinLtoCampaignDTO = {\n\t\t\t\tisEntireMenu: participant.isEntireMenu,\n\t\t\t\tproducts: (participant.products ?? []) as mongoose.Types.ObjectId[],\n\t\t\t\tshopCategories: [],\n\t\t\t\tdiscountPercentage: participant.discountPercentage ?? 0,\n\t\t\t\tmaxDiscountCap: participant.maxDiscountCap ?? 0,\n\t\t\t\tisOrderCapacityEnabled: participant.isOrderCapacityEnabled,\n\t\t\t\tmaxOrderCapacity: participant.maxOrderCapacity,\n\t\t\t};\n\t\t\t// Drop any prior marketing (e.g. created when the shop joined between recurrences) so we\n\t\t\t// don't orphan it — it carries no campaign ref and would leak past cleanup.\n\t\t\tif (participant.marketing) {\n\t\t\t\tawait this.marketingService.removeMarketing(participant.marketing as mongoose.Types.ObjectId);\n\t\t\t}\n\t\t\tconst {marketingId} = await this.marketingService.applyMarketing(\n\t\t\t\tparticipant.shop as mongoose.Types.ObjectId,\n\t\t\t\tcampaign,\n\t\t\t\tdto,\n\t\t\t);\n\t\t\tawait this.repository.updateParticipant(\n\t\t\t\tcampaign._id,\n\t\t\t\tparticipant.shop as mongoose.Types.ObjectId,\n\t\t\t\t{...dto, marketing: marketingId},\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async applyMarketingWithRollback(input: {\n\t\tshopId: mongoose.Types.ObjectId;\n\t\tcampaign: DocumentType<LimitedTimeOfferCampaign>;\n\t\tdto: JoinLtoCampaignDTO;\n\t\tpausedMarketings: mongoose.Types.ObjectId[];\n\t}): Promise<{marketingId: mongoose.Types.ObjectId; pausedMarketingIds: mongoose.Types.ObjectId[]}> {\n\t\tconst {shopId, campaign, dto, pausedMarketings} = input;\n\t\ttry {\n\t\t\treturn await this.marketingService.applyMarketing(shopId, campaign, dto);\n\t\t} catch (err) {\n\t\t\tawait this.marketingService.resumeMarketings(pausedMarketings);\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tprivate async fetchCurrentCampaignOrThrow(): Promise<DocumentType<LimitedTimeOfferCampaign>> {\n\t\tconst campaign = await this.campaignService.getCurrent();\n\t\tif (!campaign) {\n\t\t\tthrow badRequestError('No campaign active or scheduled.');\n\t\t}\n\t\treturn campaign;\n\t}\n\n\tprivate async assertNotAlreadyJoined(\n\t\tcampaignId: mongoose.Types.ObjectId,\n\t\tshopId: mongoose.Types.ObjectId\n\t): Promise<void> {\n\t\tif (await this.repository.existsActiveByCampaignAndShop(campaignId, shopId)) {\n\t\t\tthrow conflictError('Your shop has already joined this campaign.');\n\t\t}\n\t}\n\n\t/**\n\t * Expands the selected shop categories into their product ids and merges them with any explicitly\n\t * selected products. The marketing layer only ever receives a flat product list, so category\n\t * selection is purely an LTO-side convenience that is resolved here before anything is persisted.\n\t */\n\tprivate async resolveCategorySelection(\n\t\tshopId: mongoose.Types.ObjectId,\n\t\tdto: JoinLtoCampaignDTO\n\t): Promise<JoinLtoCampaignDTO> {\n\t\tif (dto.isEntireMenu || !dto.shopCategories?.length) return dto;\n\n\t\tconst categoryProductIds = await this.repository.findProductIdsByCategories(shopId, dto.shopCategories);\n\t\tconst products = this.uniqueObjectIds([...(dto.products ?? []), ...categoryProductIds]);\n\n\t\tif (products.length === 0) {\n\t\t\tthrow badRequestError('The selected categories do not contain any products.');\n\t\t}\n\n\t\treturn { ...dto, products };\n\t}\n\n\t/**\n\t * Validates that explicitly selected products belong to the shop. Categories are not checked here:\n\t * {@link resolveCategorySelection} fetches their products with a shop-scoped query, so any category\n\t * that does not belong to the shop simply contributes no products.\n\t */\n\tprivate async assertProductsBelongToShop(\n\t\tshopId: mongoose.Types.ObjectId,\n\t\tdto: JoinLtoCampaignDTO\n\t): Promise<void> {\n\t\tif (dto.isEntireMenu) return;\n\n\t\tconst productIds = this.uniqueObjectIds(dto.products ?? []);\n\t\tif (!productIds.length) return;\n\n\t\tconst owned = await this.repository.countShopProducts(shopId, productIds);\n\t\tif (owned !== productIds.length) {\n\t\t\tthrow badRequestError('One or more selected products do not belong to your shop.');\n\t\t}\n\t}\n\n\tprivate uniqueObjectIds(ids: mongoose.Types.ObjectId[]): mongoose.Types.ObjectId[] {\n\t\treturn [...new Map(ids.map(id => [id.toString(), id])).values()];\n\t}\n\n\tprivate validateDiscountSelections(input: {\n\t\tcampaign: DocumentType<LimitedTimeOfferCampaign>;\n\t\tdiscountPercentage: number;\n\t\tmaxDiscountCap: number;\n\t\tparticipant?: ParticipantSummaryDTO;\n\t}): void {\n\t\tconst {campaign, discountPercentage, maxDiscountCap, participant} = input;\n\t\tif (!campaign.discountOptions.includes(discountPercentage)) {\n\t\t\tif (!participant || discountPercentage != participant.discountPercentage) {\n\t\t\t\tthrow badRequestError('Selected discount is not an available option for this campaign.');\n\t\t\t}\n\t\t}\n\t\tif (!campaign.maxDiscountCaps.includes(maxDiscountCap)) {\n\t\t\tif (!participant || maxDiscountCap != participant.maxDiscountCap) {\n\t\t\t\tthrow badRequestError('Selected max discount cap is not an available option for this campaign.');\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport const ltoParticipantService = Container.get(LimitedTimeOfferParticipantService);\n"]}
@@ -0,0 +1,13 @@
1
+ import { mongoose } from '@typegoose/typegoose';
2
+ import { LimitedTimeOfferCampaignSession as Model } from '@lyxa.ai/core/dist/libraries/mongo/models';
3
+ export declare class LtoCampaignSessionRepository {
4
+ private model;
5
+ constructor();
6
+ create(data: object): Promise<InstanceType<typeof Model>>;
7
+ findByCampaign(campaignId: mongoose.Types.ObjectId, page: number, size: number): Promise<{
8
+ documents: InstanceType<typeof Model>[];
9
+ total: number;
10
+ }>;
11
+ }
12
+ export declare const ltoCampaignSessionRepository: LtoCampaignSessionRepository;
13
+ //# sourceMappingURL=limited-time-offer-campaign-session.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limited-time-offer-campaign-session.repository.d.ts","sourceRoot":"/","sources":["modules/limited-time-offer/session/limited-time-offer-campaign-session.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EACH,+BAA+B,IAAI,KAAK,EAE3C,MAAM,2CAA2C,CAAC;AAEnD,qBACa,4BAA4B;IACrC,OAAO,CAAC,KAAK,CAA8C;;IAMrD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,KAAK,CAAC,CAAC;IAIzD,cAAc,CAChB,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACb,OAAO,CAAC;QAAC,SAAS,EAAE,YAAY,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC;CAYvE;AAED,eAAO,MAAM,4BAA4B,8BAA8C,CAAC"}