Make stripe available on prod

This commit is contained in:
Arthur Belleville 2025-11-25 08:48:26 +01:00
parent d158a204af
commit 95baf4dbb4
No known key found for this signature in database
7 changed files with 43 additions and 74 deletions

View file

@ -33,7 +33,7 @@
"multer": "^2.0.2",
"nodemailer": "^7.0.4",
"stream-chat": "^9.8.0",
"stripe": "^19.2.0",
"stripe": "^20.0.0",
"ts-node": "^10.9.2"
},
"devDependencies": {

View file

@ -55,6 +55,17 @@ export function createConfig(secrets?: Secrets): AppConfig {
// In test mode, use environment variables directly instead of secrets
const isTestMode = NODE_ENV === "test";
const isStagingMode = NODE_ENV === "staging";
const streamChatApiSecret = isStagingMode
? secrets!.streamChatApiSecretStaging
: secrets!.streamChatApiSecret;
const stripeSecretKey = isStagingMode
? secrets!.stripeSecretKeyStaging
: secrets!.stripeSecretKey;
const stripeWebhookSecret = isStagingMode
? secrets!.stripeWebhookSecretStaging
: secrets!.stripeWebhookSecret;
// Base configuration
const baseConfig: AppConfig = {
NODE_ENV,
@ -70,15 +81,16 @@ export function createConfig(secrets?: Secrets): AppConfig {
? validateEnvVar("SUPABASE_CA_CERT", process.env.SUPABASE_CA_CERT)
: secrets!.supabaseCaCert,
STREAM_CHAT_API_KEY: validateEnvVar("STREAM_CHAT_API_KEY", process.env.STREAM_CHAT_API_KEY),
// Env dependent
STREAM_CHAT_API_SECRET: isTestMode
? validateEnvVar("STREAM_CHAT_API_SECRET", process.env.STREAM_CHAT_API_SECRET)
: secrets!.streamChatApiSecret,
: streamChatApiSecret,
STRIPE_SECRET_KEY: isTestMode
? validateEnvVar("STRIPE_SECRET_KEY", process.env.STRIPE_SECRET_KEY)
: secrets!.stripeSecretKey,
: stripeSecretKey,
STRIPE_WEBHOOK_SECRET: isTestMode
? validateEnvVar("STRIPE_WEBHOOK_SECRET", process.env.STRIPE_WEBHOOK_SECRET)
: secrets!.stripeWebhookSecret,
: stripeWebhookSecret,
EMAIL_USER: validateEnvVar("EMAIL_USER", process.env.EMAIL_USER),
EMAIL_CLIENT_ID: validateEnvVar("EMAIL_CLIENT_ID", process.env.EMAIL_CLIENT_ID),
EMAIL_CLIENT_SECRET: isTestMode

View file

@ -194,7 +194,7 @@ export class MiddlewareManager {
const stripeMiddleware = createMiddleware(async (c: Context, next: Next) => {
const stripe = new Stripe(config.STRIPE_SECRET_KEY || "", {
apiVersion: "2025-10-29.clover",
apiVersion: "2025-11-17.clover",
});
c.set("stripe", stripe);
await next();

View file

@ -21,13 +21,18 @@ export type Secrets = {
supabaseServiceRoleKey: string;
supabaseConnectionString: string;
supabaseCaCert: string;
streamChatApiSecret: string;
stripeSecretKey: string;
stripeWebhookSecret: string;
emailClientSecret: string;
emailRefreshToken: string;
r2AccessKeyId: string;
r2SecretAccessKey: string;
// Env dependent
streamChatApiSecret: string;
stripeSecretKey: string;
stripeWebhookSecret: string;
// Staging
streamChatApiSecretStaging: string;
stripeSecretKeyStaging: string;
stripeWebhookSecretStaging: string;
};
/**
@ -39,13 +44,19 @@ export async function loadSecrets(): Promise<Secrets> {
supabaseServiceRoleKey: await fetchSecret("supabase-service-role-key"),
supabaseConnectionString: await fetchSecret("supabase-connection-string"),
supabaseCaCert: await fetchSecret("supabase-ca-cert"),
streamChatApiSecret: await fetchSecret("stream-chat-api-secret"),
stripeSecretKey: await fetchSecret("stripe-secret-key"),
stripeWebhookSecret: await fetchSecret("stripe-webhook-secret"),
emailClientSecret: await fetchSecret("email-client-secret"),
emailRefreshToken: await fetchSecret("email-refresh-token"),
r2AccessKeyId: await fetchSecret("r2-access-key-id"),
r2SecretAccessKey: await fetchSecret("r2-secret-access-key"),
// Env dependent
// Staging
streamChatApiSecretStaging: await fetchSecret("stream-chat-api-secret-staging"),
stripeSecretKeyStaging: await fetchSecret("stripe-secret-key-staging"),
stripeWebhookSecretStaging: await fetchSecret("stripe-webhook-secret-staging"),
// Production
streamChatApiSecret: await fetchSecret("stream-chat-api-secret"),
stripeSecretKey: await fetchSecret("stripe-secret-key"),
stripeWebhookSecret: await fetchSecret("stripe-webhook-secret"),
};
return secrets;
}

View file

@ -6,7 +6,7 @@ VITE_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFz
VITE_SUPABASE_ID=mhcafqvzbrrwvahpvvzd
VITE_STREAM_CHAT_API_KEY="v4yf8rs94aa8"
VITE_STRIPE_PUBLISHABLE_KEY=pk_test_51SPKLPAto3YQ7YhIrM5ViAUXWuSwKJeHyOyOINVg9cnwxxOcbMlyhxQcDYWDSLNQJukafxbc7kqpkGI82lFezaiM00rgcALKB0
VITE_STRIPE_PUBLISHABLE_KEY=pk_live_51Qc159AmcXPHW4mTHUTW6it2mdZ3KQTxZGXZ188DKpXuXgpirUWOj24dnb7DzbcEAu45nU1S5k66Nm4liY3IlGOW00pndRsgUM
VITE_STRIPE_STANDARD_MONTHLY_PRICE_ID=price_1SPr3qAto3YQ7YhIALNeFBva
VITE_API_URL=https://xablo-api-636270553187.europe-west1.run.app

View file

@ -35,7 +35,7 @@ importers:
version: 1.19.6(hono@4.10.4)
'@supabase/stripe-sync-engine':
specifier: ^0.45.0
version: 0.45.0(stripe@19.3.0(@types/node@20.19.23))
version: 0.45.0(stripe@20.0.0(@types/node@20.19.23))
'@supabase/supabase-js':
specifier: ^2.49.4
version: 2.76.1
@ -76,8 +76,8 @@ importers:
specifier: ^9.8.0
version: 9.24.0
stripe:
specifier: ^19.2.0
version: 19.3.0(@types/node@20.19.23)
specifier: ^20.0.0
version: 20.0.0(@types/node@20.19.23)
ts-node:
specifier: ^10.9.2
version: 10.9.2(@types/node@20.19.23)(typescript@5.9.3)
@ -350,9 +350,6 @@ importers:
stream-chat-react:
specifier: ^13.1.0
version: 13.9.0(@emoji-mart/data@1.2.1)(@types/react@19.0.10)(emoji-mart@5.6.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(stream-chat@9.24.0)(typescript@5.9.3)
three:
specifier: ^0.172.0
version: 0.172.0
ts-pattern:
specifier: ^5.6.2
version: 5.8.0
@ -417,9 +414,6 @@ importers:
'@types/react-dom':
specifier: 19.0.4
version: 19.0.4(@types/react@19.0.10)
'@types/three':
specifier: ^0.181.0
version: 0.181.0
'@typescript-eslint/eslint-plugin':
specifier: ^7.0.2
version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
@ -1298,9 +1292,6 @@ packages:
'@date-fns/tz@1.4.1':
resolution: {integrity: sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==}
'@dimforge/rapier3d-compat@0.12.0':
resolution: {integrity: sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==}
'@emnapi/runtime@1.6.0':
resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==}
@ -3970,9 +3961,6 @@ packages:
'@tsconfig/node16@1.0.4':
resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
'@tweenjs/tween.js@23.1.3':
resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==}
'@types/aria-query@5.0.4':
resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
@ -4104,12 +4092,6 @@ packages:
'@types/stack-utils@2.0.3':
resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
'@types/stats.js@0.17.4':
resolution: {integrity: sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==}
'@types/three@0.181.0':
resolution: {integrity: sha512-MLF1ks8yRM2k71D7RprFpDb9DOX0p22DbdPqT/uAkc6AtQXjxWCVDjCy23G9t1o8HcQPk7woD2NIyiaWcWPYmA==}
'@types/tough-cookie@4.0.5':
resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
@ -4125,9 +4107,6 @@ packages:
'@types/use-sync-external-store@0.0.6':
resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==}
'@types/webxr@0.5.24':
resolution: {integrity: sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==}
'@types/whatwg-mimetype@3.0.2':
resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==}
@ -4377,9 +4356,6 @@ packages:
'@vitest/utils@4.0.8':
resolution: {integrity: sha512-pdk2phO5NDvEFfUTxcTP8RFYjVj/kfLSPIN5ebP2Mu9kcIMeAQTbknqcFEyBcC4z2pJlJI9aS5UQjcYfhmKAow==}
'@webgpu/types@0.1.66':
resolution: {integrity: sha512-YA2hLrwLpDsRueNDXIMqN9NTzD6bCDkuXbOSe0heS+f8YE8usA6Gbv1prj81pzVHrbaAma7zObnIC+I6/sXJgA==}
abab@2.0.6:
resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
deprecated: Use your platform's native atob() and btoa() methods instead
@ -6541,9 +6517,6 @@ packages:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
meshoptimizer@0.22.0:
resolution: {integrity: sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==}
micromark-core-commonmark@2.0.3:
resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
@ -7941,8 +7914,8 @@ packages:
strip-literal@3.1.0:
resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==}
stripe@19.3.0:
resolution: {integrity: sha512-3MbqRkw5LXb4LWP1LgIEYxUAYhYDDU5pcHZj4Xha6VWPnN1wrUmQ7Htsgm8wR584s0hn1aQg1lYD0Hi+F37E5g==}
stripe@20.0.0:
resolution: {integrity: sha512-EaZeWpbJOCcDytdjKSwdrL5BxzbDGNueiCfHjHXlPdBQvLqoxl6AAivC35SPzTmVXJb5duXQlXFGS45H0+e6Gg==}
engines: {node: '>=16'}
peerDependencies:
'@types/node': '>=16'
@ -8032,9 +8005,6 @@ packages:
thread-stream@3.1.0:
resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==}
three@0.172.0:
resolution: {integrity: sha512-6HMgMlzU97MsV7D/tY8Va38b83kz8YJX+BefKjspMNAv0Vx6dxMogHOrnRl/sbMIs3BPUKijPqDqJ/+UwJbIow==}
through@2.3.8:
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
@ -9769,8 +9739,6 @@ snapshots:
'@date-fns/tz@1.4.1': {}
'@dimforge/rapier3d-compat@0.12.0': {}
'@emnapi/runtime@1.6.0':
dependencies:
tslib: 2.8.1
@ -12683,11 +12651,11 @@ snapshots:
'@supabase/node-fetch': 2.6.15
tslib: 2.8.1
'@supabase/stripe-sync-engine@0.45.0(stripe@19.3.0(@types/node@20.19.23))':
'@supabase/stripe-sync-engine@0.45.0(stripe@20.0.0(@types/node@20.19.23))':
dependencies:
pg: 8.16.3
pg-node-migrations: 0.0.8
stripe: 19.3.0(@types/node@20.19.23)
stripe: 20.0.0(@types/node@20.19.23)
yesql: 7.0.0
transitivePeerDependencies:
- pg-native
@ -12951,8 +12919,6 @@ snapshots:
'@tsconfig/node16@1.0.4': {}
'@tweenjs/tween.js@23.1.3': {}
'@types/aria-query@5.0.4': {}
'@types/babel__core@7.20.5':
@ -13110,18 +13076,6 @@ snapshots:
'@types/stack-utils@2.0.3': {}
'@types/stats.js@0.17.4': {}
'@types/three@0.181.0':
dependencies:
'@dimforge/rapier3d-compat': 0.12.0
'@tweenjs/tween.js': 23.1.3
'@types/stats.js': 0.17.4
'@types/webxr': 0.5.24
'@webgpu/types': 0.1.66
fflate: 0.8.2
meshoptimizer: 0.22.0
'@types/tough-cookie@4.0.5': {}
'@types/trusted-types@2.0.7':
@ -13133,8 +13087,6 @@ snapshots:
'@types/use-sync-external-store@0.0.6': {}
'@types/webxr@0.5.24': {}
'@types/whatwg-mimetype@3.0.2': {}
'@types/ws@8.18.1':
@ -13465,8 +13417,6 @@ snapshots:
'@vitest/pretty-format': 4.0.8
tinyrainbow: 3.0.3
'@webgpu/types@0.1.66': {}
abab@2.0.6: {}
abort-controller@3.0.0:
@ -16294,8 +16244,6 @@ snapshots:
merge2@1.4.1: {}
meshoptimizer@0.22.0: {}
micromark-core-commonmark@2.0.3:
dependencies:
decode-named-character-reference: 1.2.0
@ -18033,7 +17981,7 @@ snapshots:
dependencies:
js-tokens: 9.0.1
stripe@19.3.0(@types/node@20.19.23):
stripe@20.0.0(@types/node@20.19.23):
dependencies:
qs: 6.14.0
optionalDependencies:
@ -18127,8 +18075,6 @@ snapshots:
dependencies:
real-require: 0.2.0
three@0.172.0: {}
through@2.3.8: {}
tiny-async-pool@2.1.0: {}