From 9e915ed3d0fe0802ab08c80ac4a8c9388d921ac2 Mon Sep 17 00:00:00 2001 From: Vegard Kyrkjedelen Hovland Date: Thu, 6 Mar 2025 10:00:47 +0100 Subject: [PATCH 1/7] feat: :card_file_box: Add a basic seeding script should be expanded with more options in the future --- db/seeding/seeding.ts | 46 +++++++++++++++++++++++++++++++++++++ db/seeding/seedingTables.ts | 21 +++++++++++++++++ package.json | 2 ++ pnpm-lock.yaml | 22 ++++++++++++++++++ 4 files changed, 91 insertions(+) create mode 100644 db/seeding/seeding.ts create mode 100644 db/seeding/seedingTables.ts diff --git a/db/seeding/seeding.ts b/db/seeding/seeding.ts new file mode 100644 index 0000000..485b7d5 --- /dev/null +++ b/db/seeding/seeding.ts @@ -0,0 +1,46 @@ +import { + getDatabaseErrorPrivateMessage, + postgresErrorParser, +} from "@db/errors/postgresError"; +import { seedingTables } from "@db/seeding/seedingTables"; +import { database } from "@db/setup/queryPostgres"; +import { reset, seed } from "drizzle-seed"; + +const doRevertSeeding = + process.argv.length === 3 && process.argv[2] === "--reset"; +const hasUnknownOption = + process.argv.length > 3 || + (process.argv.length === 3 && process.argv[2] !== "--reset"); +if (hasUnknownOption) { + console.error("Unknown option"); + process.exit(1); +} + +try { + if (doRevertSeeding) { + await reset(database, seedingTables); + console.log("Database seeding has been reverted"); + } else { + await seed(database, seedingTables); + console.log("Database has been seeded"); + } +} catch (error) { + const postgresErrorResult = postgresErrorParser.safeParse(error); + if (postgresErrorResult.success) { + console.error(getDatabaseErrorPrivateMessage(postgresErrorResult.data)); + } else if (error instanceof Error) { + // The drizzle-seed library has awful errorhandling and just throws + // new Error() everywhere. So this is the best way to handle it + console.error(error.message); + } else { + console.error(error); + } + if (doRevertSeeding) { + console.error("Failed to reset seeded database"); + } else { + console.error("Failed to seed database"); + } + process.exit(1); +} + +process.exit(0); diff --git a/db/seeding/seedingTables.ts b/db/seeding/seedingTables.ts new file mode 100644 index 0000000..8980065 --- /dev/null +++ b/db/seeding/seedingTables.ts @@ -0,0 +1,21 @@ +import { departmentsTable } from "@db/tables/departments"; +import { expensesTable } from "@db/tables/expenses"; +import { fieldsOfStudyTable } from "@db/tables/fieldsOfStudy"; +import { teamsTable } from "@db/tables/team"; +import { teamApplicationsTable } from "@db/tables/teamApplication"; +import { + assistantUsersTable, + teamUsersTable, + usersTable, +} from "@db/tables/users"; + +export const seedingTables = { + departmentsTable, + fieldsOfStudyTable, + teamsTable, + usersTable, + teamUsersTable, + assistantUsersTable, + teamApplicationsTable, + expensesTable, +}; diff --git a/package.json b/package.json index c0df505..975df06 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "db:generate": "drizzle-kit generate --config=db/config/drizzle.config.ts", "db:migrate": "tsx ./db/setup/createDatabase.ts && drizzle-kit migrate --config=db/config/drizzle.config.ts", "db:studio": "drizzle-kit studio --config=db/config/drizzle.config.ts", + "db:seed": "tsx ./db/seeding/seeding.ts", "docs:generate": "tsx ./src/openapi/generateDocument.ts" }, "license": "ISC", @@ -24,6 +25,7 @@ "cors": "^2.8.5", "dotenv": "^16.4.5", "drizzle-orm": "^0.33.0", + "drizzle-seed": "^0.3.1", "drizzle-zod": "^0.5.1", "express": "^4.21.1", "pg": "^8.13.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 53adc7b..a620060 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: drizzle-orm: specifier: ^0.33.0 version: 0.33.0(@types/pg@8.11.11)(pg@8.13.3) + drizzle-seed: + specifier: ^0.3.1 + version: 0.3.1(drizzle-orm@0.33.0(@types/pg@8.11.11)(pg@8.13.3)) drizzle-zod: specifier: ^0.5.1 version: 0.5.1(drizzle-orm@0.33.0(@types/pg@8.11.11)(pg@8.13.3))(zod@3.24.2) @@ -873,6 +876,14 @@ packages: sqlite3: optional: true + drizzle-seed@0.3.1: + resolution: {integrity: sha512-F/0lgvfOAsqlYoHM/QAGut4xXIOXoE5VoAdv2FIl7DpGYVXlAzKuJO+IphkKUFK3Dz+rFlOsQLnMNrvoQ0cx7g==} + peerDependencies: + drizzle-orm: '>=0.36.4' + peerDependenciesMeta: + drizzle-orm: + optional: true + drizzle-zod@0.5.1: resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} peerDependencies: @@ -1246,6 +1257,9 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} @@ -1924,6 +1938,12 @@ snapshots: '@types/pg': 8.11.11 pg: 8.13.3 + drizzle-seed@0.3.1(drizzle-orm@0.33.0(@types/pg@8.11.11)(pg@8.13.3)): + dependencies: + pure-rand: 6.1.0 + optionalDependencies: + drizzle-orm: 0.33.0(@types/pg@8.11.11)(pg@8.13.3) + drizzle-zod@0.5.1(drizzle-orm@0.33.0(@types/pg@8.11.11)(pg@8.13.3))(zod@3.24.2): dependencies: drizzle-orm: 0.33.0(@types/pg@8.11.11)(pg@8.13.3) @@ -2354,6 +2374,8 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + pure-rand@6.1.0: {} + qs@6.13.0: dependencies: side-channel: 1.1.0 From bed30cdea4be0346d93d368337990037aa1a842c Mon Sep 17 00:00:00 2001 From: Vegard Kyrkjedelen Hovland Date: Thu, 6 Mar 2025 10:44:00 +0100 Subject: [PATCH 2/7] feat: :card_file_box: Make a reset option for seeding --- db/seeding/seeding.ts | 17 ++++++++++------- db/seeding/seedingTables.ts | 4 ++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/db/seeding/seeding.ts b/db/seeding/seeding.ts index 485b7d5..e69cb37 100644 --- a/db/seeding/seeding.ts +++ b/db/seeding/seeding.ts @@ -16,17 +16,19 @@ if (hasUnknownOption) { process.exit(1); } +if (doRevertSeeding) { + await reset(database, seedingTables); + console.log("Database seeding has been reverted"); + process.exit(0); +} + try { - if (doRevertSeeding) { - await reset(database, seedingTables); - console.log("Database seeding has been reverted"); - } else { - await seed(database, seedingTables); - console.log("Database has been seeded"); - } + await seed(database, seedingTables); + console.log("Database has been seeded"); } catch (error) { const postgresErrorResult = postgresErrorParser.safeParse(error); if (postgresErrorResult.success) { + console.error("Database error:") console.error(getDatabaseErrorPrivateMessage(postgresErrorResult.data)); } else if (error instanceof Error) { // The drizzle-seed library has awful errorhandling and just throws @@ -39,6 +41,7 @@ try { console.error("Failed to reset seeded database"); } else { console.error("Failed to seed database"); + await reset(database, seedingTables); } process.exit(1); } diff --git a/db/seeding/seedingTables.ts b/db/seeding/seedingTables.ts index 8980065..05f9d17 100644 --- a/db/seeding/seedingTables.ts +++ b/db/seeding/seedingTables.ts @@ -14,8 +14,8 @@ export const seedingTables = { fieldsOfStudyTable, teamsTable, usersTable, - teamUsersTable, - assistantUsersTable, + //teamUsersTable, these two tables dont work currently + //assistantUsersTable, teamApplicationsTable, expensesTable, }; From 6d51555d81ac88bb719de8f26df45d2ee4c2369f Mon Sep 17 00:00:00 2001 From: Vegard Kyrkjedelen Hovland Date: Thu, 6 Mar 2025 10:48:47 +0100 Subject: [PATCH 3/7] ci: :hammer: Update ci scripts to use create database --- .github/workflows/pull-request-check.yml | 8 ++++++-- package.json | 5 +++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pull-request-check.yml b/.github/workflows/pull-request-check.yml index 60689e4..623b50a 100644 --- a/.github/workflows/pull-request-check.yml +++ b/.github/workflows/pull-request-check.yml @@ -60,6 +60,8 @@ jobs: run: pnpm install - name: Generate migration files run: pnpm db:generate + - name: Create database + run: pnpm db:create - name: Migrate database run: pnpm db:migrate - name: Build @@ -102,11 +104,13 @@ jobs: run: pnpm install - name: Generate migration files run: pnpm db:generate + - name: Create database + run: pnpm db:create - name: Migrate database run: pnpm db:migrate + - name: Seed database + run: pnpm db:seed - name: Build run: pnpm build - name: Test run: pnpm test - - diff --git a/package.json b/package.json index 975df06..b613c71 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,9 @@ "format": "biome format --write", "lint": "biome lint --write", "check": "biome check --write", + "db:create": "tsx ./db/setup/createDatabase.ts", "db:generate": "drizzle-kit generate --config=db/config/drizzle.config.ts", - "db:migrate": "tsx ./db/setup/createDatabase.ts && drizzle-kit migrate --config=db/config/drizzle.config.ts", + "db:migrate": "drizzle-kit migrate --config=db/config/drizzle.config.ts", "db:studio": "drizzle-kit studio --config=db/config/drizzle.config.ts", "db:seed": "tsx ./db/seeding/seeding.ts", "docs:generate": "tsx ./src/openapi/generateDocument.ts" @@ -51,4 +52,4 @@ "typescript": "^5.6.3", "yaml": "^2.6.0" } -} +} \ No newline at end of file From 4738a081af8287b3749911c6667831738a751a43 Mon Sep 17 00:00:00 2001 From: Vegard Kyrkjedelen Hovland Date: Thu, 6 Mar 2025 11:12:06 +0100 Subject: [PATCH 4/7] style: :rotating_light: Fix biome lint check --- db/seeding/seeding.ts | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/db/seeding/seeding.ts b/db/seeding/seeding.ts index e69cb37..b893fc6 100644 --- a/db/seeding/seeding.ts +++ b/db/seeding/seeding.ts @@ -28,7 +28,7 @@ try { } catch (error) { const postgresErrorResult = postgresErrorParser.safeParse(error); if (postgresErrorResult.success) { - console.error("Database error:") + console.error("Database error:"); console.error(getDatabaseErrorPrivateMessage(postgresErrorResult.data)); } else if (error instanceof Error) { // The drizzle-seed library has awful errorhandling and just throws diff --git a/package.json b/package.json index b613c71..6d57a42 100644 --- a/package.json +++ b/package.json @@ -52,4 +52,4 @@ "typescript": "^5.6.3", "yaml": "^2.6.0" } -} \ No newline at end of file +} From 170ec10277ef158e2fe46e86e9207d312fd26552 Mon Sep 17 00:00:00 2001 From: Vegard Kyrkjedelen Hovland Date: Thu, 6 Mar 2025 12:25:53 +0100 Subject: [PATCH 5/7] ci: :hammer: Make build and test depend on biome-check --- .github/workflows/pull-request-check.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/pull-request-check.yml b/.github/workflows/pull-request-check.yml index 623b50a..abfefa5 100644 --- a/.github/workflows/pull-request-check.yml +++ b/.github/workflows/pull-request-check.yml @@ -30,6 +30,7 @@ jobs: - name: Run Biome run: biome ci . build: + needs: [biome-check] runs-on: ubuntu-latest services: database: @@ -74,6 +75,7 @@ jobs: - name: Start run: pnpm start & test: + needs: [biome-check] runs-on: ubuntu-latest services: database: From fd7d81dfa09112356826680676ca9da5caa43a4a Mon Sep 17 00:00:00 2001 From: Vegard Kyrkjedelen Hovland Date: Mon, 17 Mar 2025 16:42:31 +0100 Subject: [PATCH 6/7] fix: :twisted_rightwards_arrows: Fix merge issues Removed db:create; excanged with docker compose up. Updated seeding files to pass new linting rules and use correct imports. --- .github/workflows/pull-request-check.yml | 4 ---- db/seeding/seeding-tables.ts | 17 +++++++++++++++++ db/seeding/seeding.ts | 10 +++++----- db/seeding/seedingTables.ts | 21 --------------------- package.json | 3 +-- 5 files changed, 23 insertions(+), 32 deletions(-) create mode 100644 db/seeding/seeding-tables.ts delete mode 100644 db/seeding/seedingTables.ts diff --git a/.github/workflows/pull-request-check.yml b/.github/workflows/pull-request-check.yml index 4313368..bf45c9d 100644 --- a/.github/workflows/pull-request-check.yml +++ b/.github/workflows/pull-request-check.yml @@ -43,8 +43,6 @@ jobs: run: docker compose up -d - name: Generate migration files run: pnpm db:generate - - name: Create database - run: pnpm db:create - name: Migrate database run: pnpm db:migrate - name: Build @@ -77,8 +75,6 @@ jobs: run: docker compose up -d - name: Generate migration files run: pnpm db:generate - - name: Create database - run: pnpm db:create - name: Migrate database run: pnpm db:migrate - name: Seed database diff --git a/db/seeding/seeding-tables.ts b/db/seeding/seeding-tables.ts new file mode 100644 index 0000000..9cf4415 --- /dev/null +++ b/db/seeding/seeding-tables.ts @@ -0,0 +1,17 @@ +import { departmentsTable } from "@/db/tables/departments"; +import { expensesTable } from "@/db/tables/expenses"; +import { fieldsOfStudyTable } from "@/db/tables/fields-of-study"; +import { teamApplicationsTable } from "@/db/tables/team-applications"; +import { teamsTable } from "@/db/tables/teams"; +import { usersTable } from "@/db/tables/users"; + +export const seedingTables = { + departmentsTable, + fieldsOfStudyTable, + teamsTable, + usersTable, + //teamUsersTable, these two tables dont work currently + //assistantUsersTable, + teamApplicationsTable, + expensesTable, +}; diff --git a/db/seeding/seeding.ts b/db/seeding/seeding.ts index b893fc6..069a137 100644 --- a/db/seeding/seeding.ts +++ b/db/seeding/seeding.ts @@ -1,9 +1,9 @@ import { getDatabaseErrorPrivateMessage, postgresErrorParser, -} from "@db/errors/postgresError"; -import { seedingTables } from "@db/seeding/seedingTables"; -import { database } from "@db/setup/queryPostgres"; +} from "@/db/errors/postgres-error"; +import { seedingTables } from "@/db/seeding/seeding-tables"; +import { database } from "@/db/setup/query-postgres"; import { reset, seed } from "drizzle-seed"; const doRevertSeeding = @@ -18,13 +18,13 @@ if (hasUnknownOption) { if (doRevertSeeding) { await reset(database, seedingTables); - console.log("Database seeding has been reverted"); + console.info("Database seeding has been reverted"); process.exit(0); } try { await seed(database, seedingTables); - console.log("Database has been seeded"); + console.info("Database has been seeded"); } catch (error) { const postgresErrorResult = postgresErrorParser.safeParse(error); if (postgresErrorResult.success) { diff --git a/db/seeding/seedingTables.ts b/db/seeding/seedingTables.ts deleted file mode 100644 index 05f9d17..0000000 --- a/db/seeding/seedingTables.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { departmentsTable } from "@db/tables/departments"; -import { expensesTable } from "@db/tables/expenses"; -import { fieldsOfStudyTable } from "@db/tables/fieldsOfStudy"; -import { teamsTable } from "@db/tables/team"; -import { teamApplicationsTable } from "@db/tables/teamApplication"; -import { - assistantUsersTable, - teamUsersTable, - usersTable, -} from "@db/tables/users"; - -export const seedingTables = { - departmentsTable, - fieldsOfStudyTable, - teamsTable, - usersTable, - //teamUsersTable, these two tables dont work currently - //assistantUsersTable, - teamApplicationsTable, - expensesTable, -}; diff --git a/package.json b/package.json index b79ba7d..e2bae66 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,6 @@ "format": "biome format --write", "lint": "biome lint --write", "check": "biome check --write", - "db:create": "tsx ./db/setup/createDatabase.ts", "db:generate": "drizzle-kit generate --config=db/config/drizzle.config.ts", "db:migrate": "drizzle-kit migrate --config=db/config/drizzle.config.ts", "db:studio": "drizzle-kit studio --config=db/config/drizzle.config.ts", @@ -54,5 +53,5 @@ "typescript": "^5.6.3", "yaml": "^2.6.0" }, - "packageManager": "pnpm@10.6.3+sha512.bb45e34d50a9a76e858a95837301bfb6bd6d35aea2c5d52094fa497a467c43f5c440103ce2511e9e0a2f89c3d6071baac3358fc68ac6fb75e2ceb3d2736065e6" + "packageManager": "pnpm@10.6.4+sha512.da3d715bfd22a9a105e6e8088cfc7826699332ded60c423b14ec613a185f1602206702ff0fe4c438cb15c979081ce4cb02568e364b15174503a63c7a8e2a5f6c" } From f43dead18e95398a0eb212a20aeef84b9271fa70 Mon Sep 17 00:00:00 2001 From: Vegard Kyrkjedelen Hovland Date: Mon, 17 Mar 2025 16:43:09 +0100 Subject: [PATCH 7/7] chore: :fire: Remove create-databases because it is no longer used --- db/setup/create-database.ts | 42 ------------------------------------- 1 file changed, 42 deletions(-) delete mode 100644 db/setup/create-database.ts diff --git a/db/setup/create-database.ts b/db/setup/create-database.ts deleted file mode 100644 index 0b708a9..0000000 --- a/db/setup/create-database.ts +++ /dev/null @@ -1,42 +0,0 @@ -import "dotenv/config"; -import { databaseConnectionParameters } from "@/db/config/parameters"; -import { - getDatabaseErrorPrivateMessage, - postgresErrorParser, -} from "@/db/errors/postgres-error"; -import pg from "pg"; // It does not work to import { Client } from "pg" - -const postgresClient = new pg.Client({ - ...databaseConnectionParameters, - database: "postgres", -}); - -try { - await postgresClient.connect(); - const databaseListResponse = await postgresClient.query( - `SELECT pg_catalog.pg_database.datname FROM pg_catalog.pg_database WHERE pg_catalog.pg_database.datname = '${databaseConnectionParameters.database}';`, - ); - - if (databaseListResponse.rowCount === 0) { - console.info( - `${databaseConnectionParameters.database} database not found, creating it`, - ); - await postgresClient.query( - `CREATE DATABASE "${databaseConnectionParameters.database}";`, - ); - console.info(`Created database ${databaseConnectionParameters.database}`); - } else { - console.info(`Database ${databaseConnectionParameters.database} exists`); - } - await postgresClient.end(); -} catch (error) { - const errorResult = postgresErrorParser.safeParse(error); - if (errorResult.success) { - console.error(getDatabaseErrorPrivateMessage(errorResult.data)); - } else { - console.error(error); - } - await postgresClient.end(); - console.error("Error when checking if database already exists."); - process.exit(1); -}