@forklaunch/implementation-billing-base 0.1.2 → 0.1.4

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 (101) hide show
  1. package/lib/__test__/schemaEquality.test.d.ts +2 -0
  2. package/lib/__test__/schemaEquality.test.d.ts.map +1 -0
  3. package/lib/__test__/schemaEquality.test.js +226 -0
  4. package/{schemas/typebox → lib/eject/schemas/zod}/billingPortal.schema.ts +1 -1
  5. package/{schemas/typebox → lib/eject/schemas/zod}/checkoutSession.schema.ts +1 -2
  6. package/{schemas/typebox → lib/eject/schemas/zod}/paymentLink.schema.ts +1 -1
  7. package/{schemas/typebox → lib/eject/schemas/zod}/plan.schema.ts +1 -1
  8. package/{schemas/typebox → lib/eject/schemas/zod}/subscription.schema.ts +1 -1
  9. package/lib/eject/services/services/billingPortal.service.ts +148 -0
  10. package/lib/eject/services/services/checkoutSession.service.ts +135 -0
  11. package/lib/eject/services/services/paymentLink.service.ts +173 -0
  12. package/lib/eject/services/services/plan.service.ts +135 -0
  13. package/lib/eject/services/subscription.service.ts +239 -0
  14. package/lib/index.d.ts +11 -0
  15. package/lib/index.d.ts.map +1 -0
  16. package/lib/jest.config.d.ts +4 -0
  17. package/lib/jest.config.d.ts.map +1 -0
  18. package/lib/jest.config.js +19 -0
  19. package/lib/schemas/billingPortal.schema.d.ts +42 -0
  20. package/lib/schemas/billingPortal.schema.d.ts.map +1 -0
  21. package/lib/schemas/billingPortal.schema.js +14 -0
  22. package/lib/schemas/checkoutSession.schema.d.ts +55 -0
  23. package/lib/schemas/checkoutSession.schema.d.ts.map +1 -0
  24. package/lib/schemas/checkoutSession.schema.js +14 -0
  25. package/lib/schemas/paymentLink.schema.d.ts +66 -0
  26. package/lib/schemas/paymentLink.schema.d.ts.map +1 -0
  27. package/lib/schemas/paymentLink.schema.js +14 -0
  28. package/lib/schemas/plan.schema.d.ts +78 -0
  29. package/lib/schemas/plan.schema.d.ts.map +1 -0
  30. package/lib/schemas/plan.schema.js +14 -0
  31. package/lib/schemas/subscription.schema.d.ts +90 -0
  32. package/lib/schemas/subscription.schema.d.ts.map +1 -0
  33. package/lib/schemas/subscription.schema.js +14 -0
  34. package/lib/schemas/typebox/billingPortal.schema.d.ts +20 -0
  35. package/lib/schemas/typebox/billingPortal.schema.d.ts.map +1 -0
  36. package/lib/schemas/typebox/billingPortal.schema.js +20 -0
  37. package/lib/schemas/typebox/checkoutSession.schema.d.ts +28 -0
  38. package/lib/schemas/typebox/checkoutSession.schema.d.ts.map +1 -0
  39. package/lib/schemas/typebox/checkoutSession.schema.js +27 -0
  40. package/lib/schemas/typebox/paymentLink.schema.d.ts +33 -0
  41. package/lib/schemas/typebox/paymentLink.schema.d.ts.map +1 -0
  42. package/lib/schemas/typebox/paymentLink.schema.js +32 -0
  43. package/lib/schemas/typebox/plan.schema.d.ts +39 -0
  44. package/lib/schemas/typebox/plan.schema.d.ts.map +1 -0
  45. package/lib/schemas/typebox/plan.schema.js +38 -0
  46. package/lib/schemas/typebox/subscription.schema.d.ts +45 -0
  47. package/lib/schemas/typebox/subscription.schema.d.ts.map +1 -0
  48. package/lib/schemas/typebox/subscription.schema.js +44 -0
  49. package/lib/schemas/zod/billingPortal.schema.d.ts +20 -0
  50. package/lib/schemas/zod/billingPortal.schema.d.ts.map +1 -0
  51. package/lib/schemas/zod/billingPortal.schema.js +20 -0
  52. package/lib/schemas/zod/checkoutSession.schema.d.ts +27 -0
  53. package/lib/schemas/zod/checkoutSession.schema.d.ts.map +1 -0
  54. package/lib/schemas/zod/checkoutSession.schema.js +26 -0
  55. package/lib/schemas/zod/paymentLink.schema.d.ts +33 -0
  56. package/lib/schemas/zod/paymentLink.schema.d.ts.map +1 -0
  57. package/lib/schemas/zod/paymentLink.schema.js +32 -0
  58. package/lib/schemas/zod/plan.schema.d.ts +39 -0
  59. package/lib/schemas/zod/plan.schema.d.ts.map +1 -0
  60. package/lib/schemas/zod/plan.schema.js +38 -0
  61. package/lib/schemas/zod/subscription.schema.d.ts +45 -0
  62. package/lib/schemas/zod/subscription.schema.d.ts.map +1 -0
  63. package/lib/schemas/zod/subscription.schema.js +44 -0
  64. package/lib/services/billingPortal.service.d.ts +44 -0
  65. package/lib/services/billingPortal.service.d.ts.map +1 -0
  66. package/lib/services/billingPortal.service.js +51 -0
  67. package/lib/services/checkoutSession.service.d.ts +45 -0
  68. package/lib/services/checkoutSession.service.d.ts.map +1 -0
  69. package/lib/services/checkoutSession.service.js +49 -0
  70. package/lib/services/paymentLink.service.d.ts +48 -0
  71. package/lib/services/paymentLink.service.d.ts.map +1 -0
  72. package/lib/services/paymentLink.service.js +72 -0
  73. package/lib/services/plan.service.d.ts +42 -0
  74. package/lib/services/plan.service.d.ts.map +1 -0
  75. package/lib/services/plan.service.js +43 -0
  76. package/lib/services/subscription.service.d.ts +52 -0
  77. package/lib/services/subscription.service.d.ts.map +1 -0
  78. package/lib/services/subscription.service.js +94 -0
  79. package/lib/tsconfig.tsbuildinfo +1 -0
  80. package/lib/vitest.config.d.ts +3 -0
  81. package/lib/vitest.config.d.ts.map +1 -0
  82. package/lib/vitest.config.js +7 -0
  83. package/package.json +6 -4
  84. package/__test__/schemaEquality.test.ts +0 -411
  85. package/schemas/billingPortal.schema.ts +0 -28
  86. package/schemas/checkoutSession.schema.ts +0 -28
  87. package/schemas/paymentLink.schema.ts +0 -28
  88. package/schemas/plan.schema.ts +0 -28
  89. package/schemas/subscription.schema.ts +0 -28
  90. package/tsconfig.json +0 -7
  91. /package/{schemas/zod → lib/eject/schemas}/billingPortal.schema.ts +0 -0
  92. /package/{schemas/zod → lib/eject/schemas}/checkoutSession.schema.ts +0 -0
  93. /package/{schemas/zod → lib/eject/schemas}/paymentLink.schema.ts +0 -0
  94. /package/{schemas/zod → lib/eject/schemas}/plan.schema.ts +0 -0
  95. /package/{schemas/zod → lib/eject/schemas}/subscription.schema.ts +0 -0
  96. /package/{services → lib/eject/services}/billingPortal.service.ts +0 -0
  97. /package/{services → lib/eject/services}/checkoutSession.service.ts +0 -0
  98. /package/{services → lib/eject/services}/paymentLink.service.ts +0 -0
  99. /package/{services → lib/eject/services}/plan.service.ts +0 -0
  100. /package/{services → lib/eject/services/services}/subscription.service.ts +0 -0
  101. /package/{index.ts → lib/index.js} +0 -0
@@ -0,0 +1,51 @@
1
+ import { createCacheKey } from '@forklaunch/core/cache';
2
+ import { transformIntoInternalDtoMapper } from '@forklaunch/core/dtoMapper';
3
+ export class BaseBillingPortalService {
4
+ cache;
5
+ openTelemetryCollector;
6
+ schemaValidator;
7
+ dtoMappers;
8
+ #dtoMappers;
9
+ constructor(cache, openTelemetryCollector, schemaValidator, dtoMappers) {
10
+ this.cache = cache;
11
+ this.openTelemetryCollector = openTelemetryCollector;
12
+ this.schemaValidator = schemaValidator;
13
+ this.dtoMappers = dtoMappers;
14
+ this.#dtoMappers = transformIntoInternalDtoMapper(dtoMappers, schemaValidator);
15
+ }
16
+ createCacheKey = createCacheKey('billing_portal_session');
17
+ async createBillingPortalSession(billingPortalDto) {
18
+ const billingPortalSession = this.#dtoMappers.CreateBillingPortalDtoMapper.deserializeDtoToEntity(billingPortalDto);
19
+ this.openTelemetryCollector.debug('Create billing portal session', billingPortalSession);
20
+ await this.cache.putRecord({
21
+ key: this.createCacheKey(billingPortalSession.id),
22
+ value: billingPortalSession,
23
+ ttlMilliseconds: this.cache.getTtlMilliseconds()
24
+ });
25
+ return this.#dtoMappers.BillingPortalDtoMapper.serializeEntityToDto(billingPortalSession);
26
+ }
27
+ async getBillingPortalSession(idDto) {
28
+ const billingPortalSessionDetails = await this.cache.readRecord(this.createCacheKey(idDto.id));
29
+ if (!billingPortalSessionDetails) {
30
+ throw new Error('Session not found');
31
+ }
32
+ return this.#dtoMappers.BillingPortalDtoMapper.serializeEntityToDto(billingPortalSessionDetails.value);
33
+ }
34
+ async updateBillingPortalSession(billingPortalDto) {
35
+ const billingPortalSession = this.#dtoMappers.UpdateBillingPortalDtoMapper.deserializeDtoToEntity(billingPortalDto);
36
+ // Save the updated session to your database or external service
37
+ await this.cache.putRecord({
38
+ key: this.createCacheKey(billingPortalSession.id),
39
+ value: billingPortalSession,
40
+ ttlMilliseconds: this.cache.getTtlMilliseconds()
41
+ });
42
+ return this.#dtoMappers.BillingPortalDtoMapper.serializeEntityToDto(billingPortalSession);
43
+ }
44
+ async expireBillingPortalSession(idDto) {
45
+ const sessionExists = await this.cache.readRecord(this.createCacheKey(idDto.id));
46
+ if (!sessionExists) {
47
+ throw new Error('Session not found');
48
+ }
49
+ await this.cache.deleteRecord(this.createCacheKey(idDto.id));
50
+ }
51
+ }
@@ -0,0 +1,45 @@
1
+ import { CheckoutSessionDto, CheckoutSessionService, CreateCheckoutSessionDto, UpdateCheckoutSessionDto } from '@forklaunch/interfaces-billing';
2
+ import { IdDto } from '@forklaunch/common';
3
+ import { TtlCache } from '@forklaunch/core/cache';
4
+ import { RequestDtoMapperConstructor, ResponseDtoMapperConstructor } from '@forklaunch/core/dtoMapper';
5
+ import { MetricsDefinition, OpenTelemetryCollector } from '@forklaunch/core/http';
6
+ import { AnySchemaValidator } from '@forklaunch/validator';
7
+ export declare class BaseCheckoutSessionService<SchemaValidator extends AnySchemaValidator, PaymentMethodEnum, Metrics extends MetricsDefinition = MetricsDefinition, Dto extends {
8
+ CheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
9
+ CreateCheckoutSessionDtoMapper: CreateCheckoutSessionDto<PaymentMethodEnum>;
10
+ UpdateCheckoutSessionDtoMapper: UpdateCheckoutSessionDto<PaymentMethodEnum>;
11
+ } = {
12
+ CheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
13
+ CreateCheckoutSessionDtoMapper: CreateCheckoutSessionDto<PaymentMethodEnum>;
14
+ UpdateCheckoutSessionDtoMapper: UpdateCheckoutSessionDto<PaymentMethodEnum>;
15
+ }, Entities extends {
16
+ CheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
17
+ CreateCheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
18
+ UpdateCheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
19
+ } = {
20
+ CheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
21
+ CreateCheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
22
+ UpdateCheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
23
+ }> implements CheckoutSessionService<PaymentMethodEnum> {
24
+ #private;
25
+ protected readonly cache: TtlCache;
26
+ protected readonly openTelemetryCollector: OpenTelemetryCollector<Metrics>;
27
+ protected readonly schemaValidator: SchemaValidator;
28
+ protected readonly dtoMappers: {
29
+ CheckoutSessionDtoMapper: ResponseDtoMapperConstructor<SchemaValidator, Dto['CheckoutSessionDtoMapper'], Entities['CheckoutSessionDtoMapper']>;
30
+ CreateCheckoutSessionDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['CreateCheckoutSessionDtoMapper'], Entities['CreateCheckoutSessionDtoMapper']>;
31
+ UpdateCheckoutSessionDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['UpdateCheckoutSessionDtoMapper'], Entities['UpdateCheckoutSessionDtoMapper']>;
32
+ };
33
+ constructor(cache: TtlCache, openTelemetryCollector: OpenTelemetryCollector<Metrics>, schemaValidator: SchemaValidator, dtoMappers: {
34
+ CheckoutSessionDtoMapper: ResponseDtoMapperConstructor<SchemaValidator, Dto['CheckoutSessionDtoMapper'], Entities['CheckoutSessionDtoMapper']>;
35
+ CreateCheckoutSessionDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['CreateCheckoutSessionDtoMapper'], Entities['CreateCheckoutSessionDtoMapper']>;
36
+ UpdateCheckoutSessionDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['UpdateCheckoutSessionDtoMapper'], Entities['UpdateCheckoutSessionDtoMapper']>;
37
+ });
38
+ protected createCacheKey: (id: string) => string;
39
+ createCheckoutSession(checkoutSessionDto: Dto['CreateCheckoutSessionDtoMapper']): Promise<Dto['CheckoutSessionDtoMapper']>;
40
+ getCheckoutSession({ id }: IdDto): Promise<Dto['CheckoutSessionDtoMapper']>;
41
+ expireCheckoutSession({ id }: IdDto): Promise<void>;
42
+ handleCheckoutSuccess({ id }: IdDto): Promise<void>;
43
+ handleCheckoutFailure({ id }: IdDto): Promise<void>;
44
+ }
45
+ //# sourceMappingURL=checkoutSession.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkoutSession.service.d.ts","sourceRoot":"","sources":["../../services/checkoutSession.service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,KAAK,EAAsB,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAkB,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAEL,2BAA2B,EAC3B,4BAA4B,EAE7B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,qBAAa,0BAA0B,CACrC,eAAe,SAAS,kBAAkB,EAC1C,iBAAiB,EACjB,OAAO,SAAS,iBAAiB,GAAG,iBAAiB,EACrD,GAAG,SAAS;IACV,wBAAwB,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAChE,8BAA8B,EAAE,wBAAwB,CAAC,iBAAiB,CAAC,CAAC;IAC5E,8BAA8B,EAAE,wBAAwB,CAAC,iBAAiB,CAAC,CAAC;CAC7E,GAAG;IACF,wBAAwB,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAChE,8BAA8B,EAAE,wBAAwB,CAAC,iBAAiB,CAAC,CAAC;IAC5E,8BAA8B,EAAE,wBAAwB,CAAC,iBAAiB,CAAC,CAAC;CAC7E,EACD,QAAQ,SAAS;IACf,wBAAwB,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAChE,8BAA8B,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IACtE,8BAA8B,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;CACvE,GAAG;IACF,wBAAwB,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAChE,8BAA8B,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IACtE,8BAA8B,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;CACvE,CACD,YAAW,sBAAsB,CAAC,iBAAiB,CAAC;;IASlD,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ;IAClC,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB,CAAC,OAAO,CAAC;IAC1E,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,eAAe;IACnD,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE;QAC7B,wBAAwB,EAAE,4BAA4B,CACpD,eAAe,EACf,GAAG,CAAC,0BAA0B,CAAC,EAC/B,QAAQ,CAAC,0BAA0B,CAAC,CACrC,CAAC;QACF,8BAA8B,EAAE,2BAA2B,CACzD,eAAe,EACf,GAAG,CAAC,gCAAgC,CAAC,EACrC,QAAQ,CAAC,gCAAgC,CAAC,CAC3C,CAAC;QACF,8BAA8B,EAAE,2BAA2B,CACzD,eAAe,EACf,GAAG,CAAC,gCAAgC,CAAC,EACrC,QAAQ,CAAC,gCAAgC,CAAC,CAC3C,CAAC;KACH;gBAnBkB,KAAK,EAAE,QAAQ,EACf,sBAAsB,EAAE,sBAAsB,CAAC,OAAO,CAAC,EACvD,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE;QAC7B,wBAAwB,EAAE,4BAA4B,CACpD,eAAe,EACf,GAAG,CAAC,0BAA0B,CAAC,EAC/B,QAAQ,CAAC,0BAA0B,CAAC,CACrC,CAAC;QACF,8BAA8B,EAAE,2BAA2B,CACzD,eAAe,EACf,GAAG,CAAC,gCAAgC,CAAC,EACrC,QAAQ,CAAC,gCAAgC,CAAC,CAC3C,CAAC;QACF,8BAA8B,EAAE,2BAA2B,CACzD,eAAe,EACf,GAAG,CAAC,gCAAgC,CAAC,EACrC,QAAQ,CAAC,gCAAgC,CAAC,CAC3C,CAAC;KACH;IAQH,SAAS,CAAC,cAAc,yBAAsC;IAExD,qBAAqB,CACzB,kBAAkB,EAAE,GAAG,CAAC,gCAAgC,CAAC,GACxD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAkBrC,kBAAkB,CAAC,EACvB,EAAE,EACH,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAa7C,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnD,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;CAI1D"}
@@ -0,0 +1,49 @@
1
+ import { createCacheKey } from '@forklaunch/core/cache';
2
+ import { transformIntoInternalDtoMapper } from '@forklaunch/core/dtoMapper';
3
+ export class BaseCheckoutSessionService {
4
+ cache;
5
+ openTelemetryCollector;
6
+ schemaValidator;
7
+ dtoMappers;
8
+ #dtoMappers;
9
+ constructor(cache, openTelemetryCollector, schemaValidator, dtoMappers) {
10
+ this.cache = cache;
11
+ this.openTelemetryCollector = openTelemetryCollector;
12
+ this.schemaValidator = schemaValidator;
13
+ this.dtoMappers = dtoMappers;
14
+ this.#dtoMappers = transformIntoInternalDtoMapper(dtoMappers, schemaValidator);
15
+ }
16
+ createCacheKey = createCacheKey('checkout_session');
17
+ async createCheckoutSession(checkoutSessionDto) {
18
+ const checkoutSession = this.#dtoMappers.CreateCheckoutSessionDtoMapper.deserializeDtoToEntity(checkoutSessionDto);
19
+ // Store the checkoutSession details in the cache
20
+ await this.cache.putRecord({
21
+ key: this.createCacheKey(checkoutSession.id),
22
+ value: checkoutSession,
23
+ ttlMilliseconds: this.cache.getTtlMilliseconds()
24
+ });
25
+ return this.#dtoMappers.CheckoutSessionDtoMapper.serializeEntityToDto(checkoutSession);
26
+ }
27
+ async getCheckoutSession({ id }) {
28
+ const checkoutSessionDetails = await this.cache.readRecord(this.createCacheKey(id));
29
+ if (!checkoutSessionDetails) {
30
+ throw new Error('Session not found');
31
+ }
32
+ return this.#dtoMappers.CheckoutSessionDtoMapper.serializeEntityToDto(checkoutSessionDetails.value);
33
+ }
34
+ async expireCheckoutSession({ id }) {
35
+ const checkoutSessionDetails = await this.cache.readRecord(this.createCacheKey(id));
36
+ if (!checkoutSessionDetails) {
37
+ throw new Error('Session not found');
38
+ }
39
+ await this.cache.deleteRecord(this.createCacheKey(id));
40
+ }
41
+ async handleCheckoutSuccess({ id }) {
42
+ this.openTelemetryCollector.info('Checkout success', { id });
43
+ await this.cache.deleteRecord(this.createCacheKey(id));
44
+ }
45
+ async handleCheckoutFailure({ id }) {
46
+ this.openTelemetryCollector.info('Checkout failure', { id });
47
+ await this.cache.deleteRecord(this.createCacheKey(id));
48
+ }
49
+ }
@@ -0,0 +1,48 @@
1
+ import { CreatePaymentLinkDto, PaymentLinkDto, PaymentLinkService, UpdatePaymentLinkDto } from '@forklaunch/interfaces-billing';
2
+ import { IdDto, IdsDto } from '@forklaunch/common';
3
+ import { TtlCache } from '@forklaunch/core/cache';
4
+ import { RequestDtoMapperConstructor, ResponseDtoMapperConstructor } from '@forklaunch/core/dtoMapper';
5
+ import { MetricsDefinition, OpenTelemetryCollector } from '@forklaunch/core/http';
6
+ import { AnySchemaValidator } from '@forklaunch/validator';
7
+ export declare class BasePaymentLinkService<SchemaValidator extends AnySchemaValidator, CurrencyEnum, Metrics extends MetricsDefinition = MetricsDefinition, Dto extends {
8
+ PaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
9
+ CreatePaymentLinkDtoMapper: CreatePaymentLinkDto<CurrencyEnum>;
10
+ UpdatePaymentLinkDtoMapper: UpdatePaymentLinkDto<CurrencyEnum>;
11
+ } = {
12
+ PaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
13
+ CreatePaymentLinkDtoMapper: CreatePaymentLinkDto<CurrencyEnum>;
14
+ UpdatePaymentLinkDtoMapper: UpdatePaymentLinkDto<CurrencyEnum>;
15
+ }, Entities extends {
16
+ PaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
17
+ CreatePaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
18
+ UpdatePaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
19
+ } = {
20
+ PaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
21
+ CreatePaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
22
+ UpdatePaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
23
+ }> implements PaymentLinkService<CurrencyEnum> {
24
+ #private;
25
+ protected readonly cache: TtlCache;
26
+ protected readonly openTelemetryCollector: OpenTelemetryCollector<Metrics>;
27
+ protected readonly schemaValidator: SchemaValidator;
28
+ protected readonly dtoMappers: {
29
+ PaymentLinkDtoMapper: ResponseDtoMapperConstructor<SchemaValidator, Dto['PaymentLinkDtoMapper'], Entities['PaymentLinkDtoMapper']>;
30
+ CreatePaymentLinkDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['CreatePaymentLinkDtoMapper'], Entities['CreatePaymentLinkDtoMapper']>;
31
+ UpdatePaymentLinkDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['UpdatePaymentLinkDtoMapper'], Entities['UpdatePaymentLinkDtoMapper']>;
32
+ };
33
+ constructor(cache: TtlCache, openTelemetryCollector: OpenTelemetryCollector<Metrics>, schemaValidator: SchemaValidator, dtoMappers: {
34
+ PaymentLinkDtoMapper: ResponseDtoMapperConstructor<SchemaValidator, Dto['PaymentLinkDtoMapper'], Entities['PaymentLinkDtoMapper']>;
35
+ CreatePaymentLinkDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['CreatePaymentLinkDtoMapper'], Entities['CreatePaymentLinkDtoMapper']>;
36
+ UpdatePaymentLinkDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['UpdatePaymentLinkDtoMapper'], Entities['UpdatePaymentLinkDtoMapper']>;
37
+ });
38
+ protected cacheKeyPrefix: string;
39
+ protected createCacheKey: (id: string) => string;
40
+ createPaymentLink(paymentLinkDto: Dto['CreatePaymentLinkDtoMapper']): Promise<Dto['PaymentLinkDtoMapper']>;
41
+ updatePaymentLink(paymentLinkDto: Dto['UpdatePaymentLinkDtoMapper']): Promise<Dto['PaymentLinkDtoMapper']>;
42
+ getPaymentLink({ id }: IdDto): Promise<Dto['PaymentLinkDtoMapper']>;
43
+ expirePaymentLink({ id }: IdDto): Promise<void>;
44
+ handlePaymentSuccess({ id }: IdDto): Promise<void>;
45
+ handlePaymentFailure({ id }: IdDto): Promise<void>;
46
+ listPaymentLinks(idsDto?: IdsDto): Promise<Dto['PaymentLinkDtoMapper'][]>;
47
+ }
48
+ //# sourceMappingURL=paymentLink.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paymentLink.service.d.ts","sourceRoot":"","sources":["../../services/paymentLink.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { createCacheKey } from '@forklaunch/core/cache';
2
+ import { transformIntoInternalDtoMapper } from '@forklaunch/core/dtoMapper';
3
+ export class BasePaymentLinkService {
4
+ cache;
5
+ openTelemetryCollector;
6
+ schemaValidator;
7
+ dtoMappers;
8
+ #dtoMappers;
9
+ constructor(cache, openTelemetryCollector, schemaValidator, dtoMappers) {
10
+ this.cache = cache;
11
+ this.openTelemetryCollector = openTelemetryCollector;
12
+ this.schemaValidator = schemaValidator;
13
+ this.dtoMappers = dtoMappers;
14
+ this.#dtoMappers = transformIntoInternalDtoMapper(dtoMappers, schemaValidator);
15
+ }
16
+ cacheKeyPrefix = 'payment_link';
17
+ createCacheKey = createCacheKey(this.cacheKeyPrefix);
18
+ async createPaymentLink(paymentLinkDto) {
19
+ // TODO: Perform permission checks here
20
+ const paymentLink = this.#dtoMappers.CreatePaymentLinkDtoMapper.deserializeDtoToEntity(paymentLinkDto);
21
+ await this.cache.putRecord({
22
+ key: this.createCacheKey(paymentLink.id),
23
+ value: paymentLink,
24
+ ttlMilliseconds: this.cache.getTtlMilliseconds()
25
+ });
26
+ return this.#dtoMappers.PaymentLinkDtoMapper.serializeEntityToDto(paymentLink);
27
+ }
28
+ async updatePaymentLink(paymentLinkDto) {
29
+ const cacheKey = this.createCacheKey(paymentLinkDto.id);
30
+ const existingLink = await this.cache.readRecord(cacheKey);
31
+ if (!existingLink) {
32
+ throw new Error('Payment link not found');
33
+ }
34
+ const paymentLink = this.#dtoMappers.UpdatePaymentLinkDtoMapper.deserializeDtoToEntity(paymentLinkDto);
35
+ const updatedLink = { ...existingLink, ...paymentLink };
36
+ await this.cache.putRecord({
37
+ key: cacheKey,
38
+ value: updatedLink,
39
+ ttlMilliseconds: this.cache.getTtlMilliseconds()
40
+ });
41
+ return this.#dtoMappers.PaymentLinkDtoMapper.serializeEntityToDto(updatedLink);
42
+ }
43
+ async getPaymentLink({ id }) {
44
+ const cacheKey = this.createCacheKey(id);
45
+ const paymentLink = await this.cache.readRecord(cacheKey);
46
+ if (!paymentLink) {
47
+ throw new Error('Payment link not found');
48
+ }
49
+ return this.#dtoMappers.PaymentLinkDtoMapper.serializeEntityToDto(paymentLink.value);
50
+ }
51
+ async expirePaymentLink({ id }) {
52
+ this.openTelemetryCollector.info('Payment link expired', { id });
53
+ await this.cache.deleteRecord(this.createCacheKey(id));
54
+ }
55
+ async handlePaymentSuccess({ id }) {
56
+ this.openTelemetryCollector.info('Payment link success', { id });
57
+ await this.cache.deleteRecord(this.createCacheKey(id));
58
+ }
59
+ async handlePaymentFailure({ id }) {
60
+ this.openTelemetryCollector.info('Payment link failure', { id });
61
+ await this.cache.deleteRecord(this.createCacheKey(id));
62
+ }
63
+ async listPaymentLinks(idsDto) {
64
+ const keys = idsDto?.ids.map((id) => this.createCacheKey(id)) ??
65
+ (await this.cache.listKeys(this.cacheKeyPrefix));
66
+ return await Promise.all(keys.map(async (key) => {
67
+ const paymentLink = await this.cache.readRecord(key);
68
+ const paymentLinkDto = this.#dtoMappers.PaymentLinkDtoMapper.serializeEntityToDto(paymentLink.value);
69
+ return paymentLinkDto;
70
+ }));
71
+ }
72
+ }
@@ -0,0 +1,42 @@
1
+ import { CreatePlanDto, PlanDto, PlanService, UpdatePlanDto } from '@forklaunch/interfaces-billing';
2
+ import { IdDto, IdsDto } from '@forklaunch/common';
3
+ import { RequestDtoMapperConstructor, ResponseDtoMapperConstructor } from '@forklaunch/core/dtoMapper';
4
+ import { MetricsDefinition, OpenTelemetryCollector } from '@forklaunch/core/http';
5
+ import { AnySchemaValidator } from '@forklaunch/validator';
6
+ import { EntityManager } from '@mikro-orm/core';
7
+ export declare class BasePlanService<SchemaValidator extends AnySchemaValidator, PlanCadenceEnum, BillingProviderEnum, Metrics extends MetricsDefinition = MetricsDefinition, Dto extends {
8
+ PlanDtoMapper: PlanDto<PlanCadenceEnum, BillingProviderEnum>;
9
+ CreatePlanDtoMapper: CreatePlanDto<PlanCadenceEnum, BillingProviderEnum>;
10
+ UpdatePlanDtoMapper: UpdatePlanDto<PlanCadenceEnum, BillingProviderEnum>;
11
+ } = {
12
+ PlanDtoMapper: PlanDto<PlanCadenceEnum, BillingProviderEnum>;
13
+ CreatePlanDtoMapper: CreatePlanDto<PlanCadenceEnum, BillingProviderEnum>;
14
+ UpdatePlanDtoMapper: UpdatePlanDto<PlanCadenceEnum, BillingProviderEnum>;
15
+ }, Entities extends {
16
+ PlanDtoMapper: PlanDto<PlanCadenceEnum, BillingProviderEnum>;
17
+ CreatePlanDtoMapper: PlanDto<PlanCadenceEnum, BillingProviderEnum>;
18
+ UpdatePlanDtoMapper: PlanDto<PlanCadenceEnum, BillingProviderEnum>;
19
+ } = {
20
+ PlanDtoMapper: PlanDto<PlanCadenceEnum, BillingProviderEnum>;
21
+ CreatePlanDtoMapper: PlanDto<PlanCadenceEnum, BillingProviderEnum>;
22
+ UpdatePlanDtoMapper: PlanDto<PlanCadenceEnum, BillingProviderEnum>;
23
+ }> implements PlanService<PlanCadenceEnum, BillingProviderEnum> {
24
+ #private;
25
+ private em;
26
+ private readonly openTelemetryCollector;
27
+ private readonly schemaValidator;
28
+ private readonly dtoMappers;
29
+ constructor(em: EntityManager, openTelemetryCollector: OpenTelemetryCollector<Metrics>, schemaValidator: SchemaValidator, dtoMappers: {
30
+ PlanDtoMapper: ResponseDtoMapperConstructor<SchemaValidator, Dto['PlanDtoMapper'], Entities['PlanDtoMapper']>;
31
+ CreatePlanDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['CreatePlanDtoMapper'], Entities['CreatePlanDtoMapper']>;
32
+ UpdatePlanDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['UpdatePlanDtoMapper'], Entities['UpdatePlanDtoMapper']>;
33
+ });
34
+ listPlans(idsDto?: IdsDto, em?: EntityManager): Promise<Dto['PlanDtoMapper'][]>;
35
+ createPlan(planDto: Dto['CreatePlanDtoMapper'], em?: EntityManager): Promise<Dto['PlanDtoMapper']>;
36
+ getPlan(idDto: IdDto, em?: EntityManager): Promise<Dto['PlanDtoMapper']>;
37
+ updatePlan(planDto: Dto['UpdatePlanDtoMapper'], em?: EntityManager): Promise<Dto['PlanDtoMapper']>;
38
+ deletePlan(idDto: {
39
+ id: string;
40
+ }, em?: EntityManager): Promise<void>;
41
+ }
42
+ //# sourceMappingURL=plan.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.service.d.ts","sourceRoot":"","sources":["../../services/plan.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { transformIntoInternalDtoMapper } from '@forklaunch/core/dtoMapper';
2
+ export class BasePlanService {
3
+ em;
4
+ openTelemetryCollector;
5
+ schemaValidator;
6
+ dtoMappers;
7
+ #dtoMappers;
8
+ constructor(em, openTelemetryCollector, schemaValidator, dtoMappers) {
9
+ this.em = em;
10
+ this.openTelemetryCollector = openTelemetryCollector;
11
+ this.schemaValidator = schemaValidator;
12
+ this.dtoMappers = dtoMappers;
13
+ this.#dtoMappers = transformIntoInternalDtoMapper(dtoMappers, schemaValidator);
14
+ }
15
+ async listPlans(idsDto, em) {
16
+ return (await (em ?? this.em).findAll('Plan', {
17
+ filters: idsDto?.ids ? { id: { $in: idsDto.ids } } : undefined
18
+ })).map((plan) => this.#dtoMappers.PlanDtoMapper.serializeEntityToDto(plan));
19
+ }
20
+ async createPlan(planDto, em) {
21
+ const plan = this.#dtoMappers.CreatePlanDtoMapper.deserializeDtoToEntity(planDto);
22
+ await (em ?? this.em).transactional(async (innerEm) => {
23
+ await innerEm.persist(plan);
24
+ });
25
+ return this.#dtoMappers.PlanDtoMapper.serializeEntityToDto(plan);
26
+ }
27
+ async getPlan(idDto, em) {
28
+ const plan = await (em ?? this.em).findOneOrFail('Plan', idDto);
29
+ return this.#dtoMappers.PlanDtoMapper.serializeEntityToDto(plan);
30
+ }
31
+ async updatePlan(planDto, em) {
32
+ const plan = this.#dtoMappers.UpdatePlanDtoMapper.deserializeDtoToEntity(planDto);
33
+ const updatedPlan = await (em ?? this.em).upsert(plan);
34
+ await (em ?? this.em).transactional(async (innerEm) => {
35
+ await innerEm.persist(plan);
36
+ });
37
+ const updatedPlanDto = this.#dtoMappers.PlanDtoMapper.serializeEntityToDto(updatedPlan);
38
+ return updatedPlanDto;
39
+ }
40
+ async deletePlan(idDto, em) {
41
+ await (em ?? this.em).nativeDelete('Plan', idDto);
42
+ }
43
+ }
@@ -0,0 +1,52 @@
1
+ import { CreateSubscriptionDto, SubscriptionDto, SubscriptionService, UpdateSubscriptionDto } from '@forklaunch/interfaces-billing';
2
+ import { IdDto } from '@forklaunch/common';
3
+ import { RequestDtoMapperConstructor, ResponseDtoMapperConstructor } from '@forklaunch/core/dtoMapper';
4
+ import { MetricsDefinition, OpenTelemetryCollector } from '@forklaunch/core/http';
5
+ import { AnySchemaValidator } from '@forklaunch/validator';
6
+ import { EntityManager } from '@mikro-orm/core';
7
+ export declare class BaseSubscriptionService<SchemaValidator extends AnySchemaValidator, PartyType, BillingProviderType, Metrics extends MetricsDefinition = MetricsDefinition, Dto extends {
8
+ SubscriptionDtoMapper: SubscriptionDto<PartyType, BillingProviderType>;
9
+ CreateSubscriptionDtoMapper: CreateSubscriptionDto<PartyType, BillingProviderType>;
10
+ UpdateSubscriptionDtoMapper: UpdateSubscriptionDto<PartyType, BillingProviderType>;
11
+ } = {
12
+ SubscriptionDtoMapper: SubscriptionDto<PartyType, BillingProviderType>;
13
+ CreateSubscriptionDtoMapper: CreateSubscriptionDto<PartyType, BillingProviderType>;
14
+ UpdateSubscriptionDtoMapper: UpdateSubscriptionDto<PartyType, BillingProviderType>;
15
+ }, Entities extends {
16
+ SubscriptionDtoMapper: SubscriptionDto<PartyType, BillingProviderType>;
17
+ CreateSubscriptionDtoMapper: SubscriptionDto<PartyType, BillingProviderType>;
18
+ UpdateSubscriptionDtoMapper: SubscriptionDto<PartyType, BillingProviderType>;
19
+ } = {
20
+ SubscriptionDtoMapper: SubscriptionDto<PartyType, BillingProviderType>;
21
+ CreateSubscriptionDtoMapper: SubscriptionDto<PartyType, BillingProviderType>;
22
+ UpdateSubscriptionDtoMapper: SubscriptionDto<PartyType, BillingProviderType>;
23
+ }> implements SubscriptionService<PartyType, BillingProviderType> {
24
+ #private;
25
+ protected em: EntityManager;
26
+ protected readonly openTelemetryCollector: OpenTelemetryCollector<Metrics>;
27
+ protected readonly schemaValidator: SchemaValidator;
28
+ protected readonly dtoMappers: {
29
+ SubscriptionDtoMapper: ResponseDtoMapperConstructor<SchemaValidator, Dto['SubscriptionDtoMapper'], Entities['SubscriptionDtoMapper']>;
30
+ CreateSubscriptionDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['CreateSubscriptionDtoMapper'], Entities['CreateSubscriptionDtoMapper']>;
31
+ UpdateSubscriptionDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['UpdateSubscriptionDtoMapper'], Entities['UpdateSubscriptionDtoMapper']>;
32
+ };
33
+ constructor(em: EntityManager, openTelemetryCollector: OpenTelemetryCollector<Metrics>, schemaValidator: SchemaValidator, dtoMappers: {
34
+ SubscriptionDtoMapper: ResponseDtoMapperConstructor<SchemaValidator, Dto['SubscriptionDtoMapper'], Entities['SubscriptionDtoMapper']>;
35
+ CreateSubscriptionDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['CreateSubscriptionDtoMapper'], Entities['CreateSubscriptionDtoMapper']>;
36
+ UpdateSubscriptionDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['UpdateSubscriptionDtoMapper'], Entities['UpdateSubscriptionDtoMapper']>;
37
+ });
38
+ createSubscription(subscriptionDto: Dto['CreateSubscriptionDtoMapper'], em?: EntityManager): Promise<Dto['SubscriptionDtoMapper']>;
39
+ getSubscription(idDto: IdDto, em?: EntityManager): Promise<Dto['SubscriptionDtoMapper']>;
40
+ getUserSubscription({ id }: IdDto, em?: EntityManager): Promise<Dto['SubscriptionDtoMapper']>;
41
+ getOrganizationSubscription({ id }: IdDto, em?: EntityManager): Promise<Dto['SubscriptionDtoMapper']>;
42
+ updateSubscription(subscriptionDto: Dto['UpdateSubscriptionDtoMapper'], em?: EntityManager): Promise<Dto['SubscriptionDtoMapper']>;
43
+ deleteSubscription(idDto: {
44
+ id: string;
45
+ }, em?: EntityManager): Promise<void>;
46
+ listSubscriptions(idsDto: {
47
+ ids?: string[];
48
+ }, em?: EntityManager): Promise<Dto['SubscriptionDtoMapper'][]>;
49
+ cancelSubscription(idDto: IdDto, em?: EntityManager): Promise<void>;
50
+ resumeSubscription(idDto: IdDto, em?: EntityManager): Promise<void>;
51
+ }
52
+ //# sourceMappingURL=subscription.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription.service.d.ts","sourceRoot":"","sources":["../../services/subscription.service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,KAAK,EAAsB,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAEL,2BAA2B,EAC3B,4BAA4B,EAE7B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,qBAAa,uBAAuB,CAClC,eAAe,SAAS,kBAAkB,EAC1C,SAAS,EACT,mBAAmB,EACnB,OAAO,SAAS,iBAAiB,GAAG,iBAAiB,EACrD,GAAG,SAAS;IACV,qBAAqB,EAAE,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACvE,2BAA2B,EAAE,qBAAqB,CAChD,SAAS,EACT,mBAAmB,CACpB,CAAC;IACF,2BAA2B,EAAE,qBAAqB,CAChD,SAAS,EACT,mBAAmB,CACpB,CAAC;CACH,GAAG;IACF,qBAAqB,EAAE,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACvE,2BAA2B,EAAE,qBAAqB,CAChD,SAAS,EACT,mBAAmB,CACpB,CAAC;IACF,2BAA2B,EAAE,qBAAqB,CAChD,SAAS,EACT,mBAAmB,CACpB,CAAC;CACH,EACD,QAAQ,SAAS;IACf,qBAAqB,EAAE,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACvE,2BAA2B,EAAE,eAAe,CAC1C,SAAS,EACT,mBAAmB,CACpB,CAAC;IACF,2BAA2B,EAAE,eAAe,CAC1C,SAAS,EACT,mBAAmB,CACpB,CAAC;CACH,GAAG;IACF,qBAAqB,EAAE,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACvE,2BAA2B,EAAE,eAAe,CAC1C,SAAS,EACT,mBAAmB,CACpB,CAAC;IACF,2BAA2B,EAAE,eAAe,CAC1C,SAAS,EACT,mBAAmB,CACpB,CAAC;CACH,CACD,YAAW,mBAAmB,CAAC,SAAS,EAAE,mBAAmB,CAAC;;IAS5D,SAAS,CAAC,EAAE,EAAE,aAAa;IAC3B,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB,CAAC,OAAO,CAAC;IAC1E,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,eAAe;IACnD,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE;QAC7B,qBAAqB,EAAE,4BAA4B,CACjD,eAAe,EACf,GAAG,CAAC,uBAAuB,CAAC,EAC5B,QAAQ,CAAC,uBAAuB,CAAC,CAClC,CAAC;QACF,2BAA2B,EAAE,2BAA2B,CACtD,eAAe,EACf,GAAG,CAAC,6BAA6B,CAAC,EAClC,QAAQ,CAAC,6BAA6B,CAAC,CACxC,CAAC;QACF,2BAA2B,EAAE,2BAA2B,CACtD,eAAe,EACf,GAAG,CAAC,6BAA6B,CAAC,EAClC,QAAQ,CAAC,6BAA6B,CAAC,CACxC,CAAC;KACH;gBAnBS,EAAE,EAAE,aAAa,EACR,sBAAsB,EAAE,sBAAsB,CAAC,OAAO,CAAC,EACvD,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE;QAC7B,qBAAqB,EAAE,4BAA4B,CACjD,eAAe,EACf,GAAG,CAAC,uBAAuB,CAAC,EAC5B,QAAQ,CAAC,uBAAuB,CAAC,CAClC,CAAC;QACF,2BAA2B,EAAE,2BAA2B,CACtD,eAAe,EACf,GAAG,CAAC,6BAA6B,CAAC,EAClC,QAAQ,CAAC,6BAA6B,CAAC,CACxC,CAAC;QACF,2BAA2B,EAAE,2BAA2B,CACtD,eAAe,EACf,GAAG,CAAC,6BAA6B,CAAC,EAClC,QAAQ,CAAC,6BAA6B,CAAC,CACxC,CAAC;KACH;IAUG,kBAAkB,CACtB,eAAe,EAAE,GAAG,CAAC,6BAA6B,CAAC,EACnD,EAAE,CAAC,EAAE,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAalC,eAAe,CACnB,KAAK,EAAE,KAAK,EACZ,EAAE,CAAC,EAAE,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAUlC,mBAAmB,CACvB,EAAE,EAAE,EAAE,EAAE,KAAK,EACb,EAAE,CAAC,EAAE,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAYlC,2BAA2B,CAC/B,EAAE,EAAE,EAAE,EAAE,KAAK,EACb,EAAE,CAAC,EAAE,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAWlC,kBAAkB,CACtB,eAAe,EAAE,GAAG,CAAC,6BAA6B,CAAC,EACnD,EAAE,CAAC,EAAE,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAiBlC,kBAAkB,CACtB,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,EACrB,EAAE,CAAC,EAAE,aAAa,GACjB,OAAO,CAAC,IAAI,CAAC;IAQV,iBAAiB,CACrB,MAAM,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,EAC1B,EAAE,CAAC,EAAE,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC;IAoBpC,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAWnE,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAU1E"}
@@ -0,0 +1,94 @@
1
+ import { transformIntoInternalDtoMapper } from '@forklaunch/core/dtoMapper';
2
+ export class BaseSubscriptionService {
3
+ em;
4
+ openTelemetryCollector;
5
+ schemaValidator;
6
+ dtoMappers;
7
+ #dtoMappers;
8
+ constructor(em, openTelemetryCollector, schemaValidator, dtoMappers) {
9
+ this.em = em;
10
+ this.openTelemetryCollector = openTelemetryCollector;
11
+ this.schemaValidator = schemaValidator;
12
+ this.dtoMappers = dtoMappers;
13
+ this.#dtoMappers = transformIntoInternalDtoMapper(dtoMappers, this.schemaValidator);
14
+ }
15
+ async createSubscription(subscriptionDto, em) {
16
+ const subscription = this.#dtoMappers.CreateSubscriptionDtoMapper.deserializeDtoToEntity(subscriptionDto);
17
+ await (em ?? this.em).transactional(async (innerEm) => {
18
+ await innerEm.persist(subscription);
19
+ });
20
+ const createdSubscriptionDto = this.#dtoMappers.SubscriptionDtoMapper.serializeEntityToDto(subscription);
21
+ return createdSubscriptionDto;
22
+ }
23
+ async getSubscription(idDto, em) {
24
+ const subscription = await (em ?? this.em).findOneOrFail('Subscription', idDto);
25
+ return this.#dtoMappers.SubscriptionDtoMapper.serializeEntityToDto(subscription);
26
+ }
27
+ async getUserSubscription({ id }, em) {
28
+ const subscription = await (em ?? this.em).findOneOrFail('Subscription', {
29
+ partyId: id,
30
+ partyType: 'USER',
31
+ active: true
32
+ });
33
+ return this.#dtoMappers.SubscriptionDtoMapper.serializeEntityToDto(subscription);
34
+ }
35
+ async getOrganizationSubscription({ id }, em) {
36
+ const subscription = await (em ?? this.em).findOneOrFail('Subscription', {
37
+ partyId: id,
38
+ partyType: 'ORGANIZATION',
39
+ active: true
40
+ });
41
+ return this.#dtoMappers.SubscriptionDtoMapper.serializeEntityToDto(subscription);
42
+ }
43
+ async updateSubscription(subscriptionDto, em) {
44
+ const subscription = this.#dtoMappers.UpdateSubscriptionDtoMapper.deserializeDtoToEntity(subscriptionDto);
45
+ const updatedSubscription = await (em ?? this.em).upsert(subscription);
46
+ await (em ?? this.em).transactional(async (innerEm) => {
47
+ await innerEm.persist(updatedSubscription);
48
+ });
49
+ const updatedSubscriptionDto = this.#dtoMappers.SubscriptionDtoMapper.serializeEntityToDto(updatedSubscription);
50
+ return updatedSubscriptionDto;
51
+ }
52
+ async deleteSubscription(idDto, em) {
53
+ const subscription = await (em ?? this.em).findOne('Subscription', idDto);
54
+ if (!subscription) {
55
+ throw new Error('Subscription not found');
56
+ }
57
+ await (em ?? this.em).removeAndFlush(subscription);
58
+ }
59
+ async listSubscriptions(idsDto, em) {
60
+ const subscriptions = await (em ?? this.em).findAll('Subscription', {
61
+ where: idsDto.ids
62
+ ? {
63
+ id: {
64
+ $in: idsDto.ids
65
+ }
66
+ }
67
+ : undefined
68
+ });
69
+ return subscriptions.map((subscription) => {
70
+ const subscriptionDto = this.#dtoMappers.SubscriptionDtoMapper.serializeEntityToDto(subscription);
71
+ return subscriptionDto;
72
+ });
73
+ }
74
+ async cancelSubscription(idDto, em) {
75
+ const subscription = await (em ?? this.em).findOne('Subscription', idDto);
76
+ if (!subscription) {
77
+ throw new Error('Subscription not found');
78
+ }
79
+ subscription.active = false;
80
+ await (em ?? this.em).transactional(async (innerEm) => {
81
+ await innerEm.persist(subscription);
82
+ });
83
+ }
84
+ async resumeSubscription(idDto, em) {
85
+ const subscription = await (em ?? this.em).findOne('Subscription', idDto);
86
+ if (!subscription) {
87
+ throw new Error('Subscription not found');
88
+ }
89
+ subscription.active = true;
90
+ await (em ?? this.em).transactional(async (innerEm) => {
91
+ await innerEm.persist(subscription);
92
+ });
93
+ }
94
+ }