@forklaunch/implementation-billing-stripe 1.1.32 → 1.2.0
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.
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
OpenTelemetryCollector
|
|
4
4
|
} from '@forklaunch/core/http';
|
|
5
5
|
import { AnySchemaValidator } from '@forklaunch/validator';
|
|
6
|
-
import { EntityManager, EntityName
|
|
6
|
+
import { EntityManager, EntityName } from '@mikro-orm/core';
|
|
7
7
|
import Stripe from 'stripe';
|
|
8
8
|
import { BillingProviderEnum } from '../domain/enum/billingProvider.enum';
|
|
9
9
|
import { CurrencyEnum } from '../domain/enum/currency.enum';
|
|
@@ -16,7 +16,6 @@ import {
|
|
|
16
16
|
StripePlanEntities,
|
|
17
17
|
StripeSubscriptionEntities
|
|
18
18
|
} from '../domain/types/stripe.entity.types';
|
|
19
|
-
import { StripeWebhookEvent } from '../persistence/entities';
|
|
20
19
|
import { StripeBillingPortalService } from './billingPortal.service';
|
|
21
20
|
|
|
22
21
|
import { StripeCheckoutSessionService } from './checkoutSession.service';
|
|
@@ -35,29 +34,37 @@ import { StripeSubscriptionService } from './subscription.service';
|
|
|
35
34
|
* ships one) or this package's, importable from
|
|
36
35
|
* `@forklaunch/implementation-billing-stripe/persistence`.
|
|
37
36
|
*/
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Structural constraint for injectable webhook event entities — the fields
|
|
40
|
+
* the idempotency flow reads and writes. Applications inject their own
|
|
41
|
+
* (typically richer, sqlBaseProperties-based) entity; the generic infers
|
|
42
|
+
* from the injected schema exactly like the mapper entity generics do.
|
|
43
|
+
*/
|
|
44
|
+
export type StripeWebhookEventShape = {
|
|
45
|
+
stripeId: string;
|
|
46
|
+
idempotencyKey?: string | null;
|
|
47
|
+
eventType: string;
|
|
48
|
+
eventData: unknown;
|
|
49
|
+
};
|
|
44
50
|
|
|
45
51
|
export class StripeWebhookService<
|
|
46
52
|
SchemaValidator extends AnySchemaValidator,
|
|
47
53
|
StatusEnum,
|
|
48
54
|
PartyEnum,
|
|
49
|
-
BillingPortalEntities extends
|
|
50
|
-
StripeBillingPortalEntities
|
|
51
|
-
CheckoutSessionEntities extends
|
|
52
|
-
StripeCheckoutSessionEntities<StatusEnum
|
|
53
|
-
PaymentLinkEntities extends
|
|
54
|
-
StripePaymentLinkEntities<StatusEnum
|
|
55
|
+
BillingPortalEntities extends StripeBillingPortalEntities =
|
|
56
|
+
StripeBillingPortalEntities,
|
|
57
|
+
CheckoutSessionEntities extends StripeCheckoutSessionEntities<StatusEnum> =
|
|
58
|
+
StripeCheckoutSessionEntities<StatusEnum>,
|
|
59
|
+
PaymentLinkEntities extends StripePaymentLinkEntities<StatusEnum> =
|
|
60
|
+
StripePaymentLinkEntities<StatusEnum>,
|
|
55
61
|
PlanEntities extends StripePlanEntities = StripePlanEntities,
|
|
56
|
-
SubscriptionEntities extends
|
|
57
|
-
StripeSubscriptionEntities<PartyEnum
|
|
62
|
+
SubscriptionEntities extends StripeSubscriptionEntities<PartyEnum> =
|
|
63
|
+
StripeSubscriptionEntities<PartyEnum>,
|
|
64
|
+
WebhookEventEntity extends StripeWebhookEventShape = StripeWebhookEventShape
|
|
58
65
|
> {
|
|
59
66
|
protected readonly partyEnum: PartyEnum;
|
|
60
|
-
protected readonly webhookEventEntity:
|
|
67
|
+
protected readonly webhookEventEntity: { '~entity': WebhookEventEntity };
|
|
61
68
|
protected readonly stripeClient: Stripe;
|
|
62
69
|
protected readonly em: EntityManager;
|
|
63
70
|
protected readonly schemaValidator: SchemaValidator;
|
|
@@ -118,7 +125,14 @@ export class StripeWebhookService<
|
|
|
118
125
|
* 'StripeWebhookEvent'; inject your own entity (mapper-style) to use a
|
|
119
126
|
* different one.
|
|
120
127
|
*/
|
|
121
|
-
|
|
128
|
+
/**
|
|
129
|
+
* The application's discovered webhook idempotency entity — this sealed
|
|
130
|
+
* package must operate on the entity the app's ORM actually discovered
|
|
131
|
+
* (its own definition, or this package's via the ./persistence subpath).
|
|
132
|
+
* Querying an undiscovered entity object crashes mikro-orm 7.1.x deep in
|
|
133
|
+
* EntityLoader (meta.relations undefined).
|
|
134
|
+
*/
|
|
135
|
+
webhookEventEntity: { '~entity': WebhookEventEntity }
|
|
122
136
|
) {
|
|
123
137
|
this.webhookEventEntity = webhookEventEntity;
|
|
124
138
|
this.partyEnum = partyEnum;
|
|
@@ -182,8 +196,10 @@ export class StripeWebhookService<
|
|
|
182
196
|
}
|
|
183
197
|
|
|
184
198
|
if (
|
|
185
|
-
|
|
186
|
-
|
|
199
|
+
// querying through the structural shape with an internal cast, the same
|
|
200
|
+
// way the mapper services do (`mapper.entity as typeof Plan`)
|
|
201
|
+
await this.em.findOne(
|
|
202
|
+
this.webhookEventEntity as unknown as EntityName<StripeWebhookEventShape>,
|
|
187
203
|
{
|
|
188
204
|
idempotencyKey: event.request?.idempotency_key
|
|
189
205
|
}
|
|
@@ -506,12 +522,15 @@ export class StripeWebhookService<
|
|
|
506
522
|
// em.create (not native em.insert): the app's entity generates its id and
|
|
507
523
|
// timestamps via onCreate hooks, which native inserts bypass — a native
|
|
508
524
|
// insert fails NOT NULL on id for sqlBaseProperties-style entities.
|
|
509
|
-
this.em.create<
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
525
|
+
this.em.create<StripeWebhookEventShape>(
|
|
526
|
+
this.webhookEventEntity as unknown as EntityName<StripeWebhookEventShape>,
|
|
527
|
+
{
|
|
528
|
+
stripeId: event.id,
|
|
529
|
+
idempotencyKey: event.request?.idempotency_key,
|
|
530
|
+
eventType: event.type,
|
|
531
|
+
eventData: event.data
|
|
532
|
+
} as never
|
|
533
|
+
);
|
|
515
534
|
await this.em.flush();
|
|
516
535
|
}
|
|
517
536
|
}
|
package/lib/services/index.js
CHANGED
|
@@ -627,7 +627,6 @@ var BillingProviderEnum = {
|
|
|
627
627
|
};
|
|
628
628
|
|
|
629
629
|
// services/webhook.service.ts
|
|
630
|
-
var DEFAULT_STRIPE_WEBHOOK_EVENT_ENTITY = "StripeWebhookEvent";
|
|
631
630
|
var StripeWebhookService = class {
|
|
632
631
|
partyEnum;
|
|
633
632
|
webhookEventEntity;
|
|
@@ -640,7 +639,7 @@ var StripeWebhookService = class {
|
|
|
640
639
|
paymentLinkService;
|
|
641
640
|
planService;
|
|
642
641
|
subscriptionService;
|
|
643
|
-
constructor(stripeClient, em, schemaValidator, openTelemetryCollector, billingPortalService, checkoutSessionService, paymentLinkService, planService, subscriptionService, partyEnum, webhookEventEntity
|
|
642
|
+
constructor(stripeClient, em, schemaValidator, openTelemetryCollector, billingPortalService, checkoutSessionService, paymentLinkService, planService, subscriptionService, partyEnum, webhookEventEntity) {
|
|
644
643
|
this.webhookEventEntity = webhookEventEntity;
|
|
645
644
|
this.partyEnum = partyEnum;
|
|
646
645
|
this.stripeClient = stripeClient;
|
|
@@ -687,12 +686,16 @@ var StripeWebhookService = class {
|
|
|
687
686
|
if (this.openTelemetryCollector) {
|
|
688
687
|
this.openTelemetryCollector.info("Handling webhook event", event);
|
|
689
688
|
}
|
|
690
|
-
if (
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
689
|
+
if (
|
|
690
|
+
// querying through the structural shape with an internal cast, the same
|
|
691
|
+
// way the mapper services do (`mapper.entity as typeof Plan`)
|
|
692
|
+
await this.em.findOne(
|
|
693
|
+
this.webhookEventEntity,
|
|
694
|
+
{
|
|
695
|
+
idempotencyKey: event.request?.idempotency_key
|
|
696
|
+
}
|
|
697
|
+
)
|
|
698
|
+
) {
|
|
696
699
|
this.openTelemetryCollector.info(
|
|
697
700
|
"Webhook event already processed",
|
|
698
701
|
event
|
|
@@ -935,12 +938,15 @@ var StripeWebhookService = class {
|
|
|
935
938
|
);
|
|
936
939
|
break;
|
|
937
940
|
}
|
|
938
|
-
this.em.create(
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
941
|
+
this.em.create(
|
|
942
|
+
this.webhookEventEntity,
|
|
943
|
+
{
|
|
944
|
+
stripeId: event.id,
|
|
945
|
+
idempotencyKey: event.request?.idempotency_key,
|
|
946
|
+
eventType: event.type,
|
|
947
|
+
eventData: event.data
|
|
948
|
+
}
|
|
949
|
+
);
|
|
944
950
|
await this.em.flush();
|
|
945
951
|
}
|
|
946
952
|
};
|
package/lib/services/index.mjs
CHANGED
|
@@ -595,7 +595,6 @@ var BillingProviderEnum = {
|
|
|
595
595
|
};
|
|
596
596
|
|
|
597
597
|
// services/webhook.service.ts
|
|
598
|
-
var DEFAULT_STRIPE_WEBHOOK_EVENT_ENTITY = "StripeWebhookEvent";
|
|
599
598
|
var StripeWebhookService = class {
|
|
600
599
|
partyEnum;
|
|
601
600
|
webhookEventEntity;
|
|
@@ -608,7 +607,7 @@ var StripeWebhookService = class {
|
|
|
608
607
|
paymentLinkService;
|
|
609
608
|
planService;
|
|
610
609
|
subscriptionService;
|
|
611
|
-
constructor(stripeClient, em, schemaValidator, openTelemetryCollector, billingPortalService, checkoutSessionService, paymentLinkService, planService, subscriptionService, partyEnum, webhookEventEntity
|
|
610
|
+
constructor(stripeClient, em, schemaValidator, openTelemetryCollector, billingPortalService, checkoutSessionService, paymentLinkService, planService, subscriptionService, partyEnum, webhookEventEntity) {
|
|
612
611
|
this.webhookEventEntity = webhookEventEntity;
|
|
613
612
|
this.partyEnum = partyEnum;
|
|
614
613
|
this.stripeClient = stripeClient;
|
|
@@ -655,12 +654,16 @@ var StripeWebhookService = class {
|
|
|
655
654
|
if (this.openTelemetryCollector) {
|
|
656
655
|
this.openTelemetryCollector.info("Handling webhook event", event);
|
|
657
656
|
}
|
|
658
|
-
if (
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
657
|
+
if (
|
|
658
|
+
// querying through the structural shape with an internal cast, the same
|
|
659
|
+
// way the mapper services do (`mapper.entity as typeof Plan`)
|
|
660
|
+
await this.em.findOne(
|
|
661
|
+
this.webhookEventEntity,
|
|
662
|
+
{
|
|
663
|
+
idempotencyKey: event.request?.idempotency_key
|
|
664
|
+
}
|
|
665
|
+
)
|
|
666
|
+
) {
|
|
664
667
|
this.openTelemetryCollector.info(
|
|
665
668
|
"Webhook event already processed",
|
|
666
669
|
event
|
|
@@ -903,12 +906,15 @@ var StripeWebhookService = class {
|
|
|
903
906
|
);
|
|
904
907
|
break;
|
|
905
908
|
}
|
|
906
|
-
this.em.create(
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
909
|
+
this.em.create(
|
|
910
|
+
this.webhookEventEntity,
|
|
911
|
+
{
|
|
912
|
+
stripeId: event.id,
|
|
913
|
+
idempotencyKey: event.request?.idempotency_key,
|
|
914
|
+
eventType: event.type,
|
|
915
|
+
eventData: event.data
|
|
916
|
+
}
|
|
917
|
+
);
|
|
912
918
|
await this.em.flush();
|
|
913
919
|
}
|
|
914
920
|
};
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { MetricsDefinition, OpenTelemetryCollector } from '@forklaunch/core/http';
|
|
2
2
|
import { AnySchemaValidator } from '@forklaunch/validator';
|
|
3
|
-
import { EntityManager
|
|
3
|
+
import { EntityManager } from '@mikro-orm/core';
|
|
4
4
|
import Stripe from 'stripe';
|
|
5
5
|
import { StripeBillingPortalEntities, StripeCheckoutSessionEntities, StripePaymentLinkEntities, StripePlanEntities, StripeSubscriptionEntities } from '../domain/types/stripe.entity.types';
|
|
6
|
-
import { StripeWebhookEvent } from '../persistence/entities';
|
|
7
6
|
import { StripeBillingPortalService } from './billingPortal.service';
|
|
8
7
|
import { StripeCheckoutSessionService } from './checkoutSession.service';
|
|
9
8
|
import { StripePaymentLinkService } from './paymentLink.service';
|
|
@@ -20,10 +19,23 @@ import { StripeSubscriptionService } from './subscription.service';
|
|
|
20
19
|
* ships one) or this package's, importable from
|
|
21
20
|
* `@forklaunch/implementation-billing-stripe/persistence`.
|
|
22
21
|
*/
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Structural constraint for injectable webhook event entities — the fields
|
|
24
|
+
* the idempotency flow reads and writes. Applications inject their own
|
|
25
|
+
* (typically richer, sqlBaseProperties-based) entity; the generic infers
|
|
26
|
+
* from the injected schema exactly like the mapper entity generics do.
|
|
27
|
+
*/
|
|
28
|
+
export type StripeWebhookEventShape = {
|
|
29
|
+
stripeId: string;
|
|
30
|
+
idempotencyKey?: string | null;
|
|
31
|
+
eventType: string;
|
|
32
|
+
eventData: unknown;
|
|
33
|
+
};
|
|
34
|
+
export declare class StripeWebhookService<SchemaValidator extends AnySchemaValidator, StatusEnum, PartyEnum, BillingPortalEntities extends StripeBillingPortalEntities = StripeBillingPortalEntities, CheckoutSessionEntities extends StripeCheckoutSessionEntities<StatusEnum> = StripeCheckoutSessionEntities<StatusEnum>, PaymentLinkEntities extends StripePaymentLinkEntities<StatusEnum> = StripePaymentLinkEntities<StatusEnum>, PlanEntities extends StripePlanEntities = StripePlanEntities, SubscriptionEntities extends StripeSubscriptionEntities<PartyEnum> = StripeSubscriptionEntities<PartyEnum>, WebhookEventEntity extends StripeWebhookEventShape = StripeWebhookEventShape> {
|
|
25
35
|
protected readonly partyEnum: PartyEnum;
|
|
26
|
-
protected readonly webhookEventEntity:
|
|
36
|
+
protected readonly webhookEventEntity: {
|
|
37
|
+
'~entity': WebhookEventEntity;
|
|
38
|
+
};
|
|
27
39
|
protected readonly stripeClient: Stripe;
|
|
28
40
|
protected readonly em: EntityManager;
|
|
29
41
|
protected readonly schemaValidator: SchemaValidator;
|
|
@@ -40,7 +52,16 @@ export declare class StripeWebhookService<SchemaValidator extends AnySchemaValid
|
|
|
40
52
|
* 'StripeWebhookEvent'; inject your own entity (mapper-style) to use a
|
|
41
53
|
* different one.
|
|
42
54
|
*/
|
|
43
|
-
|
|
55
|
+
/**
|
|
56
|
+
* The application's discovered webhook idempotency entity — this sealed
|
|
57
|
+
* package must operate on the entity the app's ORM actually discovered
|
|
58
|
+
* (its own definition, or this package's via the ./persistence subpath).
|
|
59
|
+
* Querying an undiscovered entity object crashes mikro-orm 7.1.x deep in
|
|
60
|
+
* EntityLoader (meta.relations undefined).
|
|
61
|
+
*/
|
|
62
|
+
webhookEventEntity: {
|
|
63
|
+
'~entity': WebhookEventEntity;
|
|
64
|
+
});
|
|
44
65
|
/**
|
|
45
66
|
* Resolve the party type for a subscription event.
|
|
46
67
|
* Stripe subscriptions are customer-scoped — customers map to users
|
|
@@ -57,5 +78,4 @@ export declare class StripeWebhookService<SchemaValidator extends AnySchemaValid
|
|
|
57
78
|
private extractFeaturesFromProduct;
|
|
58
79
|
handleWebhookEvent(event: Stripe.Event): Promise<void>;
|
|
59
80
|
}
|
|
60
|
-
export {};
|
|
61
81
|
//# sourceMappingURL=webhook.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.service.d.ts","sourceRoot":"","sources":["../../services/webhook.service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"webhook.service.d.ts","sourceRoot":"","sources":["../../services/webhook.service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED