@coursebuilder/core
Version:
Core package for Course Builder
1 lines • 3.69 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/lib/actions/prices-coupon-for-code.ts"],"sourcesContent":["import { isBefore } from 'date-fns'\n\nimport { Coupon } from '../../schemas'\nimport { InternalOptions, RequestInternal, ResponseInternal } from '../../types'\nimport { Cookie } from '../utils/cookie'\n\nconst validateCoupon = (coupon: Coupon | null, productIds: string[] = []) => {\n\tif (!coupon) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\tisRedeemable: false,\n\t\t\terror: 'coupon-not-found',\n\t\t}\n\t}\n\n\tconst isUsedUp =\n\t\tcoupon.maxUses > 0 ? coupon.usedCount >= coupon.maxUses : false\n\n\tconst isExpired = coupon.expires\n\t\t? isBefore(new Date(coupon.expires), new Date())\n\t\t: false\n\n\tif (\n\t\tcoupon.restrictedToProductId &&\n\t\t!productIds.includes(coupon.restrictedToProductId)\n\t) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\tisRedeemable: false,\n\t\t\terror: 'coupon-not-valid-for-product',\n\t\t}\n\t}\n\n\tconst isValid = !isUsedUp && !isExpired\n\n\treturn {\n\t\tisExpired,\n\t\tisUsedUp,\n\t\tisRedeemable:\n\t\t\tisValid && Number(coupon.percentageDiscount) >= 1 && !coupon.default,\n\t\tisValid,\n\t}\n}\n\nexport async function getCouponForCode(\n\trequest: RequestInternal,\n\tcookies: Cookie[],\n\toptions: InternalOptions,\n): Promise<ResponseInternal> {\n\tconst { code, productIds } = request.body || {}\n\n\tif (!code)\n\t\treturn {\n\t\t\tbody: null,\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tcookies,\n\t\t}\n\n\tlet couponFromCode = code && (await options.adapter?.getCoupon(code))\n\n\tif (couponFromCode) {\n\t\tconst is100Percent =\n\t\t\tproductIds.length === 0 &&\n\t\t\tcouponFromCode.restrictedToProductId &&\n\t\t\tcouponFromCode.percentageDiscount === 1\n\n\t\tconst validatedCoupon = validateCoupon(\n\t\t\tcouponFromCode,\n\t\t\tis100Percent ? [couponFromCode?.restrictedToProductId] : productIds,\n\t\t)\n\t\treturn {\n\t\t\tbody: {\n\t\t\t\t...couponFromCode,\n\t\t\t\t...validatedCoupon,\n\t\t\t},\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tcookies,\n\t\t}\n\t}\n\n\treturn {\n\t\tbody: null,\n\t\theaders: { 'Content-Type': 'application/json' },\n\t\tcookies,\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;sBAAyB;AAMzB,IAAMA,iBAAiB,wBAACC,QAAuBC,aAAuB,CAAA,MAAE;AACvE,MAAI,CAACD,QAAQ;AACZ,WAAO;MACNE,SAAS;MACTC,cAAc;MACdC,OAAO;IACR;EACD;AAEA,QAAMC,WACLL,OAAOM,UAAU,IAAIN,OAAOO,aAAaP,OAAOM,UAAU;AAE3D,QAAME,YAAYR,OAAOS,cACtBC,0BAAS,IAAIC,KAAKX,OAAOS,OAAO,GAAG,oBAAIE,KAAAA,CAAAA,IACvC;AAEH,MACCX,OAAOY,yBACP,CAACX,WAAWY,SAASb,OAAOY,qBAAqB,GAChD;AACD,WAAO;MACNV,SAAS;MACTC,cAAc;MACdC,OAAO;IACR;EACD;AAEA,QAAMF,UAAU,CAACG,YAAY,CAACG;AAE9B,SAAO;IACNA;IACAH;IACAF,cACCD,WAAWY,OAAOd,OAAOe,kBAAkB,KAAK,KAAK,CAACf,OAAOgB;IAC9Dd;EACD;AACD,GApCuB;AAsCvB,eAAsBe,iBACrBC,SACAC,SACAC,SAAwB;AAExB,QAAM,EAAEC,MAAMpB,WAAU,IAAKiB,QAAQI,QAAQ,CAAC;AAE9C,MAAI,CAACD;AACJ,WAAO;MACNC,MAAM;MACNC,SAAS;QAAE,gBAAgB;MAAmB;MAC9CJ;IACD;AAED,MAAIK,iBAAiBH,QAAS,MAAMD,QAAQK,SAASC,UAAUL,IAAAA;AAE/D,MAAIG,gBAAgB;AACnB,UAAMG,eACL1B,WAAW2B,WAAW,KACtBJ,eAAeZ,yBACfY,eAAeT,uBAAuB;AAEvC,UAAMc,kBAAkB9B,eACvByB,gBACAG,eAAe;MAACH,gBAAgBZ;QAAyBX,UAAAA;AAE1D,WAAO;MACNqB,MAAM;QACL,GAAGE;QACH,GAAGK;MACJ;MACAN,SAAS;QAAE,gBAAgB;MAAmB;MAC9CJ;IACD;EACD;AAEA,SAAO;IACNG,MAAM;IACNC,SAAS;MAAE,gBAAgB;IAAmB;IAC9CJ;EACD;AACD;AAzCsBF;","names":["validateCoupon","coupon","productIds","isValid","isRedeemable","error","isUsedUp","maxUses","usedCount","isExpired","expires","isBefore","Date","restrictedToProductId","includes","Number","percentageDiscount","default","getCouponForCode","request","cookies","options","code","body","headers","couponFromCode","adapter","getCoupon","is100Percent","length","validatedCoupon"]}