@forklaunch/implementation-billing-base 0.2.0 → 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 (42) hide show
  1. package/lib/__test__/schemaEquality.test.js +35 -14
  2. package/lib/eject/domain/schemas/billingPortal.schema.ts +1 -7
  3. package/lib/eject/domain/schemas/checkoutSession.schema.ts +24 -4
  4. package/lib/eject/domain/schemas/paymentLink.schema.ts +24 -4
  5. package/lib/eject/services/billingPortal.service.ts +97 -25
  6. package/lib/eject/services/checkoutSession.service.ts +106 -23
  7. package/lib/eject/services/paymentLink.service.ts +104 -25
  8. package/lib/eject/services/plan.service.ts +41 -5
  9. package/lib/eject/services/subscription.service.ts +56 -3
  10. package/lib/schemas/checkoutSession.schema.d.ts +97 -11
  11. package/lib/schemas/checkoutSession.schema.d.ts.map +1 -1
  12. package/lib/schemas/paymentLink.schema.d.ts +101 -12
  13. package/lib/schemas/paymentLink.schema.d.ts.map +1 -1
  14. package/lib/schemas/typebox/checkoutSession.schema.d.ts +130 -10
  15. package/lib/schemas/typebox/checkoutSession.schema.d.ts.map +1 -1
  16. package/lib/schemas/typebox/checkoutSession.schema.js +9 -3
  17. package/lib/schemas/typebox/paymentLink.schema.d.ts +144 -12
  18. package/lib/schemas/typebox/paymentLink.schema.d.ts.map +1 -1
  19. package/lib/schemas/typebox/paymentLink.schema.js +9 -3
  20. package/lib/schemas/zod/checkoutSession.schema.d.ts +66 -12
  21. package/lib/schemas/zod/checkoutSession.schema.d.ts.map +1 -1
  22. package/lib/schemas/zod/checkoutSession.schema.js +9 -3
  23. package/lib/schemas/zod/paymentLink.schema.d.ts +66 -12
  24. package/lib/schemas/zod/paymentLink.schema.d.ts.map +1 -1
  25. package/lib/schemas/zod/paymentLink.schema.js +9 -3
  26. package/lib/services/billingPortal.service.d.ts +20 -2
  27. package/lib/services/billingPortal.service.d.ts.map +1 -1
  28. package/lib/services/billingPortal.service.js +83 -25
  29. package/lib/services/checkoutSession.service.d.ts +58 -15
  30. package/lib/services/checkoutSession.service.d.ts.map +1 -1
  31. package/lib/services/checkoutSession.service.js +61 -10
  32. package/lib/services/paymentLink.service.d.ts +34 -15
  33. package/lib/services/paymentLink.service.d.ts.map +1 -1
  34. package/lib/services/paymentLink.service.js +79 -11
  35. package/lib/services/plan.service.d.ts +14 -2
  36. package/lib/services/plan.service.d.ts.map +1 -1
  37. package/lib/services/plan.service.js +35 -5
  38. package/lib/services/subscription.service.d.ts +16 -2
  39. package/lib/services/subscription.service.d.ts.map +1 -1
  40. package/lib/services/subscription.service.js +49 -3
  41. package/lib/tsconfig.tsbuildinfo +1 -1
  42. package/package.json +6 -6
@@ -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
9
  mappers;
10
+ options;
8
11
  #mappers;
9
- constructor(cache, openTelemetryCollector, schemaValidator, 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
26
  this.mappers = mappers;
27
+ this.options = options;
14
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
- await this.#mappers.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.#mappers.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.#mappers.BillingPortalDtoMapper.serializeEntityToDto(
43
- billingPortalSessionDetails.value
44
- );
75
+ return billingPortalDetails.value;
45
76
  }
46
77
  async updateBillingPortalSession(billingPortalDto) {
47
- const billingPortalSession =
48
- await this.#mappers.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.#mappers.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
  );
@@ -2,7 +2,8 @@ import { IdDto } from '@forklaunch/common';
2
2
  import { TtlCache } from '@forklaunch/core/cache';
3
3
  import {
4
4
  MetricsDefinition,
5
- OpenTelemetryCollector
5
+ OpenTelemetryCollector,
6
+ TelemetryOptions
6
7
  } from '@forklaunch/core/http';
7
8
  import {
8
9
  RequestDtoMapperConstructor,
@@ -15,31 +16,58 @@ 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;
@@ -60,7 +88,16 @@ 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,
@@ -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
9
  mappers;
10
+ options;
8
11
  #mappers;
9
- constructor(cache, openTelemetryCollector, schemaValidator, 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
26
  this.mappers = mappers;
27
+ this.options = options;
14
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) {
40
+ if (this.evaluatedTelemetryOptions.logging) {
41
+ this.openTelemetryCollector.info(
42
+ 'Creating checkout session',
43
+ checkoutSessionDto
44
+ );
45
+ }
18
46
  const checkoutSession =
19
47
  await this.#mappers.CreateCheckoutSessionDtoMapper.deserializeDtoToEntity(
20
- checkoutSessionDto
48
+ checkoutSessionDto,
49
+ this.em
50
+ );
51
+ const createdCheckoutSessionDto =
52
+ await this.#mappers.CheckoutSessionDtoMapper.serializeEntityToDto(
53
+ checkoutSession
21
54
  );
22
- // Store the checkoutSession details in the cache
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.#mappers.CheckoutSessionDtoMapper.serializeEntityToDto(
29
- checkoutSession
30
- );
63
+ return createdCheckoutSessionDto;
31
64
  }
32
65
  async getCheckoutSession({ id }) {
33
66
  const checkoutSessionDetails = await this.cache.readRecord(
@@ -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
  }
@@ -2,7 +2,8 @@ import { IdDto, IdsDto } from '@forklaunch/common';
2
2
  import { TtlCache } from '@forklaunch/core/cache';
3
3
  import {
4
4
  MetricsDefinition,
5
- OpenTelemetryCollector
5
+ OpenTelemetryCollector,
6
+ TelemetryOptions
6
7
  } from '@forklaunch/core/http';
7
8
  import {
8
9
  RequestDtoMapperConstructor,
@@ -15,31 +16,34 @@ 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;
@@ -60,7 +64,16 @@ 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,
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"paymentLink.service.d.ts","sourceRoot":"","sources":["../../services/paymentLink.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paymentLink.service.d.ts","sourceRoot":"","sources":["../../services/paymentLink.service.ts"],"names":[],"mappings":"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"}
@@ -1,52 +1,99 @@
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 BasePaymentLinkService {
5
+ em;
4
6
  cache;
5
7
  openTelemetryCollector;
6
8
  schemaValidator;
7
9
  mappers;
10
+ options;
8
11
  #mappers;
9
- constructor(cache, openTelemetryCollector, schemaValidator, 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
26
  this.mappers = mappers;
27
+ this.options = options;
14
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
  cacheKeyPrefix = 'payment_link';
17
39
  createCacheKey = createCacheKey(this.cacheKeyPrefix);
18
40
  async createPaymentLink(paymentLinkDto) {
19
- // TODO: Perform permission checks here
41
+ if (this.evaluatedTelemetryOptions.logging) {
42
+ this.openTelemetryCollector.info('Creating payment link', paymentLinkDto);
43
+ }
20
44
  const paymentLink =
21
45
  await this.#mappers.CreatePaymentLinkDtoMapper.deserializeDtoToEntity(
22
- paymentLinkDto
46
+ paymentLinkDto,
47
+ this.em
48
+ );
49
+ if (this.enableDatabaseBackup) {
50
+ await this.em.persistAndFlush(paymentLink);
51
+ }
52
+ const createdPaymentLinkDto =
53
+ await this.#mappers.PaymentLinkDtoMapper.serializeEntityToDto(
54
+ paymentLink
23
55
  );
24
56
  await this.cache.putRecord({
25
- key: this.createCacheKey(paymentLink.id),
26
- value: paymentLink,
57
+ key: this.createCacheKey(createdPaymentLinkDto.id),
58
+ value: createdPaymentLinkDto,
27
59
  ttlMilliseconds: this.cache.getTtlMilliseconds()
28
60
  });
29
- return this.#mappers.PaymentLinkDtoMapper.serializeEntityToDto(paymentLink);
61
+ return createdPaymentLinkDto;
30
62
  }
31
63
  async updatePaymentLink(paymentLinkDto) {
64
+ if (this.evaluatedTelemetryOptions.logging) {
65
+ this.openTelemetryCollector.info('Updating payment link', paymentLinkDto);
66
+ }
32
67
  const cacheKey = this.createCacheKey(paymentLinkDto.id);
33
- const existingLink = await this.cache.readRecord(cacheKey);
68
+ const existingLink = (await this.cache.readRecord(cacheKey))?.value;
34
69
  if (!existingLink) {
35
70
  throw new Error('Payment link not found');
36
71
  }
37
72
  const paymentLink =
38
73
  await this.#mappers.UpdatePaymentLinkDtoMapper.deserializeDtoToEntity(
39
- paymentLinkDto
74
+ paymentLinkDto,
75
+ this.em
40
76
  );
41
- const updatedLink = { ...existingLink, ...paymentLink };
77
+ if (this.enableDatabaseBackup) {
78
+ await this.em.persistAndFlush(paymentLink);
79
+ }
80
+ const updatedLinkDto = {
81
+ ...existingLink,
82
+ ...(await this.#mappers.PaymentLinkDtoMapper.serializeEntityToDto(
83
+ paymentLink
84
+ ))
85
+ };
42
86
  await this.cache.putRecord({
43
87
  key: cacheKey,
44
- value: updatedLink,
88
+ value: updatedLinkDto,
45
89
  ttlMilliseconds: this.cache.getTtlMilliseconds()
46
90
  });
47
- return this.#mappers.PaymentLinkDtoMapper.serializeEntityToDto(updatedLink);
91
+ return updatedLinkDto;
48
92
  }
49
93
  async getPaymentLink({ id }) {
94
+ if (this.evaluatedTelemetryOptions.logging) {
95
+ this.openTelemetryCollector.info('Getting payment link', { id });
96
+ }
50
97
  const cacheKey = this.createCacheKey(id);
51
98
  const paymentLink = await this.cache.readRecord(cacheKey);
52
99
  if (!paymentLink) {
@@ -58,14 +105,35 @@ export class BasePaymentLinkService {
58
105
  }
59
106
  async expirePaymentLink({ id }) {
60
107
  this.openTelemetryCollector.info('Payment link expired', { id });
108
+ if (this.enableDatabaseBackup) {
109
+ const paymentLink = await this.em.upsert('PaymentLink', {
110
+ id,
111
+ status: 'EXPIRED'
112
+ });
113
+ await this.em.removeAndFlush(paymentLink);
114
+ }
61
115
  await this.cache.deleteRecord(this.createCacheKey(id));
62
116
  }
63
117
  async handlePaymentSuccess({ id }) {
64
118
  this.openTelemetryCollector.info('Payment link success', { id });
119
+ if (this.enableDatabaseBackup) {
120
+ const paymentLink = await this.em.upsert('PaymentLink', {
121
+ id,
122
+ status: 'COMPLETED'
123
+ });
124
+ await this.em.removeAndFlush(paymentLink);
125
+ }
65
126
  await this.cache.deleteRecord(this.createCacheKey(id));
66
127
  }
67
128
  async handlePaymentFailure({ id }) {
68
129
  this.openTelemetryCollector.info('Payment link failure', { id });
130
+ if (this.enableDatabaseBackup) {
131
+ const paymentLink = await this.em.upsert('PaymentLink', {
132
+ id,
133
+ status: 'FAILED'
134
+ });
135
+ await this.em.removeAndFlush(paymentLink);
136
+ }
69
137
  await this.cache.deleteRecord(this.createCacheKey(id));
70
138
  }
71
139
  async listPaymentLinks(idsDto) {
@@ -1,7 +1,8 @@
1
1
  import { IdDto, IdsDto } from '@forklaunch/common';
2
2
  import {
3
3
  MetricsDefinition,
4
- OpenTelemetryCollector
4
+ OpenTelemetryCollector,
5
+ TelemetryOptions
5
6
  } from '@forklaunch/core/http';
6
7
  import {
7
8
  RequestDtoMapperConstructor,
@@ -45,6 +46,12 @@ export declare class BasePlanService<
45
46
  private readonly openTelemetryCollector;
46
47
  private readonly schemaValidator;
47
48
  private readonly mappers;
49
+ readonly options?:
50
+ | {
51
+ telemetry?: TelemetryOptions;
52
+ }
53
+ | undefined;
54
+ private evaluatedTelemetryOptions;
48
55
  constructor(
49
56
  em: EntityManager,
50
57
  openTelemetryCollector: OpenTelemetryCollector<Metrics>,
@@ -65,7 +72,12 @@ export declare class BasePlanService<
65
72
  Dto['UpdatePlanDtoMapper'],
66
73
  Entities['UpdatePlanDtoMapper']
67
74
  >;
68
- }
75
+ },
76
+ options?:
77
+ | {
78
+ telemetry?: TelemetryOptions;
79
+ }
80
+ | undefined
69
81
  );
70
82
  listPlans(
71
83
  idsDto?: IdsDto,