diff --git a/apps/server/package.json b/apps/server/package.json index 4d6048cd3..9275d1b61 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -31,19 +31,20 @@ "@opentelemetry/sdk-node": "^0.213.0", "@opentelemetry/sdk-trace-node": "^2.6.0", "@opentelemetry/semantic-conventions": "^1.40.0", - "@proj-airi/drizzle-orm-browser-migrator": "^0.1.4", + "@proj-airi/drizzle-orm-browser-migrator": "^0.1.6", "@proj-airi/server-schema": "workspace:*", "better-auth": "^1.4.19", "drizzle-orm": "^0.45.1", "drizzle-valibot": "catalog:", "hono": "catalog:", "injeca": "catalog:", - "postgres": "^3.4.8", + "pg": "^8.13.3", "tsx": "^4.21.0", "valibot": "catalog:" }, "devDependencies": { "@better-auth/cli": "^1.4.21", + "@types/pg": "^8.11.11", "drizzle-kit": "^0.31.9" } } diff --git a/apps/server/src/app.ts b/apps/server/src/app.ts index df35e59f5..5844e8e22 100644 --- a/apps/server/src/app.ts +++ b/apps/server/src/app.ts @@ -126,14 +126,15 @@ async function createApp() { }) const db = injeca.provide('services:db', { - dependsOn: { env: parsedEnv }, + dependsOn: { env: parsedEnv, lifecycle }, build: async ({ dependsOn }) => { - const dbInstance = createDrizzle(dependsOn.env.DATABASE_URL) + const { db: dbInstance, pool } = createDrizzle(dependsOn.env.DATABASE_URL) await dbInstance.execute('SELECT 1') logger.log('Connected to database') await migrateDatabase(dbInstance) logger.log('Applied schema') + dependsOn.lifecycle.appHooks.onStop(() => pool.end()) return dbInstance }, }) diff --git a/apps/server/src/libs/db.ts b/apps/server/src/libs/db.ts index dbd930425..1d882ea25 100644 --- a/apps/server/src/libs/db.ts +++ b/apps/server/src/libs/db.ts @@ -1,15 +1,16 @@ -import postgres from 'postgres' - import { migrate } from '@proj-airi/drizzle-orm-browser-migrator/pg' import { migrations } from '@proj-airi/server-schema' -import { drizzle } from 'drizzle-orm/postgres-js' +import { drizzle } from 'drizzle-orm/node-postgres' +import { Pool } from 'pg' import * as fullSchema from '../schemas' -export type Database = ReturnType +export type Database = ReturnType['db'] export function createDrizzle(dsn: string) { - return drizzle(postgres(dsn), { schema: fullSchema }) + const pool = new Pool({ connectionString: dsn }) + const db = drizzle(pool, { schema: fullSchema }) + return { db, pool } } export function migrateDatabase(db: Database) { diff --git a/apps/server/src/scripts/auth.ts b/apps/server/src/scripts/auth.ts index 8f398db38..8d4ceec89 100644 --- a/apps/server/src/scripts/auth.ts +++ b/apps/server/src/scripts/auth.ts @@ -5,4 +5,4 @@ import { createDrizzle } from '../libs/db' import { parseEnv } from '../libs/env' const env = parseEnv(process.env) -export default createAuth(createDrizzle(env.DATABASE_URL), env) +export default createAuth(createDrizzle(env.DATABASE_URL).db, env) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3a81d9393..a0f0b7086 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -523,8 +523,8 @@ importers: specifier: ^1.40.0 version: 1.40.0 '@proj-airi/drizzle-orm-browser-migrator': - specifier: ^0.1.4 - version: 0.1.4(drizzle-orm@0.45.1(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.11)(pg@8.19.0)(postgres@3.4.8)) + specifier: ^0.1.6 + version: 0.1.6(drizzle-orm@0.45.1(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.11)(pg@8.19.0)(postgres@3.4.8)) '@proj-airi/server-schema': specifier: workspace:* version: link:../../packages/server-schema @@ -543,9 +543,9 @@ importers: injeca: specifier: 'catalog:' version: 0.1.7(@guiiai/logg@1.2.11)(error-stack-parser@2.1.4)(nanoid@5.1.6) - postgres: - specifier: ^3.4.8 - version: 3.4.8 + pg: + specifier: ^8.13.3 + version: 8.19.0 tsx: specifier: ^4.21.0 version: 4.21.0 @@ -556,6 +556,9 @@ importers: '@better-auth/cli': specifier: ^1.4.21 version: 1.4.21(@better-fetch/fetch@1.1.21)(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.0)(better-call@1.1.8(zod@4.3.6))(drizzle-kit@0.31.9)(jose@6.1.3)(kysely@0.28.11)(magicast@0.5.2)(nanostores@1.1.1)(postgres@3.4.8)(react@19.2.3)(vitest@4.0.18)(vue@3.5.29(typescript@5.9.3)) + '@types/pg': + specifier: ^8.11.11 + version: 8.16.0 drizzle-kit: specifier: ^0.31.9 version: 0.31.9 @@ -829,7 +832,7 @@ importers: version: 1.2.44 '@intlify/unplugin-vue-i18n': specifier: ^11.0.7 - version: 11.0.7(@vue/compiler-dom@3.5.29)(eslint@9.39.3(jiti@2.6.1))(rollup@2.80.0)(typescript@5.9.3)(vue-i18n@11.2.8(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) + version: 11.0.7(@vue/compiler-dom@3.5.29)(eslint@9.39.3(jiti@2.6.1))(rollup@4.59.0)(typescript@5.9.3)(vue-i18n@11.2.8(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) '@proj-airi/cap-vite': specifier: workspace:* version: link:../../packages/cap-vite @@ -892,19 +895,19 @@ importers: version: 4.5.1 unplugin-info: specifier: ^1.2.4 - version: 1.2.4(esbuild@0.27.2)(rollup@2.80.0)(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 1.2.4(esbuild@0.27.2)(rollup@4.59.0)(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) unplugin-vue-router: specifier: ^0.19.2 version: 0.19.2(@vue/compiler-sfc@3.5.29)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) unplugin-yaml: specifier: ^4.0.0 - version: 4.0.0(esbuild@0.27.2)(rolldown@1.0.0-rc.3)(rollup@2.80.0)(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.0.0(esbuild@0.27.2)(rolldown@1.0.0-rc.3)(rollup@4.59.0)(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vite: specifier: 'catalog:' version: 8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vite-bundle-visualizer: specifier: ^1.2.1 - version: 1.2.1(rolldown@1.0.0-rc.3)(rollup@2.80.0) + version: 1.2.1(rolldown@1.0.0-rc.3)(rollup@4.59.0) vite-plugin-mkcert: specifier: 'catalog:' version: 1.17.10(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) @@ -919,7 +922,7 @@ importers: version: 0.11.0(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) vue-macros: specifier: ^3.1.2 - version: 3.1.2(@vueuse/core@14.2.1(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.2)(rolldown@1.0.0-rc.3)(rollup@2.80.0)(typescript@5.9.3)(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.5(typescript@5.9.3))(vue@3.5.29(typescript@5.9.3)) + version: 3.1.2(@vueuse/core@14.2.1(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.2)(rolldown@1.0.0-rc.3)(rollup@4.59.0)(typescript@5.9.3)(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.5(typescript@5.9.3))(vue@3.5.29(typescript@5.9.3)) vue-tsc: specifier: ^3.1.8 version: 3.2.5(typescript@5.9.3) @@ -1650,7 +1653,7 @@ importers: version: 1.2.44 '@intlify/unplugin-vue-i18n': specifier: ^11.0.7 - version: 11.0.7(@vue/compiler-dom@3.5.29)(eslint@9.39.3(jiti@2.6.1))(rollup@4.59.0)(typescript@5.9.3)(vue-i18n@11.2.8(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) + version: 11.0.7(@vue/compiler-dom@3.5.29)(eslint@9.39.3(jiti@2.6.1))(rollup@2.80.0)(typescript@5.9.3)(vue-i18n@11.2.8(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) '@proj-airi/iconify-meteocons': specifier: 'catalog:' version: 0.1.4 @@ -1710,19 +1713,19 @@ importers: version: 4.5.1 unplugin-info: specifier: ^1.2.4 - version: 1.2.4(esbuild@0.27.2)(rollup@4.59.0)(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 1.2.4(esbuild@0.27.2)(rollup@2.80.0)(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) unplugin-vue-router: specifier: ^0.19.2 version: 0.19.2(@vue/compiler-sfc@3.5.29)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) unplugin-yaml: specifier: ^4.0.0 - version: 4.0.0(esbuild@0.27.2)(rolldown@1.0.0-rc.3)(rollup@4.59.0)(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.0.0(esbuild@0.27.2)(rolldown@1.0.0-rc.3)(rollup@2.80.0)(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vite: specifier: 'catalog:' version: 8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vite-bundle-visualizer: specifier: ^1.2.1 - version: 1.2.1(rolldown@1.0.0-rc.3)(rollup@4.59.0) + version: 1.2.1(rolldown@1.0.0-rc.3)(rollup@2.80.0) vite-plugin-pwa: specifier: ^1.2.0 version: 1.2.0(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(workbox-build@7.4.0)(workbox-window@7.4.0) @@ -1734,7 +1737,7 @@ importers: version: 0.11.0(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) vue-macros: specifier: ^3.1.2 - version: 3.1.2(@vueuse/core@14.2.1(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.2)(rolldown@1.0.0-rc.3)(rollup@4.59.0)(typescript@5.9.3)(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.5(typescript@5.9.3))(vue@3.5.29(typescript@5.9.3)) + version: 3.1.2(@vueuse/core@14.2.1(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.2)(rolldown@1.0.0-rc.3)(rollup@2.80.0)(typescript@5.9.3)(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.5(typescript@5.9.3))(vue@3.5.29(typescript@5.9.3)) vue-tsc: specifier: ^3.2.5 version: 3.2.5(typescript@5.9.3) @@ -7823,8 +7826,8 @@ packages: web-worker: optional: true - '@proj-airi/drizzle-orm-browser-migrator@0.1.4': - resolution: {integrity: sha512-xglys6t2+h62aLwAvIN7L4V/lUB3FkVSbm7nj8dCHQ+OxCSQtEPyjgiwqahlFBRg6n9/L/ASvD78ASk/2VT/RQ==} + '@proj-airi/drizzle-orm-browser-migrator@0.1.6': + resolution: {integrity: sha512-7A7Ay5vSLBer2P+Ydbrl9AktE7geIlh396zB/3a9odwI/1GT89Pljzvjz5SVxG0e17+wMOPLRKnTnCzukL1B9Q==} peerDependencies: drizzle-orm: '>=0.44.0' @@ -21927,7 +21930,7 @@ snapshots: transitivePeerDependencies: - '@75lb/nature' - '@proj-airi/drizzle-orm-browser-migrator@0.1.4(drizzle-orm@0.45.1(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.11)(pg@8.19.0)(postgres@3.4.8))': + '@proj-airi/drizzle-orm-browser-migrator@0.1.6(drizzle-orm@0.45.1(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.11)(pg@8.19.0)(postgres@3.4.8))': dependencies: '@guiiai/logg': 1.2.11 drizzle-orm: 0.45.1(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.11)(pg@8.19.0)(postgres@3.4.8)