diff --git a/src/config/env/index.ts b/src/config/env/index.ts index 6d0ba0c..0b4fc36 100644 --- a/src/config/env/index.ts +++ b/src/config/env/index.ts @@ -26,6 +26,7 @@ const envSchema = z.object({ POSTGRES_PASSWORD: z.string(), POSTGRES_DATABASE: z.string(), POSTGRES_HOST: z.string(), + SHADOW_DATABASE_URL: z.string().url(), NODE_ENV: z.enum(['development', 'production', 'test']), SPARKPOST_API_KEY: z.string(), @@ -187,6 +188,14 @@ export const POSTGRES_DATABASE = parsed.data.POSTGRES_DATABASE; */ export const POSTGRES_HOST = parsed.data.POSTGRES_HOST; +/** + * The URL of another PostgreSQL database to shadow. + * + * @example + * 'postgresql://user:password@host:5432/database'; + */ +export const SHADOW_DATABASE_URL = parsed.data.SHADOW_DATABASE_URL; + /** * Node environment. * diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index e5ce2b4..6a84268 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -6,9 +6,10 @@ generator client { } datasource db { - provider = "postgresql" - url = env("POSTGRES_PRISMA_URL") // uses connection pooling - directUrl = env("POSTGRES_URL_NON_POOLING") // uses a direct connection + provider = "postgresql" + url = env("POSTGRES_PRISMA_URL") // uses connection pooling + directUrl = env("POSTGRES_URL_NON_POOLING") // uses a direct connection + shadowDatabaseUrl = env("SHADOW_DATABASE_URL") } model User { diff --git a/src/prisma/seed/clean/cleanDatabase.ts b/src/prisma/seed/clean/cleanDatabase.ts index f62e49d..9b23d4b 100644 --- a/src/prisma/seed/clean/cleanDatabase.ts +++ b/src/prisma/seed/clean/cleanDatabase.ts @@ -13,8 +13,9 @@ const cleanDatabase = async () => { DO $$ DECLARE statements CURSOR FOR - SELECT tablename FROM pg_tables - WHERE schemaname = 'public'; + SELECT tablename FROM pg_tables + WHERE schemaname = 'public' + AND tablename != '_prisma_migrations'; BEGIN FOR statement IN statements LOOP EXECUTE 'TRUNCATE TABLE ' || quote_ident(statement.tablename) || ' CASCADE;';