From a82fc6d6c07f3bc20e4cd7a188421aafda8072f8 Mon Sep 17 00:00:00 2001 From: nobswebdev Date: Sun, 1 Nov 2026 22:59:28 +0100 Subject: [PATCH] Add setup-fresh-db script to reset dev database and run migrations. --- backend/package.json | 2 + backend/src/database/utils/drop.ts | 58 +++++++++++++++++++ .../database/InformationSchemaTableRow.ts | 3 + backend/src/types/database/PgEnumTypeRow.ts | 3 + backend/src/utils/getErrorMessage.ts | 1 + 5 files changed, 67 insertions(+) create mode 100644 backend/src/database/utils/drop.ts create mode 100644 backend/src/types/database/InformationSchemaTableRow.ts create mode 100644 backend/src/types/database/PgEnumTypeRow.ts create mode 100644 backend/src/utils/getErrorMessage.ts diff --git a/backend/package.json b/backend/package.json index 5c83a44..b3d4e3b 100644 --- a/backend/package.json +++ b/backend/package.json @@ -13,6 +13,8 @@ "typeorm:generate-migration": "npm run typeorm -- -d ./src/database/DataSource.ts migration:generate ./src/database/migrations/$npm_config_name", "typeorm:revert-migration": "npm run typeorm -- -d ./src/database/DataSource.ts migration:revert", "typeorm:create-migration": "npm run typeorm -- migration:create ./src/database/migrations/$npm_config_name", + "truncate-db": "ts-node -r tsconfig-paths/register ./src/database/utils/drop", + "setup-fresh-db": "npm run truncate-db && npm run typeorm:run-migrations", "test": "jest" }, "jest": { diff --git a/backend/src/database/utils/drop.ts b/backend/src/database/utils/drop.ts new file mode 100644 index 0000000..2b87768 --- /dev/null +++ b/backend/src/database/utils/drop.ts @@ -0,0 +1,58 @@ +import dataSource from '../DataSource'; +import { getAppConfig } from '../../config'; +import { getErrorMessage } from '../../utils/getErrorMessage'; +import type { InformationSchemaTableRow } from '../../types/database/InformationSchemaTableRow'; +import type { PgEnumTypeRow } from '../../types/database/PgEnumTypeRow'; +import { NodeEnv } from '../../types/NodeEnv'; + +const { + nodeEnv +} = getAppConfig(); + +void (async () => { + if (nodeEnv === NodeEnv.Development) { + console.info('Connecting to the database...'); + + const initializedDataSource = await dataSource.initialize(); + + console.info('Connected to the database.'); + + const tables = await initializedDataSource.query( + `SELECT table_name + FROM information_schema.tables + WHERE table_schema = 'public';` + ); + + for (const table of tables) { + try { + await initializedDataSource.query(`DROP TABLE IF EXISTS "${table.table_name}" CASCADE;`); + + console.info(`Dropped table: ${table.table_name}`); + } catch (error) { + console.error(`Failed to drop table: ${table.table_name}: ${getErrorMessage(error)}`); + + return process.exit(1); + } + } + + const enums = await initializedDataSource.query( + `SELECT typname FROM pg_type WHERE typtype = 'e';` + ); + + for (const enumType of enums) { + try { + await initializedDataSource.query(`DROP TYPE IF EXISTS ${enumType.typname} CASCADE;`); + + console.info(`Dropped enum: ${enumType.typname}`); + } catch (error) { + console.error(`Failed to drop enum: ${enumType.typname}: ${getErrorMessage(error)}`); + + return process.exit(1); + } + } + + console.info('All tables and enums have been dropped.'); + + return process.exit(0); + } +})(); diff --git a/backend/src/types/database/InformationSchemaTableRow.ts b/backend/src/types/database/InformationSchemaTableRow.ts new file mode 100644 index 0000000..4eba891 --- /dev/null +++ b/backend/src/types/database/InformationSchemaTableRow.ts @@ -0,0 +1,3 @@ +export type InformationSchemaTableRow = { + table_name: string; +}; diff --git a/backend/src/types/database/PgEnumTypeRow.ts b/backend/src/types/database/PgEnumTypeRow.ts new file mode 100644 index 0000000..efbe1d6 --- /dev/null +++ b/backend/src/types/database/PgEnumTypeRow.ts @@ -0,0 +1,3 @@ +export type PgEnumTypeRow = { + typname: string; +}; diff --git a/backend/src/utils/getErrorMessage.ts b/backend/src/utils/getErrorMessage.ts new file mode 100644 index 0000000..84ba131 --- /dev/null +++ b/backend/src/utils/getErrorMessage.ts @@ -0,0 +1 @@ +export const getErrorMessage = (error: unknown): string => (error instanceof Error ? error.message : String(error));