@forklaunch/implementation-billing-base 0.2.0 → 0.2.2
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.
- package/lib/__test__/schemaEquality.test.js +35 -14
- package/lib/eject/domain/schemas/checkoutSession.schema.ts +24 -4
- package/lib/eject/domain/schemas/paymentLink.schema.ts +24 -4
- package/lib/eject/services/billingPortal.service.ts +97 -25
- package/lib/eject/services/checkoutSession.service.ts +106 -23
- package/lib/eject/services/paymentLink.service.ts +104 -25
- package/lib/eject/services/plan.service.ts +41 -5
- package/lib/eject/services/subscription.service.ts +56 -3
- package/lib/schemas/checkoutSession.schema.d.ts +97 -11
- package/lib/schemas/checkoutSession.schema.d.ts.map +1 -1
- package/lib/schemas/paymentLink.schema.d.ts +101 -12
- package/lib/schemas/paymentLink.schema.d.ts.map +1 -1
- package/lib/schemas/typebox/checkoutSession.schema.d.ts +130 -10
- package/lib/schemas/typebox/checkoutSession.schema.d.ts.map +1 -1
- package/lib/schemas/typebox/checkoutSession.schema.js +9 -3
- package/lib/schemas/typebox/paymentLink.schema.d.ts +144 -12
- package/lib/schemas/typebox/paymentLink.schema.d.ts.map +1 -1
- package/lib/schemas/typebox/paymentLink.schema.js +9 -3
- package/lib/schemas/zod/checkoutSession.schema.d.ts +66 -12
- package/lib/schemas/zod/checkoutSession.schema.d.ts.map +1 -1
- package/lib/schemas/zod/checkoutSession.schema.js +9 -3
- package/lib/schemas/zod/paymentLink.schema.d.ts +66 -12
- package/lib/schemas/zod/paymentLink.schema.d.ts.map +1 -1
- package/lib/schemas/zod/paymentLink.schema.js +9 -3
- package/lib/services/billingPortal.service.d.ts +20 -2
- package/lib/services/billingPortal.service.d.ts.map +1 -1
- package/lib/services/billingPortal.service.js +83 -25
- package/lib/services/checkoutSession.service.d.ts +58 -15
- package/lib/services/checkoutSession.service.d.ts.map +1 -1
- package/lib/services/checkoutSession.service.js +61 -10
- package/lib/services/paymentLink.service.d.ts +34 -15
- package/lib/services/paymentLink.service.d.ts.map +1 -1
- package/lib/services/paymentLink.service.js +79 -11
- package/lib/services/plan.service.d.ts +14 -2
- package/lib/services/plan.service.d.ts.map +1 -1
- package/lib/services/plan.service.js +35 -5
- package/lib/services/subscription.service.d.ts +16 -2
- package/lib/services/subscription.service.d.ts.map +1 -1
- package/lib/services/subscription.service.js +49 -3
- package/lib/tsconfig.tsbuildinfo +1 -1
- 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
|
-
|
|
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
|
-
|
|
19
|
-
|
|
40
|
+
if (this.evaluatedTelemetryOptions.logging) {
|
|
41
|
+
this.openTelemetryCollector.info(
|
|
42
|
+
'Creating billing portal session',
|
|
20
43
|
billingPortalDto
|
|
21
44
|
);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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(
|
|
28
|
-
value:
|
|
59
|
+
key: this.createCacheKey(createdBillingPortalDto.id),
|
|
60
|
+
value: createdBillingPortalDto,
|
|
29
61
|
ttlMilliseconds: this.cache.getTtlMilliseconds()
|
|
30
62
|
});
|
|
31
|
-
return
|
|
32
|
-
billingPortalSession
|
|
33
|
-
);
|
|
63
|
+
return createdBillingPortalDto;
|
|
34
64
|
}
|
|
35
65
|
async getBillingPortalSession(idDto) {
|
|
36
|
-
|
|
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 (!
|
|
72
|
+
if (!billingPortalDetails) {
|
|
40
73
|
throw new Error('Session not found');
|
|
41
74
|
}
|
|
42
|
-
return
|
|
43
|
-
billingPortalSessionDetails.value
|
|
44
|
-
);
|
|
75
|
+
return billingPortalDetails.value;
|
|
45
76
|
}
|
|
46
77
|
async updateBillingPortalSession(billingPortalDto) {
|
|
47
|
-
|
|
48
|
-
|
|
78
|
+
if (this.evaluatedTelemetryOptions.logging) {
|
|
79
|
+
this.openTelemetryCollector.info(
|
|
80
|
+
'Updating billing portal session',
|
|
49
81
|
billingPortalDto
|
|
50
82
|
);
|
|
51
|
-
|
|
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(
|
|
54
|
-
value:
|
|
107
|
+
key: this.createCacheKey(updatedBillingPortalDto.id),
|
|
108
|
+
value: updatedBillingPortalDto,
|
|
55
109
|
ttlMilliseconds: this.cache.getTtlMilliseconds()
|
|
56
110
|
});
|
|
57
|
-
return
|
|
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<
|
|
25
|
-
|
|
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<
|
|
29
|
-
|
|
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<
|
|
34
|
-
|
|
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<
|
|
38
|
-
|
|
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":"AAAA,OAAO,EAAE,KAAK,EAAsB,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAkB,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"checkoutSession.service.d.ts","sourceRoot":"","sources":["../../services/checkoutSession.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAsB,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAkB,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAEL,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEL,2BAA2B,EAC3B,4BAA4B,EAE7B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,qBAAa,0BAA0B,CACrC,eAAe,SAAS,kBAAkB,EAC1C,iBAAiB,EACjB,UAAU,EACV,OAAO,SAAS,iBAAiB,GAAG,iBAAiB,EACrD,GAAG,SAAS;IACV,wBAAwB,EAAE,kBAAkB,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;IAC5E,8BAA8B,EAAE,wBAAwB,CACtD,iBAAiB,EACjB,UAAU,CACX,CAAC;IACF,8BAA8B,EAAE,wBAAwB,CACtD,iBAAiB,EACjB,UAAU,CACX,CAAC;CACH,GAAG;IACF,wBAAwB,EAAE,kBAAkB,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;IAC5E,8BAA8B,EAAE,wBAAwB,CACtD,iBAAiB,EACjB,UAAU,CACX,CAAC;IACF,8BAA8B,EAAE,wBAAwB,CACtD,iBAAiB,EACjB,UAAU,CACX,CAAC;CACH,EACD,QAAQ,SAAS;IACf,wBAAwB,EAAE,kBAAkB,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;IAC5E,8BAA8B,EAAE,kBAAkB,CAChD,iBAAiB,EACjB,UAAU,CACX,CAAC;IACF,8BAA8B,EAAE,kBAAkB,CAChD,iBAAiB,EACjB,UAAU,CACX,CAAC;CACH,GAAG;IACF,wBAAwB,EAAE,kBAAkB,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;IAC5E,8BAA8B,EAAE,kBAAkB,CAChD,iBAAiB,EACjB,UAAU,CACX,CAAC;IACF,8BAA8B,EAAE,kBAAkB,CAChD,iBAAiB,EACjB,UAAU,CACX,CAAC;CACH,CACD,YAAW,sBAAsB,CAAC,iBAAiB,EAAE,UAAU,CAAC;;IAe9D,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,aAAa;IACpC,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,OAAO,EAAE;QAC1B,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;IACD,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,SAAS,CAAC,EAAE,gBAAgB,CAAC;KAC9B;IAhCH,OAAO,CAAC,yBAAyB,CAI/B;IACF,OAAO,CAAC,oBAAoB,CAAU;gBAGjB,EAAE,EAAE,aAAa,EACjB,KAAK,EAAE,QAAQ,EACf,sBAAsB,EAAE,sBAAsB,CAAC,OAAO,CAAC,EACvD,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE;QAC1B,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,EACQ,OAAO,CAAC,EAAE;QACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,SAAS,CAAC,EAAE,gBAAgB,CAAC;KAC9B,YAAA;IAaH,SAAS,CAAC,cAAc,yBAAsC;IAExD,qBAAqB,CACzB,kBAAkB,EAAE,GAAG,CAAC,gCAAgC,CAAC,GACxD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAgCrC,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;IAgBnD,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;CAe1D"}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
55
|
+
if (this.enableDatabaseBackup) {
|
|
56
|
+
await this.em.persistAndFlush(checkoutSession);
|
|
57
|
+
}
|
|
23
58
|
await this.cache.putRecord({
|
|
24
|
-
key: this.createCacheKey(
|
|
25
|
-
value:
|
|
59
|
+
key: this.createCacheKey(createdCheckoutSessionDto.id),
|
|
60
|
+
value: createdCheckoutSessionDto,
|
|
26
61
|
ttlMilliseconds: this.cache.getTtlMilliseconds()
|
|
27
62
|
});
|
|
28
|
-
return
|
|
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.
|
|
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.
|
|
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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAsB,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAkB,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
26
|
-
value:
|
|
57
|
+
key: this.createCacheKey(createdPaymentLinkDto.id),
|
|
58
|
+
value: createdPaymentLinkDto,
|
|
27
59
|
ttlMilliseconds: this.cache.getTtlMilliseconds()
|
|
28
60
|
});
|
|
29
|
-
return
|
|
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
|
-
|
|
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:
|
|
88
|
+
value: updatedLinkDto,
|
|
45
89
|
ttlMilliseconds: this.cache.getTtlMilliseconds()
|
|
46
90
|
});
|
|
47
|
-
return
|
|
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,
|