feat: make Creem integration optional and error-prone if misconfigured

This commit is contained in:
Innei
2025-12-05 20:13:52 +08:00
parent d0c420ba93
commit 9b1a1b7bf6
2 changed files with 32 additions and 28 deletions

View File

@@ -270,32 +270,36 @@ export class AuthProvider implements OnModuleInit {
defaultRole: 'user',
defaultBanReason: 'Spamming',
}),
creem({
apiKey: env.CREEM_API_KEY,
webhookSecret: env.CREEM_WEBHOOK_SECRET,
persistSubscriptions: true,
testMode: env.NODE_ENV !== 'production',
onCheckoutCompleted: async (data) => {
await this.handleCreemWebhook({
event: data.webhookEventType,
metadata: this.mergeMetadata(data.metadata, data.subscription?.metadata),
status: data.subscription?.status ?? null,
defaultGrant: true,
})
},
// onRefundCreated: async (data: FlatRefundCreated) => {
// await this.handleCreemRefundCreated(data)
// },
onSubscriptionCanceled: async (data) => {
await this.handleCreemSubscriptionEvent(data, true)
},
onSubscriptionExpired: async (data) => {
await this.handleCreemSubscriptionEvent(data, true)
},
onSubscriptionUpdate: async (data) => {
await this.handleCreemSubscriptionEvent(data, false)
},
}),
...(env.CREEM_API_KEY && env.CREEM_WEBHOOK_SECRET
? [
creem({
apiKey: env.CREEM_API_KEY,
webhookSecret: env.CREEM_WEBHOOK_SECRET,
persistSubscriptions: true,
testMode: env.NODE_ENV !== 'production',
onCheckoutCompleted: async (data) => {
await this.handleCreemWebhook({
event: data.webhookEventType,
metadata: this.mergeMetadata(data.metadata, data.subscription?.metadata),
status: data.subscription?.status ?? null,
defaultGrant: true,
})
},
// onRefundCreated: async (data: FlatRefundCreated) => {
// await this.handleCreemRefundCreated(data)
// },
onSubscriptionCanceled: async (data) => {
await this.handleCreemSubscriptionEvent(data, true)
},
onSubscriptionExpired: async (data) => {
await this.handleCreemSubscriptionEvent(data, true)
},
onSubscriptionUpdate: async (data) => {
await this.handleCreemSubscriptionEvent(data, false)
},
}),
]
: []),
],
hooks: {
before: createAuthMiddleware(async (ctx) => {

View File

@@ -25,8 +25,8 @@ export const env = createEnv({
AUTH_GATEWAY_STATE_SECRET: z.string().min(1).optional(),
// Payment
CREEM_API_KEY: z.string().min(1),
CREEM_WEBHOOK_SECRET: z.string().min(1),
CREEM_API_KEY: z.string().min(1).optional(),
CREEM_WEBHOOK_SECRET: z.string().min(1).optional(),
// Mail
RESEND_API_KEY: z.string().min(1).optional(),