@lyxa.ai/marketing 1.0.13 → 1.0.15
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.
- package/dist/lib/events/event-initializations.d.ts +2 -0
- package/dist/lib/events/event-initializations.d.ts.map +1 -0
- package/dist/lib/events/event-initializations.js +5 -0
- package/dist/lib/events/event-initializations.js.map +1 -0
- package/dist/lib/index.d.ts +4046 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/modules/coupon/routers/coupon.router.d.ts +2673 -0
- package/dist/lib/modules/coupon/routers/coupon.router.d.ts.map +1 -0
- package/dist/lib/modules/coupon/routers/coupon.router.js +100 -0
- package/dist/lib/modules/coupon/routers/coupon.router.js.map +1 -0
- package/dist/lib/modules/coupon/routers/index.d.ts +2 -0
- package/dist/lib/modules/coupon/routers/index.d.ts.map +1 -0
- package/dist/lib/modules/coupon/routers/index.js +18 -0
- package/dist/lib/modules/coupon/routers/index.js.map +1 -0
- package/dist/lib/modules/coupon/services/coupon.service.d.ts +42 -0
- package/dist/lib/modules/coupon/services/coupon.service.d.ts.map +1 -0
- package/dist/lib/modules/coupon/services/coupon.service.js +551 -0
- package/dist/lib/modules/coupon/services/coupon.service.js.map +1 -0
- package/dist/lib/modules/coupon/services/custom-coupon.service.d.ts +12 -0
- package/dist/lib/modules/coupon/services/custom-coupon.service.d.ts.map +1 -0
- package/dist/lib/modules/coupon/services/custom-coupon.service.js +103 -0
- package/dist/lib/modules/coupon/services/custom-coupon.service.js.map +1 -0
- package/dist/lib/modules/coupon/services/global-coupon.service.d.ts +12 -0
- package/dist/lib/modules/coupon/services/global-coupon.service.d.ts.map +1 -0
- package/dist/lib/modules/coupon/services/global-coupon.service.js +120 -0
- package/dist/lib/modules/coupon/services/global-coupon.service.js.map +1 -0
- package/dist/lib/modules/coupon/services/index.d.ts +8 -0
- package/dist/lib/modules/coupon/services/index.d.ts.map +1 -0
- package/dist/lib/modules/coupon/services/index.js +24 -0
- package/dist/lib/modules/coupon/services/index.js.map +1 -0
- package/dist/lib/modules/coupon/services/individual-store-coupon.service.d.ts +13 -0
- package/dist/lib/modules/coupon/services/individual-store-coupon.service.d.ts.map +1 -0
- package/dist/lib/modules/coupon/services/individual-store-coupon.service.js +120 -0
- package/dist/lib/modules/coupon/services/individual-store-coupon.service.js.map +1 -0
- package/dist/lib/modules/coupon/services/individual-user-coupon.service.d.ts +12 -0
- package/dist/lib/modules/coupon/services/individual-user-coupon.service.d.ts.map +1 -0
- package/dist/lib/modules/coupon/services/individual-user-coupon.service.js +111 -0
- package/dist/lib/modules/coupon/services/individual-user-coupon.service.js.map +1 -0
- package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.d.ts +12 -0
- package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.d.ts.map +1 -0
- package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js +313 -0
- package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js.map +1 -0
- package/dist/lib/modules/coupon/services/referral-code-coupon.service.d.ts +19 -0
- package/dist/lib/modules/coupon/services/referral-code-coupon.service.d.ts.map +1 -0
- package/dist/lib/modules/coupon/services/referral-code-coupon.service.js +179 -0
- package/dist/lib/modules/coupon/services/referral-code-coupon.service.js.map +1 -0
- package/dist/lib/modules/coupon/services/referral-reward-coupon.service.d.ts +19 -0
- package/dist/lib/modules/coupon/services/referral-reward-coupon.service.d.ts.map +1 -0
- package/dist/lib/modules/coupon/services/referral-reward-coupon.service.js +186 -0
- package/dist/lib/modules/coupon/services/referral-reward-coupon.service.js.map +1 -0
- package/dist/lib/modules/coupon/transformers/coupon.transformer.d.ts +221 -0
- package/dist/lib/modules/coupon/transformers/coupon.transformer.d.ts.map +1 -0
- package/dist/lib/modules/coupon/transformers/coupon.transformer.js +7 -0
- package/dist/lib/modules/coupon/transformers/coupon.transformer.js.map +1 -0
- package/dist/lib/modules/coupon/transformers/index.d.ts +2 -0
- package/dist/lib/modules/coupon/transformers/index.d.ts.map +1 -0
- package/dist/lib/modules/coupon/transformers/index.js +18 -0
- package/dist/lib/modules/coupon/transformers/index.js.map +1 -0
- package/dist/lib/modules/coupon/validations/all-coupons.validation.d.ts +4130 -0
- package/dist/lib/modules/coupon/validations/all-coupons.validation.d.ts.map +1 -0
- package/dist/lib/modules/coupon/validations/all-coupons.validation.js +28 -0
- package/dist/lib/modules/coupon/validations/all-coupons.validation.js.map +1 -0
- package/dist/lib/modules/coupon/validations/coupon.validation.d.ts +1245 -0
- package/dist/lib/modules/coupon/validations/coupon.validation.d.ts.map +1 -0
- package/dist/lib/modules/coupon/validations/coupon.validation.js +103 -0
- package/dist/lib/modules/coupon/validations/coupon.validation.js.map +1 -0
- package/dist/lib/modules/coupon/validations/custom-coupon.validation.d.ts +367 -0
- package/dist/lib/modules/coupon/validations/custom-coupon.validation.d.ts.map +1 -0
- package/dist/lib/modules/coupon/validations/custom-coupon.validation.js +21 -0
- package/dist/lib/modules/coupon/validations/custom-coupon.validation.js.map +1 -0
- package/dist/lib/modules/coupon/validations/global-coupon.validation.d.ts +340 -0
- package/dist/lib/modules/coupon/validations/global-coupon.validation.d.ts.map +1 -0
- package/dist/lib/modules/coupon/validations/global-coupon.validation.js +18 -0
- package/dist/lib/modules/coupon/validations/global-coupon.validation.js.map +1 -0
- package/dist/lib/modules/coupon/validations/index.d.ts +9 -0
- package/dist/lib/modules/coupon/validations/index.d.ts.map +1 -0
- package/dist/lib/modules/coupon/validations/index.js +25 -0
- package/dist/lib/modules/coupon/validations/index.js.map +1 -0
- package/dist/lib/modules/coupon/validations/individual-store-coupon.validation.d.ts +367 -0
- package/dist/lib/modules/coupon/validations/individual-store-coupon.validation.d.ts.map +1 -0
- package/dist/lib/modules/coupon/validations/individual-store-coupon.validation.js +21 -0
- package/dist/lib/modules/coupon/validations/individual-store-coupon.validation.js.map +1 -0
- package/dist/lib/modules/coupon/validations/individual-user-coupon.validation.d.ts +367 -0
- package/dist/lib/modules/coupon/validations/individual-user-coupon.validation.d.ts.map +1 -0
- package/dist/lib/modules/coupon/validations/individual-user-coupon.validation.js +21 -0
- package/dist/lib/modules/coupon/validations/individual-user-coupon.validation.js.map +1 -0
- package/dist/lib/modules/coupon/validations/referral-code-coupon.validation.d.ts +77 -0
- package/dist/lib/modules/coupon/validations/referral-code-coupon.validation.d.ts.map +1 -0
- package/dist/lib/modules/coupon/validations/referral-code-coupon.validation.js +24 -0
- package/dist/lib/modules/coupon/validations/referral-code-coupon.validation.js.map +1 -0
- package/dist/lib/modules/coupon/validations/referral-reward-coupon.validation.d.ts +367 -0
- package/dist/lib/modules/coupon/validations/referral-reward-coupon.validation.d.ts.map +1 -0
- package/dist/lib/modules/coupon/validations/referral-reward-coupon.validation.js +21 -0
- package/dist/lib/modules/coupon/validations/referral-reward-coupon.validation.js.map +1 -0
- package/dist/lib/modules/deal-setting/routers/deal-setting.router.d.ts +214 -0
- package/dist/lib/modules/deal-setting/routers/deal-setting.router.d.ts.map +1 -0
- package/dist/lib/modules/deal-setting/routers/deal-setting.router.js +52 -0
- package/dist/lib/modules/deal-setting/routers/deal-setting.router.js.map +1 -0
- package/dist/lib/modules/deal-setting/routers/index.d.ts +2 -0
- package/dist/lib/modules/deal-setting/routers/index.d.ts.map +1 -0
- package/dist/lib/modules/deal-setting/routers/index.js +18 -0
- package/dist/lib/modules/deal-setting/routers/index.js.map +1 -0
- package/dist/lib/modules/deal-setting/services/deal-setting.service.d.ts +17 -0
- package/dist/lib/modules/deal-setting/services/deal-setting.service.d.ts.map +1 -0
- package/dist/lib/modules/deal-setting/services/deal-setting.service.js +181 -0
- package/dist/lib/modules/deal-setting/services/deal-setting.service.js.map +1 -0
- package/dist/lib/modules/deal-setting/services/index.d.ts +2 -0
- package/dist/lib/modules/deal-setting/services/index.d.ts.map +1 -0
- package/dist/lib/modules/deal-setting/services/index.js +18 -0
- package/dist/lib/modules/deal-setting/services/index.js.map +1 -0
- package/dist/lib/modules/deal-setting/transformers/deal-setting.transformer.d.ts +11 -0
- package/dist/lib/modules/deal-setting/transformers/deal-setting.transformer.d.ts.map +1 -0
- package/dist/lib/modules/deal-setting/transformers/deal-setting.transformer.js +7 -0
- package/dist/lib/modules/deal-setting/transformers/deal-setting.transformer.js.map +1 -0
- package/dist/lib/modules/deal-setting/transformers/index.d.ts +2 -0
- package/dist/lib/modules/deal-setting/transformers/index.d.ts.map +1 -0
- package/dist/lib/modules/deal-setting/transformers/index.js +18 -0
- package/dist/lib/modules/deal-setting/transformers/index.js.map +1 -0
- package/dist/lib/modules/deal-setting/validations/deal-setting.validation.d.ts +227 -0
- package/dist/lib/modules/deal-setting/validations/deal-setting.validation.d.ts.map +1 -0
- package/dist/lib/modules/deal-setting/validations/deal-setting.validation.js +22 -0
- package/dist/lib/modules/deal-setting/validations/deal-setting.validation.js.map +1 -0
- package/dist/lib/modules/deal-setting/validations/index.d.ts +2 -0
- package/dist/lib/modules/deal-setting/validations/index.d.ts.map +1 -0
- package/dist/lib/modules/deal-setting/validations/index.js +18 -0
- package/dist/lib/modules/deal-setting/validations/index.js.map +1 -0
- package/dist/lib/modules/featured-setting/routers/featured-setting.router.d.ts +302 -0
- package/dist/lib/modules/featured-setting/routers/featured-setting.router.d.ts.map +1 -0
- package/dist/lib/modules/featured-setting/routers/featured-setting.router.js +52 -0
- package/dist/lib/modules/featured-setting/routers/featured-setting.router.js.map +1 -0
- package/dist/lib/modules/featured-setting/routers/index.d.ts +2 -0
- package/dist/lib/modules/featured-setting/routers/index.d.ts.map +1 -0
- package/dist/lib/modules/featured-setting/routers/index.js +18 -0
- package/dist/lib/modules/featured-setting/routers/index.js.map +1 -0
- package/dist/lib/modules/featured-setting/services/featured-setting.service.d.ts +17 -0
- package/dist/lib/modules/featured-setting/services/featured-setting.service.d.ts.map +1 -0
- package/dist/lib/modules/featured-setting/services/featured-setting.service.js +181 -0
- package/dist/lib/modules/featured-setting/services/featured-setting.service.js.map +1 -0
- package/dist/lib/modules/featured-setting/services/index.d.ts +2 -0
- package/dist/lib/modules/featured-setting/services/index.d.ts.map +1 -0
- package/dist/lib/modules/featured-setting/services/index.js +18 -0
- package/dist/lib/modules/featured-setting/services/index.js.map +1 -0
- package/dist/lib/modules/featured-setting/transformers/featured-setting.transformer.d.ts +19 -0
- package/dist/lib/modules/featured-setting/transformers/featured-setting.transformer.d.ts.map +1 -0
- package/dist/lib/modules/featured-setting/transformers/featured-setting.transformer.js +7 -0
- package/dist/lib/modules/featured-setting/transformers/featured-setting.transformer.js.map +1 -0
- package/dist/lib/modules/featured-setting/transformers/index.d.ts +2 -0
- package/dist/lib/modules/featured-setting/transformers/index.d.ts.map +1 -0
- package/dist/lib/modules/featured-setting/transformers/index.js +18 -0
- package/dist/lib/modules/featured-setting/transformers/index.js.map +1 -0
- package/dist/lib/modules/featured-setting/validations/featured-setting.validation.d.ts +363 -0
- package/dist/lib/modules/featured-setting/validations/featured-setting.validation.d.ts.map +1 -0
- package/dist/lib/modules/featured-setting/validations/featured-setting.validation.js +24 -0
- package/dist/lib/modules/featured-setting/validations/featured-setting.validation.js.map +1 -0
- package/dist/lib/modules/featured-setting/validations/index.d.ts +2 -0
- package/dist/lib/modules/featured-setting/validations/index.d.ts.map +1 -0
- package/dist/lib/modules/featured-setting/validations/index.js +18 -0
- package/dist/lib/modules/featured-setting/validations/index.js.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/routers/index.d.ts +2 -0
- package/dist/lib/modules/loyalty-point-setting/routers/index.d.ts.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/routers/index.js +18 -0
- package/dist/lib/modules/loyalty-point-setting/routers/index.js.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/routers/loyalty-point-setting.router.d.ts +321 -0
- package/dist/lib/modules/loyalty-point-setting/routers/loyalty-point-setting.router.d.ts.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/routers/loyalty-point-setting.router.js +82 -0
- package/dist/lib/modules/loyalty-point-setting/routers/loyalty-point-setting.router.js.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/services/index.d.ts +3 -0
- package/dist/lib/modules/loyalty-point-setting/services/index.d.ts.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/services/index.js +19 -0
- package/dist/lib/modules/loyalty-point-setting/services/index.js.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/services/loyalty-point-category.service.d.ts +16 -0
- package/dist/lib/modules/loyalty-point-setting/services/loyalty-point-category.service.d.ts.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/services/loyalty-point-category.service.js +133 -0
- package/dist/lib/modules/loyalty-point-setting/services/loyalty-point-category.service.js.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/services/loyalty-point-setting.service.d.ts +16 -0
- package/dist/lib/modules/loyalty-point-setting/services/loyalty-point-setting.service.d.ts.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/services/loyalty-point-setting.service.js +156 -0
- package/dist/lib/modules/loyalty-point-setting/services/loyalty-point-setting.service.js.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/transformers/index.d.ts +3 -0
- package/dist/lib/modules/loyalty-point-setting/transformers/index.d.ts.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/transformers/index.js +19 -0
- package/dist/lib/modules/loyalty-point-setting/transformers/index.js.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/transformers/loyalty-point-category.transformer.d.ts +8 -0
- package/dist/lib/modules/loyalty-point-setting/transformers/loyalty-point-category.transformer.d.ts.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/transformers/loyalty-point-category.transformer.js +7 -0
- package/dist/lib/modules/loyalty-point-setting/transformers/loyalty-point-category.transformer.js.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/transformers/loyalty-point-setting.transformer.d.ts +9 -0
- package/dist/lib/modules/loyalty-point-setting/transformers/loyalty-point-setting.transformer.d.ts.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/transformers/loyalty-point-setting.transformer.js +7 -0
- package/dist/lib/modules/loyalty-point-setting/transformers/loyalty-point-setting.transformer.js.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/validations/index.d.ts +3 -0
- package/dist/lib/modules/loyalty-point-setting/validations/index.d.ts.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/validations/index.js +19 -0
- package/dist/lib/modules/loyalty-point-setting/validations/index.js.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/validations/loyalty-point-category.validation.d.ts +170 -0
- package/dist/lib/modules/loyalty-point-setting/validations/loyalty-point-category.validation.d.ts.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/validations/loyalty-point-category.validation.js +19 -0
- package/dist/lib/modules/loyalty-point-setting/validations/loyalty-point-category.validation.js.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/validations/loyalty-point-setting.validation.d.ts +188 -0
- package/dist/lib/modules/loyalty-point-setting/validations/loyalty-point-setting.validation.d.ts.map +1 -0
- package/dist/lib/modules/loyalty-point-setting/validations/loyalty-point-setting.validation.js +19 -0
- package/dist/lib/modules/loyalty-point-setting/validations/loyalty-point-setting.validation.js.map +1 -0
- package/dist/lib/modules/marketing/routers/index.d.ts +2 -0
- package/dist/lib/modules/marketing/routers/index.d.ts.map +1 -0
- package/dist/lib/modules/marketing/routers/index.js +18 -0
- package/dist/lib/modules/marketing/routers/index.js.map +1 -0
- package/dist/lib/modules/marketing/routers/marketing.router.d.ts +78 -0
- package/dist/lib/modules/marketing/routers/marketing.router.d.ts.map +1 -0
- package/dist/lib/modules/marketing/routers/marketing.router.js +53 -0
- package/dist/lib/modules/marketing/routers/marketing.router.js.map +1 -0
- package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.d.ts +13 -0
- package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.d.ts.map +1 -0
- package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.js +165 -0
- package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.js.map +1 -0
- package/dist/lib/modules/marketing/services/discount-marketing.service.d.ts +14 -0
- package/dist/lib/modules/marketing/services/discount-marketing.service.d.ts.map +1 -0
- package/dist/lib/modules/marketing/services/discount-marketing.service.js +227 -0
- package/dist/lib/modules/marketing/services/discount-marketing.service.js.map +1 -0
- package/dist/lib/modules/marketing/services/featured-marketing.service.d.ts +11 -0
- package/dist/lib/modules/marketing/services/featured-marketing.service.d.ts.map +1 -0
- package/dist/lib/modules/marketing/services/featured-marketing.service.js +80 -0
- package/dist/lib/modules/marketing/services/featured-marketing.service.js.map +1 -0
- package/dist/lib/modules/marketing/services/free-delivery-marketing.service.d.ts +12 -0
- package/dist/lib/modules/marketing/services/free-delivery-marketing.service.d.ts.map +1 -0
- package/dist/lib/modules/marketing/services/free-delivery-marketing.service.js +95 -0
- package/dist/lib/modules/marketing/services/free-delivery-marketing.service.js.map +1 -0
- package/dist/lib/modules/marketing/services/index.d.ts +8 -0
- package/dist/lib/modules/marketing/services/index.d.ts.map +1 -0
- package/dist/lib/modules/marketing/services/index.js +24 -0
- package/dist/lib/modules/marketing/services/index.js.map +1 -0
- package/dist/lib/modules/marketing/services/loyalty-point-marketing.service.d.ts +12 -0
- package/dist/lib/modules/marketing/services/loyalty-point-marketing.service.d.ts.map +1 -0
- package/dist/lib/modules/marketing/services/loyalty-point-marketing.service.js +149 -0
- package/dist/lib/modules/marketing/services/loyalty-point-marketing.service.js.map +1 -0
- package/dist/lib/modules/marketing/services/marketing.service.d.ts +17 -0
- package/dist/lib/modules/marketing/services/marketing.service.d.ts.map +1 -0
- package/dist/lib/modules/marketing/services/marketing.service.js +275 -0
- package/dist/lib/modules/marketing/services/marketing.service.js.map +1 -0
- package/dist/lib/modules/marketing/services/product-marketing.service.d.ts +18 -0
- package/dist/lib/modules/marketing/services/product-marketing.service.d.ts.map +1 -0
- package/dist/lib/modules/marketing/services/product-marketing.service.js +151 -0
- package/dist/lib/modules/marketing/services/product-marketing.service.js.map +1 -0
- package/dist/lib/modules/marketing/services/punch-marketing.service.d.ts +11 -0
- package/dist/lib/modules/marketing/services/punch-marketing.service.d.ts.map +1 -0
- package/dist/lib/modules/marketing/services/punch-marketing.service.js +80 -0
- package/dist/lib/modules/marketing/services/punch-marketing.service.js.map +1 -0
- package/dist/lib/modules/marketing/transformers/buy1-get1-marketing.transformer.d.ts +43 -0
- package/dist/lib/modules/marketing/transformers/buy1-get1-marketing.transformer.d.ts.map +1 -0
- package/dist/lib/modules/marketing/transformers/buy1-get1-marketing.transformer.js +7 -0
- package/dist/lib/modules/marketing/transformers/buy1-get1-marketing.transformer.js.map +1 -0
- package/dist/lib/modules/marketing/transformers/discount-marketing.transformer.d.ts +48 -0
- package/dist/lib/modules/marketing/transformers/discount-marketing.transformer.d.ts.map +1 -0
- package/dist/lib/modules/marketing/transformers/discount-marketing.transformer.js +7 -0
- package/dist/lib/modules/marketing/transformers/discount-marketing.transformer.js.map +1 -0
- package/dist/lib/modules/marketing/transformers/featured-marketing.transformer.d.ts +21 -0
- package/dist/lib/modules/marketing/transformers/featured-marketing.transformer.d.ts.map +1 -0
- package/dist/lib/modules/marketing/transformers/featured-marketing.transformer.js +7 -0
- package/dist/lib/modules/marketing/transformers/featured-marketing.transformer.js.map +1 -0
- package/dist/lib/modules/marketing/transformers/free-delivery-marketing.transformer.d.ts +21 -0
- package/dist/lib/modules/marketing/transformers/free-delivery-marketing.transformer.d.ts.map +1 -0
- package/dist/lib/modules/marketing/transformers/free-delivery-marketing.transformer.js +7 -0
- package/dist/lib/modules/marketing/transformers/free-delivery-marketing.transformer.js.map +1 -0
- package/dist/lib/modules/marketing/transformers/index.d.ts +8 -0
- package/dist/lib/modules/marketing/transformers/index.d.ts.map +1 -0
- package/dist/lib/modules/marketing/transformers/index.js +24 -0
- package/dist/lib/modules/marketing/transformers/index.js.map +1 -0
- package/dist/lib/modules/marketing/transformers/loyalty-point-marketing.transformer.d.ts +47 -0
- package/dist/lib/modules/marketing/transformers/loyalty-point-marketing.transformer.d.ts.map +1 -0
- package/dist/lib/modules/marketing/transformers/loyalty-point-marketing.transformer.js +7 -0
- package/dist/lib/modules/marketing/transformers/loyalty-point-marketing.transformer.js.map +1 -0
- package/dist/lib/modules/marketing/transformers/marketing.transformer.d.ts +3 -0
- package/dist/lib/modules/marketing/transformers/marketing.transformer.d.ts.map +1 -0
- package/dist/lib/modules/marketing/transformers/marketing.transformer.js +7 -0
- package/dist/lib/modules/marketing/transformers/marketing.transformer.js.map +1 -0
- package/dist/lib/modules/marketing/transformers/product-marketing.transformer.d.ts +10 -0
- package/dist/lib/modules/marketing/transformers/product-marketing.transformer.d.ts.map +1 -0
- package/dist/lib/modules/marketing/transformers/product-marketing.transformer.js +7 -0
- package/dist/lib/modules/marketing/transformers/product-marketing.transformer.js.map +1 -0
- package/dist/lib/modules/marketing/transformers/punch-marketing.transformer.d.ts +26 -0
- package/dist/lib/modules/marketing/transformers/punch-marketing.transformer.d.ts.map +1 -0
- package/dist/lib/modules/marketing/transformers/punch-marketing.transformer.js +7 -0
- package/dist/lib/modules/marketing/transformers/punch-marketing.transformer.js.map +1 -0
- package/dist/lib/modules/marketing/validations/all-marketings.validation.d.ts +54 -0
- package/dist/lib/modules/marketing/validations/all-marketings.validation.d.ts.map +1 -0
- package/dist/lib/modules/marketing/validations/all-marketings.validation.js +29 -0
- package/dist/lib/modules/marketing/validations/all-marketings.validation.js.map +1 -0
- package/dist/lib/modules/marketing/validations/buy1-get1-marketing.validation.d.ts +460 -0
- package/dist/lib/modules/marketing/validations/buy1-get1-marketing.validation.d.ts.map +1 -0
- package/dist/lib/modules/marketing/validations/buy1-get1-marketing.validation.js +40 -0
- package/dist/lib/modules/marketing/validations/buy1-get1-marketing.validation.js.map +1 -0
- package/dist/lib/modules/marketing/validations/discount-marketing.validation.d.ts +530 -0
- package/dist/lib/modules/marketing/validations/discount-marketing.validation.d.ts.map +1 -0
- package/dist/lib/modules/marketing/validations/discount-marketing.validation.js +61 -0
- package/dist/lib/modules/marketing/validations/discount-marketing.validation.js.map +1 -0
- package/dist/lib/modules/marketing/validations/featured-marketing.validation.d.ts +224 -0
- package/dist/lib/modules/marketing/validations/featured-marketing.validation.d.ts.map +1 -0
- package/dist/lib/modules/marketing/validations/featured-marketing.validation.js +42 -0
- package/dist/lib/modules/marketing/validations/featured-marketing.validation.js.map +1 -0
- package/dist/lib/modules/marketing/validations/free-delivery-marketing.validation.d.ts +162 -0
- package/dist/lib/modules/marketing/validations/free-delivery-marketing.validation.d.ts.map +1 -0
- package/dist/lib/modules/marketing/validations/free-delivery-marketing.validation.js +19 -0
- package/dist/lib/modules/marketing/validations/free-delivery-marketing.validation.js.map +1 -0
- package/dist/lib/modules/marketing/validations/index.d.ts +9 -0
- package/dist/lib/modules/marketing/validations/index.d.ts.map +1 -0
- package/dist/lib/modules/marketing/validations/index.js +25 -0
- package/dist/lib/modules/marketing/validations/index.js.map +1 -0
- package/dist/lib/modules/marketing/validations/loyalty-point-marketing.validation.d.ts +504 -0
- package/dist/lib/modules/marketing/validations/loyalty-point-marketing.validation.d.ts.map +1 -0
- package/dist/lib/modules/marketing/validations/loyalty-point-marketing.validation.js +34 -0
- package/dist/lib/modules/marketing/validations/loyalty-point-marketing.validation.js.map +1 -0
- package/dist/lib/modules/marketing/validations/marketing.validation.d.ts +170 -0
- package/dist/lib/modules/marketing/validations/marketing.validation.d.ts.map +1 -0
- package/dist/lib/modules/marketing/validations/marketing.validation.js +21 -0
- package/dist/lib/modules/marketing/validations/marketing.validation.js.map +1 -0
- package/dist/lib/modules/marketing/validations/product-marketing.validation.d.ts +150 -0
- package/dist/lib/modules/marketing/validations/product-marketing.validation.d.ts.map +1 -0
- package/dist/lib/modules/marketing/validations/product-marketing.validation.js +36 -0
- package/dist/lib/modules/marketing/validations/product-marketing.validation.js.map +1 -0
- package/dist/lib/modules/marketing/validations/punch-marketing.validation.d.ts +207 -0
- package/dist/lib/modules/marketing/validations/punch-marketing.validation.d.ts.map +1 -0
- package/dist/lib/modules/marketing/validations/punch-marketing.validation.js +24 -0
- package/dist/lib/modules/marketing/validations/punch-marketing.validation.js.map +1 -0
- package/dist/lib/modules/punch-marketing-history/routers/index.d.ts +2 -0
- package/dist/lib/modules/punch-marketing-history/routers/index.d.ts.map +1 -0
- package/dist/lib/modules/punch-marketing-history/routers/index.js +18 -0
- package/dist/lib/modules/punch-marketing-history/routers/index.js.map +1 -0
- package/dist/lib/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts +414 -0
- package/dist/lib/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts.map +1 -0
- package/dist/lib/modules/punch-marketing-history/routers/punch-marketing-history.router.js +69 -0
- package/dist/lib/modules/punch-marketing-history/routers/punch-marketing-history.router.js.map +1 -0
- package/dist/lib/modules/punch-marketing-history/services/index.d.ts +2 -0
- package/dist/lib/modules/punch-marketing-history/services/index.d.ts.map +1 -0
- package/dist/lib/modules/punch-marketing-history/services/index.js +18 -0
- package/dist/lib/modules/punch-marketing-history/services/index.js.map +1 -0
- package/dist/lib/modules/punch-marketing-history/services/punch-marketing-history.service.d.ts +24 -0
- package/dist/lib/modules/punch-marketing-history/services/punch-marketing-history.service.d.ts.map +1 -0
- package/dist/lib/modules/punch-marketing-history/services/punch-marketing-history.service.js +306 -0
- package/dist/lib/modules/punch-marketing-history/services/punch-marketing-history.service.js.map +1 -0
- package/dist/lib/modules/punch-marketing-history/transformers/index.d.ts +2 -0
- package/dist/lib/modules/punch-marketing-history/transformers/index.d.ts.map +1 -0
- package/dist/lib/modules/punch-marketing-history/transformers/index.js +18 -0
- package/dist/lib/modules/punch-marketing-history/transformers/index.js.map +1 -0
- package/dist/lib/modules/punch-marketing-history/transformers/punch-marketing-history.transformer.d.ts +19 -0
- package/dist/lib/modules/punch-marketing-history/transformers/punch-marketing-history.transformer.d.ts.map +1 -0
- package/dist/lib/modules/punch-marketing-history/transformers/punch-marketing-history.transformer.js +7 -0
- package/dist/lib/modules/punch-marketing-history/transformers/punch-marketing-history.transformer.js.map +1 -0
- package/dist/lib/modules/punch-marketing-history/validations/index.d.ts +2 -0
- package/dist/lib/modules/punch-marketing-history/validations/index.d.ts.map +1 -0
- package/dist/lib/modules/punch-marketing-history/validations/index.js +18 -0
- package/dist/lib/modules/punch-marketing-history/validations/index.js.map +1 -0
- package/dist/lib/modules/punch-marketing-history/validations/punch-marketing-history.validation.d.ts +400 -0
- package/dist/lib/modules/punch-marketing-history/validations/punch-marketing-history.validation.d.ts.map +1 -0
- package/dist/lib/modules/punch-marketing-history/validations/punch-marketing-history.validation.js +39 -0
- package/dist/lib/modules/punch-marketing-history/validations/punch-marketing-history.validation.js.map +1 -0
- package/dist/lib/modules/referral-setting/routers/index.d.ts +2 -0
- package/dist/lib/modules/referral-setting/routers/index.d.ts.map +1 -0
- package/dist/lib/modules/referral-setting/routers/index.js +18 -0
- package/dist/lib/modules/referral-setting/routers/index.js.map +1 -0
- package/dist/lib/modules/referral-setting/routers/referral-setting.router.d.ts +354 -0
- package/dist/lib/modules/referral-setting/routers/referral-setting.router.d.ts.map +1 -0
- package/dist/lib/modules/referral-setting/routers/referral-setting.router.js +42 -0
- package/dist/lib/modules/referral-setting/routers/referral-setting.router.js.map +1 -0
- package/dist/lib/modules/referral-setting/services/index.d.ts +2 -0
- package/dist/lib/modules/referral-setting/services/index.d.ts.map +1 -0
- package/dist/lib/modules/referral-setting/services/index.js +18 -0
- package/dist/lib/modules/referral-setting/services/index.js.map +1 -0
- package/dist/lib/modules/referral-setting/services/referral-setting.service.d.ts +15 -0
- package/dist/lib/modules/referral-setting/services/referral-setting.service.d.ts.map +1 -0
- package/dist/lib/modules/referral-setting/services/referral-setting.service.js +154 -0
- package/dist/lib/modules/referral-setting/services/referral-setting.service.js.map +1 -0
- package/dist/lib/modules/referral-setting/transformers/index.d.ts +2 -0
- package/dist/lib/modules/referral-setting/transformers/index.d.ts.map +1 -0
- package/dist/lib/modules/referral-setting/transformers/index.js +18 -0
- package/dist/lib/modules/referral-setting/transformers/index.js.map +1 -0
- package/dist/lib/modules/referral-setting/transformers/referral-setting.transformer.d.ts +31 -0
- package/dist/lib/modules/referral-setting/transformers/referral-setting.transformer.d.ts.map +1 -0
- package/dist/lib/modules/referral-setting/transformers/referral-setting.transformer.js +7 -0
- package/dist/lib/modules/referral-setting/transformers/referral-setting.transformer.js.map +1 -0
- package/dist/lib/modules/referral-setting/validations/index.d.ts +2 -0
- package/dist/lib/modules/referral-setting/validations/index.d.ts.map +1 -0
- package/dist/lib/modules/referral-setting/validations/index.js +18 -0
- package/dist/lib/modules/referral-setting/validations/index.js.map +1 -0
- package/dist/lib/modules/referral-setting/validations/referral-setting.validation.d.ts +575 -0
- package/dist/lib/modules/referral-setting/validations/referral-setting.validation.d.ts.map +1 -0
- package/dist/lib/modules/referral-setting/validations/referral-setting.validation.js +24 -0
- package/dist/lib/modules/referral-setting/validations/referral-setting.validation.js.map +1 -0
- package/dist/types/index.d.ts +14 -14
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/modules/coupon/routers/coupon.router.d.ts +14 -14
- package/dist/types/modules/coupon/routers/coupon.router.d.ts.map +1 -1
- package/dist/types/modules/coupon/services/individual-store-coupon.service.d.ts +1 -0
- package/dist/types/modules/coupon/services/individual-store-coupon.service.d.ts.map +1 -1
- package/dist/types/modules/coupon/transformers/coupon.transformer.d.ts +1 -1
- package/dist/types/modules/coupon/validations/all-coupons.validation.d.ts +21 -21
- package/dist/types/modules/coupon/validations/coupon.validation.d.ts +2 -2
- package/dist/types/modules/coupon/validations/individual-store-coupon.validation.d.ts +9 -9
- package/dist/types/modules/marketing/routers/marketing.router.d.ts.map +1 -1
- package/dist/types/modules/marketing/services/buy1-get1-marketing.service.d.ts +1 -0
- package/dist/types/modules/marketing/services/buy1-get1-marketing.service.d.ts.map +1 -1
- package/dist/types/modules/marketing/services/discount-marketing.service.d.ts +2 -0
- package/dist/types/modules/marketing/services/discount-marketing.service.d.ts.map +1 -1
- package/dist/types/modules/marketing/services/marketing.service.d.ts.map +1 -1
- package/dist/types/modules/marketing/services/product-marketing.service.d.ts.map +1 -1
- package/dist/types/modules/marketing/transformers/buy1-get1-marketing.transformer.d.ts +1 -0
- package/dist/types/modules/marketing/transformers/buy1-get1-marketing.transformer.d.ts.map +1 -1
- package/dist/types/modules/marketing/transformers/discount-marketing.transformer.d.ts +3 -0
- package/dist/types/modules/marketing/transformers/discount-marketing.transformer.d.ts.map +1 -1
- package/dist/types/modules/marketing/validations/buy1-get1-marketing.validation.d.ts +45 -31
- package/dist/types/modules/marketing/validations/buy1-get1-marketing.validation.d.ts.map +1 -1
- package/dist/types/modules/marketing/validations/discount-marketing.validation.d.ts +42 -0
- package/dist/types/modules/marketing/validations/discount-marketing.validation.d.ts.map +1 -1
- package/package.json +3 -4
|
@@ -0,0 +1,551 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.couponService = exports.CouponService = void 0;
|
|
46
|
+
const typedi_1 = __importStar(require("typedi"));
|
|
47
|
+
const server_1 = require("@trpc/server");
|
|
48
|
+
const models_1 = require("@lyxa.ai/core/dist/libraries/mongo/models");
|
|
49
|
+
const pagination_1 = require("@lyxa.ai/core/dist/utilities/pagination");
|
|
50
|
+
const _1 = require(".");
|
|
51
|
+
const enum_1 = require("@lyxa.ai/core/dist/utilities/enum");
|
|
52
|
+
const services_1 = require("../../punch-marketing-history/services");
|
|
53
|
+
const core_1 = require("@lyxa.ai/core");
|
|
54
|
+
const CouponRepository_1 = require("./patterns/repository/CouponRepository");
|
|
55
|
+
let CouponService = class CouponService {
|
|
56
|
+
model;
|
|
57
|
+
userModel;
|
|
58
|
+
orderModel;
|
|
59
|
+
referralRewardModel;
|
|
60
|
+
constructor() {
|
|
61
|
+
this.model = models_1.CouponModel;
|
|
62
|
+
this.userModel = models_1.UserModel;
|
|
63
|
+
this.orderModel = models_1.RegularOrderModel;
|
|
64
|
+
this.referralRewardModel = models_1.ReferralRewardCouponModel;
|
|
65
|
+
}
|
|
66
|
+
async create(data) {
|
|
67
|
+
let coupon;
|
|
68
|
+
const checkCoupon = await this.model.findOne({
|
|
69
|
+
code: data.code,
|
|
70
|
+
deletedAt: null,
|
|
71
|
+
});
|
|
72
|
+
if (checkCoupon) {
|
|
73
|
+
throw new server_1.TRPCError({
|
|
74
|
+
code: 'CONFLICT',
|
|
75
|
+
message: 'Coupon code already exists',
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
switch (data.couponType) {
|
|
79
|
+
case enum_1.CouponType.GLOBAL: {
|
|
80
|
+
coupon = await _1.globalCouponService.create(data);
|
|
81
|
+
if (coupon) {
|
|
82
|
+
const globalCoupon = coupon;
|
|
83
|
+
if (!globalCoupon.forNewUserOnly) {
|
|
84
|
+
await this.assignCouponToMultipleUser({}, coupon._id);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
case enum_1.CouponType.REFERRAL_CODE: {
|
|
90
|
+
coupon = await _1.referralCodeCouponService.create(data);
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
case enum_1.CouponType.REFERRAL_REWARD: {
|
|
94
|
+
coupon = await _1.referralRewardCouponService.create(data);
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
case enum_1.CouponType.INDIVIDUAL_STORE: {
|
|
98
|
+
coupon = await _1.individualStoreCouponService.create(data);
|
|
99
|
+
if (coupon) {
|
|
100
|
+
const individualStoreCoupon = coupon;
|
|
101
|
+
if (!individualStoreCoupon.forNewUserOnly) {
|
|
102
|
+
await this.assignCouponToMultipleUser({}, coupon._id);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
case enum_1.CouponType.INDIVIDUAL_USER: {
|
|
108
|
+
coupon = await _1.individualUserCouponService.create(data);
|
|
109
|
+
if (coupon) {
|
|
110
|
+
const individualUserCoupon = coupon;
|
|
111
|
+
const users = individualUserCoupon.users;
|
|
112
|
+
await this.assignCouponToMultipleUser({ _id: { $in: users } }, coupon._id);
|
|
113
|
+
}
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
case enum_1.CouponType.CUSTOM_COUPON: {
|
|
117
|
+
coupon = await _1.customCouponService.create(data);
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
default: {
|
|
121
|
+
throw new server_1.TRPCError({
|
|
122
|
+
code: 'BAD_REQUEST',
|
|
123
|
+
message: 'Coupon type is not valid',
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (!coupon) {
|
|
128
|
+
throw new server_1.TRPCError({
|
|
129
|
+
code: 'INTERNAL_SERVER_ERROR',
|
|
130
|
+
message: 'Could not create coupon',
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
const dispatcher = (0, core_1.getLibraries)().getMicroServiceDispatcher();
|
|
134
|
+
const notificationRouter = await dispatcher.getMicroService('notification');
|
|
135
|
+
await notificationRouter.notificationRouter.sendPushNotificationForCoupon.mutate(coupon._id);
|
|
136
|
+
return coupon;
|
|
137
|
+
}
|
|
138
|
+
async findById(id) {
|
|
139
|
+
const result = await this.model
|
|
140
|
+
.findOne({
|
|
141
|
+
_id: id,
|
|
142
|
+
deletedAt: null,
|
|
143
|
+
})
|
|
144
|
+
.populate([
|
|
145
|
+
{
|
|
146
|
+
path: 'previousVersions',
|
|
147
|
+
},
|
|
148
|
+
]);
|
|
149
|
+
if (!result) {
|
|
150
|
+
throw new server_1.TRPCError({
|
|
151
|
+
code: 'NOT_FOUND',
|
|
152
|
+
message: 'Record not found',
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
async find(data) {
|
|
158
|
+
try {
|
|
159
|
+
const paginate = (0, pagination_1.createRawDocumentPaginatorObject)(this.model);
|
|
160
|
+
const options = {
|
|
161
|
+
page: data?.page,
|
|
162
|
+
size: data?.size,
|
|
163
|
+
sort: data?.sort,
|
|
164
|
+
query: { ...data?.query, updatedVersion: { $exists: false } },
|
|
165
|
+
select: data?.select,
|
|
166
|
+
populate: data?.populate,
|
|
167
|
+
};
|
|
168
|
+
const paginatedResult = await paginate(options);
|
|
169
|
+
return paginatedResult;
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
throw new server_1.TRPCError({
|
|
173
|
+
code: 'INTERNAL_SERVER_ERROR',
|
|
174
|
+
message: `err: ${err}`,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async update(id, data) {
|
|
179
|
+
let coupon;
|
|
180
|
+
const [oldCoupon, oldOrders, checkCouponCode] = await Promise.all([
|
|
181
|
+
this.model.findById(id),
|
|
182
|
+
this.orderModel
|
|
183
|
+
.find({
|
|
184
|
+
'finance.coupon.coupon': id,
|
|
185
|
+
})
|
|
186
|
+
.select(['user', 'finance']),
|
|
187
|
+
this.model.findOne({
|
|
188
|
+
code: data.code,
|
|
189
|
+
_id: { $ne: id },
|
|
190
|
+
}),
|
|
191
|
+
]);
|
|
192
|
+
if (!oldCoupon) {
|
|
193
|
+
throw new server_1.TRPCError({
|
|
194
|
+
code: 'NOT_FOUND',
|
|
195
|
+
message: `Coupon not found`,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
if (checkCouponCode) {
|
|
199
|
+
throw new server_1.TRPCError({
|
|
200
|
+
code: 'CONFLICT',
|
|
201
|
+
message: `Coupon code already exists`,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
const oldCouponUsers = oldOrders.map(order => order.user);
|
|
205
|
+
switch (data.couponType) {
|
|
206
|
+
case enum_1.CouponType.GLOBAL: {
|
|
207
|
+
coupon = await _1.globalCouponService.create(data);
|
|
208
|
+
if (coupon) {
|
|
209
|
+
const globalCoupon = coupon;
|
|
210
|
+
if (!globalCoupon.forNewUserOnly) {
|
|
211
|
+
await this.exchangeCouponForMultipleUser({ _id: { $nin: oldCouponUsers } }, oldCoupon._id, coupon._id);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
await this.removeCouponFromMultipleUser({ _id: { $nin: oldCouponUsers } }, oldCoupon._id);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
case enum_1.CouponType.INDIVIDUAL_STORE: {
|
|
220
|
+
coupon = await _1.individualStoreCouponService.create(data);
|
|
221
|
+
if (coupon) {
|
|
222
|
+
const individualStoreCoupon = coupon;
|
|
223
|
+
if (!individualStoreCoupon.forNewUserOnly) {
|
|
224
|
+
await this.exchangeCouponForMultipleUser({ _id: { $nin: oldCouponUsers } }, oldCoupon._id, coupon._id);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
await this.removeCouponFromMultipleUser({ _id: { $nin: oldCouponUsers } }, oldCoupon._id);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
case enum_1.CouponType.INDIVIDUAL_USER: {
|
|
233
|
+
coupon = await _1.individualUserCouponService.create(data);
|
|
234
|
+
if (coupon) {
|
|
235
|
+
const individualUserCoupon = coupon;
|
|
236
|
+
await this.removeCouponFromMultipleUser({ _id: { $nin: oldCouponUsers } }, oldCoupon._id);
|
|
237
|
+
if (!individualUserCoupon.forNewUserOnly) {
|
|
238
|
+
await this.assignCouponToMultipleUser({ _id: { $in: individualUserCoupon.users } }, oldCoupon._id);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
case enum_1.CouponType.CUSTOM_COUPON: {
|
|
244
|
+
coupon = await _1.customCouponService.create(data);
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
default: {
|
|
248
|
+
throw new server_1.TRPCError({
|
|
249
|
+
code: 'BAD_REQUEST',
|
|
250
|
+
message: `Invalid coupon type`,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (!coupon) {
|
|
255
|
+
throw new server_1.TRPCError({
|
|
256
|
+
code: 'BAD_REQUEST',
|
|
257
|
+
message: `Could create updated coupon`,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
const previousVersions = oldCoupon?.previousVersions || [];
|
|
261
|
+
previousVersions.push(oldCoupon._id);
|
|
262
|
+
const updatedCoupon = await this.model.findByIdAndUpdate(coupon._id, {
|
|
263
|
+
$set: {
|
|
264
|
+
previousVersions,
|
|
265
|
+
},
|
|
266
|
+
}, {
|
|
267
|
+
new: true,
|
|
268
|
+
runValidators: true,
|
|
269
|
+
});
|
|
270
|
+
if (!updatedCoupon) {
|
|
271
|
+
throw new server_1.TRPCError({
|
|
272
|
+
code: 'INTERNAL_SERVER_ERROR',
|
|
273
|
+
message: `Could not set previous versions of coupon`,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
const updatedOldCoupon = await this.model.findByIdAndUpdate(oldCoupon._id, {
|
|
277
|
+
$set: {
|
|
278
|
+
updatedVersion: coupon._id,
|
|
279
|
+
},
|
|
280
|
+
}, {
|
|
281
|
+
new: true,
|
|
282
|
+
runValidators: true,
|
|
283
|
+
});
|
|
284
|
+
return updatedCoupon;
|
|
285
|
+
}
|
|
286
|
+
async deleteById(data) {
|
|
287
|
+
const { _id, softDelete } = data;
|
|
288
|
+
const result = await this.model.deleteRecord({ _id, deletedAt: null }, softDelete);
|
|
289
|
+
if (!result) {
|
|
290
|
+
throw new server_1.TRPCError({
|
|
291
|
+
code: 'NOT_FOUND',
|
|
292
|
+
message: 'Record not found',
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
this.removeCouponFromMultipleUser({}, _id);
|
|
296
|
+
return 'Record deleted successfully';
|
|
297
|
+
}
|
|
298
|
+
async getUserCoupons(user, page = 0, size = 0) {
|
|
299
|
+
const couponRepository = new CouponRepository_1.CouponRepository();
|
|
300
|
+
return await couponRepository.getUserCoupons(user, page, size);
|
|
301
|
+
}
|
|
302
|
+
async validateCoupon(data) {
|
|
303
|
+
if (!data.coupon) {
|
|
304
|
+
return await services_1.punchMarketingHistoryService.getPunchDiscount(data);
|
|
305
|
+
}
|
|
306
|
+
const [user, coupon] = await Promise.all([
|
|
307
|
+
this.userModel.findById(data.user),
|
|
308
|
+
this.model.findOne({ code: data.coupon }),
|
|
309
|
+
]);
|
|
310
|
+
if (!user) {
|
|
311
|
+
throw new server_1.TRPCError({
|
|
312
|
+
code: 'NOT_FOUND',
|
|
313
|
+
message: 'User not found',
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
if (!coupon) {
|
|
317
|
+
throw new server_1.TRPCError({
|
|
318
|
+
code: 'NOT_FOUND',
|
|
319
|
+
message: 'Coupon not found',
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
if (coupon.couponType == enum_1.CouponType.REFERRAL_CODE) {
|
|
323
|
+
return await _1.referralCodeCouponService.validateCoupon(data);
|
|
324
|
+
}
|
|
325
|
+
const baseCoupon = coupon;
|
|
326
|
+
const isValid = await this.validateBaseCoupon(baseCoupon, user._id, data.amountBeforeCoupon);
|
|
327
|
+
if (!isValid) {
|
|
328
|
+
return {
|
|
329
|
+
isValid,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
switch (coupon.couponType) {
|
|
333
|
+
case enum_1.CouponType.REFERRAL_REWARD:
|
|
334
|
+
return await _1.referralRewardCouponService.validateCoupon(data, coupon);
|
|
335
|
+
case enum_1.CouponType.GLOBAL:
|
|
336
|
+
return await _1.globalCouponService.validateCoupon(data, coupon);
|
|
337
|
+
case enum_1.CouponType.INDIVIDUAL_STORE:
|
|
338
|
+
return await _1.individualStoreCouponService.validateCoupon(data, coupon);
|
|
339
|
+
case enum_1.CouponType.INDIVIDUAL_USER:
|
|
340
|
+
return await _1.individualUserCouponService.validateCoupon(data, coupon);
|
|
341
|
+
case enum_1.CouponType.CUSTOM_COUPON:
|
|
342
|
+
return await _1.customCouponService.validateCoupon(data, coupon);
|
|
343
|
+
default:
|
|
344
|
+
throw new server_1.TRPCError({
|
|
345
|
+
code: 'NOT_IMPLEMENTED',
|
|
346
|
+
message: `Validation not implemented for ${coupon.couponType} coupons`,
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
isCouponExpired(coupon) {
|
|
351
|
+
if (coupon.expirationReason || (coupon?.duration?.end && new Date(coupon?.duration?.end) < new Date())) {
|
|
352
|
+
return true;
|
|
353
|
+
}
|
|
354
|
+
return false;
|
|
355
|
+
}
|
|
356
|
+
async validateBaseCoupon(coupon, user, orderAmount) {
|
|
357
|
+
const invalidConditions = [
|
|
358
|
+
this.isCouponExpired(coupon),
|
|
359
|
+
coupon.duration.start > new Date(),
|
|
360
|
+
coupon.minOrderValue && orderAmount < coupon.minOrderValue,
|
|
361
|
+
coupon.forNewUserOnly && !(await this.checkIfNewUser(user)),
|
|
362
|
+
coupon.orderLimitPerUser &&
|
|
363
|
+
(await this.getCouponOrdersForUser(user, coupon._id)) >= coupon.orderLimitPerUser,
|
|
364
|
+
];
|
|
365
|
+
return invalidConditions.every(value => value == false);
|
|
366
|
+
}
|
|
367
|
+
async checkIfNewUser(user) {
|
|
368
|
+
const order = await this.orderModel.findOne({
|
|
369
|
+
user,
|
|
370
|
+
status: { ne: enum_1.RegularOrderStatus.CANCELLED },
|
|
371
|
+
});
|
|
372
|
+
return order ? false : true;
|
|
373
|
+
}
|
|
374
|
+
async getCouponOrdersForUser(user, coupon) {
|
|
375
|
+
return await this.orderModel.countDocuments({
|
|
376
|
+
status: { $ne: enum_1.RegularOrderStatus.CANCELLED },
|
|
377
|
+
'finance.coupon.coupon': coupon,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
async updateCouponExpiry(coupon) {
|
|
381
|
+
if (coupon.totalOrderLimit) {
|
|
382
|
+
const orderCount = await this.orderModel.countDocuments({
|
|
383
|
+
status: { $ne: enum_1.RegularOrderStatus.CANCELLED },
|
|
384
|
+
'finance.coupon.coupon': coupon._id,
|
|
385
|
+
});
|
|
386
|
+
if (orderCount > coupon.totalOrderLimit) {
|
|
387
|
+
await this.model.findByIdAndUpdate(coupon._id, {
|
|
388
|
+
$set: {
|
|
389
|
+
expirationReason: enum_1.CouponExpirationReason.TOTAL_ORDER_LIMIT,
|
|
390
|
+
},
|
|
391
|
+
}, {
|
|
392
|
+
new: true,
|
|
393
|
+
runValidators: true,
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
if (coupon.spendLimit) {
|
|
398
|
+
const { totalCouponDiscount, totalSecondaryCouponDiscount } = await this.getCouponDiscountTotals(coupon._id);
|
|
399
|
+
if (totalCouponDiscount >= coupon.spendLimit) {
|
|
400
|
+
await this.model.findByIdAndUpdate(coupon._id, {
|
|
401
|
+
$set: {
|
|
402
|
+
expirationReason: enum_1.CouponExpirationReason.SPEND_LIMIT,
|
|
403
|
+
},
|
|
404
|
+
}, {
|
|
405
|
+
new: true,
|
|
406
|
+
runValidators: true,
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
async findCouponByCode(code) {
|
|
412
|
+
const coupon = await this.model.findOne({ code: code });
|
|
413
|
+
if (!coupon) {
|
|
414
|
+
throw new server_1.TRPCError({
|
|
415
|
+
code: 'NOT_FOUND',
|
|
416
|
+
message: 'Coupon not found',
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
return coupon;
|
|
420
|
+
}
|
|
421
|
+
async getCouponDiscountTotals(coupon) {
|
|
422
|
+
const pipeline = [
|
|
423
|
+
{
|
|
424
|
+
$match: {
|
|
425
|
+
status: { $ne: enum_1.RegularOrderStatus.CANCELLED },
|
|
426
|
+
'finance.coupon.coupon': coupon,
|
|
427
|
+
},
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
$group: {
|
|
431
|
+
_id: null,
|
|
432
|
+
totalCouponDiscount: {
|
|
433
|
+
$sum: {
|
|
434
|
+
$toDouble: {
|
|
435
|
+
$ifNull: ['$finance.pricing.couponDiscount', 0],
|
|
436
|
+
},
|
|
437
|
+
},
|
|
438
|
+
},
|
|
439
|
+
totalSecondaryCouponDiscount: {
|
|
440
|
+
$sum: {
|
|
441
|
+
$toDouble: {
|
|
442
|
+
$ifNull: ['$finance.pricing.secondaryCouponDiscount', 0],
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
},
|
|
446
|
+
},
|
|
447
|
+
},
|
|
448
|
+
];
|
|
449
|
+
const result = await this.orderModel.aggregate(pipeline);
|
|
450
|
+
return {
|
|
451
|
+
totalCouponDiscount: result[0]?.totalCouponDiscount ?? 0,
|
|
452
|
+
totalSecondaryCouponDiscount: result[0]?.totalSecondaryCouponDiscount ?? 0,
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
async assignCouponToUser(user, coupon) {
|
|
456
|
+
const updatedUser = await this.userModel.findByIdAndUpdate(user, {
|
|
457
|
+
$push: {
|
|
458
|
+
coupons: coupon,
|
|
459
|
+
},
|
|
460
|
+
}, {
|
|
461
|
+
new: true,
|
|
462
|
+
runValidators: true,
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
async assignCouponToMultipleUser(query, coupon) {
|
|
466
|
+
const updatedUsers = await this.userModel.updateMany(query, {
|
|
467
|
+
$push: {
|
|
468
|
+
coupons: coupon,
|
|
469
|
+
},
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
async removeCouponFromUser(user, coupon) {
|
|
473
|
+
const updatedUser = await this.userModel.findByIdAndUpdate(user, {
|
|
474
|
+
$pull: {
|
|
475
|
+
coupons: coupon,
|
|
476
|
+
},
|
|
477
|
+
}, {
|
|
478
|
+
new: true,
|
|
479
|
+
runValidators: true,
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
async removeCouponFromMultipleUser(query, coupon) {
|
|
483
|
+
const updatedUsers = await this.userModel.updateMany(query, {
|
|
484
|
+
$pull: {
|
|
485
|
+
coupons: coupon,
|
|
486
|
+
},
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
async newUserCheck(userId) {
|
|
490
|
+
const user = await this.userModel.findById(userId).select('orderCompleted');
|
|
491
|
+
return (user?.orderCompleted ?? 0) < 1;
|
|
492
|
+
}
|
|
493
|
+
throwBadRequest(message) {
|
|
494
|
+
throw new server_1.TRPCError({
|
|
495
|
+
code: 'BAD_REQUEST',
|
|
496
|
+
message,
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
async addCouponToUser(user, couponCode) {
|
|
500
|
+
const coupon = await this.findCouponByCode(couponCode);
|
|
501
|
+
if (!coupon) {
|
|
502
|
+
this.throwBadRequest('Coupon not found');
|
|
503
|
+
}
|
|
504
|
+
const typedCoupon = coupon;
|
|
505
|
+
if (this.isCouponExpired(typedCoupon)) {
|
|
506
|
+
this.throwBadRequest('This coupon has expired and cannot be added');
|
|
507
|
+
}
|
|
508
|
+
const isNewUser = await this.newUserCheck(user);
|
|
509
|
+
if (typedCoupon.forNewUserOnly && !isNewUser) {
|
|
510
|
+
this.throwBadRequest('This coupon is valid for new users only');
|
|
511
|
+
}
|
|
512
|
+
const alreadyApplied = await this.hasUserAlreadyAppliedCoupon(user, typedCoupon._id);
|
|
513
|
+
if (alreadyApplied) {
|
|
514
|
+
this.throwBadRequest('Coupon already applied to user');
|
|
515
|
+
}
|
|
516
|
+
await this.userModel.findByIdAndUpdate(user, { $push: { coupons: typedCoupon._id } }, { new: true, runValidators: true });
|
|
517
|
+
return coupon;
|
|
518
|
+
}
|
|
519
|
+
async hasUserAlreadyAppliedCoupon(userId, couponId) {
|
|
520
|
+
const user = await this.userModel.findById(userId).select('coupons');
|
|
521
|
+
if (!user) {
|
|
522
|
+
throw new server_1.TRPCError({
|
|
523
|
+
code: 'NOT_FOUND',
|
|
524
|
+
message: 'User not found',
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
return (user.coupons?.some((c) => {
|
|
528
|
+
const id = (c?._id ?? c)?.toString();
|
|
529
|
+
return id === couponId.toString();
|
|
530
|
+
}) ?? false);
|
|
531
|
+
}
|
|
532
|
+
async exchangeCouponForMultipleUser(query, oldCoupon, newCoupon) {
|
|
533
|
+
await this.removeCouponFromMultipleUser(query, oldCoupon);
|
|
534
|
+
await this.assignCouponToMultipleUser(query, newCoupon);
|
|
535
|
+
}
|
|
536
|
+
getShareableLink = async (code) => {
|
|
537
|
+
const secretsService = (0, core_1.getLibraries)().getSecretsService();
|
|
538
|
+
const deepLinkUrl = (await secretsService.getKey('DEEP_LINK_URL')) ?? 'https://link.lyxa.ai';
|
|
539
|
+
const link = `${deepLinkUrl}/invite/${code}`;
|
|
540
|
+
const message = `Download Lyxa and explore the wide variety of offerings and benefits! Use my code at checkout to claim a special coupon : ${code}.
|
|
541
|
+
${link}`;
|
|
542
|
+
return { link, message };
|
|
543
|
+
};
|
|
544
|
+
};
|
|
545
|
+
exports.CouponService = CouponService;
|
|
546
|
+
exports.CouponService = CouponService = __decorate([
|
|
547
|
+
(0, typedi_1.Service)(),
|
|
548
|
+
__metadata("design:paramtypes", [])
|
|
549
|
+
], CouponService);
|
|
550
|
+
exports.couponService = typedi_1.default.get(CouponService);
|
|
551
|
+
//# sourceMappingURL=coupon.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupon.service.js","sourceRoot":"/","sources":["modules/coupon/services/coupon.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { TRPCError } from '@trpc/server';\nimport { DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose';\nimport {\n\tCouponModel,\n\tCustomCoupon,\n\tGlobalCoupon,\n\tIndividualStoreCoupon,\n\tIndividualUserCoupon,\n\tCoupon as Model,\n\tReferralRewardCoupon,\n\tReferralRewardCouponModel,\n\tRegularOrder,\n\tRegularOrderModel,\n\tUser,\n\tUserModel,\n} from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport {\n\tAllCouponsValidationDTO,\n\tAllCouponsUpdateDTO,\n\tGetUserCouponDTO,\n\tcouponFields,\n\tCouponValidationOutputDTO,\n\tValidateCouponDTO,\n} from '@modules/coupon/validations';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport {\n\tFilterDTO,\n\tPaginatedResponse,\n\tDeleteDTO,\n\tShareableLinkDTO,\n} from '@lyxa.ai/core/dist/utilities/validation';\nimport { createRawDocumentPaginatorObject, PaginatorOptions } from '@lyxa.ai/core/dist/utilities/pagination';\nimport { ModelType } from '@typegoose/typegoose/lib/types';\nimport {\n\tcustomCouponService,\n\tglobalCouponService,\n\tindividualStoreCouponService,\n\tindividualUserCouponService,\n\treferralCodeCouponService,\n\treferralRewardCouponService,\n} from '.';\nimport { CouponExpirationReason, CouponType, RegularOrderStatus } from '@lyxa.ai/core/dist/utilities/enum';\nimport { BaseCoupon } from '@lyxa.ai/core/dist/libraries/mongo/models/base/base-coupon.model';\nimport { punchMarketingHistoryService } from '@modules/punch-marketing-history/services';\nimport { getLibraries } from '@lyxa.ai/core';\nimport { NotificationMicroserviceRouter } from '@lyxa.ai/notification';\nimport { CouponRepository } from './patterns/repository/CouponRepository';\n\n@Service()\nexport class CouponService {\n\tprivate model: typeof CouponModel & SoftDeleteModel<Model>;\n\tprivate userModel: typeof UserModel & SoftDeleteModel<User>;\n\tprivate orderModel: typeof RegularOrderModel & SoftDeleteModel<RegularOrder>;\n\tprivate referralRewardModel: typeof ReferralRewardCouponModel & SoftDeleteModel<ReferralRewardCoupon>;\n\n\tconstructor() {\n\t\tthis.model = CouponModel as typeof CouponModel & SoftDeleteModel<Model>;\n\t\tthis.userModel = UserModel as typeof UserModel & SoftDeleteModel<User>;\n\t\tthis.orderModel = RegularOrderModel as typeof RegularOrderModel & SoftDeleteModel<RegularOrder>;\n\t\tthis.referralRewardModel = ReferralRewardCouponModel as typeof ReferralRewardCouponModel &\n\t\t\tSoftDeleteModel<ReferralRewardCoupon>;\n\t}\n\n\t/**\n\t * Create a new record\n\t * @param data Data for the new record\n\t */\n\tpublic async create(data: AllCouponsValidationDTO): Promise<DocumentType<Model>> {\n\t\tlet coupon: DocumentType<Model>;\n\n\t\tconst checkCoupon = await this.model.findOne({\n\t\t\tcode: data.code,\n\t\t\tdeletedAt: null,\n\t\t});\n\n\t\tif (checkCoupon) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'CONFLICT',\n\t\t\t\tmessage: 'Coupon code already exists',\n\t\t\t});\n\t\t}\n\n\t\tswitch (data.couponType) {\n\t\t\tcase CouponType.GLOBAL: {\n\t\t\t\tcoupon = await globalCouponService.create(data);\n\t\t\t\tif (coupon) {\n\t\t\t\t\tconst globalCoupon = coupon as DocumentType<GlobalCoupon>;\n\t\t\t\t\tif (!globalCoupon.forNewUserOnly) {\n\t\t\t\t\t\tawait this.assignCouponToMultipleUser({}, coupon._id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase CouponType.REFERRAL_CODE: {\n\t\t\t\tcoupon = await referralCodeCouponService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase CouponType.REFERRAL_REWARD: {\n\t\t\t\tcoupon = await referralRewardCouponService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase CouponType.INDIVIDUAL_STORE: {\n\t\t\t\tcoupon = await individualStoreCouponService.create(data);\n\t\t\t\tif (coupon) {\n\t\t\t\t\tconst individualStoreCoupon = coupon as DocumentType<IndividualStoreCoupon>;\n\t\t\t\t\tif (!individualStoreCoupon.forNewUserOnly) {\n\t\t\t\t\t\tawait this.assignCouponToMultipleUser({}, coupon._id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase CouponType.INDIVIDUAL_USER: {\n\t\t\t\tcoupon = await individualUserCouponService.create(data);\n\t\t\t\tif (coupon) {\n\t\t\t\t\tconst individualUserCoupon = coupon as DocumentType<IndividualUserCoupon>;\n\t\t\t\t\tconst users = individualUserCoupon.users;\n\t\t\t\t\tawait this.assignCouponToMultipleUser({ _id: { $in: users } }, coupon._id);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase CouponType.CUSTOM_COUPON: {\n\t\t\t\tcoupon = await customCouponService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'BAD_REQUEST',\n\t\t\t\t\tmessage: 'Coupon type is not valid',\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (!coupon) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Could not create coupon',\n\t\t\t});\n\t\t}\n\n\t\t// Send Notification\n\t\tconst dispatcher = getLibraries().getMicroServiceDispatcher();\n\t\tconst notificationRouter =\n\t\t\tawait dispatcher.getMicroService<NotificationMicroserviceRouter>('notification');\n\n\t\tawait notificationRouter.notificationRouter.sendPushNotificationForCoupon.mutate(coupon._id);\n\n\t\treturn coupon;\n\t}\n\n\t/**\n\t * Get record by ID\n\t * @param id ID of the record\n\t */\n\tpublic async findById(id: string | mongoose.Types.ObjectId): Promise<DocumentType<Model>> {\n\t\tconst result = await this.model\n\t\t\t.findOne({\n\t\t\t\t_id: id,\n\t\t\t\tdeletedAt: null,\n\t\t\t})\n\t\t\t.populate([\n\t\t\t\t{\n\t\t\t\t\tpath: 'previousVersions',\n\t\t\t\t},\n\t\t\t]);\n\t\tif (!result) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Record not found',\n\t\t\t});\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get records\n\t * @param query Query to find records\n\t */\n\tpublic async find(data?: Partial<FilterDTO>): Promise<PaginatedResponse<DocumentType<ModelType<Model>>>> {\n\t\ttry {\n\t\t\tconst paginate = createRawDocumentPaginatorObject(this.model as ReturnModelType<typeof this.model>);\n\t\t\tconst options: PaginatorOptions<typeof Model> = {\n\t\t\t\tpage: data?.page,\n\t\t\t\tsize: data?.size,\n\t\t\t\tsort: data?.sort,\n\t\t\t\tquery: { ...data?.query, updatedVersion: { $exists: false } },\n\t\t\t\tselect: data?.select,\n\t\t\t\tpopulate: data?.populate,\n\t\t\t};\n\t\t\tconst paginatedResult = await paginate(options);\n\t\t\treturn paginatedResult;\n\t\t} catch (err) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: `err: ${err}`,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Update record\n\t * @param id ID of the old coupon\n\t * @param data Data of the updated coupon\n\t */\n\tpublic async update(id: string, data: AllCouponsValidationDTO): Promise<DocumentType<Model>> {\n\t\tlet coupon: DocumentType<Model> | null;\n\n\t\tconst [oldCoupon, oldOrders, checkCouponCode] = await Promise.all([\n\t\t\tthis.model.findById(id),\n\t\t\tthis.orderModel\n\t\t\t\t.find({\n\t\t\t\t\t'finance.coupon.coupon': id,\n\t\t\t\t})\n\t\t\t\t.select(['user', 'finance']),\n\t\t\tthis.model.findOne({\n\t\t\t\tcode: data.code,\n\t\t\t\t_id: { $ne: id },\n\t\t\t}),\n\t\t]);\n\n\t\tif (!oldCoupon) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: `Coupon not found`,\n\t\t\t});\n\t\t}\n\n\t\tif (checkCouponCode) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'CONFLICT',\n\t\t\t\tmessage: `Coupon code already exists`,\n\t\t\t});\n\t\t}\n\n\t\tconst oldCouponUsers = oldOrders.map(order => order.user);\n\n\t\tswitch (data.couponType) {\n\t\t\tcase CouponType.GLOBAL: {\n\t\t\t\tcoupon = await globalCouponService.create(data);\n\t\t\t\tif (coupon) {\n\t\t\t\t\tconst globalCoupon = coupon as DocumentType<GlobalCoupon>;\n\t\t\t\t\tif (!globalCoupon.forNewUserOnly) {\n\t\t\t\t\t\tawait this.exchangeCouponForMultipleUser(\n\t\t\t\t\t\t\t{ _id: { $nin: oldCouponUsers } },\n\t\t\t\t\t\t\toldCoupon._id,\n\t\t\t\t\t\t\tcoupon._id\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait this.removeCouponFromMultipleUser({ _id: { $nin: oldCouponUsers } }, oldCoupon._id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CouponType.INDIVIDUAL_STORE: {\n\t\t\t\tcoupon = await individualStoreCouponService.create(data);\n\t\t\t\tif (coupon) {\n\t\t\t\t\tconst individualStoreCoupon = coupon as DocumentType<IndividualStoreCoupon>;\n\t\t\t\t\tif (!individualStoreCoupon.forNewUserOnly) {\n\t\t\t\t\t\tawait this.exchangeCouponForMultipleUser(\n\t\t\t\t\t\t\t{ _id: { $nin: oldCouponUsers } },\n\t\t\t\t\t\t\toldCoupon._id,\n\t\t\t\t\t\t\tcoupon._id\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait this.removeCouponFromMultipleUser({ _id: { $nin: oldCouponUsers } }, oldCoupon._id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CouponType.INDIVIDUAL_USER: {\n\t\t\t\tcoupon = await individualUserCouponService.create(data);\n\t\t\t\tif (coupon) {\n\t\t\t\t\tconst individualUserCoupon = coupon as DocumentType<IndividualUserCoupon>;\n\t\t\t\t\tawait this.removeCouponFromMultipleUser({ _id: { $nin: oldCouponUsers } }, oldCoupon._id);\n\t\t\t\t\tif (!individualUserCoupon.forNewUserOnly) {\n\t\t\t\t\t\tawait this.assignCouponToMultipleUser(\n\t\t\t\t\t\t\t{ _id: { $in: individualUserCoupon.users } },\n\t\t\t\t\t\t\toldCoupon._id\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CouponType.CUSTOM_COUPON: {\n\t\t\t\tcoupon = await customCouponService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'BAD_REQUEST',\n\t\t\t\t\tmessage: `Invalid coupon type`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (!coupon) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'BAD_REQUEST',\n\t\t\t\tmessage: `Could create updated coupon`,\n\t\t\t});\n\t\t}\n\n\t\t// add previous version to new coupon\n\t\tconst previousVersions = oldCoupon?.previousVersions || [];\n\t\tpreviousVersions.push(oldCoupon._id);\n\n\t\tconst updatedCoupon = await this.model.findByIdAndUpdate(\n\t\t\tcoupon._id,\n\t\t\t{\n\t\t\t\t$set: {\n\t\t\t\t\tpreviousVersions,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tnew: true,\n\t\t\t\trunValidators: true,\n\t\t\t}\n\t\t);\n\n\t\tif (!updatedCoupon) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: `Could not set previous versions of coupon`,\n\t\t\t});\n\t\t}\n\t\t// update old coupon\n\t\tconst updatedOldCoupon = await this.model.findByIdAndUpdate(\n\t\t\toldCoupon._id,\n\t\t\t{\n\t\t\t\t$set: {\n\t\t\t\t\tupdatedVersion: coupon._id,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tnew: true,\n\t\t\t\trunValidators: true,\n\t\t\t}\n\t\t);\n\n\t\treturn updatedCoupon;\n\t}\n\n\t/**\n\t * Delete record\n\t * @param data Data for delete\n\t */\n\tpublic async deleteById(data: DeleteDTO): Promise<string> {\n\t\tconst { _id, softDelete } = data;\n\n\t\tconst result = await this.model.deleteRecord({ _id, deletedAt: null }, softDelete);\n\t\tif (!result) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Record not found',\n\t\t\t});\n\t\t}\n\n\t\t// remove coupons from users' coupon lists\n\t\tthis.removeCouponFromMultipleUser({}, _id);\n\n\t\treturn 'Record deleted successfully';\n\t}\n\n\t/**\n\t * Get User Coupons\n\t * @param data User and pagination data\n\t */\n\tpublic async getUserCoupons(\n\t\tuser: mongoose.Types.ObjectId | undefined,\n\t\tpage: number = 0,\n\t\tsize: number = 0\n\t): Promise<{\n\t\tavailable: Array<DocumentType<Model>>;\n\t\tused: Array<DocumentType<Model>>;\n\t\texpired: Array<DocumentType<Model>>;\n\t}> {\n\t\tconst couponRepository = new CouponRepository();\n\t\treturn await couponRepository.getUserCoupons(user, page, size);\n\t}\n\n\tpublic async validateCoupon(data: ValidateCouponDTO): Promise<CouponValidationOutputDTO> {\n\t\tif (!data.coupon) {\n\t\t\treturn await punchMarketingHistoryService.getPunchDiscount(data);\n\t\t}\n\n\t\tconst [user, coupon] = await Promise.all([\n\t\t\tthis.userModel.findById(data.user),\n\t\t\tthis.model.findOne({ code: data.coupon }),\n\t\t]);\n\n\t\tif (!user) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'User not found',\n\t\t\t});\n\t\t}\n\n\t\tif (!coupon) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Coupon not found',\n\t\t\t});\n\t\t}\n\n\t\tif (coupon.couponType == CouponType.REFERRAL_CODE) {\n\t\t\treturn await referralCodeCouponService.validateCoupon(data);\n\t\t}\n\n\t\tconst baseCoupon = coupon as DocumentType<BaseCoupon>;\n\n\t\tconst isValid = await this.validateBaseCoupon(baseCoupon, user._id, data.amountBeforeCoupon);\n\n\t\tif (!isValid) {\n\t\t\treturn {\n\t\t\t\tisValid,\n\t\t\t};\n\t\t}\n\n\t\tswitch (coupon.couponType) {\n\t\t\tcase CouponType.REFERRAL_REWARD:\n\t\t\t\treturn await referralRewardCouponService.validateCoupon(\n\t\t\t\t\tdata,\n\t\t\t\t\tcoupon as DocumentType<ReferralRewardCoupon>\n\t\t\t\t);\n\t\t\tcase CouponType.GLOBAL:\n\t\t\t\treturn await globalCouponService.validateCoupon(data, coupon as DocumentType<GlobalCoupon>);\n\t\t\tcase CouponType.INDIVIDUAL_STORE:\n\t\t\t\treturn await individualStoreCouponService.validateCoupon(\n\t\t\t\t\tdata,\n\t\t\t\t\tcoupon as DocumentType<IndividualStoreCoupon>\n\t\t\t\t);\n\t\t\tcase CouponType.INDIVIDUAL_USER:\n\t\t\t\treturn await individualUserCouponService.validateCoupon(\n\t\t\t\t\tdata,\n\t\t\t\t\tcoupon as DocumentType<IndividualUserCoupon>\n\t\t\t\t);\n\t\t\tcase CouponType.CUSTOM_COUPON:\n\t\t\t\treturn await customCouponService.validateCoupon(data, coupon as DocumentType<CustomCoupon>);\n\t\t\tdefault:\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'NOT_IMPLEMENTED',\n\t\t\t\t\tmessage: `Validation not implemented for ${coupon.couponType} coupons`,\n\t\t\t\t});\n\t\t}\n\t}\n\n\tprivate isCouponExpired(coupon: DocumentType<BaseCoupon>): Boolean {\n\t\t// TODO: Add an event listener to ensure the coupon expiration reason is updated after an order is placed\n\t\tif (coupon.expirationReason || (coupon?.duration?.end && new Date(coupon?.duration?.end) < new Date())) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t *\n\t * @param coupon Base coupon document\n\t * @param user ID of the user trying to user the coupon\n\t * @param orderAmount Order subtotal\n\t * @returns True if coupon is valid\n\t */\n\tprivate async validateBaseCoupon(\n\t\tcoupon: DocumentType<BaseCoupon>,\n\t\tuser: mongoose.Types.ObjectId,\n\t\torderAmount: number\n\t): Promise<boolean> {\n\t\tconst invalidConditions = [\n\t\t\tthis.isCouponExpired(coupon), // check coupon expired\n\t\t\tcoupon.duration.start > new Date(), // check coupon start\n\t\t\tcoupon.minOrderValue && orderAmount < coupon.minOrderValue, // check minimum order value\n\t\t\tcoupon.forNewUserOnly && !(await this.checkIfNewUser(user)), // check if new user\n\t\t\tcoupon.orderLimitPerUser &&\n\t\t\t\t(await this.getCouponOrdersForUser(user, coupon._id)) >= coupon.orderLimitPerUser, // check order limit for user\n\t\t];\n\n\t\treturn invalidConditions.every(value => value == false);\n\t}\n\n\tprivate async checkIfNewUser(user: mongoose.Types.ObjectId): Promise<boolean> {\n\t\tconst order = await this.orderModel.findOne({\n\t\t\tuser,\n\t\t\tstatus: { ne: RegularOrderStatus.CANCELLED },\n\t\t});\n\t\treturn order ? false : true;\n\t}\n\n\tprivate async getCouponOrdersForUser(\n\t\tuser: mongoose.Types.ObjectId,\n\t\tcoupon: mongoose.Types.ObjectId\n\t): Promise<number> {\n\t\treturn await this.orderModel.countDocuments({\n\t\t\tstatus: { $ne: RegularOrderStatus.CANCELLED },\n\t\t\t'finance.coupon.coupon': coupon,\n\t\t});\n\t}\n\n\tprivate async updateCouponExpiry(coupon: DocumentType<BaseCoupon>) {\n\t\tif (coupon.totalOrderLimit) {\n\t\t\t// total order limit\n\t\t\tconst orderCount = await this.orderModel.countDocuments({\n\t\t\t\tstatus: { $ne: RegularOrderStatus.CANCELLED },\n\t\t\t\t'finance.coupon.coupon': coupon._id,\n\t\t\t});\n\n\t\t\tif (orderCount > coupon.totalOrderLimit) {\n\t\t\t\tawait this.model.findByIdAndUpdate(\n\t\t\t\t\tcoupon._id,\n\t\t\t\t\t{\n\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\texpirationReason: CouponExpirationReason.TOTAL_ORDER_LIMIT,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tnew: true,\n\t\t\t\t\t\trunValidators: true,\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (coupon.spendLimit) {\n\t\t\t// spend limit\n\n\t\t\tconst { totalCouponDiscount, totalSecondaryCouponDiscount } = await this.getCouponDiscountTotals(\n\t\t\t\tcoupon._id\n\t\t\t);\n\n\t\t\tif (totalCouponDiscount >= coupon.spendLimit) {\n\t\t\t\tawait this.model.findByIdAndUpdate(\n\t\t\t\t\tcoupon._id,\n\t\t\t\t\t{\n\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\texpirationReason: CouponExpirationReason.SPEND_LIMIT,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tnew: true,\n\t\t\t\t\t\trunValidators: true,\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\tprivate async findCouponByCode(code: string): Promise<DocumentType<Model> | null> {\n\t\tconst coupon = await this.model.findOne({ code: code });\n\t\tif (!coupon) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Coupon not found',\n\t\t\t});\n\t\t}\n\t\treturn coupon;\n\t}\n\n\tprivate async getCouponDiscountTotals(coupon: mongoose.Types.ObjectId) {\n\t\tconst pipeline = [\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\tstatus: { $ne: RegularOrderStatus.CANCELLED },\n\t\t\t\t\t'finance.coupon.coupon': coupon,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: null,\n\t\t\t\t\ttotalCouponDiscount: {\n\t\t\t\t\t\t$sum: {\n\t\t\t\t\t\t\t$toDouble: {\n\t\t\t\t\t\t\t\t$ifNull: ['$finance.pricing.couponDiscount', 0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\ttotalSecondaryCouponDiscount: {\n\t\t\t\t\t\t$sum: {\n\t\t\t\t\t\t\t$toDouble: {\n\t\t\t\t\t\t\t\t$ifNull: ['$finance.pricing.secondaryCouponDiscount', 0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\n\t\tconst result = await this.orderModel.aggregate(pipeline);\n\n\t\treturn {\n\t\t\ttotalCouponDiscount: result[0]?.totalCouponDiscount ?? 0,\n\t\t\ttotalSecondaryCouponDiscount: result[0]?.totalSecondaryCouponDiscount ?? 0,\n\t\t};\n\t}\n\n\tprivate async assignCouponToUser(user: mongoose.Types.ObjectId, coupon: mongoose.Types.ObjectId) {\n\t\tconst updatedUser = await this.userModel.findByIdAndUpdate(\n\t\t\tuser,\n\t\t\t{\n\t\t\t\t$push: {\n\t\t\t\t\tcoupons: coupon,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tnew: true,\n\t\t\t\trunValidators: true,\n\t\t\t}\n\t\t);\n\t}\n\n\tprivate async assignCouponToMultipleUser(\n\t\tquery: mongoose.FilterQuery<User>,\n\t\tcoupon: mongoose.Types.ObjectId\n\t) {\n\t\tconst updatedUsers = await this.userModel.updateMany(query, {\n\t\t\t$push: {\n\t\t\t\tcoupons: coupon,\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate async removeCouponFromUser(user: mongoose.Types.ObjectId, coupon: mongoose.Types.ObjectId) {\n\t\tconst updatedUser = await this.userModel.findByIdAndUpdate(\n\t\t\tuser,\n\t\t\t{\n\t\t\t\t$pull: {\n\t\t\t\t\tcoupons: coupon,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tnew: true,\n\t\t\t\trunValidators: true,\n\t\t\t}\n\t\t);\n\t}\n\n\tprivate async removeCouponFromMultipleUser(\n\t\tquery: mongoose.FilterQuery<User>,\n\t\tcoupon: mongoose.Types.ObjectId\n\t) {\n\t\tconst updatedUsers = await this.userModel.updateMany(query, {\n\t\t\t$pull: {\n\t\t\t\tcoupons: coupon,\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate async newUserCheck(userId: mongoose.Types.ObjectId): Promise<boolean> {\n\t\tconst user = await this.userModel.findById(userId).select('orderCompleted');\n\t\treturn (user?.orderCompleted ?? 0) < 1;\n\t}\n\n\tprivate throwBadRequest(message: string): never {\n\t\tthrow new TRPCError({\n\t\t\tcode: 'BAD_REQUEST',\n\t\t\tmessage,\n\t\t});\n\t}\n\n\tpublic async addCouponToUser(user: any, couponCode: string): Promise<DocumentType<Model>> {\n\t\tconst coupon = await this.findCouponByCode(couponCode);\n\t\tif (!coupon) {\n\t\t\tthis.throwBadRequest('Coupon not found');\n\t\t}\n\n\t\tconst typedCoupon = coupon as DocumentType<BaseCoupon>;\n\n\t\tif (this.isCouponExpired(typedCoupon)) {\n\t\t\tthis.throwBadRequest('This coupon has expired and cannot be added');\n\t\t}\n\n\t\tconst isNewUser = await this.newUserCheck(user);\n\t\tif (typedCoupon.forNewUserOnly && !isNewUser) {\n\t\t\tthis.throwBadRequest('This coupon is valid for new users only');\n\t\t}\n\n\t\tconst alreadyApplied = await this.hasUserAlreadyAppliedCoupon(user, typedCoupon._id);\n\t\tif (alreadyApplied) {\n\t\t\tthis.throwBadRequest('Coupon already applied to user');\n\t\t}\n\t\tawait this.userModel.findByIdAndUpdate(\n\t\t\tuser,\n\t\t\t{ $push: { coupons: typedCoupon._id } },\n\t\t\t{ new: true, runValidators: true }\n\t\t);\n\n\t\treturn coupon;\n\t}\n\n\tprivate async hasUserAlreadyAppliedCoupon(\n\t\tuserId: mongoose.Types.ObjectId,\n\t\tcouponId: mongoose.Types.ObjectId\n\t): Promise<boolean> {\n\t\tconst user = await this.userModel.findById(userId).select('coupons');\n\t\tif (!user) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'User not found',\n\t\t\t});\n\t\t}\n\n\t\treturn (\n\t\t\tuser.coupons?.some((c: any) => {\n\t\t\t\tconst id = (c?._id ?? c)?.toString();\n\t\t\t\treturn id === couponId.toString();\n\t\t\t}) ?? false\n\t\t);\n\t}\n\n\tprivate async exchangeCouponForMultipleUser(\n\t\tquery: mongoose.FilterQuery<User>,\n\t\toldCoupon: mongoose.Types.ObjectId,\n\t\tnewCoupon: mongoose.Types.ObjectId\n\t) {\n\t\tawait this.removeCouponFromMultipleUser(query, oldCoupon);\n\t\tawait this.assignCouponToMultipleUser(query, newCoupon);\n\t}\n\n\tpublic getShareableLink = async (code: string): Promise<ShareableLinkDTO> => {\n\t\tconst secretsService = getLibraries().getSecretsService();\n\t\tconst deepLinkUrl = (await secretsService.getKey('DEEP_LINK_URL')) ?? 'https://link.lyxa.ai';\n\n\t\tconst link = `${deepLinkUrl}/invite/${code}`;\n\n\t\tconst message = `Download Lyxa and explore the wide variety of offerings and benefits! Use my code at checkout to claim a special coupon : ${code}.\n\t\t${link}`;\n\n\t\treturn { link, message };\n\t};\n}\n\nexport const couponService = Container.get(CouponService);\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DocumentType } from '@typegoose/typegoose';
|
|
2
|
+
import { CustomCoupon as Model } from '@lyxa.ai/core/dist/libraries/mongo/models/';
|
|
3
|
+
import { CouponValidationOutputDTO, CreateCustomCouponDTO as CreateDTO, UpdateCustomCouponDTO as UpdateDTO, ValidateCouponDTO } from '../../coupon/validations';
|
|
4
|
+
export declare class CustomCouponService {
|
|
5
|
+
private model;
|
|
6
|
+
constructor();
|
|
7
|
+
create(data: CreateDTO): Promise<DocumentType<Model>>;
|
|
8
|
+
update(id: string, data: UpdateDTO): Promise<DocumentType<Model>>;
|
|
9
|
+
validateCoupon(data: ValidateCouponDTO, couponDocument: DocumentType<Model>): Promise<CouponValidationOutputDTO>;
|
|
10
|
+
}
|
|
11
|
+
export declare const customCouponService: CustomCouponService;
|
|
12
|
+
//# sourceMappingURL=custom-coupon.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-coupon.service.d.ts","sourceRoot":"/","sources":["modules/coupon/services/custom-coupon.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAqB,YAAY,IAAI,KAAK,EAAE,MAAM,4CAA4C,CAAC;AACtG,OAAO,EACN,yBAAyB,EACzB,qBAAqB,IAAI,SAAS,EAClC,qBAAqB,IAAI,SAAS,EAClC,iBAAiB,EACjB,MAAM,6BAA6B,CAAC;AAIrC,qBACa,mBAAmB;IAC/B,OAAO,CAAC,KAAK,CAAC;;IAUD,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IASrD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAuBjE,cAAc,CAC1B,IAAI,EAAE,iBAAiB,EACvB,cAAc,EAAE,YAAY,CAAC,KAAK,CAAC,GACjC,OAAO,CAAC,yBAAyB,CAAC;CA4BrC;AAED,eAAO,MAAM,mBAAmB,qBAAqC,CAAC"}
|