From 34ec8df8f5f33de1ffb7e5d774f139661039c711 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Thu, 21 May 2026 14:43:39 -0700 Subject: [PATCH] =?UTF-8?q?fix(minting):=20rename=20DATABASE=5FURL=20?= =?UTF-8?q?=E2=86=92=20MINTING=5FDATABASE=5FURL=20to=20avoid=20Neon=20inte?= =?UTF-8?q?gration=20override?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Neon Vercel integration injects DATABASE_URL (and DATABASE_URL_UNPOOLED, POSTGRES_URL, etc.) pointing at the default `neondb` database — overriding any project-level DATABASE_URL value we set. This caused the minting webhook to connect to `neondb` (which doesn't have our schema) instead of the `minting` database that owns processed_events + licenses. Use a non-conflicting var name so the integration can't shadow it. Run book: - Set MINTING_DATABASE_URL on the threadplane-minting-service Vercel project to the pooled connection string for the `minting` database. Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/minting-service/src/lib/env.spec.ts | 6 +++--- apps/minting-service/src/lib/env.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/minting-service/src/lib/env.spec.ts b/apps/minting-service/src/lib/env.spec.ts index aa35d80d..e3d7021c 100644 --- a/apps/minting-service/src/lib/env.spec.ts +++ b/apps/minting-service/src/lib/env.spec.ts @@ -2,7 +2,7 @@ const REQUIRED = { STRIPE_SECRET_KEY: 'sk_test_xxx', STRIPE_WEBHOOK_SECRET: 'whsec_xxx', - DATABASE_URL: 'postgres://u:p@h:5432/d', + MINTING_DATABASE_URL: 'postgres://u:p@h:5432/d', RESEND_API_KEY: 're_xxx', EMAIL_FROM: 'a@b.c', LICENSE_SIGNING_PRIVATE_KEY_HEX: 'a'.repeat(64), @@ -31,9 +31,9 @@ describe('loadEnv', () => { }); it('throws with a list of all missing vars', async () => { - setEnv({ ...REQUIRED, STRIPE_SECRET_KEY: undefined, DATABASE_URL: undefined }); + setEnv({ ...REQUIRED, STRIPE_SECRET_KEY: undefined, MINTING_DATABASE_URL: undefined }); const { loadEnv } = await import('./env.js'); - expect(() => loadEnv()).toThrow(/STRIPE_SECRET_KEY.*DATABASE_URL|DATABASE_URL.*STRIPE_SECRET_KEY/); + expect(() => loadEnv()).toThrow(/STRIPE_SECRET_KEY.*MINTING_DATABASE_URL|MINTING_DATABASE_URL.*STRIPE_SECRET_KEY/); }); it('throws when private key hex is the wrong length', async () => { diff --git a/apps/minting-service/src/lib/env.ts b/apps/minting-service/src/lib/env.ts index b15c4195..84225127 100644 --- a/apps/minting-service/src/lib/env.ts +++ b/apps/minting-service/src/lib/env.ts @@ -2,7 +2,7 @@ const REQUIRED_VARS = [ 'STRIPE_SECRET_KEY', 'STRIPE_WEBHOOK_SECRET', - 'DATABASE_URL', + 'MINTING_DATABASE_URL', 'RESEND_API_KEY', 'EMAIL_FROM', 'LICENSE_SIGNING_PRIVATE_KEY_HEX', @@ -32,7 +32,7 @@ export function loadEnv(): Env { return { STRIPE_SECRET_KEY: process.env['STRIPE_SECRET_KEY']!, STRIPE_WEBHOOK_SECRET: process.env['STRIPE_WEBHOOK_SECRET']!, - DATABASE_URL: process.env['DATABASE_URL']!, + DATABASE_URL: process.env['MINTING_DATABASE_URL']!, RESEND_API_KEY: process.env['RESEND_API_KEY']!, EMAIL_FROM: process.env['EMAIL_FROM']!, LICENSE_SIGNING_PRIVATE_KEY_HEX: keyHex,