@forklaunch/implementation-billing-base 0.1.17 → 0.2.1

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 (41) hide show
  1. package/lib/__test__/schemaEquality.test.js +35 -14
  2. package/lib/eject/domain/schemas/checkoutSession.schema.ts +24 -4
  3. package/lib/eject/domain/schemas/paymentLink.schema.ts +24 -4
  4. package/lib/eject/services/billingPortal.service.ts +104 -32
  5. package/lib/eject/services/checkoutSession.service.ts +115 -32
  6. package/lib/eject/services/paymentLink.service.ts +116 -41
  7. package/lib/eject/services/plan.service.ts +60 -22
  8. package/lib/eject/services/subscription.service.ts +83 -26
  9. package/lib/schemas/checkoutSession.schema.d.ts +97 -11
  10. package/lib/schemas/checkoutSession.schema.d.ts.map +1 -1
  11. package/lib/schemas/paymentLink.schema.d.ts +101 -12
  12. package/lib/schemas/paymentLink.schema.d.ts.map +1 -1
  13. package/lib/schemas/typebox/checkoutSession.schema.d.ts +130 -10
  14. package/lib/schemas/typebox/checkoutSession.schema.d.ts.map +1 -1
  15. package/lib/schemas/typebox/checkoutSession.schema.js +9 -3
  16. package/lib/schemas/typebox/paymentLink.schema.d.ts +144 -12
  17. package/lib/schemas/typebox/paymentLink.schema.d.ts.map +1 -1
  18. package/lib/schemas/typebox/paymentLink.schema.js +9 -3
  19. package/lib/schemas/zod/checkoutSession.schema.d.ts +66 -12
  20. package/lib/schemas/zod/checkoutSession.schema.d.ts.map +1 -1
  21. package/lib/schemas/zod/checkoutSession.schema.js +9 -3
  22. package/lib/schemas/zod/paymentLink.schema.d.ts +66 -12
  23. package/lib/schemas/zod/paymentLink.schema.d.ts.map +1 -1
  24. package/lib/schemas/zod/paymentLink.schema.js +9 -3
  25. package/lib/services/billingPortal.service.d.ts +25 -7
  26. package/lib/services/billingPortal.service.d.ts.map +1 -1
  27. package/lib/services/billingPortal.service.js +87 -29
  28. package/lib/services/checkoutSession.service.d.ts +63 -20
  29. package/lib/services/checkoutSession.service.d.ts.map +1 -1
  30. package/lib/services/checkoutSession.service.js +67 -16
  31. package/lib/services/paymentLink.service.d.ts +39 -20
  32. package/lib/services/paymentLink.service.d.ts.map +1 -1
  33. package/lib/services/paymentLink.service.js +88 -24
  34. package/lib/services/plan.service.d.ts +19 -7
  35. package/lib/services/plan.service.d.ts.map +1 -1
  36. package/lib/services/plan.service.js +49 -17
  37. package/lib/services/subscription.service.d.ts +21 -7
  38. package/lib/services/subscription.service.d.ts.map +1 -1
  39. package/lib/services/subscription.service.js +72 -20
  40. package/lib/tsconfig.tsbuildinfo +1 -1
  41. package/package.json +6 -6
@@ -7,18 +7,20 @@ import {
7
7
  unknown,
8
8
  uuid
9
9
  } from '@forklaunch/validator/zod';
10
- export const CreatePaymentLinkSchema = (CurrencyEnum) => ({
10
+ export const CreatePaymentLinkSchema = (CurrencyEnum, StatusEnum) => ({
11
11
  amount: number,
12
12
  currency: enum_(CurrencyEnum),
13
13
  description: optional(string),
14
14
  metadata: optional(unknown),
15
15
  successRedirectUri: string,
16
16
  cancelRedirectUri: string,
17
+ expiresAt: date,
18
+ status: enum_(StatusEnum),
17
19
  extraFields: optional(unknown)
18
20
  });
19
21
  export const UpdatePaymentLinkSchema =
20
22
  ({ uuidId }) =>
21
- (CurrencyEnum) => ({
23
+ (CurrencyEnum, StatusEnum) => ({
22
24
  id: uuidId ? uuid : string,
23
25
  amount: optional(number),
24
26
  currency: optional(enum_(CurrencyEnum)),
@@ -26,11 +28,13 @@ export const UpdatePaymentLinkSchema =
26
28
  metadata: optional(unknown),
27
29
  successRedirectUri: optional(string),
28
30
  cancelRedirectUri: optional(string),
31
+ expiresAt: optional(date),
32
+ status: optional(enum_(StatusEnum)),
29
33
  extraFields: optional(unknown)
30
34
  });
31
35
  export const PaymentLinkSchema =
32
36
  ({ uuidId }) =>
33
- (CurrencyEnum) => ({
37
+ (CurrencyEnum, StatusEnum) => ({
34
38
  id: uuidId ? uuid : string,
35
39
  amount: number,
36
40
  currency: enum_(CurrencyEnum),
@@ -38,6 +42,8 @@ export const PaymentLinkSchema =
38
42
  metadata: optional(unknown),
39
43
  successRedirectUri: string,
40
44
  cancelRedirectUri: string,
45
+ expiresAt: date,
46
+ status: enum_(StatusEnum),
41
47
  extraFields: optional(unknown),
42
48
  createdAt: optional(date),
43
49
  updatedAt: optional(date)
@@ -1,13 +1,14 @@
1
1
  import { IdDto } from '@forklaunch/common';
2
2
  import { TtlCache } from '@forklaunch/core/cache';
3
+ import {
4
+ MetricsDefinition,
5
+ OpenTelemetryCollector,
6
+ TelemetryOptions
7
+ } from '@forklaunch/core/http';
3
8
  import {
4
9
  RequestDtoMapperConstructor,
5
10
  ResponseDtoMapperConstructor
6
11
  } from '@forklaunch/core/mappers';
7
- import {
8
- MetricsDefinition,
9
- OpenTelemetryCollector
10
- } from '@forklaunch/core/http';
11
12
  import { BillingPortalService } from '@forklaunch/interfaces-billing/interfaces';
12
13
  import {
13
14
  BillingPortalDto,
@@ -15,6 +16,7 @@ import {
15
16
  UpdateBillingPortalDto
16
17
  } from '@forklaunch/interfaces-billing/types';
17
18
  import { AnySchemaValidator } from '@forklaunch/validator';
19
+ import { EntityManager } from '@mikro-orm/core';
18
20
  export declare class BaseBillingPortalService<
19
21
  SchemaValidator extends AnySchemaValidator,
20
22
  Metrics extends MetricsDefinition = MetricsDefinition,
@@ -39,10 +41,11 @@ export declare class BaseBillingPortalService<
39
41
  > implements BillingPortalService
40
42
  {
41
43
  #private;
44
+ protected em: EntityManager;
42
45
  protected cache: TtlCache;
43
46
  protected openTelemetryCollector: OpenTelemetryCollector<Metrics>;
44
47
  protected schemaValidator: SchemaValidator;
45
- protected mapperss: {
48
+ protected mappers: {
46
49
  BillingPortalDtoMapper: ResponseDtoMapperConstructor<
47
50
  SchemaValidator,
48
51
  Dto['BillingPortalDtoMapper'],
@@ -59,11 +62,20 @@ export declare class BaseBillingPortalService<
59
62
  Entities['UpdateBillingPortalDtoMapper']
60
63
  >;
61
64
  };
65
+ readonly options?:
66
+ | {
67
+ telemetry?: TelemetryOptions;
68
+ enableDatabaseBackup?: boolean;
69
+ }
70
+ | undefined;
71
+ private evaluatedTelemetryOptions;
72
+ private enableDatabaseBackup;
62
73
  constructor(
74
+ em: EntityManager,
63
75
  cache: TtlCache,
64
76
  openTelemetryCollector: OpenTelemetryCollector<Metrics>,
65
77
  schemaValidator: SchemaValidator,
66
- mapperss: {
78
+ mappers: {
67
79
  BillingPortalDtoMapper: ResponseDtoMapperConstructor<
68
80
  SchemaValidator,
69
81
  Dto['BillingPortalDtoMapper'],
@@ -79,7 +91,13 @@ export declare class BaseBillingPortalService<
79
91
  Dto['UpdateBillingPortalDtoMapper'],
80
92
  Entities['UpdateBillingPortalDtoMapper']
81
93
  >;
82
- }
94
+ },
95
+ options?:
96
+ | {
97
+ telemetry?: TelemetryOptions;
98
+ enableDatabaseBackup?: boolean;
99
+ }
100
+ | undefined
83
101
  );
84
102
  protected createCacheKey: (id: string) => string;
85
103
  createBillingPortalSession(
@@ -1 +1 @@
1
- {"version":3,"file":"billingPortal.service.d.ts","sourceRoot":"","sources":["../../services/billingPortal.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"billingPortal.service.d.ts","sourceRoot":"","sources":["../../services/billingPortal.service.ts"],"names":[],"mappings":"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"}
@@ -1,64 +1,122 @@
1
1
  import { createCacheKey } from '@forklaunch/core/cache';
2
+ import { evaluateTelemetryOptions } from '@forklaunch/core/http';
2
3
  import { transformIntoInternalDtoMapper } from '@forklaunch/core/mappers';
3
4
  export class BaseBillingPortalService {
5
+ em;
4
6
  cache;
5
7
  openTelemetryCollector;
6
8
  schemaValidator;
7
- mapperss;
8
- #mapperss;
9
- constructor(cache, openTelemetryCollector, schemaValidator, mapperss) {
9
+ mappers;
10
+ options;
11
+ #mappers;
12
+ evaluatedTelemetryOptions;
13
+ enableDatabaseBackup;
14
+ constructor(
15
+ em,
16
+ cache,
17
+ openTelemetryCollector,
18
+ schemaValidator,
19
+ mappers,
20
+ options
21
+ ) {
22
+ this.em = em;
10
23
  this.cache = cache;
11
24
  this.openTelemetryCollector = openTelemetryCollector;
12
25
  this.schemaValidator = schemaValidator;
13
- this.mapperss = mapperss;
14
- this.#mapperss = transformIntoInternalDtoMapper(mapperss, schemaValidator);
26
+ this.mappers = mappers;
27
+ this.options = options;
28
+ this.#mappers = transformIntoInternalDtoMapper(mappers, schemaValidator);
29
+ this.enableDatabaseBackup = options?.enableDatabaseBackup ?? false;
30
+ this.evaluatedTelemetryOptions = options?.telemetry
31
+ ? evaluateTelemetryOptions(options.telemetry).enabled
32
+ : {
33
+ logging: false,
34
+ metrics: false,
35
+ tracing: false
36
+ };
15
37
  }
16
38
  createCacheKey = createCacheKey('billing_portal_session');
17
39
  async createBillingPortalSession(billingPortalDto) {
18
- const billingPortalSession =
19
- this.#mapperss.CreateBillingPortalDtoMapper.deserializeDtoToEntity(
40
+ if (this.evaluatedTelemetryOptions.logging) {
41
+ this.openTelemetryCollector.info(
42
+ 'Creating billing portal session',
20
43
  billingPortalDto
21
44
  );
22
- this.openTelemetryCollector.debug(
23
- 'Create billing portal session',
24
- billingPortalSession
25
- );
45
+ }
46
+ const billingPortal =
47
+ await this.#mappers.CreateBillingPortalDtoMapper.deserializeDtoToEntity(
48
+ billingPortalDto,
49
+ this.em
50
+ );
51
+ if (this.enableDatabaseBackup) {
52
+ await this.em.persistAndFlush(billingPortal);
53
+ }
54
+ const createdBillingPortalDto =
55
+ await this.#mappers.BillingPortalDtoMapper.serializeEntityToDto(
56
+ billingPortal
57
+ );
26
58
  await this.cache.putRecord({
27
- key: this.createCacheKey(billingPortalSession.id),
28
- value: billingPortalSession,
59
+ key: this.createCacheKey(createdBillingPortalDto.id),
60
+ value: createdBillingPortalDto,
29
61
  ttlMilliseconds: this.cache.getTtlMilliseconds()
30
62
  });
31
- return this.#mapperss.BillingPortalDtoMapper.serializeEntityToDto(
32
- billingPortalSession
33
- );
63
+ return createdBillingPortalDto;
34
64
  }
35
65
  async getBillingPortalSession(idDto) {
36
- const billingPortalSessionDetails = await this.cache.readRecord(
66
+ if (this.evaluatedTelemetryOptions.logging) {
67
+ this.openTelemetryCollector.info('Getting billing portal session', idDto);
68
+ }
69
+ const billingPortalDetails = await this.cache.readRecord(
37
70
  this.createCacheKey(idDto.id)
38
71
  );
39
- if (!billingPortalSessionDetails) {
72
+ if (!billingPortalDetails) {
40
73
  throw new Error('Session not found');
41
74
  }
42
- return this.#mapperss.BillingPortalDtoMapper.serializeEntityToDto(
43
- billingPortalSessionDetails.value
44
- );
75
+ return billingPortalDetails.value;
45
76
  }
46
77
  async updateBillingPortalSession(billingPortalDto) {
47
- const billingPortalSession =
48
- this.#mapperss.UpdateBillingPortalDtoMapper.deserializeDtoToEntity(
78
+ if (this.evaluatedTelemetryOptions.logging) {
79
+ this.openTelemetryCollector.info(
80
+ 'Updating billing portal session',
49
81
  billingPortalDto
50
82
  );
51
- // Save the updated session to your database or external service
83
+ }
84
+ const existingBillingPortal = (
85
+ await this.cache.readRecord(this.createCacheKey(billingPortalDto.id))
86
+ )?.value;
87
+ if (!existingBillingPortal) {
88
+ throw new Error('Session not found');
89
+ }
90
+ const billingPortal =
91
+ await this.#mappers.UpdateBillingPortalDtoMapper.deserializeDtoToEntity(
92
+ billingPortalDto,
93
+ this.em
94
+ );
95
+ if (this.enableDatabaseBackup) {
96
+ await this.em.persistAndFlush({
97
+ billingPortal
98
+ });
99
+ }
100
+ const updatedBillingPortalDto = {
101
+ ...existingBillingPortal,
102
+ ...(await this.#mappers.BillingPortalDtoMapper.serializeEntityToDto(
103
+ billingPortal
104
+ ))
105
+ };
52
106
  await this.cache.putRecord({
53
- key: this.createCacheKey(billingPortalSession.id),
54
- value: billingPortalSession,
107
+ key: this.createCacheKey(updatedBillingPortalDto.id),
108
+ value: updatedBillingPortalDto,
55
109
  ttlMilliseconds: this.cache.getTtlMilliseconds()
56
110
  });
57
- return this.#mapperss.BillingPortalDtoMapper.serializeEntityToDto(
58
- billingPortalSession
59
- );
111
+ return updatedBillingPortalDto;
60
112
  }
61
113
  async expireBillingPortalSession(idDto) {
114
+ if (this.evaluatedTelemetryOptions.logging) {
115
+ this.openTelemetryCollector.info(
116
+ 'Expiring billing portal session',
117
+ idDto
118
+ );
119
+ }
62
120
  const sessionExists = await this.cache.readRecord(
63
121
  this.createCacheKey(idDto.id)
64
122
  );
@@ -1,13 +1,14 @@
1
1
  import { IdDto } from '@forklaunch/common';
2
2
  import { TtlCache } from '@forklaunch/core/cache';
3
+ import {
4
+ MetricsDefinition,
5
+ OpenTelemetryCollector,
6
+ TelemetryOptions
7
+ } from '@forklaunch/core/http';
3
8
  import {
4
9
  RequestDtoMapperConstructor,
5
10
  ResponseDtoMapperConstructor
6
11
  } from '@forklaunch/core/mappers';
7
- import {
8
- MetricsDefinition,
9
- OpenTelemetryCollector
10
- } from '@forklaunch/core/http';
11
12
  import { CheckoutSessionService } from '@forklaunch/interfaces-billing/interfaces';
12
13
  import {
13
14
  CheckoutSessionDto,
@@ -15,35 +16,62 @@ import {
15
16
  UpdateCheckoutSessionDto
16
17
  } from '@forklaunch/interfaces-billing/types';
17
18
  import { AnySchemaValidator } from '@forklaunch/validator';
19
+ import { EntityManager } from '@mikro-orm/core';
18
20
  export declare class BaseCheckoutSessionService<
19
21
  SchemaValidator extends AnySchemaValidator,
20
22
  PaymentMethodEnum,
23
+ StatusEnum,
21
24
  Metrics extends MetricsDefinition = MetricsDefinition,
22
25
  Dto extends {
23
- CheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
24
- CreateCheckoutSessionDtoMapper: CreateCheckoutSessionDto<PaymentMethodEnum>;
25
- UpdateCheckoutSessionDtoMapper: UpdateCheckoutSessionDto<PaymentMethodEnum>;
26
+ CheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum, StatusEnum>;
27
+ CreateCheckoutSessionDtoMapper: CreateCheckoutSessionDto<
28
+ PaymentMethodEnum,
29
+ StatusEnum
30
+ >;
31
+ UpdateCheckoutSessionDtoMapper: UpdateCheckoutSessionDto<
32
+ PaymentMethodEnum,
33
+ StatusEnum
34
+ >;
26
35
  } = {
27
- CheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
28
- CreateCheckoutSessionDtoMapper: CreateCheckoutSessionDto<PaymentMethodEnum>;
29
- UpdateCheckoutSessionDtoMapper: UpdateCheckoutSessionDto<PaymentMethodEnum>;
36
+ CheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum, StatusEnum>;
37
+ CreateCheckoutSessionDtoMapper: CreateCheckoutSessionDto<
38
+ PaymentMethodEnum,
39
+ StatusEnum
40
+ >;
41
+ UpdateCheckoutSessionDtoMapper: UpdateCheckoutSessionDto<
42
+ PaymentMethodEnum,
43
+ StatusEnum
44
+ >;
30
45
  },
31
46
  Entities extends {
32
- CheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
33
- CreateCheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
34
- UpdateCheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
47
+ CheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum, StatusEnum>;
48
+ CreateCheckoutSessionDtoMapper: CheckoutSessionDto<
49
+ PaymentMethodEnum,
50
+ StatusEnum
51
+ >;
52
+ UpdateCheckoutSessionDtoMapper: CheckoutSessionDto<
53
+ PaymentMethodEnum,
54
+ StatusEnum
55
+ >;
35
56
  } = {
36
- CheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
37
- CreateCheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
38
- UpdateCheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum>;
57
+ CheckoutSessionDtoMapper: CheckoutSessionDto<PaymentMethodEnum, StatusEnum>;
58
+ CreateCheckoutSessionDtoMapper: CheckoutSessionDto<
59
+ PaymentMethodEnum,
60
+ StatusEnum
61
+ >;
62
+ UpdateCheckoutSessionDtoMapper: CheckoutSessionDto<
63
+ PaymentMethodEnum,
64
+ StatusEnum
65
+ >;
39
66
  }
40
- > implements CheckoutSessionService<PaymentMethodEnum>
67
+ > implements CheckoutSessionService<PaymentMethodEnum, StatusEnum>
41
68
  {
42
69
  #private;
70
+ protected readonly em: EntityManager;
43
71
  protected readonly cache: TtlCache;
44
72
  protected readonly openTelemetryCollector: OpenTelemetryCollector<Metrics>;
45
73
  protected readonly schemaValidator: SchemaValidator;
46
- protected readonly mapperss: {
74
+ protected readonly mappers: {
47
75
  CheckoutSessionDtoMapper: ResponseDtoMapperConstructor<
48
76
  SchemaValidator,
49
77
  Dto['CheckoutSessionDtoMapper'],
@@ -60,11 +88,20 @@ export declare class BaseCheckoutSessionService<
60
88
  Entities['UpdateCheckoutSessionDtoMapper']
61
89
  >;
62
90
  };
91
+ readonly options?:
92
+ | {
93
+ enableDatabaseBackup?: boolean;
94
+ telemetry?: TelemetryOptions;
95
+ }
96
+ | undefined;
97
+ private evaluatedTelemetryOptions;
98
+ private enableDatabaseBackup;
63
99
  constructor(
100
+ em: EntityManager,
64
101
  cache: TtlCache,
65
102
  openTelemetryCollector: OpenTelemetryCollector<Metrics>,
66
103
  schemaValidator: SchemaValidator,
67
- mapperss: {
104
+ mappers: {
68
105
  CheckoutSessionDtoMapper: ResponseDtoMapperConstructor<
69
106
  SchemaValidator,
70
107
  Dto['CheckoutSessionDtoMapper'],
@@ -80,7 +117,13 @@ export declare class BaseCheckoutSessionService<
80
117
  Dto['UpdateCheckoutSessionDtoMapper'],
81
118
  Entities['UpdateCheckoutSessionDtoMapper']
82
119
  >;
83
- }
120
+ },
121
+ options?:
122
+ | {
123
+ enableDatabaseBackup?: boolean;
124
+ telemetry?: TelemetryOptions;
125
+ }
126
+ | undefined
84
127
  );
85
128
  protected createCacheKey: (id: string) => string;
86
129
  createCheckoutSession(
@@ -1 +1 @@
1
- {"version":3,"file":"checkoutSession.service.d.ts","sourceRoot":"","sources":["../../services/checkoutSession.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checkoutSession.service.d.ts","sourceRoot":"","sources":["../../services/checkoutSession.service.ts"],"names":[],"mappings":"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"}
@@ -1,33 +1,66 @@
1
1
  import { createCacheKey } from '@forklaunch/core/cache';
2
+ import { evaluateTelemetryOptions } from '@forklaunch/core/http';
2
3
  import { transformIntoInternalDtoMapper } from '@forklaunch/core/mappers';
3
4
  export class BaseCheckoutSessionService {
5
+ em;
4
6
  cache;
5
7
  openTelemetryCollector;
6
8
  schemaValidator;
7
- mapperss;
8
- #mapperss;
9
- constructor(cache, openTelemetryCollector, schemaValidator, mapperss) {
9
+ mappers;
10
+ options;
11
+ #mappers;
12
+ evaluatedTelemetryOptions;
13
+ enableDatabaseBackup;
14
+ constructor(
15
+ em,
16
+ cache,
17
+ openTelemetryCollector,
18
+ schemaValidator,
19
+ mappers,
20
+ options
21
+ ) {
22
+ this.em = em;
10
23
  this.cache = cache;
11
24
  this.openTelemetryCollector = openTelemetryCollector;
12
25
  this.schemaValidator = schemaValidator;
13
- this.mapperss = mapperss;
14
- this.#mapperss = transformIntoInternalDtoMapper(mapperss, schemaValidator);
26
+ this.mappers = mappers;
27
+ this.options = options;
28
+ this.#mappers = transformIntoInternalDtoMapper(mappers, schemaValidator);
29
+ this.enableDatabaseBackup = options?.enableDatabaseBackup ?? false;
30
+ this.evaluatedTelemetryOptions = options?.telemetry
31
+ ? evaluateTelemetryOptions(options.telemetry).enabled
32
+ : {
33
+ logging: false,
34
+ metrics: false,
35
+ tracing: false
36
+ };
15
37
  }
16
38
  createCacheKey = createCacheKey('checkout_session');
17
39
  async createCheckoutSession(checkoutSessionDto) {
18
- const checkoutSession =
19
- this.#mapperss.CreateCheckoutSessionDtoMapper.deserializeDtoToEntity(
40
+ if (this.evaluatedTelemetryOptions.logging) {
41
+ this.openTelemetryCollector.info(
42
+ 'Creating checkout session',
20
43
  checkoutSessionDto
21
44
  );
22
- // Store the checkoutSession details in the cache
45
+ }
46
+ const checkoutSession =
47
+ await this.#mappers.CreateCheckoutSessionDtoMapper.deserializeDtoToEntity(
48
+ checkoutSessionDto,
49
+ this.em
50
+ );
51
+ const createdCheckoutSessionDto =
52
+ await this.#mappers.CheckoutSessionDtoMapper.serializeEntityToDto(
53
+ checkoutSession
54
+ );
55
+ if (this.enableDatabaseBackup) {
56
+ await this.em.persistAndFlush(checkoutSession);
57
+ }
23
58
  await this.cache.putRecord({
24
- key: this.createCacheKey(checkoutSession.id),
25
- value: checkoutSession,
59
+ key: this.createCacheKey(createdCheckoutSessionDto.id),
60
+ value: createdCheckoutSessionDto,
26
61
  ttlMilliseconds: this.cache.getTtlMilliseconds()
27
62
  });
28
- return this.#mapperss.CheckoutSessionDtoMapper.serializeEntityToDto(
29
- checkoutSession
30
- );
63
+ return createdCheckoutSessionDto;
31
64
  }
32
65
  async getCheckoutSession({ id }) {
33
66
  const checkoutSessionDetails = await this.cache.readRecord(
@@ -36,7 +69,7 @@ export class BaseCheckoutSessionService {
36
69
  if (!checkoutSessionDetails) {
37
70
  throw new Error('Session not found');
38
71
  }
39
- return this.#mapperss.CheckoutSessionDtoMapper.serializeEntityToDto(
72
+ return this.#mappers.CheckoutSessionDtoMapper.serializeEntityToDto(
40
73
  checkoutSessionDetails.value
41
74
  );
42
75
  }
@@ -50,11 +83,29 @@ export class BaseCheckoutSessionService {
50
83
  await this.cache.deleteRecord(this.createCacheKey(id));
51
84
  }
52
85
  async handleCheckoutSuccess({ id }) {
53
- this.openTelemetryCollector.info('Checkout success', { id });
86
+ if (this.evaluatedTelemetryOptions.logging) {
87
+ this.openTelemetryCollector.info('Checkout success', { id });
88
+ }
89
+ if (this.enableDatabaseBackup) {
90
+ const checkoutSession = await this.em.upsert('CheckoutSession', {
91
+ id,
92
+ status: 'SUCCESS'
93
+ });
94
+ await this.em.persistAndFlush(checkoutSession);
95
+ }
54
96
  await this.cache.deleteRecord(this.createCacheKey(id));
55
97
  }
56
98
  async handleCheckoutFailure({ id }) {
57
- this.openTelemetryCollector.info('Checkout failure', { id });
99
+ if (this.evaluatedTelemetryOptions.logging) {
100
+ this.openTelemetryCollector.info('Checkout failure', { id });
101
+ }
102
+ if (this.enableDatabaseBackup) {
103
+ const checkoutSession = await this.em.upsert('CheckoutSession', {
104
+ id,
105
+ status: 'FAILED'
106
+ });
107
+ await this.em.persistAndFlush(checkoutSession);
108
+ }
58
109
  await this.cache.deleteRecord(this.createCacheKey(id));
59
110
  }
60
111
  }
@@ -1,13 +1,14 @@
1
1
  import { IdDto, IdsDto } from '@forklaunch/common';
2
2
  import { TtlCache } from '@forklaunch/core/cache';
3
+ import {
4
+ MetricsDefinition,
5
+ OpenTelemetryCollector,
6
+ TelemetryOptions
7
+ } from '@forklaunch/core/http';
3
8
  import {
4
9
  RequestDtoMapperConstructor,
5
10
  ResponseDtoMapperConstructor
6
11
  } from '@forklaunch/core/mappers';
7
- import {
8
- MetricsDefinition,
9
- OpenTelemetryCollector
10
- } from '@forklaunch/core/http';
11
12
  import { PaymentLinkService } from '@forklaunch/interfaces-billing/interfaces';
12
13
  import {
13
14
  CreatePaymentLinkDto,
@@ -15,35 +16,38 @@ import {
15
16
  UpdatePaymentLinkDto
16
17
  } from '@forklaunch/interfaces-billing/types';
17
18
  import { AnySchemaValidator } from '@forklaunch/validator';
19
+ import { EntityManager } from '@mikro-orm/core';
18
20
  export declare class BasePaymentLinkService<
19
21
  SchemaValidator extends AnySchemaValidator,
20
22
  CurrencyEnum,
23
+ StatusEnum,
21
24
  Metrics extends MetricsDefinition = MetricsDefinition,
22
25
  Dto extends {
23
- PaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
24
- CreatePaymentLinkDtoMapper: CreatePaymentLinkDto<CurrencyEnum>;
25
- UpdatePaymentLinkDtoMapper: UpdatePaymentLinkDto<CurrencyEnum>;
26
+ PaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum, StatusEnum>;
27
+ CreatePaymentLinkDtoMapper: CreatePaymentLinkDto<CurrencyEnum, StatusEnum>;
28
+ UpdatePaymentLinkDtoMapper: UpdatePaymentLinkDto<CurrencyEnum, StatusEnum>;
26
29
  } = {
27
- PaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
28
- CreatePaymentLinkDtoMapper: CreatePaymentLinkDto<CurrencyEnum>;
29
- UpdatePaymentLinkDtoMapper: UpdatePaymentLinkDto<CurrencyEnum>;
30
+ PaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum, StatusEnum>;
31
+ CreatePaymentLinkDtoMapper: CreatePaymentLinkDto<CurrencyEnum, StatusEnum>;
32
+ UpdatePaymentLinkDtoMapper: UpdatePaymentLinkDto<CurrencyEnum, StatusEnum>;
30
33
  },
31
34
  Entities extends {
32
- PaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
33
- CreatePaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
34
- UpdatePaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
35
+ PaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum, StatusEnum>;
36
+ CreatePaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum, StatusEnum>;
37
+ UpdatePaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum, StatusEnum>;
35
38
  } = {
36
- PaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
37
- CreatePaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
38
- UpdatePaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum>;
39
+ PaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum, StatusEnum>;
40
+ CreatePaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum, StatusEnum>;
41
+ UpdatePaymentLinkDtoMapper: PaymentLinkDto<CurrencyEnum, StatusEnum>;
39
42
  }
40
- > implements PaymentLinkService<CurrencyEnum>
43
+ > implements PaymentLinkService<CurrencyEnum, StatusEnum>
41
44
  {
42
45
  #private;
46
+ protected readonly em: EntityManager;
43
47
  protected readonly cache: TtlCache;
44
48
  protected readonly openTelemetryCollector: OpenTelemetryCollector<Metrics>;
45
49
  protected readonly schemaValidator: SchemaValidator;
46
- protected readonly mapperss: {
50
+ protected readonly mappers: {
47
51
  PaymentLinkDtoMapper: ResponseDtoMapperConstructor<
48
52
  SchemaValidator,
49
53
  Dto['PaymentLinkDtoMapper'],
@@ -60,11 +64,20 @@ export declare class BasePaymentLinkService<
60
64
  Entities['UpdatePaymentLinkDtoMapper']
61
65
  >;
62
66
  };
67
+ readonly options?:
68
+ | {
69
+ enableDatabaseBackup?: boolean;
70
+ telemetry?: TelemetryOptions;
71
+ }
72
+ | undefined;
73
+ private evaluatedTelemetryOptions;
74
+ private enableDatabaseBackup;
63
75
  constructor(
76
+ em: EntityManager,
64
77
  cache: TtlCache,
65
78
  openTelemetryCollector: OpenTelemetryCollector<Metrics>,
66
79
  schemaValidator: SchemaValidator,
67
- mapperss: {
80
+ mappers: {
68
81
  PaymentLinkDtoMapper: ResponseDtoMapperConstructor<
69
82
  SchemaValidator,
70
83
  Dto['PaymentLinkDtoMapper'],
@@ -80,7 +93,13 @@ export declare class BasePaymentLinkService<
80
93
  Dto['UpdatePaymentLinkDtoMapper'],
81
94
  Entities['UpdatePaymentLinkDtoMapper']
82
95
  >;
83
- }
96
+ },
97
+ options?:
98
+ | {
99
+ enableDatabaseBackup?: boolean;
100
+ telemetry?: TelemetryOptions;
101
+ }
102
+ | undefined
84
103
  );
85
104
  protected cacheKeyPrefix: string;
86
105
  protected createCacheKey: (id: string) => string;