@lyxa.ai/marketing 1.0.15 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/lib/index.d.ts +390 -0
  2. package/dist/lib/index.d.ts.map +1 -1
  3. package/dist/lib/modules/coupon/routers/coupon.router.d.ts +390 -0
  4. package/dist/lib/modules/coupon/routers/coupon.router.d.ts.map +1 -1
  5. package/dist/lib/modules/coupon/routers/coupon.router.js +8 -2
  6. package/dist/lib/modules/coupon/routers/coupon.router.js.map +1 -1
  7. package/dist/lib/modules/coupon/services/coupon.service.d.ts +3 -3
  8. package/dist/lib/modules/coupon/services/coupon.service.d.ts.map +1 -1
  9. package/dist/lib/modules/coupon/services/coupon.service.js +145 -10
  10. package/dist/lib/modules/coupon/services/coupon.service.js.map +1 -1
  11. package/dist/lib/modules/coupon/transformers/coupon.transformer.d.ts +12 -0
  12. package/dist/lib/modules/coupon/transformers/coupon.transformer.d.ts.map +1 -1
  13. package/dist/lib/modules/coupon/validations/all-coupons.validation.d.ts +252 -0
  14. package/dist/lib/modules/coupon/validations/all-coupons.validation.d.ts.map +1 -1
  15. package/dist/lib/modules/coupon/validations/coupon.validation.d.ts +52 -0
  16. package/dist/lib/modules/coupon/validations/coupon.validation.d.ts.map +1 -1
  17. package/dist/lib/modules/coupon/validations/coupon.validation.js +6 -2
  18. package/dist/lib/modules/coupon/validations/coupon.validation.js.map +1 -1
  19. package/dist/lib/modules/coupon/validations/custom-coupon.validation.d.ts +18 -0
  20. package/dist/lib/modules/coupon/validations/custom-coupon.validation.d.ts.map +1 -1
  21. package/dist/lib/modules/coupon/validations/global-coupon.validation.d.ts +18 -0
  22. package/dist/lib/modules/coupon/validations/global-coupon.validation.d.ts.map +1 -1
  23. package/dist/lib/modules/coupon/validations/individual-store-coupon.validation.d.ts +18 -0
  24. package/dist/lib/modules/coupon/validations/individual-store-coupon.validation.d.ts.map +1 -1
  25. package/dist/lib/modules/coupon/validations/individual-user-coupon.validation.d.ts +18 -0
  26. package/dist/lib/modules/coupon/validations/individual-user-coupon.validation.d.ts.map +1 -1
  27. package/dist/lib/modules/coupon/validations/referral-code-coupon.validation.d.ts +18 -0
  28. package/dist/lib/modules/coupon/validations/referral-code-coupon.validation.d.ts.map +1 -1
  29. package/dist/lib/modules/coupon/validations/referral-reward-coupon.validation.d.ts +18 -0
  30. package/dist/lib/modules/coupon/validations/referral-reward-coupon.validation.d.ts.map +1 -1
  31. package/dist/types/index.d.ts +390 -0
  32. package/dist/types/index.d.ts.map +1 -1
  33. package/dist/types/modules/coupon/routers/coupon.router.d.ts +390 -0
  34. package/dist/types/modules/coupon/routers/coupon.router.d.ts.map +1 -1
  35. package/dist/types/modules/coupon/services/coupon.service.d.ts +3 -3
  36. package/dist/types/modules/coupon/services/coupon.service.d.ts.map +1 -1
  37. package/dist/types/modules/coupon/transformers/coupon.transformer.d.ts +12 -0
  38. package/dist/types/modules/coupon/transformers/coupon.transformer.d.ts.map +1 -1
  39. package/dist/types/modules/coupon/validations/all-coupons.validation.d.ts +252 -0
  40. package/dist/types/modules/coupon/validations/all-coupons.validation.d.ts.map +1 -1
  41. package/dist/types/modules/coupon/validations/coupon.validation.d.ts +52 -0
  42. package/dist/types/modules/coupon/validations/coupon.validation.d.ts.map +1 -1
  43. package/dist/types/modules/coupon/validations/custom-coupon.validation.d.ts +18 -0
  44. package/dist/types/modules/coupon/validations/custom-coupon.validation.d.ts.map +1 -1
  45. package/dist/types/modules/coupon/validations/global-coupon.validation.d.ts +18 -0
  46. package/dist/types/modules/coupon/validations/global-coupon.validation.d.ts.map +1 -1
  47. package/dist/types/modules/coupon/validations/individual-store-coupon.validation.d.ts +18 -0
  48. package/dist/types/modules/coupon/validations/individual-store-coupon.validation.d.ts.map +1 -1
  49. package/dist/types/modules/coupon/validations/individual-user-coupon.validation.d.ts +18 -0
  50. package/dist/types/modules/coupon/validations/individual-user-coupon.validation.d.ts.map +1 -1
  51. package/dist/types/modules/coupon/validations/referral-code-coupon.validation.d.ts +18 -0
  52. package/dist/types/modules/coupon/validations/referral-code-coupon.validation.d.ts.map +1 -1
  53. package/dist/types/modules/coupon/validations/referral-reward-coupon.validation.d.ts +18 -0
  54. package/dist/types/modules/coupon/validations/referral-reward-coupon.validation.d.ts.map +1 -1
  55. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"coupon.router.d.ts","sourceRoot":"/","sources":["modules/coupon/routers/coupon.router.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAcZ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA0G0+wB,CAAC;;;;;;;;;;GADv/wB,CAAC"}
1
+ {"version":3,"file":"coupon.router.d.ts","sourceRoot":"/","sources":["modules/coupon/routers/coupon.router.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAOQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAAD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA4Hw9yB,CAAC;;;;;;;;;;GADz/yB,CAAC"}
@@ -12,11 +12,11 @@ const auth_1 = require("@lyxa.ai/core/dist/libraries/trpc/middlewares/auth");
12
12
  const auth_2 = require("@lyxa.ai/core/dist/libraries/auth");
13
13
  const typegoose_1 = require("@typegoose/typegoose");
14
14
  exports.couponRouter = (0, trpc_1.createTRPCRouter)({
15
- create: trpc_1.publicProcedure
15
+ create: (0, auth_1.createAuthenticatedProcedure)({ entityTypes: [auth_2.AuthEntityType.CRM] })
16
16
  .input(validations_1.AllCouponsValidationSchema)
17
17
  .output(validations_1.CouponResponseSchema)
18
18
  .mutation(async ({ ctx, input }) => error_handler_1.ErrorHandler.wrapAsync(async () => {
19
- await services_1.couponService.create(input);
19
+ await services_1.couponService.create({ ...input, createdBy: new typegoose_1.mongoose.Types.ObjectId(ctx.entity?.id) });
20
20
  return (0, response_1.response)('Coupon created successfully');
21
21
  })),
22
22
  getById: trpc_1.publicProcedure
@@ -57,6 +57,12 @@ exports.couponRouter = (0, trpc_1.createTRPCRouter)({
57
57
  const result = await services_1.couponService.getUserCoupons(isAdmin ? input.user : id, input.page, input.size);
58
58
  return result;
59
59
  })),
60
+ getUserCouponList: (0, auth_1.createAuthenticatedProcedure)({ entityTypes: [auth_2.AuthEntityType.CRM] })
61
+ .input(validation_1.FilterSchema)
62
+ .query(async ({ ctx, input }) => error_handler_1.ErrorHandler.wrapAsync(async () => {
63
+ const result = await services_1.couponService.getUserCouponList(input);
64
+ return result;
65
+ })),
60
66
  validateCoupon: trpc_1.publicProcedure
61
67
  .input(validations_1.ValidateCouponSchema)
62
68
  .output(validations_1.CouponValidationResponseSchema)
@@ -1 +1 @@
1
- {"version":3,"file":"coupon.router.js","sourceRoot":"/","sources":["modules/coupon/routers/coupon.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { createTRPCRouter, publicProcedure } from '@lyxa.ai/core/dist/libraries/trpc';\nimport { TRPCError } from '@trpc/server';\nimport { referralCodeCouponService, couponService as service } from '@modules/coupon/services';\nimport {\n\tCouponSchema as Schema,\n\tCouponIdValidationSchema as IdSchema,\n\tAllCouponsUpdateSchema as UpdateSchema,\n\tAllCouponsValidationSchema,\n\tCouponResponseSchema as ResponseSchema,\n\tGetUserCouponSchema,\n\tValidateCouponSchema,\n\tCouponValidationResponseSchema,\n\tCouponCodeSchema,\n} from '@modules/coupon/validations';\nimport { allCouponTransformer as transformer } from '@modules/coupon/transformers';\nimport {\n\tDeleteSchema,\n\tFilterSchema,\n\tShareableLinkResponseSchema,\n\tStringSchema,\n} from '@lyxa.ai/core/dist/utilities/validation';\nimport { ErrorHandler } from '@lyxa.ai/core/dist/utilities/error-handler';\nimport { response } from '@lyxa.ai/core/dist/utilities/response';\nimport { createAuthenticatedProcedure } from '@lyxa.ai/core/dist/libraries/trpc/middlewares/auth';\nimport { AuthEntityType } from '@lyxa.ai/core/dist/libraries/auth';\nimport { mongoose } from '@typegoose/typegoose';\nimport { z } from 'zod';\n\nexport const couponRouter = createTRPCRouter({\n\tcreate: publicProcedure\n\t\t.input(AllCouponsValidationSchema)\n\t\t.output(ResponseSchema)\n\t\t.mutation(async ({ ctx, input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tawait service.create(input);\n\t\t\t\treturn response('Coupon created successfully');\n\t\t\t})\n\t\t),\n\n\tgetById: publicProcedure\n\t\t.input(IdSchema)\n\t\t.output(ResponseSchema)\n\t\t.query(async ({ input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst result = await service.findById(input);\n\t\t\t\tconst transformedResult = transformer.transformToBasicView(result);\n\t\t\t\treturn response('Coupon fetched successfully', transformedResult);\n\t\t\t})\n\t\t),\n\n\tget: publicProcedure\n\t\t.input(FilterSchema)\n\t\t.output(ResponseSchema)\n\t\t.query(async ({ input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst result = await service.find(input);\n\t\t\t\treturn response('Coupons fetched successfully', result);\n\t\t\t})\n\t\t),\n\n\tupdate: publicProcedure\n\t\t.input(UpdateSchema)\n\t\t.output(ResponseSchema)\n\t\t.mutation(async ({ input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst { _id, data } = input;\n\t\t\t\tawait service.update(String(_id), data);\n\t\t\t\treturn response('Coupon updated successfully');\n\t\t\t})\n\t\t),\n\n\tdeleteById: publicProcedure\n\t\t.input(DeleteSchema)\n\t\t.output(ResponseSchema)\n\t\t.mutation(async ({ input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tawait service.deleteById(input);\n\t\t\t\treturn response('Coupon deleted successfully');\n\t\t\t})\n\t\t),\n\n\tgetUserCoupons: createAuthenticatedProcedure({ entityTypes: [AuthEntityType.CRM, AuthEntityType.USER] })\n\t\t.input(GetUserCouponSchema)\n\t\t// .output(ResponseSchema)\n\t\t.query(async ({ ctx, input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst isAdmin = ctx.entity?.type == AuthEntityType.CRM;\n\t\t\t\tconst id = new mongoose.Types.ObjectId(ctx.entity?.id);\n\t\t\t\tconst result = await service.getUserCoupons(isAdmin ? input.user : id, input.page, input.size);\n\t\t\t\treturn result;\n\t\t\t\t// return response('Coupons fetched successfully', result);\n\t\t\t})\n\t\t),\n\n\tvalidateCoupon: publicProcedure\n\t\t.input(ValidateCouponSchema)\n\t\t.output(CouponValidationResponseSchema)\n\t\t.query(async ({ input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst result = await service.validateCoupon(input);\n\t\t\t\treturn response('Coupon validated successfully', result);\n\t\t\t})\n\t\t),\n\n\tcreateReferralCodeForUser: createAuthenticatedProcedure({\n\t\tentityTypes: [AuthEntityType.CRM, AuthEntityType.USER],\n\t})\n\t\t.input(GetUserCouponSchema)\n\t\t.mutation(async ({ ctx, input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst isAdmin = ctx.entity?.type == AuthEntityType.CRM;\n\t\t\t\tconst id = new mongoose.Types.ObjectId(ctx.entity?.id);\n\t\t\t\tconst result = await referralCodeCouponService.createReferralCodeForUser(isAdmin ? input.user : id);\n\t\t\t\treturn result;\n\t\t\t})\n\t\t),\n\n\tgetReferralCodeCoupon: createAuthenticatedProcedure({\n\t\tentityTypes: [AuthEntityType.USER],\n\t}).query(async ({ ctx, input }) =>\n\t\tErrorHandler.wrapAsync(async () => {\n\t\t\tconst id = new mongoose.Types.ObjectId(ctx.entity?.id);\n\t\t\tconst result = await referralCodeCouponService.getReferralCodeCoupon(id);\n\t\t\treturn result;\n\t\t})\n\t),\n\n\taddCouponToUser: createAuthenticatedProcedure({\n\t\tentityTypes: [AuthEntityType.USER],\n\t})\n\t\t.input(CouponCodeSchema)\n\t\t.mutation(async ({ ctx, input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst result = await service.addCouponToUser(ctx.entity?.id as string, input.couponCode);\n\t\t\t\treturn result;\n\t\t\t})\n\t\t),\n\n\tgetShareableLink: publicProcedure\n\t\t.input(StringSchema)\n\t\t.output(ShareableLinkResponseSchema)\n\t\t.query(async ({ input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst result = await service.getShareableLink(input);\n\t\t\t\treturn response('Invite friend shareable link fetched successfully', result);\n\t\t\t})\n\t\t),\n});\n"]}
1
+ {"version":3,"file":"coupon.router.js","sourceRoot":"/","sources":["modules/coupon/routers/coupon.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { createTRPCRouter, publicProcedure } from '@lyxa.ai/core/dist/libraries/trpc';\nimport { TRPCError } from '@trpc/server';\nimport { referralCodeCouponService, couponService as service } from '@modules/coupon/services';\nimport {\n\tCouponSchema as Schema,\n\tCouponIdValidationSchema as IdSchema,\n\tAllCouponsUpdateSchema as UpdateSchema,\n\tAllCouponsValidationSchema,\n\tCouponResponseSchema as ResponseSchema,\n\tGetUserCouponSchema,\n\tValidateCouponSchema,\n\tCouponValidationResponseSchema,\n\tCouponCodeSchema,\n} from '@modules/coupon/validations';\nimport { allCouponTransformer as transformer } from '@modules/coupon/transformers';\nimport {\n\tDeleteSchema,\n\tFilterSchema,\n\tShareableLinkResponseSchema,\n\tStringSchema,\n} from '@lyxa.ai/core/dist/utilities/validation';\nimport { ErrorHandler } from '@lyxa.ai/core/dist/utilities/error-handler';\nimport { response } from '@lyxa.ai/core/dist/utilities/response';\nimport { createAuthenticatedProcedure } from '@lyxa.ai/core/dist/libraries/trpc/middlewares/auth';\nimport { AuthEntityType } from '@lyxa.ai/core/dist/libraries/auth';\nimport { mongoose } from '@typegoose/typegoose';\nimport { z } from 'zod';\n\nexport const couponRouter = createTRPCRouter({\n\tcreate: createAuthenticatedProcedure({ entityTypes: [AuthEntityType.CRM] })\n\t\t.input(AllCouponsValidationSchema)\n\t\t.output(ResponseSchema)\n\t\t.mutation(async ({ ctx, input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tawait service.create({ ...input, createdBy: new mongoose.Types.ObjectId(ctx.entity?.id) });\n\t\t\t\treturn response('Coupon created successfully');\n\t\t\t})\n\t\t),\n\n\tgetById: publicProcedure\n\t\t.input(IdSchema)\n\t\t.output(ResponseSchema)\n\t\t.query(async ({ input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst result = await service.findById(input);\n\t\t\t\tconst transformedResult = transformer.transformToBasicView(result);\n\t\t\t\treturn response('Coupon fetched successfully', transformedResult);\n\t\t\t})\n\t\t),\n\n\tget: publicProcedure\n\t\t.input(FilterSchema)\n\t\t.output(ResponseSchema)\n\t\t.query(async ({ input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst result = await service.find(input);\n\t\t\t\treturn response('Coupons fetched successfully', result);\n\t\t\t})\n\t\t),\n\n\tupdate: publicProcedure\n\t\t.input(UpdateSchema)\n\t\t.output(ResponseSchema)\n\t\t.mutation(async ({ input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst { _id, data } = input;\n\t\t\t\tawait service.update(String(_id), data);\n\t\t\t\treturn response('Coupon updated successfully');\n\t\t\t})\n\t\t),\n\n\tdeleteById: publicProcedure\n\t\t.input(DeleteSchema)\n\t\t.output(ResponseSchema)\n\t\t.mutation(async ({ input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tawait service.deleteById(input);\n\t\t\t\treturn response('Coupon deleted successfully');\n\t\t\t})\n\t\t),\n\n\tgetUserCoupons: createAuthenticatedProcedure({ entityTypes: [AuthEntityType.CRM, AuthEntityType.USER] })\n\t\t.input(GetUserCouponSchema)\n\t\t// .output(ResponseSchema)\n\t\t.query(async ({ ctx, input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst isAdmin = ctx.entity?.type == AuthEntityType.CRM;\n\t\t\t\tconst id = new mongoose.Types.ObjectId(ctx.entity?.id);\n\t\t\t\tconst result = await service.getUserCoupons(isAdmin ? input.user : id, input.page, input.size);\n\t\t\t\treturn result;\n\t\t\t\t// return response('Coupons fetched successfully', result);\n\t\t\t})\n\t\t),\n\n\tgetUserCouponList: createAuthenticatedProcedure({ entityTypes: [AuthEntityType.CRM] })\n\t\t.input(FilterSchema)\n\t\t// .output(ResponseSchema)\n\t\t.query(async ({ ctx, input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst result = await service.getUserCouponList(input);\n\t\t\t\treturn result;\n\t\t\t\t// return response('Coupons fetched successfully', result);\n\t\t\t})\n\t\t),\n\n\tvalidateCoupon: publicProcedure\n\t\t.input(ValidateCouponSchema)\n\t\t.output(CouponValidationResponseSchema)\n\t\t.query(async ({ input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst result = await service.validateCoupon(input);\n\t\t\t\treturn response('Coupon validated successfully', result);\n\t\t\t})\n\t\t),\n\n\tcreateReferralCodeForUser: createAuthenticatedProcedure({\n\t\tentityTypes: [AuthEntityType.CRM, AuthEntityType.USER],\n\t})\n\t\t.input(GetUserCouponSchema)\n\t\t.mutation(async ({ ctx, input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst isAdmin = ctx.entity?.type == AuthEntityType.CRM;\n\t\t\t\tconst id = new mongoose.Types.ObjectId(ctx.entity?.id);\n\t\t\t\tconst result = await referralCodeCouponService.createReferralCodeForUser(isAdmin ? input.user : id);\n\t\t\t\treturn result;\n\t\t\t})\n\t\t),\n\n\tgetReferralCodeCoupon: createAuthenticatedProcedure({\n\t\tentityTypes: [AuthEntityType.USER],\n\t}).query(async ({ ctx, input }) =>\n\t\tErrorHandler.wrapAsync(async () => {\n\t\t\tconst id = new mongoose.Types.ObjectId(ctx.entity?.id);\n\t\t\tconst result = await referralCodeCouponService.getReferralCodeCoupon(id);\n\t\t\treturn result;\n\t\t})\n\t),\n\n\taddCouponToUser: createAuthenticatedProcedure({\n\t\tentityTypes: [AuthEntityType.USER],\n\t})\n\t\t.input(CouponCodeSchema)\n\t\t.mutation(async ({ ctx, input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst result = await service.addCouponToUser(ctx.entity?.id as string, input.couponCode);\n\t\t\t\treturn result;\n\t\t\t})\n\t\t),\n\n\tgetShareableLink: publicProcedure\n\t\t.input(StringSchema)\n\t\t.output(ShareableLinkResponseSchema)\n\t\t.query(async ({ input }) =>\n\t\t\tErrorHandler.wrapAsync(async () => {\n\t\t\t\tconst result = await service.getShareableLink(input);\n\t\t\t\treturn response('Invite friend shareable link fetched successfully', result);\n\t\t\t})\n\t\t),\n});\n"]}
@@ -1,8 +1,7 @@
1
1
  import { DocumentType, mongoose } from '@typegoose/typegoose';
2
2
  import { Coupon as Model } from '@lyxa.ai/core/dist/libraries/mongo/models';
3
- import { AllCouponsValidationDTO, CouponValidationOutputDTO, ValidateCouponDTO } from '../../coupon/validations';
3
+ import { AllCouponsValidationDTO, CouponValidationOutputDTO, ValidateCouponDTO, AllCouponsDTO } from '../../coupon/validations';
4
4
  import { FilterDTO, PaginatedResponse, DeleteDTO, ShareableLinkDTO } from '@lyxa.ai/core/dist/utilities/validation';
5
- import { ModelType } from '@typegoose/typegoose/lib/types';
6
5
  export declare class CouponService {
7
6
  private model;
8
7
  private userModel;
@@ -11,7 +10,7 @@ export declare class CouponService {
11
10
  constructor();
12
11
  create(data: AllCouponsValidationDTO): Promise<DocumentType<Model>>;
13
12
  findById(id: string | mongoose.Types.ObjectId): Promise<DocumentType<Model>>;
14
- find(data?: Partial<FilterDTO>): Promise<PaginatedResponse<DocumentType<ModelType<Model>>>>;
13
+ find(data?: Partial<FilterDTO>): Promise<PaginatedResponse<AllCouponsDTO>>;
15
14
  update(id: string, data: AllCouponsValidationDTO): Promise<DocumentType<Model>>;
16
15
  deleteById(data: DeleteDTO): Promise<string>;
17
16
  getUserCoupons(user: mongoose.Types.ObjectId | undefined, page?: number, size?: number): Promise<{
@@ -37,6 +36,7 @@ export declare class CouponService {
37
36
  private hasUserAlreadyAppliedCoupon;
38
37
  private exchangeCouponForMultipleUser;
39
38
  getShareableLink: (code: string) => Promise<ShareableLinkDTO>;
39
+ getUserCouponList(data?: Partial<FilterDTO>): Promise<PaginatedResponse<AllCouponsDTO>>;
40
40
  }
41
41
  export declare const couponService: CouponService;
42
42
  //# sourceMappingURL=coupon.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"coupon.service.d.ts","sourceRoot":"/","sources":["modules/coupon/services/coupon.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAmB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAMN,MAAM,IAAI,KAAK,EAOf,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACN,uBAAuB,EAIvB,yBAAyB,EACzB,iBAAiB,EACjB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACN,SAAS,EACT,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAgB3D,qBACa,aAAa;IACzB,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,SAAS,CAA2C;IAC5D,OAAO,CAAC,UAAU,CAA2D;IAC7E,OAAO,CAAC,mBAAmB,CAA2E;;IAczF,MAAM,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IA4FnE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAwB5E,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IA0B3F,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IA8I/E,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB5C,cAAc,CAC1B,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,EACzC,IAAI,GAAE,MAAU,EAChB,IAAI,GAAE,MAAU,GACd,OAAO,CAAC;QACV,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACjC,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;KACpC,CAAC;IAKW,cAAc,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAkExF,OAAO,CAAC,eAAe;YAeT,kBAAkB;YAiBlB,cAAc;YAQd,sBAAsB;YAUtB,kBAAkB;YA8ClB,gBAAgB;YAWhB,uBAAuB;YAqCvB,kBAAkB;YAelB,0BAA0B;YAW1B,oBAAoB;YAepB,4BAA4B;YAW5B,YAAY;IAK1B,OAAO,CAAC,eAAe;IAOV,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YA8B3E,2BAA2B;YAoB3B,6BAA6B;IASpC,gBAAgB,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,gBAAgB,CAAC,CAUvE;CACF;AAED,eAAO,MAAM,aAAa,eAA+B,CAAC"}
1
+ {"version":3,"file":"coupon.service.d.ts","sourceRoot":"/","sources":["modules/coupon/services/coupon.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAgC,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAMN,MAAM,IAAI,KAAK,EAOf,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACN,uBAAuB,EAIvB,yBAAyB,EACzB,iBAAiB,EACjB,aAAa,EACb,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACN,SAAS,EACT,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,MAAM,yCAAyC,CAAC;AAwBjD,qBACa,aAAa;IACzB,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,SAAS,CAA2C;IAC5D,OAAO,CAAC,UAAU,CAA2D;IAC7E,OAAO,CAAC,mBAAmB,CAA2E;;IAczF,MAAM,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IA4FnE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAwB5E,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAwF1E,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IA8I/E,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB5C,cAAc,CAC1B,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,EACzC,IAAI,GAAE,MAAU,EAChB,IAAI,GAAE,MAAU,GACd,OAAO,CAAC;QACV,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACjC,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;KACpC,CAAC;IAKW,cAAc,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAkExF,OAAO,CAAC,eAAe;YAeT,kBAAkB;YAiBlB,cAAc;YAQd,sBAAsB;YAUtB,kBAAkB;YA8ClB,gBAAgB;YAWhB,uBAAuB;YAqCvB,kBAAkB;YAelB,0BAA0B;YAW1B,oBAAoB;YAepB,4BAA4B;YAW5B,YAAY;IAK1B,OAAO,CAAC,eAAe;IAOV,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YA8B3E,2BAA2B;YAoB3B,6BAA6B;IASpC,gBAAgB,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,gBAAgB,CAAC,CAUvE;IAEW,iBAAiB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;CA2FpG;AAED,eAAO,MAAM,aAAa,eAA+B,CAAC"}
@@ -52,6 +52,8 @@ const enum_1 = require("@lyxa.ai/core/dist/utilities/enum");
52
52
  const services_1 = require("../../punch-marketing-history/services");
53
53
  const core_1 = require("@lyxa.ai/core");
54
54
  const CouponRepository_1 = require("./patterns/repository/CouponRepository");
55
+ const normalize_1 = require("@lyxa.ai/core/dist/utilities/normalize");
56
+ const error_common_1 = require("@lyxa.ai/core/dist/utilities/error-common");
55
57
  let CouponService = class CouponService {
56
58
  model;
57
59
  userModel;
@@ -156,17 +158,70 @@ let CouponService = class CouponService {
156
158
  }
157
159
  async find(data) {
158
160
  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,
161
+ let query = data?.query || {};
162
+ const select = data?.select || {
163
+ _id: 1,
164
+ 'createdBy.name': 1,
165
+ 'duration.start': 1,
166
+ 'duration.end': 1,
167
+ code: 1,
168
+ status: 1,
169
+ createdAt: 1,
167
170
  };
168
- const paginatedResult = await paginate(options);
169
- return paginatedResult;
171
+ let isExpiredField = null;
172
+ if (query.status) {
173
+ if (query.status === 'expired') {
174
+ isExpiredField = true;
175
+ delete query.status;
176
+ }
177
+ }
178
+ const pipeline = [
179
+ { $match: { ...query, deletedAt: null } },
180
+ {
181
+ $lookup: {
182
+ from: 'admins',
183
+ localField: 'createdBy',
184
+ foreignField: '_id',
185
+ as: 'createdBy',
186
+ },
187
+ },
188
+ { $unwind: { path: '$createdBy', preserveNullAndEmptyArrays: true } },
189
+ {
190
+ $project: select,
191
+ },
192
+ {
193
+ $addFields: {
194
+ isExpired: {
195
+ $cond: {
196
+ if: {
197
+ $or: [{ $lt: ['$duration.end', new Date()] }, { $ifNull: ['$expirationReason', false] }],
198
+ },
199
+ then: true,
200
+ else: false,
201
+ },
202
+ },
203
+ },
204
+ },
205
+ {
206
+ $match: isExpiredField
207
+ ? { isExpired: true }
208
+ : query.status === 'active'
209
+ ? { isExpired: false }
210
+ : {},
211
+ },
212
+ ];
213
+ if (data?.search?.searchKey) {
214
+ const searchKey = (0, normalize_1.normalizeName)(data.search.searchKey);
215
+ const regex = new RegExp(searchKey, 'i');
216
+ const fields = data.search.searchFields?.length ? data.search.searchFields : ['code'];
217
+ pipeline.push({
218
+ $match: {
219
+ $or: fields.map(field => ({ [field]: { $regex: regex } })),
220
+ },
221
+ });
222
+ }
223
+ const results = await (0, pagination_1.paginateAggregation)(this.model, pipeline, data?.page, data?.size, data?.sort);
224
+ return results;
170
225
  }
171
226
  catch (err) {
172
227
  throw new server_1.TRPCError({
@@ -541,6 +596,86 @@ let CouponService = class CouponService {
541
596
  ${link}`;
542
597
  return { link, message };
543
598
  };
599
+ async getUserCouponList(data) {
600
+ try {
601
+ let query = data?.query || {};
602
+ if (!query.user) {
603
+ (0, error_common_1.badRequestError)("User ID is required in query");
604
+ }
605
+ const select = data?.select || {
606
+ _id: 1,
607
+ 'createdBy.name': 1,
608
+ 'duration.start': 1,
609
+ 'duration.end': 1,
610
+ code: 1,
611
+ status: 1,
612
+ createdAt: 1,
613
+ };
614
+ let isExpiredField = null;
615
+ if (query.status) {
616
+ if (query.status === 'expired') {
617
+ isExpiredField = true;
618
+ delete query.status;
619
+ }
620
+ }
621
+ const user = await this.userModel.findById(query.user).select('coupons');
622
+ query._id = { $in: user?.coupons ?? [] };
623
+ delete query.user;
624
+ const pipeline = [
625
+ { $match: { ...query, deletedAt: null } },
626
+ {
627
+ $lookup: {
628
+ from: 'admins',
629
+ localField: 'createdBy',
630
+ foreignField: '_id',
631
+ as: 'createdBy',
632
+ },
633
+ },
634
+ { $unwind: { path: '$createdBy', preserveNullAndEmptyArrays: true } },
635
+ {
636
+ $project: select,
637
+ },
638
+ {
639
+ $addFields: {
640
+ isExpired: {
641
+ $cond: {
642
+ if: {
643
+ $or: [{ $lt: ['$duration.end', new Date()] }, { $ifNull: ['$expirationReason', false] }],
644
+ },
645
+ then: true,
646
+ else: false,
647
+ },
648
+ },
649
+ },
650
+ },
651
+ {
652
+ $match: isExpiredField
653
+ ? { isExpired: true }
654
+ : query.status === 'active'
655
+ ? { isExpired: false }
656
+ : {},
657
+ },
658
+ ];
659
+ if (data?.search?.searchKey) {
660
+ const searchKey = (0, normalize_1.normalizeName)(data.search.searchKey);
661
+ const regex = new RegExp(searchKey, 'i');
662
+ const fields = data.search.searchFields?.length ? data.search.searchFields : ['code'];
663
+ pipeline.push({
664
+ $match: {
665
+ $or: fields.map(field => ({ [field]: { $regex: regex } })),
666
+ },
667
+ });
668
+ }
669
+ const results = await (0, pagination_1.paginateAggregation)(this.model, pipeline, data?.page, data?.size, data?.sort);
670
+ return results;
671
+ }
672
+ catch (err) {
673
+ throw new server_1.TRPCError({
674
+ code: 'INTERNAL_SERVER_ERROR',
675
+ message: `err: ${err}`,
676
+ });
677
+ }
678
+ }
544
679
  };
545
680
  exports.CouponService = CouponService;
546
681
  exports.CouponService = CouponService = __decorate([
@@ -1 +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"]}
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, queryMethod, 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\tAllCouponsDTO,\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 {\n\tcreateRawDocumentPaginatorObject,\n\tpaginateAggregation,\n\tPaginatorOptions,\n} 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';\nimport { normalizeName } from '@lyxa.ai/core/dist/utilities/normalize';\nimport { badRequestError } from '@lyxa.ai/core/dist/utilities/error-common';\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<AllCouponsDTO>> {\n\t\ttry {\n\t\t\tlet query = data?.query || {};\n\t\t\tconst select = data?.select || {\n\t\t\t\t_id: 1,\n\t\t\t\t'createdBy.name': 1,\n\t\t\t\t'duration.start': 1,\n\t\t\t\t'duration.end': 1,\n\t\t\t\tcode: 1,\n\t\t\t\tstatus: 1,\n\t\t\t\tcreatedAt: 1,\n\t\t\t};\n\n\t\t\tlet isExpiredField = null;\n\n\t\t\tif (query.status) {\n\t\t\t\tif (query.status === 'expired') {\n\t\t\t\t\tisExpiredField = true;\n\t\t\t\t\tdelete query.status;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst pipeline: any[] = [\n\t\t\t\t{ $match: { ...query, deletedAt: null } }, // Filter by search query\n\t\t\t\t{\n\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t// INNER JOIN on categories\n\t\t\t\t\t\tfrom: 'admins', // Mongoose auto-pluralizes collection names\n\t\t\t\t\t\tlocalField: 'createdBy',\n\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\tas: 'createdBy',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{ $unwind: { path: '$createdBy', preserveNullAndEmptyArrays: true } }, // Flatten the array\n\t\t\t\t{\n\t\t\t\t\t$project: select,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t$addFields: {\n\t\t\t\t\t\tisExpired: {\n\t\t\t\t\t\t\t$cond: {\n\t\t\t\t\t\t\t\tif: {\n\t\t\t\t\t\t\t\t\t$or: [{ $lt: ['$duration.end', new Date()] }, { $ifNull: ['$expirationReason', false] }],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tthen: true,\n\t\t\t\t\t\t\t\telse: false,\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\t{\n\t\t\t\t\t$match: isExpiredField\n\t\t\t\t\t\t? { isExpired: true }\n\t\t\t\t\t\t: query.status === 'active'\n\t\t\t\t\t\t\t? { isExpired: false }\n\t\t\t\t\t\t\t: {},\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tif (data?.search?.searchKey) {\n\t\t\t\tconst searchKey = normalizeName(data.search.searchKey);\n\t\t\t\tconst regex = new RegExp(searchKey, 'i'); // case-insensitive search\n\t\t\t\tconst fields = data.search.searchFields?.length ? data.search.searchFields : ['code']; // default field(s) to search in\n\n\t\t\t\tpipeline.push({\n\t\t\t\t\t$match: {\n\t\t\t\t\t\t$or: fields.map(field => ({ [field]: { $regex: regex } })),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Execute the aggregation with pagination and sorting\n\t\t\tconst results = await paginateAggregation(this.model, pipeline, data?.page, data?.size, data?.sort);\n\n\t\t\treturn results as unknown as PaginatedResponse<AllCouponsDTO>;\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\tpublic async getUserCouponList(data?: Partial<FilterDTO>): Promise<PaginatedResponse<AllCouponsDTO>> {\n\t\ttry {\n\t\t\tlet query = data?.query || {};\n\n\t\t\tif (!query.user) {\n\t\t\t\tbadRequestError(\"User ID is required in query\");\n\t\t\t}\n\n\t\t\tconst select = data?.select || {\n\t\t\t\t_id: 1,\n\t\t\t\t'createdBy.name': 1,\n\t\t\t\t'duration.start': 1,\n\t\t\t\t'duration.end': 1,\n\t\t\t\tcode: 1,\n\t\t\t\tstatus: 1,\n\t\t\t\tcreatedAt: 1,\n\t\t\t};\n\n\t\t\tlet isExpiredField = null;\n\n\t\t\tif (query.status) {\n\t\t\t\tif (query.status === 'expired') {\n\t\t\t\t\tisExpiredField = true;\n\t\t\t\t\tdelete query.status;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst user = await this.userModel.findById(query.user).select('coupons');\n\t\t\tquery._id = { $in: user?.coupons ?? [] };\n\t\t\tdelete query.user; // remove user from query to avoid issues in aggregation match stage\n\n\t\t\tconst pipeline: any[] = [\n\t\t\t\t{ $match: { ...query, deletedAt: null } }, // Filter by search query\n\t\t\t\t{\n\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t// INNER JOIN on categories\n\t\t\t\t\t\tfrom: 'admins', // Mongoose auto-pluralizes collection names\n\t\t\t\t\t\tlocalField: 'createdBy',\n\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\tas: 'createdBy',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{ $unwind: { path: '$createdBy', preserveNullAndEmptyArrays: true } }, // Flatten the array\n\t\t\t\t{\n\t\t\t\t\t$project: select,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t$addFields: {\n\t\t\t\t\t\tisExpired: {\n\t\t\t\t\t\t\t$cond: {\n\t\t\t\t\t\t\t\tif: {\n\t\t\t\t\t\t\t\t\t$or: [{ $lt: ['$duration.end', new Date()] }, { $ifNull: ['$expirationReason', false] }],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tthen: true,\n\t\t\t\t\t\t\t\telse: false,\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\t{\n\t\t\t\t\t$match: isExpiredField\n\t\t\t\t\t\t? { isExpired: true }\n\t\t\t\t\t\t: query.status === 'active'\n\t\t\t\t\t\t\t? { isExpired: false }\n\t\t\t\t\t\t\t: {},\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tif (data?.search?.searchKey) {\n\t\t\t\tconst searchKey = normalizeName(data.search.searchKey);\n\t\t\t\tconst regex = new RegExp(searchKey, 'i'); // case-insensitive search\n\t\t\t\tconst fields = data.search.searchFields?.length ? data.search.searchFields : ['code']; // default field(s) to search in\n\n\t\t\t\tpipeline.push({\n\t\t\t\t\t$match: {\n\t\t\t\t\t\t$or: fields.map(field => ({ [field]: { $regex: regex } })),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Execute the aggregation with pagination and sorting\n\t\t\tconst results = await paginateAggregation(this.model, pipeline, data?.page, data?.size, data?.sort);\n\n\t\t\treturn results as unknown as PaginatedResponse<AllCouponsDTO>;\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\nexport const couponService = Container.get(CouponService);\n"]}
@@ -38,12 +38,16 @@ export declare const allCouponTransformer: import("@lyxa.ai/core/dist/utilities/
38
38
  }>>>;
39
39
  code: import("zod").ZodOptional<import("zod").ZodString | import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, string, string>>;
40
40
  orderLimitPerUser: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodNumber>>>>;
41
+ createdBy: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, import("mongoose").Types.ObjectId, string>, import("zod").ZodType<import("mongoose").Types.ObjectId, import("zod").ZodTypeDef, import("mongoose").Types.ObjectId>]>>>;
42
+ isExpired: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodBoolean>>;
41
43
  _id: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, import("mongoose").Types.ObjectId, string>, import("zod").ZodType<import("mongoose").Types.ObjectId, import("zod").ZodTypeDef, import("mongoose").Types.ObjectId>]>>;
42
44
  }, import("zod").ZodTypeAny, "passthrough"> | import("zod").objectOutputType<{
43
45
  couponType: import("zod").ZodOptional<import("zod").ZodLiteral<import("@lyxa.ai/core/dist/utilities/enum").CouponType.REFERRAL_CODE>>;
44
46
  orderLimitPerUser: import("zod").ZodOptional<import("zod").ZodLiteral<1>>;
45
47
  referralUser: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, import("mongoose").Types.ObjectId, string>, import("zod").ZodType<import("mongoose").Types.ObjectId, import("zod").ZodTypeDef, import("mongoose").Types.ObjectId>]>>;
46
48
  code: import("zod").ZodOptional<import("zod").ZodString | import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, string, string>>;
49
+ createdBy: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, import("mongoose").Types.ObjectId, string>, import("zod").ZodType<import("mongoose").Types.ObjectId, import("zod").ZodTypeDef, import("mongoose").Types.ObjectId>]>>>;
50
+ isExpired: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodBoolean>>;
47
51
  _id: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, import("mongoose").Types.ObjectId, string>, import("zod").ZodType<import("mongoose").Types.ObjectId, import("zod").ZodTypeDef, import("mongoose").Types.ObjectId>]>>;
48
52
  }, import("zod").ZodTypeAny, "passthrough"> | import("zod").objectOutputType<{
49
53
  couponType: import("zod").ZodOptional<import("zod").ZodLiteral<import("@lyxa.ai/core/dist/utilities/enum").CouponType.REFERRAL_REWARD>>;
@@ -87,6 +91,8 @@ export declare const allCouponTransformer: import("@lyxa.ai/core/dist/utilities/
87
91
  }>>>;
88
92
  code: import("zod").ZodOptional<import("zod").ZodString | import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, string, string>>;
89
93
  orderLimitPerUser: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodNumber>>>>;
94
+ createdBy: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, import("mongoose").Types.ObjectId, string>, import("zod").ZodType<import("mongoose").Types.ObjectId, import("zod").ZodTypeDef, import("mongoose").Types.ObjectId>]>>>;
95
+ isExpired: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodBoolean>>;
90
96
  _id: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, import("mongoose").Types.ObjectId, string>, import("zod").ZodType<import("mongoose").Types.ObjectId, import("zod").ZodTypeDef, import("mongoose").Types.ObjectId>]>>;
91
97
  }, import("zod").ZodTypeAny, "passthrough"> | import("zod").objectOutputType<{
92
98
  couponType: import("zod").ZodOptional<import("zod").ZodLiteral<import("@lyxa.ai/core/dist/utilities/enum").CouponType.INDIVIDUAL_STORE>>;
@@ -130,6 +136,8 @@ export declare const allCouponTransformer: import("@lyxa.ai/core/dist/utilities/
130
136
  }>>>;
131
137
  code: import("zod").ZodOptional<import("zod").ZodString | import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, string, string>>;
132
138
  orderLimitPerUser: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodNumber>>>>;
139
+ createdBy: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, import("mongoose").Types.ObjectId, string>, import("zod").ZodType<import("mongoose").Types.ObjectId, import("zod").ZodTypeDef, import("mongoose").Types.ObjectId>]>>>;
140
+ isExpired: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodBoolean>>;
133
141
  _id: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, import("mongoose").Types.ObjectId, string>, import("zod").ZodType<import("mongoose").Types.ObjectId, import("zod").ZodTypeDef, import("mongoose").Types.ObjectId>]>>;
134
142
  }, import("zod").ZodTypeAny, "passthrough"> | import("zod").objectOutputType<{
135
143
  couponType: import("zod").ZodOptional<import("zod").ZodLiteral<import("@lyxa.ai/core/dist/utilities/enum").CouponType.INDIVIDUAL_USER>>;
@@ -173,6 +181,8 @@ export declare const allCouponTransformer: import("@lyxa.ai/core/dist/utilities/
173
181
  }>>>;
174
182
  code: import("zod").ZodOptional<import("zod").ZodString | import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, string, string>>;
175
183
  orderLimitPerUser: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodNumber>>>>;
184
+ createdBy: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, import("mongoose").Types.ObjectId, string>, import("zod").ZodType<import("mongoose").Types.ObjectId, import("zod").ZodTypeDef, import("mongoose").Types.ObjectId>]>>>;
185
+ isExpired: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodBoolean>>;
176
186
  _id: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, import("mongoose").Types.ObjectId, string>, import("zod").ZodType<import("mongoose").Types.ObjectId, import("zod").ZodTypeDef, import("mongoose").Types.ObjectId>]>>;
177
187
  }, import("zod").ZodTypeAny, "passthrough"> | import("zod").objectOutputType<{
178
188
  couponType: import("zod").ZodOptional<import("zod").ZodLiteral<import("@lyxa.ai/core/dist/utilities/enum").CouponType.CUSTOM_COUPON>>;
@@ -216,6 +226,8 @@ export declare const allCouponTransformer: import("@lyxa.ai/core/dist/utilities/
216
226
  }>>>;
217
227
  code: import("zod").ZodOptional<import("zod").ZodString | import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, string, string>>;
218
228
  orderLimitPerUser: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodNumber>>>>;
229
+ createdBy: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, import("mongoose").Types.ObjectId, string>, import("zod").ZodType<import("mongoose").Types.ObjectId, import("zod").ZodTypeDef, import("mongoose").Types.ObjectId>]>>>;
230
+ isExpired: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodBoolean>>;
219
231
  _id: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, import("mongoose").Types.ObjectId, string>, import("zod").ZodType<import("mongoose").Types.ObjectId, import("zod").ZodTypeDef, import("mongoose").Types.ObjectId>]>>;
220
232
  }, import("zod").ZodTypeAny, "passthrough">>;
221
233
  //# sourceMappingURL=coupon.transformer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"coupon.transformer.d.ts","sourceRoot":"/","sources":["modules/coupon/transformers/coupon.transformer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,wDAAwD,CAAC;AAQzF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CAEhC,CAAC"}
1
+ {"version":3,"file":"coupon.transformer.d.ts","sourceRoot":"/","sources":["modules/coupon/transformers/coupon.transformer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,wDAAwD,CAAC;AAQzF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CAEhC,CAAC"}