@lyxa.ai/marketing 1.0.41 → 1.0.42
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/event/event-initializations.d.ts.map +1 -1
- package/dist/lib/event/event-initializations.js +2 -0
- package/dist/lib/event/event-initializations.js.map +1 -1
- package/dist/lib/event/event-listeners/event-listeners.d.ts.map +1 -1
- package/dist/lib/event/event-listeners/event-listeners.js.map +1 -1
- package/dist/lib/index.d.ts +643 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +6 -6
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/modules/coupon/routers/coupon.router.d.ts.map +1 -1
- package/dist/lib/modules/coupon/services/coupon.service.d.ts +1 -0
- package/dist/lib/modules/coupon/services/coupon.service.d.ts.map +1 -1
- package/dist/lib/modules/coupon/services/coupon.service.js +61 -40
- package/dist/lib/modules/coupon/services/coupon.service.js.map +1 -1
- package/dist/lib/modules/coupon/services/helper.service.d.ts.map +1 -1
- package/dist/lib/modules/coupon/services/helper.service.js +11 -6
- package/dist/lib/modules/coupon/services/helper.service.js.map +1 -1
- package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.d.ts.map +1 -1
- package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js +108 -149
- package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js.map +1 -1
- package/dist/lib/modules/coupon/services/referral-code-coupon.service.d.ts.map +1 -1
- package/dist/lib/modules/coupon/services/referral-code-coupon.service.js +1 -1
- package/dist/lib/modules/coupon/services/referral-code-coupon.service.js.map +1 -1
- package/dist/lib/modules/coupon/services/referral-reward-coupon.service.d.ts.map +1 -1
- package/dist/lib/modules/coupon/services/referral-reward-coupon.service.js +5 -1
- package/dist/lib/modules/coupon/services/referral-reward-coupon.service.js.map +1 -1
- package/dist/lib/modules/deal-setting/routers/deal-setting.router.d.ts.map +1 -1
- package/dist/lib/modules/featured-setting/routers/featured-setting.router.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/campaign.router.d.ts +339 -0
- package/dist/lib/modules/limited-time-offer/campaign/campaign.router.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/campaign/campaign.router.js +77 -0
- package/dist/lib/modules/limited-time-offer/campaign/campaign.router.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/campaign/jobs/index.d.ts +4 -0
- package/dist/lib/modules/limited-time-offer/campaign/jobs/index.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/campaign/jobs/index.js +24 -0
- package/dist/lib/modules/limited-time-offer/campaign/jobs/index.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.producer.d.ts +12 -0
- package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.producer.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.producer.js +29 -0
- package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.producer.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts +8 -0
- package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.js +79 -0
- package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts +851 -0
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.js +100 -0
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts +11 -0
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.js +75 -0
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts +9 -0
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.js +42 -0
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts +78 -0
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.js +308 -0
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.service.d.ts +12 -0
- package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.service.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.service.js +94 -0
- package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.service.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.validation.d.ts +189 -0
- package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.validation.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.validation.js +24 -0
- package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.validation.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/config/limited-time-offer.router.d.ts +122 -0
- package/dist/lib/modules/limited-time-offer/config/limited-time-offer.router.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/config/limited-time-offer.router.js +37 -0
- package/dist/lib/modules/limited-time-offer/config/limited-time-offer.router.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/limited-time-offer.router.d.ts +644 -0
- package/dist/lib/modules/limited-time-offer/limited-time-offer.router.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/limited-time-offer.router.js +13 -0
- package/dist/lib/modules/limited-time-offer/limited-time-offer.router.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts +170 -0
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.js +51 -0
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts +603 -0
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.js +85 -0
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts +12 -0
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.js +98 -0
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts +21 -0
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.js +133 -0
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.js.map +1 -0
- package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts +2 -1
- package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts.map +1 -1
- package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.js +23 -15
- package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.js.map +1 -1
- package/dist/lib/modules/marketing/routers/marketing.router.d.ts.map +1 -1
- package/dist/lib/modules/marketing/routers/marketing.router.js.map +1 -1
- package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.d.ts +0 -2
- package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.d.ts.map +1 -1
- package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.js +18 -39
- package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.js.map +1 -1
- package/dist/lib/modules/marketing/services/discount-marketing.service.d.ts +0 -3
- package/dist/lib/modules/marketing/services/discount-marketing.service.d.ts.map +1 -1
- package/dist/lib/modules/marketing/services/discount-marketing.service.js +26 -52
- package/dist/lib/modules/marketing/services/discount-marketing.service.js.map +1 -1
- package/dist/lib/modules/marketing/services/marketing.service.d.ts +1 -0
- package/dist/lib/modules/marketing/services/marketing.service.d.ts.map +1 -1
- package/dist/lib/modules/marketing/services/marketing.service.js +55 -25
- package/dist/lib/modules/marketing/services/marketing.service.js.map +1 -1
- package/dist/lib/modules/marketing/services/product-marketing.service.d.ts +9 -2
- package/dist/lib/modules/marketing/services/product-marketing.service.d.ts.map +1 -1
- package/dist/lib/modules/marketing/services/product-marketing.service.js +132 -7
- package/dist/lib/modules/marketing/services/product-marketing.service.js.map +1 -1
- package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.d.ts.map +1 -1
- package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.js +30 -24
- package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.js.map +1 -1
- package/dist/lib/modules/marketing/transformers/buy1-get1-marketing.transformer.d.ts +3 -0
- package/dist/lib/modules/marketing/transformers/buy1-get1-marketing.transformer.d.ts.map +1 -1
- package/dist/lib/modules/marketing/transformers/discount-marketing.transformer.d.ts +3 -0
- package/dist/lib/modules/marketing/transformers/discount-marketing.transformer.d.ts.map +1 -1
- package/dist/lib/modules/marketing/transformers/product-marketing.transformer.d.ts +1 -0
- package/dist/lib/modules/marketing/transformers/product-marketing.transformer.d.ts.map +1 -1
- package/dist/lib/modules/marketing/validations/buy1-get1-marketing.validation.d.ts +30 -0
- package/dist/lib/modules/marketing/validations/buy1-get1-marketing.validation.d.ts.map +1 -1
- package/dist/lib/modules/marketing/validations/discount-marketing.validation.d.ts +45 -9
- package/dist/lib/modules/marketing/validations/discount-marketing.validation.d.ts.map +1 -1
- package/dist/lib/modules/marketing/validations/product-marketing.validation.d.ts +77 -0
- package/dist/lib/modules/marketing/validations/product-marketing.validation.d.ts.map +1 -1
- package/dist/lib/modules/marketing/validations/product-marketing.validation.js +20 -1
- package/dist/lib/modules/marketing/validations/product-marketing.validation.js.map +1 -1
- package/dist/lib/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts.map +1 -1
- package/dist/types/event/event-initializations.d.ts.map +1 -1
- package/dist/types/event/event-listeners/event-listeners.d.ts.map +1 -1
- package/dist/types/index.d.ts +643 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/modules/coupon/routers/coupon.router.d.ts.map +1 -1
- package/dist/types/modules/coupon/services/coupon.service.d.ts +1 -0
- package/dist/types/modules/coupon/services/coupon.service.d.ts.map +1 -1
- package/dist/types/modules/coupon/services/helper.service.d.ts.map +1 -1
- package/dist/types/modules/coupon/services/patterns/repository/CouponRepository.d.ts.map +1 -1
- package/dist/types/modules/coupon/services/referral-code-coupon.service.d.ts.map +1 -1
- package/dist/types/modules/coupon/services/referral-reward-coupon.service.d.ts.map +1 -1
- package/dist/types/modules/deal-setting/routers/deal-setting.router.d.ts.map +1 -1
- package/dist/types/modules/featured-setting/routers/featured-setting.router.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/campaign/campaign.router.d.ts +339 -0
- package/dist/types/modules/limited-time-offer/campaign/campaign.router.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/campaign/jobs/index.d.ts +4 -0
- package/dist/types/modules/limited-time-offer/campaign/jobs/index.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.producer.d.ts +12 -0
- package/dist/types/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.producer.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts +8 -0
- package/dist/types/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts +851 -0
- package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts +11 -0
- package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts +9 -0
- package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts +78 -0
- package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/config/limited-time-offer-config.service.d.ts +12 -0
- package/dist/types/modules/limited-time-offer/config/limited-time-offer-config.service.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/config/limited-time-offer-config.validation.d.ts +189 -0
- package/dist/types/modules/limited-time-offer/config/limited-time-offer-config.validation.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/config/limited-time-offer.router.d.ts +122 -0
- package/dist/types/modules/limited-time-offer/config/limited-time-offer.router.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/limited-time-offer.router.d.ts +644 -0
- package/dist/types/modules/limited-time-offer/limited-time-offer.router.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts +170 -0
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts +1 -0
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts +603 -0
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts +12 -0
- package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts +21 -0
- package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts.map +1 -0
- package/dist/types/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts +2 -1
- package/dist/types/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts.map +1 -1
- 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 +0 -2
- 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 +0 -3
- package/dist/types/modules/marketing/services/discount-marketing.service.d.ts.map +1 -1
- package/dist/types/modules/marketing/services/marketing.service.d.ts +1 -0
- package/dist/types/modules/marketing/services/marketing.service.d.ts.map +1 -1
- package/dist/types/modules/marketing/services/product-marketing.service.d.ts +13 -2
- package/dist/types/modules/marketing/services/product-marketing.service.d.ts.map +1 -1
- package/dist/types/modules/marketing/services/synchronize-product-marketing.service.d.ts.map +1 -1
- package/dist/types/modules/marketing/transformers/buy1-get1-marketing.transformer.d.ts +3 -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/transformers/product-marketing.transformer.d.ts +1 -0
- package/dist/types/modules/marketing/transformers/product-marketing.transformer.d.ts.map +1 -1
- package/dist/types/modules/marketing/validations/buy1-get1-marketing.validation.d.ts +30 -0
- 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 +45 -9
- package/dist/types/modules/marketing/validations/discount-marketing.validation.d.ts.map +1 -1
- package/dist/types/modules/marketing/validations/product-marketing.validation.d.ts +77 -0
- package/dist/types/modules/marketing/validations/product-marketing.validation.d.ts.map +1 -1
- package/dist/types/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/lib/events/event-initializations.d.ts +0 -2
- package/dist/lib/events/event-initializations.d.ts.map +0 -1
- package/dist/lib/events/event-initializations.js +0 -5
- package/dist/lib/events/event-initializations.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referral-code-coupon.service.js","sourceRoot":"/","sources":["modules/coupon/services/referral-code-coupon.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { TRPCError } from '@trpc/server';\nimport { DocumentType, mongoose } from '@typegoose/typegoose';\nimport {\n\tReferralCodeCouponModel,\n\tReferralCodeCoupon as Model,\n\tReferralSettingModel,\n\tReferralSetting,\n\tUserModel,\n\tUser,\n\tgetCoreUserModel,\n} from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport {\n\tCouponValidationOutputDTO,\n\tCreateReferralCodeCouponDTO as CreateDTO,\n\tReferralCodeCouponResponseDTO,\n\tUpdateReferralCodeCouponDTO as UpdateDTO,\n\tValidateCouponDTO,\n} from '@modules/coupon/validations';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { convertToSecondary } from '@lyxa.ai/core/dist/utilities/currency';\nimport { roundBaseCurrency, roundSecondaryCurrency } from '@lyxa.ai/core/dist/utilities/shared';\nimport { ValueType, CouponType } from '@lyxa.ai/core/dist/utilities/enum';\nimport { internalServerError, notFoundError } from '@lyxa.ai/core/dist/utilities/error-common';\nimport { couponHelperService } from './helper.service';\nimport { CouponRepository } from './patterns/repository/CouponRepository';\n\n@Service()\nexport class ReferralCodeCouponService {\n\tprivate model;\n\tprivate settingsModel: typeof ReferralSettingModel & SoftDeleteModel<ReferralSetting>;\n\tprivate userModel: typeof UserModel & SoftDeleteModel<User>;\n\tprivate _coreUserModel: ReturnType<typeof getCoreUserModel> | null = null;\n\n\tconstructor() {\n\t\tthis.model = ReferralCodeCouponModel;\n\t\tthis.settingsModel = ReferralSettingModel as typeof ReferralSettingModel &\n\t\t\tSoftDeleteModel<ReferralSetting>;\n\t\tthis.userModel = UserModel as typeof UserModel & SoftDeleteModel<User>;\n\t}\n\n\tprivate get coreUserModel() {\n\t\tif (!this._coreUserModel) {\n\t\t\tthis._coreUserModel = getCoreUserModel();\n\t\t}\n\t\treturn this._coreUserModel;\n\t}\n\n\t/**\n\t * Create a new record\n\t * @param data Data for the new record\n\t */\n\tpublic async create(data: CreateDTO): Promise<DocumentType<Model>> {\n\t\treturn await this.model.create(data);\n\t}\n\n\t/**\n\t * Update record\n\t * @param id ID of the record\n\t * @param data Data to update\n\t */\n\tpublic async update(id: string, data: UpdateDTO): Promise<DocumentType<Model>> {\n\t\tconst record = await this.model.findOneAndUpdate(\n\t\t\t{\n\t\t\t\t_id: id,\n\t\t\t\tdeletedAt: null,\n\t\t\t},\n\t\t\tdata,\n\t\t\t{\n\t\t\t\tnew: true,\n\t\t\t\trunValidators: true,\n\t\t\t}\n\t\t);\n\n\t\tif (!record) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: `Record not found`,\n\t\t\t});\n\t\t}\n\n\t\treturn record;\n\t}\n\n\t/**\n\t * Normalize the name by removing accents, special characters,\n\t * and converting to uppercase\n\t *\n\t * @param name\n\t * @returns Normalized name\n\t */\n\tprivate normalizeName(value: string): string {\n\t\tif (!value) return '';\n\n\t\treturn value\n\t\t\t.normalize('NFD') // split accents\n\t\t\t.replace(/[\\u0300-\\u036f]/g, '') // remove accents\n\t\t\t.replace(/[^a-zA-Z]/g, '') // keep letters only\n\t\t\t.toUpperCase();\n\t}\n\n\t/**\n\t * Pad the value to 3 characters, if it's shorter than 3 characters,\n\t * pad with 'X', if it's longer than 3 characters,\n\t * truncate it to 3 characters\n\t *\n\t * @param value\n\t * @returns\n\t */\n\tprivate padToThree(value: string): string {\n\t\tif (!value) return 'XXX';\n\n\t\tif (value.length >= 3) {\n\t\t\treturn value.slice(0, 3);\n\t\t}\n\n\t\treturn value.padEnd(3, 'X');\n\t}\n\n\t/**\n\t * Detect Arabic Characters\n\t *\n\t * @param text\n\t * @returns\n\t */\n\tprivate containsArabic(text: string): boolean {\n\t\treturn /[\\u0600-\\u06FF]/.test(text);\n\t}\n\n\t/**\n\t * Letters + Numbers (for Arabic fallback)\n\t *\n\t * @param length\n\t * @returns\n\t */\n\tprivate generateRandomAlphaNumeric(length: number): string {\n\t\tconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n\t\tlet result = '';\n\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tresult += chars.charAt(Math.floor(Math.random() * chars.length));\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Random Digits (000–999)\n\t *\n\t * @return string\n\t */\n\tprivate generateThreeDigits(): string {\n\t\treturn Math.floor(Math.random() * 1000)\n\t\t\t.toString()\n\t\t\t.padStart(3, '0');\n\t}\n\n\t/**\n\t * Main Generator (Core Logic)\n\t *\n\t * @param firstName\n\t * @param lastName\n\t * @returns\n\t */\n\tprivate generateCouponFromName(firstName: string, lastName?: string): string {\n\t\tconst fullName = `${firstName} ${lastName ?? ''}`;\n\n\t\t// Arabic rule -> random 6 chars + 3 digits\n\t\tif (this.containsArabic(fullName)) {\n\t\t\treturn this.generateRandomAlphaNumeric(6) + this.generateThreeDigits();\n\t\t}\n\n\t\t// Normalize\n\t\tconst first = this.normalizeName(firstName);\n\t\tconst last = this.normalizeName(lastName ?? '');\n\n\t\t// Fallback if unsafe\n\t\tconst safeFirst = first || 'XXX';\n\t\tconst safeLast = last || 'XXX';\n\n\t\t// Pad\n\t\tconst firstPart = this.padToThree(safeFirst);\n\t\tconst lastPart = this.padToThree(safeLast);\n\n\t\t// Digits\n\t\tconst digits = this.generateThreeDigits();\n\n\t\treturn `${firstPart}${lastPart}${digits}`;\n\t}\n\n\t/**\n\t * Split full name into first name and last name.\n\t * If only one word is provided, treat it as first name and leave last name empty.\n\t * If multiple words are provided, treat the first word as first name and\n\t * the last word as last name, ignoring any middle words.\n\t *\n\t * @param fullName string\n\t * @returns object\n\t */\n\tprivate splitName(fullName: string): { firstName: string; lastName: string } {\n\t\tif (!fullName || !fullName.trim()) {\n\t\t\treturn { firstName: '', lastName: '' };\n\t\t}\n\n\t\tconst parts = fullName.trim().split(/\\s+/);\n\n\t\tif (parts.length === 1) {\n\t\t\t// Only one word -> treat as first name, last name empty\n\t\t\treturn { firstName: parts[0], lastName: '' };\n\t\t}\n\n\t\t// More than one word -> first word = first name, last word = last name\n\t\treturn { firstName: parts[0], lastName: parts[parts.length - 1] };\n\t}\n\n\tprivate generateCode(length = 6): string {\n\t\tconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n\t\tlet result = '';\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tresult += chars.charAt(Math.floor(Math.random() * chars.length));\n\t\t}\n\t\treturn result;\n\t}\n\n\t// private async generateCouponCode(): Promise<string> {\n\t// \tlet code: string = 'SAMPLE';\n\t// \tlet exists = true;\n\n\t// \twhile (exists) {\n\t// \t\tcode = this.generateCode();\n\t// \t\texists = (await this.model.exists({ code: code })) ? true : false;\n\t// \t}\n\n\t// \treturn code;\n\t// }\n\n\tprivate async generateCouponCode(fullName: string): Promise<string> {\n\t\tconst { firstName, lastName } = this.splitName(fullName);\n\n\t\tlet code: string = '';\n\t\tlet exists: boolean = true;\n\n\t\twhile (exists) {\n\t\t\tcode = this.generateCouponFromName(firstName, lastName);\n\t\t\tconst result = await this.model.exists({ code });\n\n\t\t\texists = !!result;\n\t\t}\n\n\t\treturn code;\n\t}\n\n\t// create referral code for user\n\tpublic async createReferralCodeForUser(\n\t\tuserId: mongoose.Types.ObjectId | undefined\n\t): Promise<DocumentType<Model>> {\n\t\tif (!userId) notFoundError('User not found');\n\n\t\t// Get user details to generate code based on name\n\t\tconst user = await this.userModel.findById(userId).select('coreUser');\n\t\tif (!user) notFoundError('User not found');\n\n\t\tconst coreUser = await this.coreUserModel.findById(user.coreUser).select('name');\n\t\tconst fullName = coreUser?.name ?? 'Customer';\n\n\t\tconst existingReferralCodeCoupon = await this.model.findOne({\n\t\t\treferralUser: userId,\n\t\t});\n\n\t\tif (existingReferralCodeCoupon) {\n\t\t\treturn existingReferralCodeCoupon;\n\t\t}\n\n\t\t// const code = await this.generateCouponCode();\n\t\tconst code = await this.generateCouponCode(fullName);\n\n\t\tconst referralCodeCoupon = await this.create({\n\t\t\tcode,\n\t\t\tcouponType: CouponType.REFERRAL_CODE,\n\t\t\treferralUser: userId,\n\t\t\torderLimitPerUser: 1,\n\t\t\tisOrderLimitPerUserEnabled: true,\n\t\t});\n\n\t\tif (!referralCodeCoupon) internalServerError('Could not create referral code coupon');\n\n\t\treturn referralCodeCoupon;\n\t}\n\n\tpublic async validateCoupon(\n\t\tdata: ValidateCouponDTO,\n\t\tcoupon: DocumentType<Model>\n\t): Promise<CouponValidationOutputDTO> {\n\t\tif (data.user.toString() == coupon.referralUser.toString()) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\tmessage: 'You cannot use your own referral code',\n\t\t\t};\n\t\t}\n\n\t\tconst isNewUser = await couponHelperService.isNewUser(new mongoose.Types.ObjectId(data.user));\n\n\t\tif (!isNewUser) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\tmessage: 'This coupon is for new user only',\n\t\t\t};\n\t\t}\n\n\t\tconst referralCouponSettings = await this.getReferralSettings();\n\n\t\tconst minimumOrderAmount = referralCouponSettings.receiver?.minimumOrderValue;\n\n\t\tif (minimumOrderAmount && minimumOrderAmount >= data.amountBeforeCoupon) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\tmessage: 'Minimum order amount not met',\n\t\t\t};\n\t\t}\n\n\t\tlet discountAmount =\n\t\t\treferralCouponSettings.receiver?.valueType == ValueType.FIXED\n\t\t\t\t? referralCouponSettings.receiver.value\n\t\t\t\t: roundBaseCurrency((data.amountBeforeCoupon * (referralCouponSettings.receiver?.value || 1)) / 100);\n\n\t\tlet secondaryDiscountAmount =\n\t\t\treferralCouponSettings.receiver?.valueType == ValueType.FIXED\n\t\t\t\t? await convertToSecondary(referralCouponSettings.receiver.value)\n\t\t\t\t: roundSecondaryCurrency(\n\t\t\t\t\t\t(data.secondaryAmountBeforeCoupon * (referralCouponSettings.receiver?.value || 1)) / 100\n\t\t\t\t\t);\n\n\t\tif (discountAmount > data.amountBeforeCoupon) {\n\t\t\tdiscountAmount = data.amountBeforeCoupon;\n\t\t}\n\t\tif (secondaryDiscountAmount > data.secondaryAmountBeforeCoupon) {\n\t\t\tsecondaryDiscountAmount = data.secondaryAmountBeforeCoupon;\n\t\t}\n\n\t\tconst referrerName = await couponHelperService.fetchUserName(coupon.referralUser._id);\n\n\t\tconst couponRepository = new CouponRepository();\n\n\t\treturn couponHelperService.buildCouponResponse(\n\t\t\tdata,\n\t\t\tdiscountAmount,\n\t\t\tsecondaryDiscountAmount,\n\t\t\tfalse, // company pays\n\t\t\tcouponRepository.addLabelsToCoupons([\n\t\t\t\t{\n\t\t\t\t\t...coupon.toJSON(),\n\t\t\t\t\treferringUser: { name: referrerName },\n\t\t\t\t\tvalue: referralCouponSettings.receiver?.value,\n\t\t\t\t\tvalueType: referralCouponSettings.receiver?.valueType,\n\t\t\t\t\tminimumOrderValue: referralCouponSettings.receiver?.minimumOrderValue,\n\t\t\t\t\tsecondaryCurrencyValue:\n\t\t\t\t\t\treferralCouponSettings.receiver?.valueType == ValueType.FIXED\n\t\t\t\t\t\t\t? await convertToSecondary(referralCouponSettings.receiver?.value ?? 0)\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\tsecondaryCurrencyMinOrderValue: await convertToSecondary(\n\t\t\t\t\t\treferralCouponSettings.receiver?.minimumOrderValue ?? 0\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t])[0]\n\t\t);\n\t}\n\n\tpublic async getReferralCodeCoupon(\n\t\tuserId: mongoose.Types.ObjectId\n\t): Promise<ReferralCodeCouponResponseDTO> {\n\t\tlet coupon = await this.model.findOne({ referralUser: userId });\n\n\t\tif (!coupon) {\n\t\t\tcoupon = await this.createReferralCodeForUser(userId);\n\t\t}\n\t\tconst referral = coupon as unknown as Model;\n\n\t\treturn {\n\t\t\tcode: referral.code,\n\t\t\ttext: `Download Lyxa and explore the wide variety of offerings and benefits!\\nUse my code at checkout to claim a special coupon: ${referral.code}.\\nhttps://request.lyxa.ai/app/user/home/share`,\n\t\t};\n\t}\n\n\tprivate async getReferralSettings(): Promise<DocumentType<ReferralSetting>> {\n\t\tconst referralSetting = await this.settingsModel.findOne({});\n\t\tif (!referralSetting) notFoundError('Referral setting not found');\n\t\treturn referralSetting;\n\t}\n}\n\nexport const referralCodeCouponService = Container.get(ReferralCodeCouponService);\n"]}
|
|
1
|
+
{"version":3,"file":"referral-code-coupon.service.js","sourceRoot":"/","sources":["modules/coupon/services/referral-code-coupon.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { TRPCError } from '@trpc/server';\nimport { DocumentType, mongoose } from '@typegoose/typegoose';\nimport {\n\tReferralCodeCouponModel,\n\tReferralCodeCoupon as Model,\n\tReferralSettingModel,\n\tReferralSetting,\n\tUserModel,\n\tUser,\n\tgetCoreUserModel,\n} from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport {\n\tCouponValidationOutputDTO,\n\tCreateReferralCodeCouponDTO as CreateDTO,\n\tReferralCodeCouponResponseDTO,\n\tUpdateReferralCodeCouponDTO as UpdateDTO,\n\tValidateCouponDTO,\n} from '@modules/coupon/validations';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { convertToSecondary } from '@lyxa.ai/core/dist/utilities/currency';\nimport { roundBaseCurrency, roundSecondaryCurrency } from '@lyxa.ai/core/dist/utilities/shared';\nimport { ValueType, CouponType } from '@lyxa.ai/core/dist/utilities/enum';\nimport { internalServerError, notFoundError } from '@lyxa.ai/core/dist/utilities/error-common';\nimport { couponHelperService } from './helper.service';\nimport { CouponRepository } from './patterns/repository/CouponRepository';\n\n@Service()\nexport class ReferralCodeCouponService {\n\tprivate model;\n\tprivate settingsModel: typeof ReferralSettingModel & SoftDeleteModel<ReferralSetting>;\n\tprivate userModel: typeof UserModel & SoftDeleteModel<User>;\n\tprivate _coreUserModel: ReturnType<typeof getCoreUserModel> | null = null;\n\n\tconstructor() {\n\t\tthis.model = ReferralCodeCouponModel;\n\t\tthis.settingsModel = ReferralSettingModel as typeof ReferralSettingModel &\n\t\t\tSoftDeleteModel<ReferralSetting>;\n\t\tthis.userModel = UserModel as typeof UserModel & SoftDeleteModel<User>;\n\t}\n\n\tprivate get coreUserModel() {\n\t\tif (!this._coreUserModel) {\n\t\t\tthis._coreUserModel = getCoreUserModel();\n\t\t}\n\t\treturn this._coreUserModel;\n\t}\n\n\t/**\n\t * Create a new record\n\t * @param data Data for the new record\n\t */\n\tpublic async create(data: CreateDTO): Promise<DocumentType<Model>> {\n\t\treturn await this.model.create(data);\n\t}\n\n\t/**\n\t * Update record\n\t * @param id ID of the record\n\t * @param data Data to update\n\t */\n\tpublic async update(id: string, data: UpdateDTO): Promise<DocumentType<Model>> {\n\t\tconst record = await this.model.findOneAndUpdate(\n\t\t\t{\n\t\t\t\t_id: id,\n\t\t\t\tdeletedAt: null,\n\t\t\t},\n\t\t\tdata,\n\t\t\t{\n\t\t\t\tnew: true,\n\t\t\t\trunValidators: true,\n\t\t\t}\n\t\t);\n\n\t\tif (!record) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: `Record not found`,\n\t\t\t});\n\t\t}\n\n\t\treturn record;\n\t}\n\n\t/**\n\t * Normalize the name by removing accents, special characters,\n\t * and converting to uppercase\n\t *\n\t * @param name\n\t * @returns Normalized name\n\t */\n\tprivate normalizeName(value: string): string {\n\t\tif (!value) return '';\n\n\t\treturn value\n\t\t\t.normalize('NFD') // split accents\n\t\t\t.replace(/[\\u0300-\\u036f]/g, '') // remove accents\n\t\t\t.replace(/[^a-zA-Z]/g, '') // keep letters only\n\t\t\t.toUpperCase();\n\t}\n\n\t/**\n\t * Pad the value to 3 characters, if it's shorter than 3 characters,\n\t * pad with 'X', if it's longer than 3 characters,\n\t * truncate it to 3 characters\n\t *\n\t * @param value\n\t * @returns\n\t */\n\tprivate padToThree(value: string): string {\n\t\tif (!value) return 'XXX';\n\n\t\tif (value.length >= 3) {\n\t\t\treturn value.slice(0, 3);\n\t\t}\n\n\t\treturn value.padEnd(3, 'X');\n\t}\n\n\t/**\n\t * Detect Arabic Characters\n\t *\n\t * @param text\n\t * @returns\n\t */\n\tprivate containsArabic(text: string): boolean {\n\t\treturn /[\\u0600-\\u06FF]/.test(text);\n\t}\n\n\t/**\n\t * Letters + Numbers (for Arabic fallback)\n\t *\n\t * @param length\n\t * @returns\n\t */\n\tprivate generateRandomAlphaNumeric(length: number): string {\n\t\tconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n\t\tlet result = '';\n\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tresult += chars.charAt(Math.floor(Math.random() * chars.length));\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Random Digits (000–999)\n\t *\n\t * @return string\n\t */\n\tprivate generateThreeDigits(): string {\n\t\treturn Math.floor(Math.random() * 1000)\n\t\t\t.toString()\n\t\t\t.padStart(3, '0');\n\t}\n\n\t/**\n\t * Main Generator (Core Logic)\n\t *\n\t * @param firstName\n\t * @param lastName\n\t * @returns\n\t */\n\tprivate generateCouponFromName(firstName: string, lastName?: string): string {\n\t\tconst fullName = `${firstName} ${lastName ?? ''}`;\n\n\t\t// Arabic rule -> random 6 chars + 3 digits\n\t\tif (this.containsArabic(fullName)) {\n\t\t\treturn this.generateRandomAlphaNumeric(6) + this.generateThreeDigits();\n\t\t}\n\n\t\t// Normalize\n\t\tconst first = this.normalizeName(firstName);\n\t\tconst last = this.normalizeName(lastName ?? '');\n\n\t\t// Fallback if unsafe\n\t\tconst safeFirst = first || 'XXX';\n\t\tconst safeLast = last || 'XXX';\n\n\t\t// Pad\n\t\tconst firstPart = this.padToThree(safeFirst);\n\t\tconst lastPart = this.padToThree(safeLast);\n\n\t\t// Digits\n\t\tconst digits = this.generateThreeDigits();\n\n\t\treturn `${firstPart}${lastPart}${digits}`;\n\t}\n\n\t/**\n\t * Split full name into first name and last name.\n\t * If only one word is provided, treat it as first name and leave last name empty.\n\t * If multiple words are provided, treat the first word as first name and\n\t * the last word as last name, ignoring any middle words.\n\t *\n\t * @param fullName string\n\t * @returns object\n\t */\n\tprivate splitName(fullName: string): { firstName: string; lastName: string } {\n\t\tif (!fullName || !fullName.trim()) {\n\t\t\treturn { firstName: '', lastName: '' };\n\t\t}\n\n\t\tconst parts = fullName.trim().split(/\\s+/);\n\n\t\tif (parts.length === 1) {\n\t\t\t// Only one word -> treat as first name, last name empty\n\t\t\treturn { firstName: parts[0], lastName: '' };\n\t\t}\n\n\t\t// More than one word -> first word = first name, last word = last name\n\t\treturn { firstName: parts[0], lastName: parts[parts.length - 1] };\n\t}\n\n\tprivate generateCode(length = 6): string {\n\t\tconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n\t\tlet result = '';\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tresult += chars.charAt(Math.floor(Math.random() * chars.length));\n\t\t}\n\t\treturn result;\n\t}\n\n\t// private async generateCouponCode(): Promise<string> {\n\t// \tlet code: string = 'SAMPLE';\n\t// \tlet exists = true;\n\n\t// \twhile (exists) {\n\t// \t\tcode = this.generateCode();\n\t// \t\texists = (await this.model.exists({ code: code })) ? true : false;\n\t// \t}\n\n\t// \treturn code;\n\t// }\n\n\tprivate async generateCouponCode(fullName: string): Promise<string> {\n\t\tconst { firstName, lastName } = this.splitName(fullName);\n\n\t\tlet code: string = '';\n\t\tlet exists: boolean = true;\n\n\t\twhile (exists) {\n\t\t\tcode = this.generateCouponFromName(firstName, lastName);\n\t\t\tconst result = await this.model.exists({ code });\n\n\t\t\texists = !!result;\n\t\t}\n\n\t\treturn code;\n\t}\n\n\t// create referral code for user\n\tpublic async createReferralCodeForUser(\n\t\tuserId: mongoose.Types.ObjectId | undefined\n\t): Promise<DocumentType<Model>> {\n\t\tif (!userId) notFoundError('User not found');\n\n\t\t// Get user details to generate code based on name\n\t\tconst user = await this.userModel.findById(userId).select('coreUser');\n\t\tif (!user) notFoundError('User not found');\n\n\t\tconst coreUser = await this.coreUserModel.findById(user.coreUser).select('name');\n\t\tconst fullName = coreUser?.name ?? 'Customer';\n\n\t\tconst existingReferralCodeCoupon = await this.model.findOne({\n\t\t\treferralUser: userId,\n\t\t});\n\n\t\tif (existingReferralCodeCoupon) {\n\t\t\treturn existingReferralCodeCoupon;\n\t\t}\n\n\t\t// const code = await this.generateCouponCode();\n\t\tconst code = await this.generateCouponCode(fullName);\n\n\t\tconst referralCodeCoupon = await this.create({\n\t\t\tcode,\n\t\t\tcouponType: CouponType.REFERRAL_CODE,\n\t\t\treferralUser: userId,\n\t\t\torderLimitPerUser: 1,\n\t\t\tisOrderLimitPerUserEnabled: true,\n\t\t});\n\n\t\tif (!referralCodeCoupon) internalServerError('Could not create referral code coupon');\n\n\t\treturn referralCodeCoupon;\n\t}\n\n\tpublic async validateCoupon(\n\t\tdata: ValidateCouponDTO,\n\t\tcoupon: DocumentType<Model>\n\t): Promise<CouponValidationOutputDTO> {\n\t\tif (data.user.toString() == coupon.referralUser.toString()) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\tmessage: 'You cannot use your own referral code',\n\t\t\t};\n\t\t}\n\n\t\tconst isNewUser = await couponHelperService.isNewUser(new mongoose.Types.ObjectId(data.user));\n\n\t\tif (!isNewUser) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\tmessage: 'This coupon is for new user only',\n\t\t\t};\n\t\t}\n\n\t\tconst referralCouponSettings = await this.getReferralSettings();\n\n\t\tconst minimumOrderAmount = referralCouponSettings.receiver?.minimumOrderValue;\n\t\tif (minimumOrderAmount && minimumOrderAmount >= data.amountBeforeCoupon) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\tmessage: `Minimum order amount ${minimumOrderAmount}$ is not met!`,\n\t\t\t};\n\t\t}\n\n\t\tlet discountAmount =\n\t\t\treferralCouponSettings.receiver?.valueType == ValueType.FIXED\n\t\t\t\t? referralCouponSettings.receiver.value\n\t\t\t\t: roundBaseCurrency((data.amountBeforeCoupon * (referralCouponSettings.receiver?.value || 1)) / 100);\n\n\t\tlet secondaryDiscountAmount =\n\t\t\treferralCouponSettings.receiver?.valueType == ValueType.FIXED\n\t\t\t\t? await convertToSecondary(referralCouponSettings.receiver.value)\n\t\t\t\t: roundSecondaryCurrency(\n\t\t\t\t\t\t(data.secondaryAmountBeforeCoupon * (referralCouponSettings.receiver?.value || 1)) / 100\n\t\t\t\t\t);\n\n\t\tif (discountAmount > data.amountBeforeCoupon) {\n\t\t\tdiscountAmount = data.amountBeforeCoupon;\n\t\t}\n\t\tif (secondaryDiscountAmount > data.secondaryAmountBeforeCoupon) {\n\t\t\tsecondaryDiscountAmount = data.secondaryAmountBeforeCoupon;\n\t\t}\n\n\t\tconst referrerName = await couponHelperService.fetchUserName(coupon.referralUser._id);\n\n\t\tconst couponRepository = new CouponRepository();\n\n\t\treturn couponHelperService.buildCouponResponse(\n\t\t\tdata,\n\t\t\tdiscountAmount,\n\t\t\tsecondaryDiscountAmount,\n\t\t\tfalse, // company pays\n\t\t\tcouponRepository.addLabelsToCoupons([\n\t\t\t\t{\n\t\t\t\t\t...coupon.toJSON(),\n\t\t\t\t\treferringUser: { name: referrerName },\n\t\t\t\t\tvalue: referralCouponSettings.receiver?.value,\n\t\t\t\t\tvalueType: referralCouponSettings.receiver?.valueType,\n\t\t\t\t\tminimumOrderValue: referralCouponSettings.receiver?.minimumOrderValue,\n\t\t\t\t\tsecondaryCurrencyValue:\n\t\t\t\t\t\treferralCouponSettings.receiver?.valueType == ValueType.FIXED\n\t\t\t\t\t\t\t? await convertToSecondary(referralCouponSettings.receiver?.value ?? 0)\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\tsecondaryCurrencyMinOrderValue: await convertToSecondary(\n\t\t\t\t\t\treferralCouponSettings.receiver?.minimumOrderValue ?? 0\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t])[0]\n\t\t);\n\t}\n\n\tpublic async getReferralCodeCoupon(\n\t\tuserId: mongoose.Types.ObjectId\n\t): Promise<ReferralCodeCouponResponseDTO> {\n\t\tlet coupon = await this.model.findOne({ referralUser: userId });\n\n\t\tif (!coupon) {\n\t\t\tcoupon = await this.createReferralCodeForUser(userId);\n\t\t}\n\t\tconst referral = coupon as unknown as Model;\n\n\t\treturn {\n\t\t\tcode: referral.code,\n\t\t\ttext: `Download Lyxa and explore the wide variety of offerings and benefits!\\nUse my code at checkout to claim a special coupon: ${referral.code}.\\nhttps://request.lyxa.ai/app/user/home/share`,\n\t\t};\n\t}\n\n\tprivate async getReferralSettings(): Promise<DocumentType<ReferralSetting>> {\n\t\tconst referralSetting = await this.settingsModel.findOne({});\n\t\tif (!referralSetting) notFoundError('Referral setting not found');\n\t\treturn referralSetting;\n\t}\n}\n\nexport const referralCodeCouponService = Container.get(ReferralCodeCouponService);\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referral-reward-coupon.service.d.ts","sourceRoot":"/","sources":["modules/coupon/services/referral-reward-coupon.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAEN,oBAAoB,IAAI,KAAK,EAU7B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACN,yBAAyB,EACzB,6BAA6B,IAAI,SAAS,EAC1C,6BAA6B,IAAI,SAAS,EAC1C,iBAAiB,EACjB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"referral-reward-coupon.service.d.ts","sourceRoot":"/","sources":["modules/coupon/services/referral-reward-coupon.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAEN,oBAAoB,IAAI,KAAK,EAU7B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACN,yBAAyB,EACzB,6BAA6B,IAAI,SAAS,EAC1C,6BAA6B,IAAI,SAAS,EAC1C,iBAAiB,EACjB,MAAM,6BAA6B,CAAC;AAQrC,qBACa,2BAA2B;IACvC,OAAO,CAAC,KAAK,CAA4D;IACzE,OAAO,CAAC,WAAW,CAA+C;IAClE,OAAO,CAAC,aAAa,CAAiE;IACtF,OAAO,CAAC,SAAS,CAA2C;IAC5D,OAAO,CAAC,UAAU,CAA2D;;IAehE,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;IAuB9E,OAAO,CAAC,YAAY;YASN,kBAAkB;IAanB,4BAA4B,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ;IAmE7D,cAAc,CAC1B,IAAI,EAAE,iBAAiB,EACvB,cAAc,EAAE,YAAY,CAAC,KAAK,CAAC,GACjC,OAAO,CAAC,yBAAyB,CAAC;YAiEvB,mBAAmB;CAUjC;AAED,eAAO,MAAM,2BAA2B,6BAA6C,CAAC"}
|
|
@@ -49,6 +49,7 @@ const models_1 = require("@lyxa.ai/core/dist/libraries/mongo/models/");
|
|
|
49
49
|
const enum_1 = require("@lyxa.ai/core/dist/utilities/enum");
|
|
50
50
|
const currency_1 = require("@lyxa.ai/core/dist/utilities/currency");
|
|
51
51
|
const shared_1 = require("@lyxa.ai/core/dist/utilities/shared");
|
|
52
|
+
const core_1 = require("@lyxa.ai/core");
|
|
52
53
|
let ReferralRewardCouponService = class ReferralRewardCouponService {
|
|
53
54
|
model;
|
|
54
55
|
couponModel;
|
|
@@ -141,6 +142,9 @@ let ReferralRewardCouponService = class ReferralRewardCouponService {
|
|
|
141
142
|
isTotalOrderLimitEnabled: true,
|
|
142
143
|
});
|
|
143
144
|
await this.userModel.findByIdAndUpdate(user, { $push: { coupons: referralRewardCoupon._id } }, { new: true, runValidators: true });
|
|
145
|
+
const dispatcher = (0, core_1.getLibraries)().getMicroServiceDispatcher();
|
|
146
|
+
const notificationRouter = await dispatcher.getMicroService('notification');
|
|
147
|
+
await notificationRouter.notificationRouter.sendPushNotificationForCoupon.mutate(referralRewardCoupon._id);
|
|
144
148
|
}
|
|
145
149
|
async validateCoupon(data, couponDocument) {
|
|
146
150
|
if (couponDocument.isMinOrderValueEnabled &&
|
|
@@ -148,7 +152,7 @@ let ReferralRewardCouponService = class ReferralRewardCouponService {
|
|
|
148
152
|
couponDocument.minOrderValue > data.amountBeforeCoupon) {
|
|
149
153
|
return {
|
|
150
154
|
isValid: false,
|
|
151
|
-
message:
|
|
155
|
+
message: `Minimum order amount ${couponDocument.minOrderValue}$ is not met!`,
|
|
152
156
|
};
|
|
153
157
|
}
|
|
154
158
|
if (couponDocument.user._id.toString() != data.user?.toString()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referral-reward-coupon.service.js","sourceRoot":"/","sources":["modules/coupon/services/referral-reward-coupon.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { TRPCError } from '@trpc/server';\nimport { DocumentType, mongoose } from '@typegoose/typegoose';\nimport {\n\tReferralRewardCouponModel,\n\tReferralRewardCoupon as Model,\n\tReferralSetting,\n\tReferralSettingModel,\n\tRegularOrder,\n\tUser,\n\tUserModel,\n\tRegularOrderModel,\n\tCouponModel,\n\tCoupon,\n\tReferralCodeCoupon,\n} from '@lyxa.ai/core/dist/libraries/mongo/models/';\nimport {\n\tCouponValidationOutputDTO,\n\tCreateReferralRewardCouponDTO as CreateDTO,\n\tUpdateReferralRewardCouponDTO as UpdateDTO,\n\tValidateCouponDTO,\n} from '@modules/coupon/validations';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { CouponType, Status, ValueType } from '@lyxa.ai/core/dist/utilities/enum';\nimport { convertToSecondary } from '@lyxa.ai/core/dist/utilities/currency';\nimport { roundBaseCurrency, roundSecondaryCurrency } from '@lyxa.ai/core/dist/utilities/shared';\n\n@Service()\nexport class ReferralRewardCouponService {\n\tprivate model: typeof ReferralRewardCouponModel & SoftDeleteModel<Model>;\n\tprivate couponModel: typeof CouponModel & SoftDeleteModel<Coupon>;\n\tprivate settingsModel: typeof ReferralSettingModel & SoftDeleteModel<ReferralSetting>;\n\tprivate userModel: typeof UserModel & SoftDeleteModel<User>;\n\tprivate orderModel: typeof RegularOrderModel & SoftDeleteModel<RegularOrder>;\n\n\tconstructor() {\n\t\tthis.model = ReferralRewardCouponModel as typeof ReferralRewardCouponModel & SoftDeleteModel<Model>;\n\t\tthis.couponModel = CouponModel as typeof CouponModel & SoftDeleteModel<Coupon>;\n\t\tthis.settingsModel = ReferralSettingModel as typeof ReferralSettingModel &\n\t\t\tSoftDeleteModel<ReferralSetting>;\n\t\tthis.userModel = UserModel as typeof UserModel & SoftDeleteModel<User>;\n\t\tthis.orderModel = RegularOrderModel as typeof RegularOrderModel & SoftDeleteModel<RegularOrder>;\n\t}\n\n\t/**\n\t * Create a new record\n\t * @param data Data for the new record\n\t */\n\tpublic async create(data: CreateDTO): Promise<DocumentType<Model>> {\n\t\treturn await this.model.create(data);\n\t}\n\n\t/**\n\t * Update record\n\t * @param id ID of the record\n\t * @param data Data to update\n\t */\n\tpublic async update(id: string, data: UpdateDTO): Promise<DocumentType<Model>> {\n\t\tconst record = await this.model.findOneAndUpdate(\n\t\t\t{\n\t\t\t\t_id: id,\n\t\t\t\tdeletedAt: null,\n\t\t\t},\n\t\t\tdata,\n\t\t\t{\n\t\t\t\tnew: true,\n\t\t\t\trunValidators: true,\n\t\t\t}\n\t\t);\n\n\t\tif (!record) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: `Record not found`,\n\t\t\t});\n\t\t}\n\n\t\treturn record;\n\t}\n\n\tprivate generateCode(length = 6): string {\n\t\tconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n\t\tlet result = '';\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tresult += chars.charAt(Math.floor(Math.random() * chars.length));\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate async generateCouponCode(): Promise<string> {\n\t\tlet code: string = 'SAMPLE';\n\t\tlet exists = true;\n\n\t\twhile (exists) {\n\t\t\tcode = this.generateCode();\n\t\t\texists = (await this.model.exists({ code: code })) ? true : false;\n\t\t}\n\n\t\treturn code;\n\t}\n\n\t// give referral reward to user\n\tpublic async giveReferralRewardToReferrer(orderId: mongoose.Types.ObjectId) {\n\t\tconst order = (await this.orderModel.findById(orderId)) as DocumentType<RegularOrder>;\n\n\t\tif (!order) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!order.adjustedFinance?.coupon?.coupon?._id) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst orderCoupon = await this.couponModel.findById(order.adjustedFinance?.coupon?.coupon?._id);\n\n\t\tif (!orderCoupon || orderCoupon.couponType !== CouponType.REFERRAL_CODE) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst user = (orderCoupon as DocumentType<ReferralCodeCoupon>).referralUser;\n\n\t\tconst referralCouponSettings = await this.getReferralSettings();\n\n\t\tif (!referralCouponSettings.sender) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst referralRewardCoupon = await this.create({\n\t\t\tcode: await this.generateCouponCode(),\n\t\t\tstatus: Status.ACTIVE,\n\t\t\tcouponType: CouponType.REFERRAL_REWARD,\n\t\t\tduration: {\n\t\t\t\tstart: new Date(),\n\t\t\t},\n\t\t\tforNewUserOnly: false,\n\t\t\tuser: user._id,\n\t\t\tminOrderValue: referralCouponSettings.sender?.minimumOrderValue ?? null,\n\t\t\tvalue: referralCouponSettings.sender?.value,\n\t\t\tvalueType: referralCouponSettings.sender?.valueType,\n\t\t\treferralCodeUsedBy: order.user as mongoose.Types.ObjectId,\n\t\t\treferralCodeUsedOnOrder: order._id,\n\t\t\texpirationReason: null,\n\t\t\tmaxDiscountLimit: null,\n\t\t\torderLimitPerUser: 1,\n\t\t\tspendLimit: null,\n\t\t\ttotalOrderLimit: 1,\n\t\t\tisMinOrderValueEnabled: !!referralCouponSettings.sender?.minimumOrderValue,\n\t\t\tisMaxDiscountLimitEnabled: false,\n\t\t\tisOrderLimitPerUserEnabled: true,\n\t\t\tisSpendLimitEnabled: false,\n\t\t\tisTotalOrderLimitEnabled: true,\n\t\t});\n\n\t\tawait this.userModel.findByIdAndUpdate(\n\t\t\tuser,\n\t\t\t{ $push: { coupons: referralRewardCoupon._id } },\n\t\t\t{ new: true, runValidators: true }\n\t\t);\n\t}\n\n\tpublic async validateCoupon(\n\t\tdata: ValidateCouponDTO,\n\t\tcouponDocument: DocumentType<Model>\n\t): Promise<CouponValidationOutputDTO> {\n\t\tif (\n\t\t\tcouponDocument.isMinOrderValueEnabled &&\n\t\t\tcouponDocument.minOrderValue &&\n\t\t\tcouponDocument.minOrderValue > data.amountBeforeCoupon\n\t\t) {\n\t\t\t// throw new TRPCError({\n\t\t\t// \tcode: 'BAD_REQUEST',\n\t\t\t// \tmessage: 'Amount is lower than the minimum order amount',\n\t\t\t// });\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\tmessage: 'Minimum order amount not met',\n\t\t\t};\n\t\t}\n\n\t\tif (couponDocument.user._id.toString() != data.user?.toString()) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\tmessage: 'This reward is not for you',\n\t\t\t};\n\t\t}\n\n\t\tlet discountAmount =\n\t\t\tcouponDocument.valueType == ValueType.FIXED\n\t\t\t\t? couponDocument.value\n\t\t\t\t: roundBaseCurrency((data.amountBeforeCoupon * couponDocument.value) / 100);\n\n\t\tlet secondaryDiscountAmount =\n\t\t\tcouponDocument.valueType == ValueType.FIXED\n\t\t\t\t? await convertToSecondary(couponDocument.value)\n\t\t\t\t: roundSecondaryCurrency((data.secondaryAmountBeforeCoupon * couponDocument.value) / 100);\n\n\t\tif (couponDocument.isMaxDiscountLimitEnabled && couponDocument.maxDiscountLimit) {\n\t\t\tdiscountAmount = Math.min(discountAmount, couponDocument.maxDiscountLimit);\n\t\t\tsecondaryDiscountAmount = Math.min(\n\t\t\t\tsecondaryDiscountAmount,\n\t\t\t\tawait convertToSecondary(couponDocument.maxDiscountLimit)\n\t\t\t);\n\t\t}\n\n\t\tif (discountAmount > data.amountBeforeCoupon) {\n\t\t\tdiscountAmount = data.amountBeforeCoupon;\n\t\t}\n\t\tif (secondaryDiscountAmount > data.secondaryAmountBeforeCoupon) {\n\t\t\tsecondaryDiscountAmount = data.secondaryAmountBeforeCoupon;\n\t\t}\n\n\t\treturn {\n\t\t\tisValid: true,\n\t\t\tdiscountAmount,\n\t\t\tsecondaryDiscountAmount,\n\t\t\tamountAfterCoupon: roundBaseCurrency(data.amountBeforeCoupon - discountAmount),\n\t\t\tsecondaryAmountAfterCoupon: roundSecondaryCurrency(\n\t\t\t\tdata.secondaryAmountBeforeCoupon - secondaryDiscountAmount\n\t\t\t),\n\t\t\tdiscountCut: {\n\t\t\t\tcompanyCut: discountAmount,\n\t\t\t\tsecondaryCompanyCut: secondaryDiscountAmount,\n\t\t\t\tshopCut: 0,\n\t\t\t\tsecondaryShopCut: 0,\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate async getReferralSettings(): Promise<DocumentType<ReferralSetting>> {\n\t\tconst referralSetting = await this.settingsModel.findOne({});\n\t\tif (!referralSetting) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Referral setting not found',\n\t\t\t});\n\t\t}\n\t\treturn referralSetting;\n\t}\n}\n\nexport const referralRewardCouponService = Container.get(ReferralRewardCouponService);\n"]}
|
|
1
|
+
{"version":3,"file":"referral-reward-coupon.service.js","sourceRoot":"/","sources":["modules/coupon/services/referral-reward-coupon.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { TRPCError } from '@trpc/server';\nimport { DocumentType, mongoose } from '@typegoose/typegoose';\nimport {\n\tReferralRewardCouponModel,\n\tReferralRewardCoupon as Model,\n\tReferralSetting,\n\tReferralSettingModel,\n\tRegularOrder,\n\tUser,\n\tUserModel,\n\tRegularOrderModel,\n\tCouponModel,\n\tCoupon,\n\tReferralCodeCoupon,\n} from '@lyxa.ai/core/dist/libraries/mongo/models/';\nimport {\n\tCouponValidationOutputDTO,\n\tCreateReferralRewardCouponDTO as CreateDTO,\n\tUpdateReferralRewardCouponDTO as UpdateDTO,\n\tValidateCouponDTO,\n} from '@modules/coupon/validations';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { CouponType, Status, ValueType } from '@lyxa.ai/core/dist/utilities/enum';\nimport { convertToSecondary } from '@lyxa.ai/core/dist/utilities/currency';\nimport { roundBaseCurrency, roundSecondaryCurrency } from '@lyxa.ai/core/dist/utilities/shared';\nimport { getLibraries } from '@lyxa.ai/core';\nimport { NotificationMicroserviceRouter } from '@lyxa.ai/notification';\n\n@Service()\nexport class ReferralRewardCouponService {\n\tprivate model: typeof ReferralRewardCouponModel & SoftDeleteModel<Model>;\n\tprivate couponModel: typeof CouponModel & SoftDeleteModel<Coupon>;\n\tprivate settingsModel: typeof ReferralSettingModel & SoftDeleteModel<ReferralSetting>;\n\tprivate userModel: typeof UserModel & SoftDeleteModel<User>;\n\tprivate orderModel: typeof RegularOrderModel & SoftDeleteModel<RegularOrder>;\n\n\tconstructor() {\n\t\tthis.model = ReferralRewardCouponModel as typeof ReferralRewardCouponModel & SoftDeleteModel<Model>;\n\t\tthis.couponModel = CouponModel as typeof CouponModel & SoftDeleteModel<Coupon>;\n\t\tthis.settingsModel = ReferralSettingModel as typeof ReferralSettingModel &\n\t\t\tSoftDeleteModel<ReferralSetting>;\n\t\tthis.userModel = UserModel as typeof UserModel & SoftDeleteModel<User>;\n\t\tthis.orderModel = RegularOrderModel as typeof RegularOrderModel & SoftDeleteModel<RegularOrder>;\n\t}\n\n\t/**\n\t * Create a new record\n\t * @param data Data for the new record\n\t */\n\tpublic async create(data: CreateDTO): Promise<DocumentType<Model>> {\n\t\treturn await this.model.create(data);\n\t}\n\n\t/**\n\t * Update record\n\t * @param id ID of the record\n\t * @param data Data to update\n\t */\n\tpublic async update(id: string, data: UpdateDTO): Promise<DocumentType<Model>> {\n\t\tconst record = await this.model.findOneAndUpdate(\n\t\t\t{\n\t\t\t\t_id: id,\n\t\t\t\tdeletedAt: null,\n\t\t\t},\n\t\t\tdata,\n\t\t\t{\n\t\t\t\tnew: true,\n\t\t\t\trunValidators: true,\n\t\t\t}\n\t\t);\n\n\t\tif (!record) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: `Record not found`,\n\t\t\t});\n\t\t}\n\n\t\treturn record;\n\t}\n\n\tprivate generateCode(length = 6): string {\n\t\tconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n\t\tlet result = '';\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tresult += chars.charAt(Math.floor(Math.random() * chars.length));\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate async generateCouponCode(): Promise<string> {\n\t\tlet code: string = 'SAMPLE';\n\t\tlet exists = true;\n\n\t\twhile (exists) {\n\t\t\tcode = this.generateCode();\n\t\t\texists = (await this.model.exists({ code: code })) ? true : false;\n\t\t}\n\n\t\treturn code;\n\t}\n\n\t// give referral reward to user\n\tpublic async giveReferralRewardToReferrer(orderId: mongoose.Types.ObjectId) {\n\t\tconst order = (await this.orderModel.findById(orderId)) as DocumentType<RegularOrder>;\n\n\t\tif (!order) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!order.adjustedFinance?.coupon?.coupon?._id) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst orderCoupon = await this.couponModel.findById(order.adjustedFinance?.coupon?.coupon?._id);\n\n\t\tif (!orderCoupon || orderCoupon.couponType !== CouponType.REFERRAL_CODE) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst user = (orderCoupon as DocumentType<ReferralCodeCoupon>).referralUser;\n\n\t\tconst referralCouponSettings = await this.getReferralSettings();\n\n\t\tif (!referralCouponSettings.sender) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst referralRewardCoupon = await this.create({\n\t\t\tcode: await this.generateCouponCode(),\n\t\t\tstatus: Status.ACTIVE,\n\t\t\tcouponType: CouponType.REFERRAL_REWARD,\n\t\t\tduration: {\n\t\t\t\tstart: new Date(),\n\t\t\t},\n\t\t\tforNewUserOnly: false,\n\t\t\tuser: user._id,\n\t\t\tminOrderValue: referralCouponSettings.sender?.minimumOrderValue ?? null,\n\t\t\tvalue: referralCouponSettings.sender?.value,\n\t\t\tvalueType: referralCouponSettings.sender?.valueType,\n\t\t\treferralCodeUsedBy: order.user as mongoose.Types.ObjectId,\n\t\t\treferralCodeUsedOnOrder: order._id,\n\t\t\texpirationReason: null,\n\t\t\tmaxDiscountLimit: null,\n\t\t\torderLimitPerUser: 1,\n\t\t\tspendLimit: null,\n\t\t\ttotalOrderLimit: 1,\n\t\t\tisMinOrderValueEnabled: !!referralCouponSettings.sender?.minimumOrderValue,\n\t\t\tisMaxDiscountLimitEnabled: false,\n\t\t\tisOrderLimitPerUserEnabled: true,\n\t\t\tisSpendLimitEnabled: false,\n\t\t\tisTotalOrderLimitEnabled: true,\n\t\t});\n\n\t\tawait this.userModel.findByIdAndUpdate(\n\t\t\tuser,\n\t\t\t{ $push: { coupons: referralRewardCoupon._id } },\n\t\t\t{ new: true, runValidators: true }\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(\n\t\t\treferralRewardCoupon._id\n\t\t);\n\t}\n\n\tpublic async validateCoupon(\n\t\tdata: ValidateCouponDTO,\n\t\tcouponDocument: DocumentType<Model>\n\t): Promise<CouponValidationOutputDTO> {\n\t\tif (\n\t\t\tcouponDocument.isMinOrderValueEnabled &&\n\t\t\tcouponDocument.minOrderValue &&\n\t\t\tcouponDocument.minOrderValue > data.amountBeforeCoupon\n\t\t) {\n\t\t\t// throw new TRPCError({\n\t\t\t// \tcode: 'BAD_REQUEST',\n\t\t\t// \tmessage: 'Amount is lower than the minimum order amount',\n\t\t\t// });\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\tmessage: `Minimum order amount ${couponDocument.minOrderValue}$ is not met!`,\n\t\t\t};\n\t\t}\n\n\t\tif (couponDocument.user._id.toString() != data.user?.toString()) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\tmessage: 'This reward is not for you',\n\t\t\t};\n\t\t}\n\n\t\tlet discountAmount =\n\t\t\tcouponDocument.valueType == ValueType.FIXED\n\t\t\t\t? couponDocument.value\n\t\t\t\t: roundBaseCurrency((data.amountBeforeCoupon * couponDocument.value) / 100);\n\n\t\tlet secondaryDiscountAmount =\n\t\t\tcouponDocument.valueType == ValueType.FIXED\n\t\t\t\t? await convertToSecondary(couponDocument.value)\n\t\t\t\t: roundSecondaryCurrency((data.secondaryAmountBeforeCoupon * couponDocument.value) / 100);\n\n\t\tif (couponDocument.isMaxDiscountLimitEnabled && couponDocument.maxDiscountLimit) {\n\t\t\tdiscountAmount = Math.min(discountAmount, couponDocument.maxDiscountLimit);\n\t\t\tsecondaryDiscountAmount = Math.min(\n\t\t\t\tsecondaryDiscountAmount,\n\t\t\t\tawait convertToSecondary(couponDocument.maxDiscountLimit)\n\t\t\t);\n\t\t}\n\n\t\tif (discountAmount > data.amountBeforeCoupon) {\n\t\t\tdiscountAmount = data.amountBeforeCoupon;\n\t\t}\n\t\tif (secondaryDiscountAmount > data.secondaryAmountBeforeCoupon) {\n\t\t\tsecondaryDiscountAmount = data.secondaryAmountBeforeCoupon;\n\t\t}\n\n\t\treturn {\n\t\t\tisValid: true,\n\t\t\tdiscountAmount,\n\t\t\tsecondaryDiscountAmount,\n\t\t\tamountAfterCoupon: roundBaseCurrency(data.amountBeforeCoupon - discountAmount),\n\t\t\tsecondaryAmountAfterCoupon: roundSecondaryCurrency(\n\t\t\t\tdata.secondaryAmountBeforeCoupon - secondaryDiscountAmount\n\t\t\t),\n\t\t\tdiscountCut: {\n\t\t\t\tcompanyCut: discountAmount,\n\t\t\t\tsecondaryCompanyCut: secondaryDiscountAmount,\n\t\t\t\tshopCut: 0,\n\t\t\t\tsecondaryShopCut: 0,\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate async getReferralSettings(): Promise<DocumentType<ReferralSetting>> {\n\t\tconst referralSetting = await this.settingsModel.findOne({});\n\t\tif (!referralSetting) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Referral setting not found',\n\t\t\t});\n\t\t}\n\t\treturn referralSetting;\n\t}\n}\n\nexport const referralRewardCouponService = Container.get(ReferralRewardCouponService);\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deal-setting.router.d.ts","sourceRoot":"/","sources":["modules/deal-setting/routers/deal-setting.router.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"deal-setting.router.d.ts","sourceRoot":"/","sources":["modules/deal-setting/routers/deal-setting.router.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAkBqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4ClD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featured-setting.router.d.ts","sourceRoot":"/","sources":["modules/featured-setting/routers/featured-setting.router.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"featured-setting.router.d.ts","sourceRoot":"/","sources":["modules/featured-setting/routers/featured-setting.router.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAkBE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCnC,CAAC"}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
export declare const campaignRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
2
|
+
ctx: import("@lyxa.ai/core/dist/libraries/trpc/context").LyxaHTTPContext;
|
|
3
|
+
meta: object;
|
|
4
|
+
errorShape: {
|
|
5
|
+
message: string;
|
|
6
|
+
data: {
|
|
7
|
+
stack: undefined;
|
|
8
|
+
path: undefined;
|
|
9
|
+
code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
|
|
10
|
+
httpStatus: number;
|
|
11
|
+
};
|
|
12
|
+
stack: undefined;
|
|
13
|
+
code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
|
|
14
|
+
};
|
|
15
|
+
transformer: false;
|
|
16
|
+
}, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
|
|
17
|
+
create: import("@trpc/server").TRPCMutationProcedure<{
|
|
18
|
+
input: {
|
|
19
|
+
startDate: string | Date;
|
|
20
|
+
endDate: string | Date;
|
|
21
|
+
title?: string | undefined;
|
|
22
|
+
subTitle?: string | undefined;
|
|
23
|
+
};
|
|
24
|
+
output: {
|
|
25
|
+
message: string;
|
|
26
|
+
success: boolean;
|
|
27
|
+
data?: {
|
|
28
|
+
status: import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus;
|
|
29
|
+
_id: string | import("mongoose").Types.ObjectId;
|
|
30
|
+
campaignNumber: number;
|
|
31
|
+
createdAt?: Date | null | undefined;
|
|
32
|
+
updatedAt?: Date | null | undefined;
|
|
33
|
+
title?: string | undefined;
|
|
34
|
+
startDate?: Date | null | undefined;
|
|
35
|
+
endDate?: Date | null | undefined;
|
|
36
|
+
subTitle?: string | undefined;
|
|
37
|
+
archivedAt?: Date | null | undefined;
|
|
38
|
+
discountOptions?: number[] | undefined;
|
|
39
|
+
maxDiscountCaps?: number[] | undefined;
|
|
40
|
+
} | {
|
|
41
|
+
documents: {
|
|
42
|
+
status: import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus;
|
|
43
|
+
_id: string | import("mongoose").Types.ObjectId;
|
|
44
|
+
campaignNumber: number;
|
|
45
|
+
createdAt?: Date | null | undefined;
|
|
46
|
+
updatedAt?: Date | null | undefined;
|
|
47
|
+
title?: string | undefined;
|
|
48
|
+
startDate?: Date | null | undefined;
|
|
49
|
+
endDate?: Date | null | undefined;
|
|
50
|
+
subTitle?: string | undefined;
|
|
51
|
+
archivedAt?: Date | null | undefined;
|
|
52
|
+
discountOptions?: number[] | undefined;
|
|
53
|
+
maxDiscountCaps?: number[] | undefined;
|
|
54
|
+
}[];
|
|
55
|
+
metadata?: {
|
|
56
|
+
page: number;
|
|
57
|
+
size: number;
|
|
58
|
+
totalElements: number;
|
|
59
|
+
totalPages: number;
|
|
60
|
+
} | undefined;
|
|
61
|
+
} | undefined;
|
|
62
|
+
};
|
|
63
|
+
meta: object;
|
|
64
|
+
}>;
|
|
65
|
+
getCurrent: import("@trpc/server").TRPCQueryProcedure<{
|
|
66
|
+
input: void;
|
|
67
|
+
output: {
|
|
68
|
+
message: string;
|
|
69
|
+
success: boolean;
|
|
70
|
+
data?: {
|
|
71
|
+
status: import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus;
|
|
72
|
+
_id: string | import("mongoose").Types.ObjectId;
|
|
73
|
+
campaignNumber: number;
|
|
74
|
+
createdAt?: Date | null | undefined;
|
|
75
|
+
updatedAt?: Date | null | undefined;
|
|
76
|
+
title?: string | undefined;
|
|
77
|
+
startDate?: Date | null | undefined;
|
|
78
|
+
endDate?: Date | null | undefined;
|
|
79
|
+
subTitle?: string | undefined;
|
|
80
|
+
archivedAt?: Date | null | undefined;
|
|
81
|
+
discountOptions?: number[] | undefined;
|
|
82
|
+
maxDiscountCaps?: number[] | undefined;
|
|
83
|
+
} | {
|
|
84
|
+
documents: ({
|
|
85
|
+
status: import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus;
|
|
86
|
+
_id: string | import("mongoose").Types.ObjectId;
|
|
87
|
+
campaignNumber: number;
|
|
88
|
+
createdAt?: Date | null | undefined;
|
|
89
|
+
updatedAt?: Date | null | undefined;
|
|
90
|
+
title?: string | undefined;
|
|
91
|
+
startDate?: Date | null | undefined;
|
|
92
|
+
endDate?: Date | null | undefined;
|
|
93
|
+
subTitle?: string | undefined;
|
|
94
|
+
archivedAt?: Date | null | undefined;
|
|
95
|
+
discountOptions?: number[] | undefined;
|
|
96
|
+
maxDiscountCaps?: number[] | undefined;
|
|
97
|
+
} | null)[];
|
|
98
|
+
metadata?: {
|
|
99
|
+
page: number;
|
|
100
|
+
size: number;
|
|
101
|
+
totalElements: number;
|
|
102
|
+
totalPages: number;
|
|
103
|
+
} | undefined;
|
|
104
|
+
} | null | undefined;
|
|
105
|
+
};
|
|
106
|
+
meta: object;
|
|
107
|
+
}>;
|
|
108
|
+
getActiveForShop: import("@trpc/server").TRPCQueryProcedure<{
|
|
109
|
+
input: void;
|
|
110
|
+
output: {
|
|
111
|
+
message: string;
|
|
112
|
+
success: boolean;
|
|
113
|
+
data?: {
|
|
114
|
+
status: import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus;
|
|
115
|
+
_id: string | import("mongoose").Types.ObjectId;
|
|
116
|
+
campaignNumber: number;
|
|
117
|
+
createdAt?: Date | null | undefined;
|
|
118
|
+
updatedAt?: Date | null | undefined;
|
|
119
|
+
title?: string | undefined;
|
|
120
|
+
startDate?: Date | null | undefined;
|
|
121
|
+
endDate?: Date | null | undefined;
|
|
122
|
+
subTitle?: string | undefined;
|
|
123
|
+
archivedAt?: Date | null | undefined;
|
|
124
|
+
discountOptions?: number[] | undefined;
|
|
125
|
+
maxDiscountCaps?: number[] | undefined;
|
|
126
|
+
} | {
|
|
127
|
+
documents: ({
|
|
128
|
+
status: import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus;
|
|
129
|
+
_id: string | import("mongoose").Types.ObjectId;
|
|
130
|
+
campaignNumber: number;
|
|
131
|
+
createdAt?: Date | null | undefined;
|
|
132
|
+
updatedAt?: Date | null | undefined;
|
|
133
|
+
title?: string | undefined;
|
|
134
|
+
startDate?: Date | null | undefined;
|
|
135
|
+
endDate?: Date | null | undefined;
|
|
136
|
+
subTitle?: string | undefined;
|
|
137
|
+
archivedAt?: Date | null | undefined;
|
|
138
|
+
discountOptions?: number[] | undefined;
|
|
139
|
+
maxDiscountCaps?: number[] | undefined;
|
|
140
|
+
} | null)[];
|
|
141
|
+
metadata?: {
|
|
142
|
+
page: number;
|
|
143
|
+
size: number;
|
|
144
|
+
totalElements: number;
|
|
145
|
+
totalPages: number;
|
|
146
|
+
} | undefined;
|
|
147
|
+
} | null | undefined;
|
|
148
|
+
};
|
|
149
|
+
meta: object;
|
|
150
|
+
}>;
|
|
151
|
+
getActiveForUser: import("@trpc/server").TRPCQueryProcedure<{
|
|
152
|
+
input: void;
|
|
153
|
+
output: {
|
|
154
|
+
message: string;
|
|
155
|
+
success: boolean;
|
|
156
|
+
data?: {
|
|
157
|
+
status: import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus;
|
|
158
|
+
_id: string | import("mongoose").Types.ObjectId;
|
|
159
|
+
campaignNumber: number;
|
|
160
|
+
createdAt?: Date | null | undefined;
|
|
161
|
+
updatedAt?: Date | null | undefined;
|
|
162
|
+
title?: string | undefined;
|
|
163
|
+
startDate?: Date | null | undefined;
|
|
164
|
+
endDate?: Date | null | undefined;
|
|
165
|
+
subTitle?: string | undefined;
|
|
166
|
+
archivedAt?: Date | null | undefined;
|
|
167
|
+
discountOptions?: number[] | undefined;
|
|
168
|
+
maxDiscountCaps?: number[] | undefined;
|
|
169
|
+
} | {
|
|
170
|
+
documents: ({
|
|
171
|
+
status: import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus;
|
|
172
|
+
_id: string | import("mongoose").Types.ObjectId;
|
|
173
|
+
campaignNumber: number;
|
|
174
|
+
createdAt?: Date | null | undefined;
|
|
175
|
+
updatedAt?: Date | null | undefined;
|
|
176
|
+
title?: string | undefined;
|
|
177
|
+
startDate?: Date | null | undefined;
|
|
178
|
+
endDate?: Date | null | undefined;
|
|
179
|
+
subTitle?: string | undefined;
|
|
180
|
+
archivedAt?: Date | null | undefined;
|
|
181
|
+
discountOptions?: number[] | undefined;
|
|
182
|
+
maxDiscountCaps?: number[] | undefined;
|
|
183
|
+
} | null)[];
|
|
184
|
+
metadata?: {
|
|
185
|
+
page: number;
|
|
186
|
+
size: number;
|
|
187
|
+
totalElements: number;
|
|
188
|
+
totalPages: number;
|
|
189
|
+
} | undefined;
|
|
190
|
+
} | null | undefined;
|
|
191
|
+
};
|
|
192
|
+
meta: object;
|
|
193
|
+
}>;
|
|
194
|
+
getById: import("@trpc/server").TRPCQueryProcedure<{
|
|
195
|
+
input: {
|
|
196
|
+
campaignId: string | import("mongoose").Types.ObjectId;
|
|
197
|
+
};
|
|
198
|
+
output: {
|
|
199
|
+
message: string;
|
|
200
|
+
success: boolean;
|
|
201
|
+
data?: {
|
|
202
|
+
status: import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus;
|
|
203
|
+
_id: string | import("mongoose").Types.ObjectId;
|
|
204
|
+
campaignNumber: number;
|
|
205
|
+
createdAt?: Date | null | undefined;
|
|
206
|
+
updatedAt?: Date | null | undefined;
|
|
207
|
+
title?: string | undefined;
|
|
208
|
+
startDate?: Date | null | undefined;
|
|
209
|
+
endDate?: Date | null | undefined;
|
|
210
|
+
subTitle?: string | undefined;
|
|
211
|
+
archivedAt?: Date | null | undefined;
|
|
212
|
+
discountOptions?: number[] | undefined;
|
|
213
|
+
maxDiscountCaps?: number[] | undefined;
|
|
214
|
+
} | {
|
|
215
|
+
documents: {
|
|
216
|
+
status: import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus;
|
|
217
|
+
_id: string | import("mongoose").Types.ObjectId;
|
|
218
|
+
campaignNumber: number;
|
|
219
|
+
createdAt?: Date | null | undefined;
|
|
220
|
+
updatedAt?: Date | null | undefined;
|
|
221
|
+
title?: string | undefined;
|
|
222
|
+
startDate?: Date | null | undefined;
|
|
223
|
+
endDate?: Date | null | undefined;
|
|
224
|
+
subTitle?: string | undefined;
|
|
225
|
+
archivedAt?: Date | null | undefined;
|
|
226
|
+
discountOptions?: number[] | undefined;
|
|
227
|
+
maxDiscountCaps?: number[] | undefined;
|
|
228
|
+
}[];
|
|
229
|
+
metadata?: {
|
|
230
|
+
page: number;
|
|
231
|
+
size: number;
|
|
232
|
+
totalElements: number;
|
|
233
|
+
totalPages: number;
|
|
234
|
+
} | undefined;
|
|
235
|
+
} | undefined;
|
|
236
|
+
};
|
|
237
|
+
meta: object;
|
|
238
|
+
}>;
|
|
239
|
+
getHistory: import("@trpc/server").TRPCQueryProcedure<{
|
|
240
|
+
input: {
|
|
241
|
+
status?: import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus.EXPIRED | import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus.CANCELLED | undefined;
|
|
242
|
+
page?: number | undefined;
|
|
243
|
+
size?: number | undefined;
|
|
244
|
+
sortBy?: "status" | "id" | "campaignNumber" | "startDateTime" | "endDateTime" | "shopsJoined" | undefined;
|
|
245
|
+
sortOrder?: "asc" | "desc" | undefined;
|
|
246
|
+
};
|
|
247
|
+
output: {
|
|
248
|
+
message: string;
|
|
249
|
+
success: boolean;
|
|
250
|
+
data?: {
|
|
251
|
+
status: import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus;
|
|
252
|
+
id: string;
|
|
253
|
+
campaignNumber: number;
|
|
254
|
+
shopsJoined: number;
|
|
255
|
+
startDateTime?: Date | null | undefined;
|
|
256
|
+
endDateTime?: Date | null | undefined;
|
|
257
|
+
} | {
|
|
258
|
+
documents: {
|
|
259
|
+
status: import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus;
|
|
260
|
+
id: string;
|
|
261
|
+
campaignNumber: number;
|
|
262
|
+
shopsJoined: number;
|
|
263
|
+
startDateTime?: Date | null | undefined;
|
|
264
|
+
endDateTime?: Date | null | undefined;
|
|
265
|
+
}[];
|
|
266
|
+
metadata?: {
|
|
267
|
+
page: number;
|
|
268
|
+
size: number;
|
|
269
|
+
totalElements: number;
|
|
270
|
+
totalPages: number;
|
|
271
|
+
} | undefined;
|
|
272
|
+
} | undefined;
|
|
273
|
+
};
|
|
274
|
+
meta: object;
|
|
275
|
+
}>;
|
|
276
|
+
update: import("@trpc/server").TRPCMutationProcedure<{
|
|
277
|
+
input: {
|
|
278
|
+
_id: string | import("mongoose").Types.ObjectId;
|
|
279
|
+
startDate: string | Date;
|
|
280
|
+
endDate: string | Date;
|
|
281
|
+
title?: string | undefined;
|
|
282
|
+
subTitle?: string | undefined;
|
|
283
|
+
discountOptions?: number[] | undefined;
|
|
284
|
+
maxDiscountCaps?: number[] | undefined;
|
|
285
|
+
confirmActive?: boolean | undefined;
|
|
286
|
+
};
|
|
287
|
+
output: {
|
|
288
|
+
message: string;
|
|
289
|
+
success: boolean;
|
|
290
|
+
data?: {
|
|
291
|
+
status: import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus;
|
|
292
|
+
_id: string | import("mongoose").Types.ObjectId;
|
|
293
|
+
campaignNumber: number;
|
|
294
|
+
createdAt?: Date | null | undefined;
|
|
295
|
+
updatedAt?: Date | null | undefined;
|
|
296
|
+
title?: string | undefined;
|
|
297
|
+
startDate?: Date | null | undefined;
|
|
298
|
+
endDate?: Date | null | undefined;
|
|
299
|
+
subTitle?: string | undefined;
|
|
300
|
+
archivedAt?: Date | null | undefined;
|
|
301
|
+
discountOptions?: number[] | undefined;
|
|
302
|
+
maxDiscountCaps?: number[] | undefined;
|
|
303
|
+
} | {
|
|
304
|
+
documents: {
|
|
305
|
+
status: import("@lyxa.ai/core/dist/utilities/enum").LimitedTimeOfferCampaignStatus;
|
|
306
|
+
_id: string | import("mongoose").Types.ObjectId;
|
|
307
|
+
campaignNumber: number;
|
|
308
|
+
createdAt?: Date | null | undefined;
|
|
309
|
+
updatedAt?: Date | null | undefined;
|
|
310
|
+
title?: string | undefined;
|
|
311
|
+
startDate?: Date | null | undefined;
|
|
312
|
+
endDate?: Date | null | undefined;
|
|
313
|
+
subTitle?: string | undefined;
|
|
314
|
+
archivedAt?: Date | null | undefined;
|
|
315
|
+
discountOptions?: number[] | undefined;
|
|
316
|
+
maxDiscountCaps?: number[] | undefined;
|
|
317
|
+
}[];
|
|
318
|
+
metadata?: {
|
|
319
|
+
page: number;
|
|
320
|
+
size: number;
|
|
321
|
+
totalElements: number;
|
|
322
|
+
totalPages: number;
|
|
323
|
+
} | undefined;
|
|
324
|
+
} | undefined;
|
|
325
|
+
};
|
|
326
|
+
meta: object;
|
|
327
|
+
}>;
|
|
328
|
+
cancel: import("@trpc/server").TRPCMutationProcedure<{
|
|
329
|
+
input: {
|
|
330
|
+
campaignId: string | import("mongoose").Types.ObjectId;
|
|
331
|
+
};
|
|
332
|
+
output: {
|
|
333
|
+
message: string;
|
|
334
|
+
success: boolean;
|
|
335
|
+
};
|
|
336
|
+
meta: object;
|
|
337
|
+
}>;
|
|
338
|
+
}>>;
|
|
339
|
+
//# sourceMappingURL=campaign.router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"campaign.router.d.ts","sourceRoot":"/","sources":["modules/limited-time-offer/campaign/campaign.router.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFzB,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.campaignRouter = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const limited_time_offer_campaign_service_1 = require("./services/limited-time-offer-campaign.service");
|
|
6
|
+
const limited_time_offer_campaign_validation_1 = require("./limited-time-offer-campaign.validation");
|
|
7
|
+
const trpc_1 = require("@lyxa.ai/core/dist/libraries/trpc");
|
|
8
|
+
const auth_1 = require("@lyxa.ai/core/dist/libraries/trpc/middlewares/auth");
|
|
9
|
+
const enum_1 = require("@lyxa.ai/core/dist/utilities/enum");
|
|
10
|
+
const error_handler_1 = require("@lyxa.ai/core/dist/utilities/error-handler");
|
|
11
|
+
const response_1 = require("@lyxa.ai/core/dist/utilities/response");
|
|
12
|
+
const validation_1 = require("@lyxa.ai/core/dist/utilities/validation");
|
|
13
|
+
const crmProcedure = (0, auth_1.createAuthenticatedProcedure)({ entityTypes: [enum_1.AuthEntityType.CRM] });
|
|
14
|
+
const sellerProcedure = (0, auth_1.createAuthenticatedProcedure)({ entityTypes: [enum_1.AuthEntityType.SELLER] });
|
|
15
|
+
exports.campaignRouter = (0, trpc_1.createTRPCRouter)({
|
|
16
|
+
create: crmProcedure
|
|
17
|
+
.input(limited_time_offer_campaign_validation_1.CreateLtoCampaignSchema)
|
|
18
|
+
.output(limited_time_offer_campaign_validation_1.LtoCampaignResponseSchema)
|
|
19
|
+
.mutation(async ({ input }) => error_handler_1.ErrorHandler.wrapAsync(async () => {
|
|
20
|
+
const result = await limited_time_offer_campaign_service_1.ltoCampaignService.create(input);
|
|
21
|
+
return (0, response_1.response)('Campaign created successfully', result);
|
|
22
|
+
})),
|
|
23
|
+
getCurrent: crmProcedure
|
|
24
|
+
.output(limited_time_offer_campaign_validation_1.LtoCampaignNullableResponseSchema)
|
|
25
|
+
.query(async () => error_handler_1.ErrorHandler.wrapAsync(async () => {
|
|
26
|
+
const result = await limited_time_offer_campaign_service_1.ltoCampaignService.getCurrent();
|
|
27
|
+
return (0, response_1.response)('Current campaign fetched successfully', result);
|
|
28
|
+
})),
|
|
29
|
+
getActiveForShop: sellerProcedure
|
|
30
|
+
.output(limited_time_offer_campaign_validation_1.LtoCampaignNullableResponseSchema)
|
|
31
|
+
.query(async () => error_handler_1.ErrorHandler.wrapAsync(async () => {
|
|
32
|
+
const result = await limited_time_offer_campaign_service_1.ltoCampaignService.getActiveCampaign();
|
|
33
|
+
return (0, response_1.response)('Active campaign fetched successfully', result);
|
|
34
|
+
})),
|
|
35
|
+
getActiveForUser: trpc_1.publicProcedure
|
|
36
|
+
.output(limited_time_offer_campaign_validation_1.LtoCampaignNullableResponseSchema)
|
|
37
|
+
.query(async () => error_handler_1.ErrorHandler.wrapAsync(async () => {
|
|
38
|
+
const campaign = await limited_time_offer_campaign_service_1.ltoCampaignService.getActiveCampaign();
|
|
39
|
+
if (!campaign)
|
|
40
|
+
return (0, response_1.response)('Active campaign fetched successfully', null);
|
|
41
|
+
const { discountOptions: _, maxDiscountCaps: __, ...rest } = campaign;
|
|
42
|
+
return (0, response_1.response)('Active campaign fetched successfully', {
|
|
43
|
+
...rest,
|
|
44
|
+
discountOptions: [],
|
|
45
|
+
maxDiscountCaps: [],
|
|
46
|
+
});
|
|
47
|
+
})),
|
|
48
|
+
getById: crmProcedure
|
|
49
|
+
.input(zod_1.z.object({ campaignId: validation_1.ZodValidation.objectId() }))
|
|
50
|
+
.output(limited_time_offer_campaign_validation_1.LtoCampaignResponseSchema)
|
|
51
|
+
.query(async ({ input }) => error_handler_1.ErrorHandler.wrapAsync(async () => {
|
|
52
|
+
const result = await limited_time_offer_campaign_service_1.ltoCampaignService.getById(input.campaignId);
|
|
53
|
+
return (0, response_1.response)('Campaign fetched successfully', result);
|
|
54
|
+
})),
|
|
55
|
+
getHistory: crmProcedure
|
|
56
|
+
.input(limited_time_offer_campaign_validation_1.GetLtoCampaignHistorySchema)
|
|
57
|
+
.output(limited_time_offer_campaign_validation_1.LtoCampaignHistoryResponseSchema)
|
|
58
|
+
.query(async ({ input }) => error_handler_1.ErrorHandler.wrapAsync(async () => {
|
|
59
|
+
const result = await limited_time_offer_campaign_service_1.ltoCampaignService.getHistory(input);
|
|
60
|
+
return (0, response_1.response)('Campaign history fetched successfully', result);
|
|
61
|
+
})),
|
|
62
|
+
update: crmProcedure
|
|
63
|
+
.input(limited_time_offer_campaign_validation_1.UpdateLtoCampaignSchema)
|
|
64
|
+
.output(limited_time_offer_campaign_validation_1.LtoCampaignResponseSchema)
|
|
65
|
+
.mutation(async ({ input }) => error_handler_1.ErrorHandler.wrapAsync(async () => {
|
|
66
|
+
const result = await limited_time_offer_campaign_service_1.ltoCampaignService.update(input);
|
|
67
|
+
return (0, response_1.response)('Campaign updated successfully', result);
|
|
68
|
+
})),
|
|
69
|
+
cancel: crmProcedure
|
|
70
|
+
.input(zod_1.z.object({ campaignId: validation_1.ZodValidation.objectId() }))
|
|
71
|
+
.output(limited_time_offer_campaign_validation_1.LtoEmptyResponseSchema)
|
|
72
|
+
.mutation(async ({ input }) => error_handler_1.ErrorHandler.wrapAsync(async () => {
|
|
73
|
+
await limited_time_offer_campaign_service_1.ltoCampaignService.cancel(input.campaignId);
|
|
74
|
+
return (0, response_1.response)('Campaign cancelled successfully');
|
|
75
|
+
})),
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=campaign.router.js.map
|