diff --git a/.gitignore b/.gitignore index cd73cef1..e1c08e55 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,4 @@ installer bin .secrets test_event.json -.idea/ \ No newline at end of file +.idea/ diff --git a/Dockerfile b/Dockerfile.pg similarity index 75% rename from Dockerfile rename to Dockerfile.pg index 6ec9e23d..58c54d8c 100644 --- a/Dockerfile +++ b/Dockerfile.pg @@ -8,9 +8,11 @@ RUN npm install COPY . . -RUN npx drizzle-kit generate --dialect sqlite --schema ./server/db/schemas/ --out init +RUN echo 'export * from "./pg";' > server/db/index.ts -RUN npm run build +RUN npx drizzle-kit generate --dialect postgresql --schema ./server/db/pg/schema.ts --out init + +RUN npm run build:pg FROM node:20-alpine AS runner @@ -32,4 +34,4 @@ COPY server/db/names.json ./dist/names.json COPY public ./public -CMD ["npm", "start"] +CMD ["npm", "run", "start:pg"] diff --git a/Makefile b/Makefile index 793a3481..d20bebd4 100644 --- a/Makefile +++ b/Makefile @@ -3,8 +3,10 @@ build-release: echo "Error: tag is required. Usage: make build-all tag="; \ exit 1; \ fi - docker buildx build --platform linux/arm64,linux/amd64 -t fosrl/pangolin:latest -f Dockerfile --push . - docker buildx build --platform linux/arm64,linux/amd64 -t fosrl/pangolin:$(tag) -f Dockerfile --push . + docker buildx build --platform linux/arm64,linux/amd64 -t fosrl/pangolin:latest -f Dockerfile.sqlite --push . + docker buildx build --platform linux/arm64,linux/amd64 -t fosrl/pangolin:$(tag) -f Dockerfile.sqlite --push . + docker buildx build --platform linux/arm64,linux/amd64 -t fosrl/pangolin:postgresql-latest -f Dockerfile.pg --push . + docker buildx build --platform linux/arm64,linux/amd64 -t fosrl/pangolin:postgresql-$(tag) -f Dockerfile.pg --push . build-arm: docker buildx build --platform linux/arm64 -t fosrl/pangolin:latest . diff --git a/drizzle.pg.config.ts b/drizzle.pg.config.ts new file mode 100644 index 00000000..14aeba5b --- /dev/null +++ b/drizzle.pg.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "drizzle-kit"; +import path from "path"; + +export default defineConfig({ + dialect: "postgresql", + schema: path.join("server", "db", "pg", "schema.ts"), + out: path.join("server", "migrations"), + verbose: true, + dbCredentials: { + url: process.env.DATABASE_URL as string + } +}); diff --git a/drizzle.config.ts b/drizzle.sqlite.config.ts similarity index 83% rename from drizzle.config.ts rename to drizzle.sqlite.config.ts index dcfc55c6..94574a89 100644 --- a/drizzle.config.ts +++ b/drizzle.sqlite.config.ts @@ -4,7 +4,7 @@ import path from "path"; export default defineConfig({ dialect: "sqlite", - schema: path.join("server", "db", "schemas"), + schema: path.join("server", "db", "sqlite", "schema.ts"), out: path.join("server", "migrations"), verbose: true, dbCredentials: { diff --git a/newt b/newt deleted file mode 100755 index 3805c736..00000000 Binary files a/newt and /dev/null differ diff --git a/next.config.mjs b/next.config.mjs index fce5b1fa..5b5eafc1 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,7 +1,7 @@ /** @type {import('next').NextConfig} */ const nextConfig = { eslint: { - ignoreDuringBuilds: true, + ignoreDuringBuilds: true }, output: "standalone" }; diff --git a/package-lock.json b/package-lock.json index c6da9176..7464b068 100644 --- a/package-lock.json +++ b/package-lock.json @@ -69,6 +69,7 @@ "nodemailer": "6.9.16", "npm": "^11.2.0", "oslo": "1.2.1", + "pg": "^8.16.0", "qrcode.react": "4.2.0", "react": "19.0.0", "react-dom": "19.0.0", @@ -12512,6 +12513,95 @@ "url": "https://ko-fi.com/killymxi" } }, + "node_modules/pg": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.0.tgz", + "integrity": "sha512-7SKfdvP8CTNXjMUzfcVTaI+TDzBEeaUnVwiVGZQD1Hh33Kpev7liQba9uLd4CfN8r9mCVsD0JIpq03+Unpz+kg==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.9.0", + "pg-pool": "^3.10.0", + "pg-protocol": "^1.10.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.2.5" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.5.tgz", + "integrity": "sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.0.tgz", + "integrity": "sha512-P2DEBKuvh5RClafLngkAuGe9OUlFV7ebu8w1kmaaOgPcpJd1RIFh7otETfI6hAR8YupOLFTY7nuvvIn7PLciUQ==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.0.tgz", + "integrity": "sha512-DzZ26On4sQ0KmqnO34muPcmKbhrjmyiO4lCCR0VwEd7MjmiKf5NTg/6+apUEu0NF7ESa37CGzFxH513CoUmWnA==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.0.tgz", + "integrity": "sha512-IpdytjudNuLv8nhlHs/UrVBhU0e78J0oIS/0AVdTbWxSOkFUVdsHC/NrorO6nXsQNDTT1kzDSOMJubBQviX18Q==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -12582,6 +12672,45 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", @@ -14316,6 +14445,15 @@ "source-map": "^0.6.0" } }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/stable-hash": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", @@ -15498,6 +15636,15 @@ } } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index f2ce2cd4..72f6ba2d 100644 --- a/package.json +++ b/package.json @@ -12,11 +12,16 @@ "license": "SEE LICENSE IN LICENSE AND README.md", "scripts": { "dev": "NODE_ENV=development ENVIRONMENT=dev tsx watch server/index.ts", - "db:generate": "drizzle-kit generate", - "db:push": "npx tsx server/db/migrate.ts", + "db:pg:generate": "drizzle-kit generate --config=./drizzle.pg.config.ts", + "db:sqlite:generate": "drizzle-kit generate --config=./drizzle.sqlite.config.ts", + "db:pg:push": "npx tsx server/db/pg/migrate.ts", + "db:sqlite:push": "npx tsx server/db/sqlite/migrate.ts", "db:studio": "drizzle-kit studio", - "build": "mkdir -p dist && next build && node esbuild.mjs -e server/index.ts -o dist/server.mjs && node esbuild.mjs -e server/setup/migrations.ts -o dist/migrations.mjs", - "start": "NODE_OPTIONS=--enable-source-maps NODE_ENV=development ENVIRONMENT=prod sh -c 'node dist/migrations.mjs && node dist/server.mjs'", + "db:clear-migrations": "rm -rf server/migrations", + "build:sqlite": "mkdir -p dist && next build && node esbuild.mjs -e server/index.ts -o dist/server.mjs && node esbuild.mjs -e server/setup/migrationsSqlite.ts -o dist/migrations.mjs", + "build:pg": "mkdir -p dist && next build && node esbuild.mjs -e server/index.ts -o dist/server.mjs && node esbuild.mjs -e server/setup/migrationsPg.ts -o dist/migrations.mjs", + "start:sqlite": "DB_TYPE=sqlite NODE_OPTIONS=--enable-source-maps NODE_ENV=development ENVIRONMENT=prod sh -c 'node dist/migrations.mjs && node dist/server.mjs'", + "start:pg": "DB_TYPE=pg NODE_OPTIONS=--enable-source-maps NODE_ENV=development ENVIRONMENT=prod sh -c 'node dist/migrations.mjs && node dist/server.mjs'", "email": "email dev --dir server/emails/templates --port 3005" }, "dependencies": { @@ -80,6 +85,7 @@ "nodemailer": "6.9.16", "npm": "^11.2.0", "oslo": "1.2.1", + "pg": "^8.16.0", "qrcode.react": "4.2.0", "react": "19.0.0", "react-dom": "19.0.0", diff --git a/server/auth/actions.ts b/server/auth/actions.ts index e83031a1..08c86321 100644 --- a/server/auth/actions.ts +++ b/server/auth/actions.ts @@ -1,6 +1,6 @@ import { Request } from "express"; import { db } from "@server/db"; -import { userActions, roleActions, userOrgs } from "@server/db/schemas"; +import { userActions, roleActions, userOrgs } from "@server/db"; import { and, eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/auth/canUserAccessResource.ts b/server/auth/canUserAccessResource.ts index 0d618255..161a0bee 100644 --- a/server/auth/canUserAccessResource.ts +++ b/server/auth/canUserAccessResource.ts @@ -1,6 +1,6 @@ -import db from "@server/db"; +import { db } from "@server/db"; import { and, eq } from "drizzle-orm"; -import { roleResources, userResources } from "@server/db/schemas"; +import { roleResources, userResources } from "@server/db"; export async function canUserAccessResource({ userId, diff --git a/server/auth/checkValidInvite.ts b/server/auth/checkValidInvite.ts index bda12c9f..e8dee8a8 100644 --- a/server/auth/checkValidInvite.ts +++ b/server/auth/checkValidInvite.ts @@ -1,5 +1,5 @@ -import db from "@server/db"; -import { UserInvite, userInvites } from "@server/db/schemas"; +import { db } from "@server/db"; +import { UserInvite, userInvites } from "@server/db"; import { isWithinExpirationDate } from "oslo"; import { verifyPassword } from "./password"; import { eq } from "drizzle-orm"; diff --git a/server/auth/limits.ts b/server/auth/limits.ts index c7c19398..5d0b14e4 100644 --- a/server/auth/limits.ts +++ b/server/auth/limits.ts @@ -1,5 +1,5 @@ import { db } from '@server/db'; -import { limitsTable } from '@server/db/schemas'; +import { limitsTable } from '@server/db'; import { and, eq } from 'drizzle-orm'; import createHttpError from 'http-errors'; import HttpCode from '@server/types/HttpCode'; diff --git a/server/auth/resourceOtp.ts b/server/auth/resourceOtp.ts index 2539bf38..3a0753e0 100644 --- a/server/auth/resourceOtp.ts +++ b/server/auth/resourceOtp.ts @@ -1,5 +1,5 @@ -import db from "@server/db"; -import { resourceOtp } from "@server/db/schemas"; +import { db } from "@server/db"; +import { resourceOtp } from "@server/db"; import { and, eq } from "drizzle-orm"; import { createDate, isWithinExpirationDate, TimeSpan } from "oslo"; import { alphabet, generateRandomString, sha256 } from "oslo/crypto"; diff --git a/server/auth/sendEmailVerificationCode.ts b/server/auth/sendEmailVerificationCode.ts index 788c1358..71112922 100644 --- a/server/auth/sendEmailVerificationCode.ts +++ b/server/auth/sendEmailVerificationCode.ts @@ -1,7 +1,7 @@ import { TimeSpan, createDate } from "oslo"; import { generateRandomString, alphabet } from "oslo/crypto"; -import db from "@server/db"; -import { users, emailVerificationCodes } from "@server/db/schemas"; +import { db } from "@server/db"; +import { users, emailVerificationCodes } from "@server/db"; import { eq } from "drizzle-orm"; import { sendEmail } from "@server/emails"; import config from "@server/lib/config"; diff --git a/server/auth/sessions/app.ts b/server/auth/sessions/app.ts index be43d7a8..34d584f6 100644 --- a/server/auth/sessions/app.ts +++ b/server/auth/sessions/app.ts @@ -9,8 +9,8 @@ import { sessions, User, users -} from "@server/db/schemas"; -import db from "@server/db"; +} from "@server/db"; +import { db } from "@server/db"; import { eq, inArray } from "drizzle-orm"; import config from "@server/lib/config"; import type { RandomReader } from "@oslojs/crypto/random"; diff --git a/server/auth/sessions/newt.ts b/server/auth/sessions/newt.ts index 7d2ef8ab..5e55c491 100644 --- a/server/auth/sessions/newt.ts +++ b/server/auth/sessions/newt.ts @@ -2,8 +2,8 @@ import { encodeHexLowerCase, } from "@oslojs/encoding"; import { sha256 } from "@oslojs/crypto/sha2"; -import { Newt, newts, newtSessions, NewtSession } from "@server/db/schemas"; -import db from "@server/db"; +import { Newt, newts, newtSessions, NewtSession } from "@server/db"; +import { db } from "@server/db"; import { eq } from "drizzle-orm"; export const EXPIRES = 1000 * 60 * 60 * 24 * 30; diff --git a/server/auth/sessions/resource.ts b/server/auth/sessions/resource.ts index b95bece3..f29a8b75 100644 --- a/server/auth/sessions/resource.ts +++ b/server/auth/sessions/resource.ts @@ -1,7 +1,7 @@ import { encodeHexLowerCase } from "@oslojs/encoding"; import { sha256 } from "@oslojs/crypto/sha2"; -import { resourceSessions, ResourceSession } from "@server/db/schemas"; -import db from "@server/db"; +import { resourceSessions, ResourceSession } from "@server/db"; +import { db } from "@server/db"; import { eq, and } from "drizzle-orm"; import config from "@server/lib/config"; diff --git a/server/auth/totp.ts b/server/auth/totp.ts index 3ca183a0..efe2b64b 100644 --- a/server/auth/totp.ts +++ b/server/auth/totp.ts @@ -1,6 +1,6 @@ import { verify } from "@node-rs/argon2"; -import db from "@server/db"; -import { twoFactorBackupCodes } from "@server/db/schemas"; +import { db } from "@server/db"; +import { twoFactorBackupCodes } from "@server/db"; import { eq } from "drizzle-orm"; import { decodeHex } from "oslo/encoding"; import { TOTPController } from "oslo/otp"; diff --git a/server/auth/verifyResourceAccessToken.ts b/server/auth/verifyResourceAccessToken.ts index 8ddb5018..f1b587b7 100644 --- a/server/auth/verifyResourceAccessToken.ts +++ b/server/auth/verifyResourceAccessToken.ts @@ -1,10 +1,10 @@ -import db from "@server/db"; +import { db } from "@server/db"; import { Resource, ResourceAccessToken, resourceAccessToken, resources -} from "@server/db/schemas"; +} from "@server/db"; import { and, eq } from "drizzle-orm"; import { isWithinExpirationDate } from "oslo"; import { verifyPassword } from "./password"; diff --git a/server/db/README.md b/server/db/README.md new file mode 100644 index 00000000..76515b46 --- /dev/null +++ b/server/db/README.md @@ -0,0 +1,66 @@ +# Database + +Pangolin can use a Postgres or SQLite database to store its data. + +## Development + +### Postgres + +To use Postgres, edit `server/db/index.ts` to export all from `server/db/pg/index.ts`: + +```typescript +export * from "./pg"; +``` + +Make sure you have a valid config file with a connection string: + +```yaml +postgres: + connection_string: postgresql://postgres:postgres@localhost:5432 +``` + +You can run an ephemeral Postgres database for local development using Docker: + +```bash +docker run -d \ + --name postgres \ + --rm \ + -p 5432:5432 \ + -e POSTGRES_PASSWORD=postgres \ + -v $(mktemp -d):/var/lib/postgresql/data \ + postgres:17 +``` + +### SQLite + +To use SQLite, edit `server/db/index.ts` to export all from `server/db/sqlite/index.ts`: + +```typescript +export * from "./sqlite"; +``` + +No edits to the config are needed. If you keep the Postgres config, it will be ignored. + +## Generate and Push Migrations + +Ensure drizzle-kit is installed. + +### Postgres + +You must have a connection string in your config file, as shown above. + +```bash +npm run db:pg:generate +npm run db:pg:push +``` + +### SQLite + +```bash +npm run db:sqlite:generate +npm run db:sqlite:push +``` + +## Build Time + +There is a dockerfile for each database type. The dockerfile swaps out the `server/db/index.ts` file to use the correct database type. diff --git a/server/db/index.ts b/server/db/index.ts index ba26d1dc..826c950f 100644 --- a/server/db/index.ts +++ b/server/db/index.ts @@ -1,63 +1,2 @@ -import { drizzle as DrizzleSqlite } from "drizzle-orm/better-sqlite3"; -import { drizzle as DrizzlePostgres } from "drizzle-orm/node-postgres"; -import Database from "better-sqlite3"; -import * as schema from "@server/db/schemas"; -import path from "path"; -import fs from "fs/promises"; -import { APP_PATH } from "@server/lib/consts"; -import { existsSync, mkdirSync } from "fs"; -import { readConfigFile } from "@server/lib/readConfigFile"; - -export const location = path.join(APP_PATH, "db", "db.sqlite"); -export const exists = await checkFileExists(location); - -bootstrapVolume(); - -function createDb() { - const config = readConfigFile(); - - if (config.database.type === "postgres") { - return DrizzlePostgres(config.database!.postgres!.connection_string!); - } else { - const sqlite = new Database(location); - return DrizzleSqlite(sqlite, { schema }); - } -} - -export const db = createDb(); -export default db; - -async function checkFileExists(filePath: string): Promise { - try { - await fs.access(filePath); - return true; - } catch { - return false; - } -} - -function bootstrapVolume() { - const appPath = APP_PATH; - - const dbDir = path.join(appPath, "db"); - const logsDir = path.join(appPath, "logs"); - - // check if the db directory exists and create it if it doesn't - if (!existsSync(dbDir)) { - mkdirSync(dbDir, { recursive: true }); - } - - // check if the logs directory exists and create it if it doesn't - if (!existsSync(logsDir)) { - mkdirSync(logsDir, { recursive: true }); - } - - // THIS IS FOR TRAEFIK; NOT REALLY NEEDED, BUT JUST IN CASE - - const traefikDir = path.join(appPath, "traefik"); - - // check if the traefik directory exists and create it if it doesn't - if (!existsSync(traefikDir)) { - mkdirSync(traefikDir, { recursive: true }); - } -} +export * from "./sqlite"; +// export * from "./pg"; diff --git a/server/db/names.ts b/server/db/names.ts index 21a37c9a..56d62373 100644 --- a/server/db/names.ts +++ b/server/db/names.ts @@ -1,7 +1,7 @@ import { join } from "path"; import { readFileSync } from "fs"; import { db } from "@server/db"; -import { exitNodes, sites } from "./schemas/schema"; +import { exitNodes, sites } from "@server/db"; import { eq, and } from "drizzle-orm"; import { __DIRNAME } from "@server/lib/consts"; diff --git a/server/db/pg/driver.ts b/server/db/pg/driver.ts new file mode 100644 index 00000000..999b6827 --- /dev/null +++ b/server/db/pg/driver.ts @@ -0,0 +1,17 @@ +import { drizzle as DrizzlePostgres } from "drizzle-orm/node-postgres"; +import { readConfigFile } from "@server/lib/readConfigFile"; + +function createDb() { + const config = readConfigFile(); + + const connectionString = config.postgres?.connection_string; + + if (!connectionString) { + throw new Error("Postgres connection string is not defined in the configuration file."); + } + + return DrizzlePostgres(connectionString); +} + +export const db = createDb(); +export default db; diff --git a/server/db/schemas/index.ts b/server/db/pg/index.ts similarity index 50% rename from server/db/schemas/index.ts rename to server/db/pg/index.ts index 686fbd9e..9ad4678c 100644 --- a/server/db/schemas/index.ts +++ b/server/db/pg/index.ts @@ -1 +1,2 @@ +export * from "./driver"; export * from "./schema"; diff --git a/server/db/migratePostgres.ts b/server/db/pg/migrate.ts similarity index 88% rename from server/db/migratePostgres.ts rename to server/db/pg/migrate.ts index 614b2c66..b9463dd4 100644 --- a/server/db/migratePostgres.ts +++ b/server/db/pg/migrate.ts @@ -1,5 +1,5 @@ import { migrate } from "drizzle-orm/node-postgres/migrator"; -import db from "@server/db"; +import db from "./driver"; import path from "path"; const migrationsFolder = path.join("server/migrations"); @@ -7,7 +7,7 @@ const migrationsFolder = path.join("server/migrations"); const runMigrations = async () => { console.log("Running migrations..."); try { - migrate(db as any, { + await migrate(db as any, { migrationsFolder: migrationsFolder }); console.log("Migrations completed successfully."); diff --git a/server/db/pg/schema.ts b/server/db/pg/schema.ts new file mode 100644 index 00000000..227ceba4 --- /dev/null +++ b/server/db/pg/schema.ts @@ -0,0 +1,531 @@ +import { + pgTable, + serial, + varchar, + boolean, + integer, + bigint, + real +} from "drizzle-orm/pg-core"; +import { InferSelectModel } from "drizzle-orm"; + +export const domains = pgTable("domains", { + domainId: varchar("domainId").primaryKey(), + baseDomain: varchar("baseDomain").notNull(), + configManaged: boolean("configManaged").notNull().default(false) +}); + +export const orgs = pgTable("orgs", { + orgId: varchar("orgId").primaryKey(), + name: varchar("name").notNull() +}); + +export const orgDomains = pgTable("orgDomains", { + orgId: varchar("orgId") + .notNull() + .references(() => orgs.orgId, { onDelete: "cascade" }), + domainId: varchar("domainId") + .notNull() + .references(() => domains.domainId, { onDelete: "cascade" }) +}); + +export const sites = pgTable("sites", { + siteId: serial("siteId").primaryKey(), + orgId: varchar("orgId") + .references(() => orgs.orgId, { + onDelete: "cascade" + }) + .notNull(), + niceId: varchar("niceId").notNull(), + exitNodeId: integer("exitNode").references(() => exitNodes.exitNodeId, { + onDelete: "set null" + }), + name: varchar("name").notNull(), + pubKey: varchar("pubKey"), + subnet: varchar("subnet").notNull(), + megabytesIn: real("bytesIn"), + megabytesOut: real("bytesOut"), + lastBandwidthUpdate: varchar("lastBandwidthUpdate"), + type: varchar("type").notNull(), // "newt" or "wireguard" + online: boolean("online").notNull().default(false) +}); + +export const resources = pgTable("resources", { + resourceId: serial("resourceId").primaryKey(), + siteId: integer("siteId") + .references(() => sites.siteId, { + onDelete: "cascade" + }) + .notNull(), + orgId: varchar("orgId") + .references(() => orgs.orgId, { + onDelete: "cascade" + }) + .notNull(), + name: varchar("name").notNull(), + subdomain: varchar("subdomain"), + fullDomain: varchar("fullDomain"), + domainId: varchar("domainId").references(() => domains.domainId, { + onDelete: "set null" + }), + ssl: boolean("ssl").notNull().default(false), + blockAccess: boolean("blockAccess").notNull().default(false), + sso: boolean("sso").notNull().default(true), + http: boolean("http").notNull().default(true), + protocol: varchar("protocol").notNull(), + proxyPort: integer("proxyPort"), + emailWhitelistEnabled: boolean("emailWhitelistEnabled") + .notNull() + .default(false), + isBaseDomain: boolean("isBaseDomain"), + applyRules: boolean("applyRules").notNull().default(false), + enabled: boolean("enabled").notNull().default(true), + stickySession: boolean("stickySession").notNull().default(false), + tlsServerName: varchar("tlsServerName"), + setHostHeader: varchar("setHostHeader") +}); + +export const targets = pgTable("targets", { + targetId: serial("targetId").primaryKey(), + resourceId: integer("resourceId") + .references(() => resources.resourceId, { + onDelete: "cascade" + }) + .notNull(), + ip: varchar("ip").notNull(), + method: varchar("method"), + port: integer("port").notNull(), + internalPort: integer("internalPort"), + enabled: boolean("enabled").notNull().default(true) +}); + +export const exitNodes = pgTable("exitNodes", { + exitNodeId: serial("exitNodeId").primaryKey(), + name: varchar("name").notNull(), + address: varchar("address").notNull(), + endpoint: varchar("endpoint").notNull(), + publicKey: varchar("publicKey").notNull(), + listenPort: integer("listenPort").notNull(), + reachableAt: varchar("reachableAt") +}); + +export const users = pgTable("user", { + userId: varchar("id").primaryKey(), + email: varchar("email"), + username: varchar("username").notNull(), + name: varchar("name"), + type: varchar("type").notNull(), // "internal", "oidc" + idpId: integer("idpId").references(() => idp.idpId, { + onDelete: "cascade" + }), + passwordHash: varchar("passwordHash"), + twoFactorEnabled: boolean("twoFactorEnabled").notNull().default(false), + twoFactorSecret: varchar("twoFactorSecret"), + emailVerified: boolean("emailVerified").notNull().default(false), + dateCreated: varchar("dateCreated").notNull(), + serverAdmin: boolean("serverAdmin").notNull().default(false) +}); + +export const newts = pgTable("newt", { + newtId: varchar("id").primaryKey(), + secretHash: varchar("secretHash").notNull(), + dateCreated: varchar("dateCreated").notNull(), + siteId: integer("siteId").references(() => sites.siteId, { + onDelete: "cascade" + }) +}); + +export const twoFactorBackupCodes = pgTable("twoFactorBackupCodes", { + codeId: serial("id").primaryKey(), + userId: varchar("userId") + .notNull() + .references(() => users.userId, { onDelete: "cascade" }), + codeHash: varchar("codeHash").notNull() +}); + +export const sessions = pgTable("session", { + sessionId: varchar("id").primaryKey(), + userId: varchar("userId") + .notNull() + .references(() => users.userId, { onDelete: "cascade" }), + expiresAt: bigint("expiresAt", { mode: "number" }).notNull() +}); + +export const newtSessions = pgTable("newtSession", { + sessionId: varchar("id").primaryKey(), + newtId: varchar("newtId") + .notNull() + .references(() => newts.newtId, { onDelete: "cascade" }), + expiresAt: bigint("expiresAt", { mode: "number" }).notNull() +}); + +export const userOrgs = pgTable("userOrgs", { + userId: varchar("userId") + .notNull() + .references(() => users.userId, { onDelete: "cascade" }), + orgId: varchar("orgId") + .references(() => orgs.orgId, { + onDelete: "cascade" + }) + .notNull(), + roleId: integer("roleId") + .notNull() + .references(() => roles.roleId), + isOwner: boolean("isOwner").notNull().default(false) +}); + +export const emailVerificationCodes = pgTable("emailVerificationCodes", { + codeId: serial("id").primaryKey(), + userId: varchar("userId") + .notNull() + .references(() => users.userId, { onDelete: "cascade" }), + email: varchar("email").notNull(), + code: varchar("code").notNull(), + expiresAt: bigint("expiresAt", { mode: "number" }).notNull() +}); + +export const passwordResetTokens = pgTable("passwordResetTokens", { + tokenId: serial("id").primaryKey(), + email: varchar("email").notNull(), + userId: varchar("userId") + .notNull() + .references(() => users.userId, { onDelete: "cascade" }), + tokenHash: varchar("tokenHash").notNull(), + expiresAt: bigint("expiresAt", { mode: "number" }).notNull() +}); + +export const actions = pgTable("actions", { + actionId: varchar("actionId").primaryKey(), + name: varchar("name"), + description: varchar("description") +}); + +export const roles = pgTable("roles", { + roleId: serial("roleId").primaryKey(), + orgId: varchar("orgId") + .references(() => orgs.orgId, { + onDelete: "cascade" + }) + .notNull(), + isAdmin: boolean("isAdmin"), + name: varchar("name").notNull(), + description: varchar("description") +}); + +export const roleActions = pgTable("roleActions", { + roleId: integer("roleId") + .notNull() + .references(() => roles.roleId, { onDelete: "cascade" }), + actionId: varchar("actionId") + .notNull() + .references(() => actions.actionId, { onDelete: "cascade" }), + orgId: varchar("orgId") + .notNull() + .references(() => orgs.orgId, { onDelete: "cascade" }) +}); + +export const userActions = pgTable("userActions", { + userId: varchar("userId") + .notNull() + .references(() => users.userId, { onDelete: "cascade" }), + actionId: varchar("actionId") + .notNull() + .references(() => actions.actionId, { onDelete: "cascade" }), + orgId: varchar("orgId") + .notNull() + .references(() => orgs.orgId, { onDelete: "cascade" }) +}); + +export const roleSites = pgTable("roleSites", { + roleId: integer("roleId") + .notNull() + .references(() => roles.roleId, { onDelete: "cascade" }), + siteId: integer("siteId") + .notNull() + .references(() => sites.siteId, { onDelete: "cascade" }) +}); + +export const userSites = pgTable("userSites", { + userId: varchar("userId") + .notNull() + .references(() => users.userId, { onDelete: "cascade" }), + siteId: integer("siteId") + .notNull() + .references(() => sites.siteId, { onDelete: "cascade" }) +}); + +export const roleResources = pgTable("roleResources", { + roleId: integer("roleId") + .notNull() + .references(() => roles.roleId, { onDelete: "cascade" }), + resourceId: integer("resourceId") + .notNull() + .references(() => resources.resourceId, { onDelete: "cascade" }) +}); + +export const userResources = pgTable("userResources", { + userId: varchar("userId") + .notNull() + .references(() => users.userId, { onDelete: "cascade" }), + resourceId: integer("resourceId") + .notNull() + .references(() => resources.resourceId, { onDelete: "cascade" }) +}); + +export const limitsTable = pgTable("limits", { + limitId: serial("limitId").primaryKey(), + orgId: varchar("orgId") + .references(() => orgs.orgId, { + onDelete: "cascade" + }) + .notNull(), + name: varchar("name").notNull(), + value: bigint("value", { mode: "number" }).notNull(), + description: varchar("description") +}); + +export const userInvites = pgTable("userInvites", { + inviteId: varchar("inviteId").primaryKey(), + orgId: varchar("orgId") + .notNull() + .references(() => orgs.orgId, { onDelete: "cascade" }), + email: varchar("email").notNull(), + expiresAt: bigint("expiresAt", { mode: "number" }).notNull(), + tokenHash: varchar("token").notNull(), + roleId: integer("roleId") + .notNull() + .references(() => roles.roleId, { onDelete: "cascade" }) +}); + +export const resourcePincode = pgTable("resourcePincode", { + pincodeId: serial("pincodeId").primaryKey(), + resourceId: integer("resourceId") + .notNull() + .references(() => resources.resourceId, { onDelete: "cascade" }), + pincodeHash: varchar("pincodeHash").notNull(), + digitLength: integer("digitLength").notNull() +}); + +export const resourcePassword = pgTable("resourcePassword", { + passwordId: serial("passwordId").primaryKey(), + resourceId: integer("resourceId") + .notNull() + .references(() => resources.resourceId, { onDelete: "cascade" }), + passwordHash: varchar("passwordHash").notNull() +}); + +export const resourceAccessToken = pgTable("resourceAccessToken", { + accessTokenId: varchar("accessTokenId").primaryKey(), + orgId: varchar("orgId") + .notNull() + .references(() => orgs.orgId, { onDelete: "cascade" }), + resourceId: integer("resourceId") + .notNull() + .references(() => resources.resourceId, { onDelete: "cascade" }), + tokenHash: varchar("tokenHash").notNull(), + sessionLength: bigint("sessionLength", { mode: "number" }).notNull(), + expiresAt: bigint("expiresAt", { mode: "number" }), + title: varchar("title"), + description: varchar("description"), + createdAt: bigint("createdAt", { mode: "number" }).notNull() +}); + +export const resourceSessions = pgTable("resourceSessions", { + sessionId: varchar("id").primaryKey(), + resourceId: integer("resourceId") + .notNull() + .references(() => resources.resourceId, { onDelete: "cascade" }), + expiresAt: bigint("expiresAt", { mode: "number" }).notNull(), + sessionLength: bigint("sessionLength", { mode: "number" }).notNull(), + doNotExtend: boolean("doNotExtend").notNull().default(false), + isRequestToken: boolean("isRequestToken"), + userSessionId: varchar("userSessionId").references( + () => sessions.sessionId, + { + onDelete: "cascade" + } + ), + passwordId: integer("passwordId").references( + () => resourcePassword.passwordId, + { + onDelete: "cascade" + } + ), + pincodeId: integer("pincodeId").references( + () => resourcePincode.pincodeId, + { + onDelete: "cascade" + } + ), + whitelistId: integer("whitelistId").references( + () => resourceWhitelist.whitelistId, + { + onDelete: "cascade" + } + ), + accessTokenId: varchar("accessTokenId").references( + () => resourceAccessToken.accessTokenId, + { + onDelete: "cascade" + } + ) +}); + +export const resourceWhitelist = pgTable("resourceWhitelist", { + whitelistId: serial("id").primaryKey(), + email: varchar("email").notNull(), + resourceId: integer("resourceId") + .notNull() + .references(() => resources.resourceId, { onDelete: "cascade" }) +}); + +export const resourceOtp = pgTable("resourceOtp", { + otpId: serial("otpId").primaryKey(), + resourceId: integer("resourceId") + .notNull() + .references(() => resources.resourceId, { onDelete: "cascade" }), + email: varchar("email").notNull(), + otpHash: varchar("otpHash").notNull(), + expiresAt: bigint("expiresAt", { mode: "number" }).notNull() +}); + +export const versionMigrations = pgTable("versionMigrations", { + version: varchar("version").primaryKey(), + executedAt: bigint("executedAt", { mode: "number" }).notNull() +}); + +export const resourceRules = pgTable("resourceRules", { + ruleId: serial("ruleId").primaryKey(), + resourceId: integer("resourceId") + .notNull() + .references(() => resources.resourceId, { onDelete: "cascade" }), + enabled: boolean("enabled").notNull().default(true), + priority: integer("priority").notNull(), + action: varchar("action").notNull(), // ACCEPT, DROP + match: varchar("match").notNull(), // CIDR, PATH, IP + value: varchar("value").notNull() +}); + +export const supporterKey = pgTable("supporterKey", { + keyId: serial("keyId").primaryKey(), + key: varchar("key").notNull(), + githubUsername: varchar("githubUsername").notNull(), + phrase: varchar("phrase"), + tier: varchar("tier"), + valid: boolean("valid").notNull().default(false) +}); + +export const idp = pgTable("idp", { + idpId: serial("idpId").primaryKey(), + name: varchar("name").notNull(), + type: varchar("type").notNull(), + defaultRoleMapping: varchar("defaultRoleMapping"), + defaultOrgMapping: varchar("defaultOrgMapping"), + autoProvision: boolean("autoProvision").notNull().default(false) +}); + +export const idpOidcConfig = pgTable("idpOidcConfig", { + idpOauthConfigId: serial("idpOauthConfigId").primaryKey(), + idpId: integer("idpId") + .notNull() + .references(() => idp.idpId, { onDelete: "cascade" }), + clientId: varchar("clientId").notNull(), + clientSecret: varchar("clientSecret").notNull(), + authUrl: varchar("authUrl").notNull(), + tokenUrl: varchar("tokenUrl").notNull(), + identifierPath: varchar("identifierPath").notNull(), + emailPath: varchar("emailPath"), + namePath: varchar("namePath"), + scopes: varchar("scopes").notNull() +}); + +export const licenseKey = pgTable("licenseKey", { + licenseKeyId: varchar("licenseKeyId").primaryKey().notNull(), + instanceId: varchar("instanceId").notNull(), + token: varchar("token").notNull() +}); + +export const hostMeta = pgTable("hostMeta", { + hostMetaId: varchar("hostMetaId").primaryKey().notNull(), + createdAt: bigint("createdAt", { mode: "number" }).notNull() +}); + +export const apiKeys = pgTable("apiKeys", { + apiKeyId: varchar("apiKeyId").primaryKey(), + name: varchar("name").notNull(), + apiKeyHash: varchar("apiKeyHash").notNull(), + lastChars: varchar("lastChars").notNull(), + createdAt: varchar("dateCreated").notNull(), + isRoot: boolean("isRoot").notNull().default(false) +}); + +export const apiKeyActions = pgTable("apiKeyActions", { + apiKeyId: varchar("apiKeyId") + .notNull() + .references(() => apiKeys.apiKeyId, { onDelete: "cascade" }), + actionId: varchar("actionId") + .notNull() + .references(() => actions.actionId, { onDelete: "cascade" }) +}); + +export const apiKeyOrg = pgTable("apiKeyOrg", { + apiKeyId: varchar("apiKeyId") + .notNull() + .references(() => apiKeys.apiKeyId, { onDelete: "cascade" }), + orgId: varchar("orgId") + .references(() => orgs.orgId, { + onDelete: "cascade" + }) + .notNull() +}); + +export const idpOrg = pgTable("idpOrg", { + idpId: integer("idpId") + .notNull() + .references(() => idp.idpId, { onDelete: "cascade" }), + orgId: varchar("orgId") + .notNull() + .references(() => orgs.orgId, { onDelete: "cascade" }), + roleMapping: varchar("roleMapping"), + orgMapping: varchar("orgMapping") +}); + +export type Org = InferSelectModel; +export type User = InferSelectModel; +export type Site = InferSelectModel; +export type Resource = InferSelectModel; +export type ExitNode = InferSelectModel; +export type Target = InferSelectModel; +export type Session = InferSelectModel; +export type Newt = InferSelectModel; +export type NewtSession = InferSelectModel; +export type EmailVerificationCode = InferSelectModel< + typeof emailVerificationCodes +>; +export type TwoFactorBackupCode = InferSelectModel; +export type PasswordResetToken = InferSelectModel; +export type Role = InferSelectModel; +export type Action = InferSelectModel; +export type RoleAction = InferSelectModel; +export type UserAction = InferSelectModel; +export type RoleSite = InferSelectModel; +export type UserSite = InferSelectModel; +export type RoleResource = InferSelectModel; +export type UserResource = InferSelectModel; +export type Limit = InferSelectModel; +export type UserInvite = InferSelectModel; +export type UserOrg = InferSelectModel; +export type ResourceSession = InferSelectModel; +export type ResourcePincode = InferSelectModel; +export type ResourcePassword = InferSelectModel; +export type ResourceOtp = InferSelectModel; +export type ResourceAccessToken = InferSelectModel; +export type ResourceWhitelist = InferSelectModel; +export type VersionMigration = InferSelectModel; +export type ResourceRule = InferSelectModel; +export type Domain = InferSelectModel; +export type SupporterKey = InferSelectModel; +export type Idp = InferSelectModel; +export type ApiKey = InferSelectModel; +export type ApiKeyAction = InferSelectModel; +export type ApiKeyOrg = InferSelectModel; diff --git a/server/db/schemas/hostMeta.ts b/server/db/schemas/hostMeta.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/server/db/sqlite/driver.ts b/server/db/sqlite/driver.ts new file mode 100644 index 00000000..a83ca7dd --- /dev/null +++ b/server/db/sqlite/driver.ts @@ -0,0 +1,58 @@ +import { drizzle as DrizzleSqlite } from "drizzle-orm/better-sqlite3"; +import Database from "better-sqlite3"; +import * as schema from "./schema"; +import path from "path"; +import fs from "fs/promises"; +import { APP_PATH } from "@server/lib/consts"; +import { existsSync, mkdirSync } from "fs"; +import { readConfigFile } from "@server/lib/readConfigFile"; + +export const location = path.join(APP_PATH, "db", "db.sqlite"); +export const exists = await checkFileExists(location); + +bootstrapVolume(); + +function createDb() { + const config = readConfigFile(); + + const sqlite = new Database(location); + return DrizzleSqlite(sqlite, { schema }); +} + +export const db = createDb(); +export default db; + +async function checkFileExists(filePath: string): Promise { + try { + await fs.access(filePath); + return true; + } catch { + return false; + } +} + +function bootstrapVolume() { + const appPath = APP_PATH; + + const dbDir = path.join(appPath, "db"); + const logsDir = path.join(appPath, "logs"); + + // check if the db directory exists and create it if it doesn't + if (!existsSync(dbDir)) { + mkdirSync(dbDir, { recursive: true }); + } + + // check if the logs directory exists and create it if it doesn't + if (!existsSync(logsDir)) { + mkdirSync(logsDir, { recursive: true }); + } + + // THIS IS FOR TRAEFIK; NOT REALLY NEEDED, BUT JUST IN CASE + + const traefikDir = path.join(appPath, "traefik"); + + // check if the traefik directory exists and create it if it doesn't + if (!existsSync(traefikDir)) { + mkdirSync(traefikDir, { recursive: true }); + } +} diff --git a/server/db/sqlite/index.ts b/server/db/sqlite/index.ts new file mode 100644 index 00000000..9ad4678c --- /dev/null +++ b/server/db/sqlite/index.ts @@ -0,0 +1,2 @@ +export * from "./driver"; +export * from "./schema"; diff --git a/server/db/migrateSqlite.ts b/server/db/sqlite/migrate.ts similarity index 94% rename from server/db/migrateSqlite.ts rename to server/db/sqlite/migrate.ts index 7e43cb4f..20b9043f 100644 --- a/server/db/migrateSqlite.ts +++ b/server/db/sqlite/migrate.ts @@ -1,5 +1,5 @@ import { migrate } from "drizzle-orm/better-sqlite3/migrator"; -import db from "@server/db"; +import db from "./driver"; import path from "path"; const migrationsFolder = path.join("server/migrations"); diff --git a/server/db/schemas/schema.ts b/server/db/sqlite/schema.ts similarity index 100% rename from server/db/schemas/schema.ts rename to server/db/sqlite/schema.ts diff --git a/server/index.ts b/server/index.ts index 33502609..4daeb711 100644 --- a/server/index.ts +++ b/server/index.ts @@ -4,7 +4,7 @@ import { runSetupFunctions } from "./setup"; import { createApiServer } from "./apiServer"; import { createNextServer } from "./nextServer"; import { createInternalServer } from "./internalServer"; -import { ApiKey, ApiKeyOrg, Session, User, UserOrg } from "./db/schemas"; +import { ApiKey, ApiKeyOrg, Session, User, UserOrg } from "@server/db"; import { createIntegrationApiServer } from "./integrationApiServer"; import config from "@server/lib/config"; diff --git a/server/lib/canUserAccessResource.ts b/server/lib/canUserAccessResource.ts index 0d618255..161a0bee 100644 --- a/server/lib/canUserAccessResource.ts +++ b/server/lib/canUserAccessResource.ts @@ -1,6 +1,6 @@ -import db from "@server/db"; +import { db } from "@server/db"; import { and, eq } from "drizzle-orm"; -import { roleResources, userResources } from "@server/db/schemas"; +import { roleResources, userResources } from "@server/db"; export async function canUserAccessResource({ userId, diff --git a/server/lib/config.ts b/server/lib/config.ts index 33239cbb..d83bb5b2 100644 --- a/server/lib/config.ts +++ b/server/lib/config.ts @@ -1,219 +1,10 @@ import { z } from "zod"; import { __DIRNAME, APP_VERSION } from "@server/lib/consts"; -import db from "@server/db"; -import { SupporterKey, supporterKey } from "@server/db/schemas"; +import { db } from "@server/db"; +import { SupporterKey, supporterKey } from "@server/db"; import { eq } from "drizzle-orm"; import { license } from "@server/license/license"; -import { readConfigFile } from "./readConfigFile"; -import stoi from "./stoi"; -import { passwordSchema } from "@server/auth/passwordSchema"; - -const portSchema = z.number().positive().gt(0).lte(65535); - -const getEnvOrYaml = (envVar: string) => (valFromYaml: any) => { - return process.env[envVar] ?? valFromYaml; -}; - -const configSchema = z.object({ - app: z.object({ - dashboard_url: z - .string() - .url() - .optional() - .pipe(z.string().url()) - .transform((url) => url.toLowerCase()), - log_level: z - .enum(["debug", "info", "warn", "error"]) - .optional() - .default("info"), - save_logs: z.boolean().optional().default(false), - log_failed_attempts: z.boolean().optional().default(false) - }), - domains: z - .record( - z.string(), - z.object({ - base_domain: z - .string() - .nonempty("base_domain must not be empty") - .transform((url) => url.toLowerCase()), - cert_resolver: z.string().optional().default("letsencrypt"), - prefer_wildcard_cert: z.boolean().optional().default(false) - }) - ) - .refine( - (domains) => { - const keys = Object.keys(domains); - - if (keys.length === 0) { - return false; - } - - return true; - }, - { - message: "At least one domain must be defined" - } - ), - server: z.object({ - integration_port: portSchema - .optional() - .default(3003) - .transform(stoi) - .pipe(portSchema.optional()), - external_port: portSchema - .optional() - .default(3000) - .transform(stoi) - .pipe(portSchema), - internal_port: portSchema - .optional() - .default(3001) - .transform(stoi) - .pipe(portSchema), - next_port: portSchema - .optional() - .default(3002) - .transform(stoi) - .pipe(portSchema), - internal_hostname: z - .string() - .optional() - .default("pangolin") - .transform((url) => url.toLowerCase()), - session_cookie_name: z.string().optional().default("p_session_token"), - resource_access_token_param: z.string().optional().default("p_token"), - resource_access_token_headers: z - .object({ - id: z.string().optional().default("P-Access-Token-Id"), - token: z.string().optional().default("P-Access-Token") - }) - .optional() - .default({}), - resource_session_request_param: z - .string() - .optional() - .default("resource_session_request_param"), - dashboard_session_length_hours: z - .number() - .positive() - .gt(0) - .optional() - .default(720), - resource_session_length_hours: z - .number() - .positive() - .gt(0) - .optional() - .default(720), - cors: z - .object({ - origins: z.array(z.string()).optional(), - methods: z.array(z.string()).optional(), - allowed_headers: z.array(z.string()).optional(), - credentials: z.boolean().optional() - }) - .optional(), - trust_proxy: z.boolean().optional().default(true), - secret: z - .string() - .optional() - .transform(getEnvOrYaml("SERVER_SECRET")) - .pipe(z.string().min(8)) - }), - traefik: z - .object({ - http_entrypoint: z.string().optional().default("web"), - https_entrypoint: z.string().optional().default("websecure"), - additional_middlewares: z.array(z.string()).optional() - }) - .optional() - .default({}), - gerbil: z - .object({ - start_port: portSchema - .optional() - .default(51820) - .transform(stoi) - .pipe(portSchema), - base_endpoint: z - .string() - .optional() - .pipe(z.string()) - .transform((url) => url.toLowerCase()), - use_subdomain: z.boolean().optional().default(false), - subnet_group: z.string().optional().default("100.89.137.0/20"), - block_size: z.number().positive().gt(0).optional().default(24), - site_block_size: z.number().positive().gt(0).optional().default(30) - }) - .optional() - .default({}), - rate_limits: z - .object({ - global: z - .object({ - window_minutes: z - .number() - .positive() - .gt(0) - .optional() - .default(1), - max_requests: z - .number() - .positive() - .gt(0) - .optional() - .default(500) - }) - .optional() - .default({}), - auth: z - .object({ - window_minutes: z.number().positive().gt(0), - max_requests: z.number().positive().gt(0) - }) - .optional() - }) - .optional() - .default({}), - email: z - .object({ - smtp_host: z.string().optional(), - smtp_port: portSchema.optional(), - smtp_user: z.string().optional(), - smtp_pass: z.string().optional(), - smtp_secure: z.boolean().optional(), - smtp_tls_reject_unauthorized: z.boolean().optional(), - no_reply: z.string().email().optional() - }) - .optional(), - users: z.object({ - server_admin: z.object({ - email: z - .string() - .email() - .optional() - .transform(getEnvOrYaml("USERS_SERVERADMIN_EMAIL")) - .pipe(z.string().email()) - .transform((v) => v.toLowerCase()), - password: passwordSchema - .optional() - .transform(getEnvOrYaml("USERS_SERVERADMIN_PASSWORD")) - .pipe(passwordSchema) - }) - }), - flags: z - .object({ - require_email_verification: z.boolean().optional(), - disable_signup_without_invite: z.boolean().optional(), - disable_user_create_org: z.boolean().optional(), - allow_raw_resources: z.boolean().optional(), - allow_base_domain_resources: z.boolean().optional(), - allow_local_sites: z.boolean().optional(), - enable_integration_api: z.boolean().optional() - }) - .optional() -}); +import { configSchema, readConfigFile } from "./readConfigFile"; export class Config { private rawConfig!: z.infer; diff --git a/server/lib/readConfigFile.ts b/server/lib/readConfigFile.ts index 63aa2ee2..15cdea78 100644 --- a/server/lib/readConfigFile.ts +++ b/server/lib/readConfigFile.ts @@ -119,28 +119,10 @@ export const configSchema = z.object({ .transform(getEnvOrYaml("SERVER_SECRET")) .pipe(z.string().min(8)) }), - database: z + postgres: z .object({ - type: z.enum(["sqlite", "postgres"]).optional().default("sqlite"), - postgres: z - .object({ - connection_string: z.string() - }) - .optional() + connection_string: z.string().optional() }) - .refine( - (data) => { - if (data.type === "postgres" && !data.postgres) { - return false; - } - return true; - }, - { - message: - "Postgres config required" - } - ) - .optional() .default({}), traefik: z .object({ @@ -230,7 +212,8 @@ export const configSchema = z.object({ disable_user_create_org: z.boolean().optional(), allow_raw_resources: z.boolean().optional(), allow_base_domain_resources: z.boolean().optional(), - allow_local_sites: z.boolean().optional() + allow_local_sites: z.boolean().optional(), + enable_integration_api: z.boolean().optional() }) .optional() }); diff --git a/server/license/license.ts b/server/license/license.ts index bd596e4b..0adc54fd 100644 --- a/server/license/license.ts +++ b/server/license/license.ts @@ -1,5 +1,5 @@ -import db from "@server/db"; -import { hostMeta, licenseKey, sites } from "@server/db/schemas"; +import { db } from "@server/db"; +import { hostMeta, licenseKey, sites } from "@server/db"; import logger from "@server/logger"; import NodeCache from "node-cache"; import { validateJWT } from "./licenseJwt"; diff --git a/server/middlewares/getUserOrgs.ts b/server/middlewares/getUserOrgs.ts index 7d5c08f7..4d042307 100644 --- a/server/middlewares/getUserOrgs.ts +++ b/server/middlewares/getUserOrgs.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { userOrgs, orgs } from "@server/db/schemas"; +import { userOrgs, orgs } from "@server/db"; import { eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/integration/verifyAccessTokenAccess.ts b/server/middlewares/integration/verifyAccessTokenAccess.ts index e9069ba4..f5ae8746 100644 --- a/server/middlewares/integration/verifyAccessTokenAccess.ts +++ b/server/middlewares/integration/verifyAccessTokenAccess.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { resourceAccessToken, resources, apiKeyOrg } from "@server/db/schemas"; +import { resourceAccessToken, resources, apiKeyOrg } from "@server/db"; import { and, eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/integration/verifyApiKey.ts b/server/middlewares/integration/verifyApiKey.ts index 0b0602ea..719b609f 100644 --- a/server/middlewares/integration/verifyApiKey.ts +++ b/server/middlewares/integration/verifyApiKey.ts @@ -1,6 +1,6 @@ import { verifyPassword } from "@server/auth/password"; -import db from "@server/db"; -import { apiKeys } from "@server/db/schemas"; +import { db } from "@server/db"; +import { apiKeys } from "@server/db"; import logger from "@server/logger"; import HttpCode from "@server/types/HttpCode"; import { eq } from "drizzle-orm"; diff --git a/server/middlewares/integration/verifyApiKeyApiKeyAccess.ts b/server/middlewares/integration/verifyApiKeyApiKeyAccess.ts index 435f01d0..1441589d 100644 --- a/server/middlewares/integration/verifyApiKeyApiKeyAccess.ts +++ b/server/middlewares/integration/verifyApiKeyApiKeyAccess.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { apiKeys, apiKeyOrg } from "@server/db/schemas"; +import { apiKeys, apiKeyOrg } from "@server/db"; import { and, eq, or } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/integration/verifyApiKeyHasAction.ts b/server/middlewares/integration/verifyApiKeyHasAction.ts index 35f4398e..428aeed2 100644 --- a/server/middlewares/integration/verifyApiKeyHasAction.ts +++ b/server/middlewares/integration/verifyApiKeyHasAction.ts @@ -3,8 +3,8 @@ import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; import logger from "@server/logger"; import { ActionsEnum } from "@server/auth/actions"; -import db from "@server/db"; -import { apiKeyActions } from "@server/db/schemas"; +import { db } from "@server/db"; +import { apiKeyActions } from "@server/db"; import { and, eq } from "drizzle-orm"; export function verifyApiKeyHasAction(action: ActionsEnum) { diff --git a/server/middlewares/integration/verifyApiKeyOrgAccess.ts b/server/middlewares/integration/verifyApiKeyOrgAccess.ts index 902ccf5e..84ba7fe9 100644 --- a/server/middlewares/integration/verifyApiKeyOrgAccess.ts +++ b/server/middlewares/integration/verifyApiKeyOrgAccess.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { apiKeyOrg } from "@server/db/schemas"; +import { apiKeyOrg } from "@server/db"; import { and, eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/integration/verifyApiKeyResourceAccess.ts b/server/middlewares/integration/verifyApiKeyResourceAccess.ts index f4e3ed0f..2473c814 100644 --- a/server/middlewares/integration/verifyApiKeyResourceAccess.ts +++ b/server/middlewares/integration/verifyApiKeyResourceAccess.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { resources, apiKeyOrg } from "@server/db/schemas"; +import { resources, apiKeyOrg } from "@server/db"; import { eq, and } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/integration/verifyApiKeyRoleAccess.ts b/server/middlewares/integration/verifyApiKeyRoleAccess.ts index 4d769413..0df10913 100644 --- a/server/middlewares/integration/verifyApiKeyRoleAccess.ts +++ b/server/middlewares/integration/verifyApiKeyRoleAccess.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { roles, apiKeyOrg } from "@server/db/schemas"; +import { roles, apiKeyOrg } from "@server/db"; import { and, eq, inArray } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/integration/verifyApiKeySetResourceUsers.ts b/server/middlewares/integration/verifyApiKeySetResourceUsers.ts index 1c3b5b12..cbb2b598 100644 --- a/server/middlewares/integration/verifyApiKeySetResourceUsers.ts +++ b/server/middlewares/integration/verifyApiKeySetResourceUsers.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { userOrgs } from "@server/db/schemas"; +import { userOrgs } from "@server/db"; import { and, eq, inArray } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/integration/verifyApiKeySiteAccess.ts b/server/middlewares/integration/verifyApiKeySiteAccess.ts index 2c83eadd..35ec3b6a 100644 --- a/server/middlewares/integration/verifyApiKeySiteAccess.ts +++ b/server/middlewares/integration/verifyApiKeySiteAccess.ts @@ -3,7 +3,7 @@ import { db } from "@server/db"; import { sites, apiKeyOrg -} from "@server/db/schemas"; +} from "@server/db"; import { and, eq, or } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/integration/verifyApiKeyTargetAccess.ts b/server/middlewares/integration/verifyApiKeyTargetAccess.ts index 7da1f29f..f810e4a2 100644 --- a/server/middlewares/integration/verifyApiKeyTargetAccess.ts +++ b/server/middlewares/integration/verifyApiKeyTargetAccess.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { resources, targets, apiKeyOrg } from "@server/db/schemas"; +import { resources, targets, apiKeyOrg } from "@server/db"; import { and, eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/integration/verifyApiKeyUserAccess.ts b/server/middlewares/integration/verifyApiKeyUserAccess.ts index 69f27e9a..070ae5ac 100644 --- a/server/middlewares/integration/verifyApiKeyUserAccess.ts +++ b/server/middlewares/integration/verifyApiKeyUserAccess.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { userOrgs } from "@server/db/schemas"; +import { userOrgs } from "@server/db"; import { and, eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/verifyAccessTokenAccess.ts b/server/middlewares/verifyAccessTokenAccess.ts index a437a8a2..92873524 100644 --- a/server/middlewares/verifyAccessTokenAccess.ts +++ b/server/middlewares/verifyAccessTokenAccess.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { resourceAccessToken, resources, userOrgs } from "@server/db/schemas"; +import { resourceAccessToken, resources, userOrgs } from "@server/db"; import { and, eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/verifyAdmin.ts b/server/middlewares/verifyAdmin.ts index b53f238f..60f7334c 100644 --- a/server/middlewares/verifyAdmin.ts +++ b/server/middlewares/verifyAdmin.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { roles, userOrgs } from "@server/db/schemas"; +import { roles, userOrgs } from "@server/db"; import { and, eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/verifyApiKeyAccess.ts b/server/middlewares/verifyApiKeyAccess.ts index ad21b37e..8ab709b6 100644 --- a/server/middlewares/verifyApiKeyAccess.ts +++ b/server/middlewares/verifyApiKeyAccess.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { userOrgs, apiKeys, apiKeyOrg } from "@server/db/schemas"; +import { userOrgs, apiKeys, apiKeyOrg } from "@server/db"; import { and, eq, or } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/verifyOrgAccess.ts b/server/middlewares/verifyOrgAccess.ts index 20018e06..a2cc44f2 100644 --- a/server/middlewares/verifyOrgAccess.ts +++ b/server/middlewares/verifyOrgAccess.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { userOrgs } from "@server/db/schemas"; +import { userOrgs } from "@server/db"; import { and, eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/verifyResourceAccess.ts b/server/middlewares/verifyResourceAccess.ts index dc5fcc24..5c88139d 100644 --- a/server/middlewares/verifyResourceAccess.ts +++ b/server/middlewares/verifyResourceAccess.ts @@ -5,7 +5,7 @@ import { userOrgs, userResources, roleResources, -} from "@server/db/schemas"; +} from "@server/db"; import { and, eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/verifyRoleAccess.ts b/server/middlewares/verifyRoleAccess.ts index 54917044..cfcbd475 100644 --- a/server/middlewares/verifyRoleAccess.ts +++ b/server/middlewares/verifyRoleAccess.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { roles, userOrgs } from "@server/db/schemas"; +import { roles, userOrgs } from "@server/db"; import { and, eq, inArray } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/verifySession.ts b/server/middlewares/verifySession.ts index 9d284394..6af34e4c 100644 --- a/server/middlewares/verifySession.ts +++ b/server/middlewares/verifySession.ts @@ -1,7 +1,7 @@ import { NextFunction, Response } from "express"; import ErrorResponse from "@server/types/ErrorResponse"; import { db } from "@server/db"; -import { users } from "@server/db/schemas"; +import { users } from "@server/db"; import { eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/verifySetResourceUsers.ts b/server/middlewares/verifySetResourceUsers.ts index 0f351069..be6d21fc 100644 --- a/server/middlewares/verifySetResourceUsers.ts +++ b/server/middlewares/verifySetResourceUsers.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { userOrgs } from "@server/db/schemas"; +import { userOrgs } from "@server/db"; import { and, eq, inArray, or } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/verifySiteAccess.ts b/server/middlewares/verifySiteAccess.ts index b741e3ae..6d01392f 100644 --- a/server/middlewares/verifySiteAccess.ts +++ b/server/middlewares/verifySiteAccess.ts @@ -6,7 +6,7 @@ import { userSites, roleSites, roles, -} from "@server/db/schemas"; +} from "@server/db"; import { and, eq, or } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/verifyTargetAccess.ts b/server/middlewares/verifyTargetAccess.ts index f57ba474..50563d6e 100644 --- a/server/middlewares/verifyTargetAccess.ts +++ b/server/middlewares/verifyTargetAccess.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { resources, targets, userOrgs } from "@server/db/schemas"; +import { resources, targets, userOrgs } from "@server/db"; import { and, eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/verifyUser.ts b/server/middlewares/verifyUser.ts index 06b08601..8fd38b24 100644 --- a/server/middlewares/verifyUser.ts +++ b/server/middlewares/verifyUser.ts @@ -1,7 +1,7 @@ import { NextFunction, Response } from "express"; import ErrorResponse from "@server/types/ErrorResponse"; import { db } from "@server/db"; -import { users } from "@server/db/schemas"; +import { users } from "@server/db"; import { eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/verifyUserAccess.ts b/server/middlewares/verifyUserAccess.ts index 43ec9cff..3ef0f0ba 100644 --- a/server/middlewares/verifyUserAccess.ts +++ b/server/middlewares/verifyUserAccess.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { userOrgs } from "@server/db/schemas"; +import { userOrgs } from "@server/db"; import { and, eq, or } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/middlewares/verifyUserIsOrgOwner.ts b/server/middlewares/verifyUserIsOrgOwner.ts index ac96f379..25ccf047 100644 --- a/server/middlewares/verifyUserIsOrgOwner.ts +++ b/server/middlewares/verifyUserIsOrgOwner.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { userOrgs } from "@server/db/schemas"; +import { userOrgs } from "@server/db"; import { and, eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/accessToken/deleteAccessToken.ts b/server/routers/accessToken/deleteAccessToken.ts index 783c5fc8..60d8789e 100644 --- a/server/routers/accessToken/deleteAccessToken.ts +++ b/server/routers/accessToken/deleteAccessToken.ts @@ -5,9 +5,9 @@ import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -import { resourceAccessToken } from "@server/db/schemas"; +import { resourceAccessToken } from "@server/db"; import { and, eq } from "drizzle-orm"; -import db from "@server/db"; +import { db } from "@server/db"; import { OpenAPITags, registry } from "@server/openApi"; const deleteAccessTokenParamsSchema = z diff --git a/server/routers/accessToken/generateAccessToken.ts b/server/routers/accessToken/generateAccessToken.ts index 738c230e..631b5924 100644 --- a/server/routers/accessToken/generateAccessToken.ts +++ b/server/routers/accessToken/generateAccessToken.ts @@ -4,12 +4,12 @@ import { generateIdFromEntropySize, SESSION_COOKIE_EXPIRES } from "@server/auth/sessions/app"; -import db from "@server/db"; +import { db } from "@server/db"; import { ResourceAccessToken, resourceAccessToken, resources -} from "@server/db/schemas"; +} from "@server/db"; import HttpCode from "@server/types/HttpCode"; import response from "@server/lib/response"; import { eq } from "drizzle-orm"; diff --git a/server/routers/accessToken/listAccessTokens.ts b/server/routers/accessToken/listAccessTokens.ts index 07ef9aa3..d021c79d 100644 --- a/server/routers/accessToken/listAccessTokens.ts +++ b/server/routers/accessToken/listAccessTokens.ts @@ -7,7 +7,7 @@ import { roleResources, resourceAccessToken, sites -} from "@server/db/schemas"; +} from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/apiKeys/createOrgApiKey.ts b/server/routers/apiKeys/createOrgApiKey.ts index bf8ff8c3..d61a364b 100644 --- a/server/routers/apiKeys/createOrgApiKey.ts +++ b/server/routers/apiKeys/createOrgApiKey.ts @@ -1,8 +1,8 @@ import { NextFunction, Request, Response } from "express"; -import db from "@server/db"; +import { db } from "@server/db"; import HttpCode from "@server/types/HttpCode"; import { z } from "zod"; -import { apiKeyOrg, apiKeys } from "@server/db/schemas"; +import { apiKeyOrg, apiKeys } from "@server/db"; import { fromError } from "zod-validation-error"; import createHttpError from "http-errors"; import response from "@server/lib/response"; diff --git a/server/routers/apiKeys/createRootApiKey.ts b/server/routers/apiKeys/createRootApiKey.ts index 7a5d2d81..095d952b 100644 --- a/server/routers/apiKeys/createRootApiKey.ts +++ b/server/routers/apiKeys/createRootApiKey.ts @@ -1,8 +1,8 @@ import { NextFunction, Request, Response } from "express"; -import db from "@server/db"; +import { db } from "@server/db"; import HttpCode from "@server/types/HttpCode"; import { z } from "zod"; -import { apiKeyOrg, apiKeys, orgs } from "@server/db/schemas"; +import { apiKeyOrg, apiKeys, orgs } from "@server/db"; import { fromError } from "zod-validation-error"; import createHttpError from "http-errors"; import response from "@server/lib/response"; diff --git a/server/routers/apiKeys/deleteApiKey.ts b/server/routers/apiKeys/deleteApiKey.ts index e1a74a45..4b97b353 100644 --- a/server/routers/apiKeys/deleteApiKey.ts +++ b/server/routers/apiKeys/deleteApiKey.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { apiKeys } from "@server/db/schemas"; +import { apiKeys } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/apiKeys/deleteOrgApiKey.ts b/server/routers/apiKeys/deleteOrgApiKey.ts index dbaf47fe..22e776ca 100644 --- a/server/routers/apiKeys/deleteOrgApiKey.ts +++ b/server/routers/apiKeys/deleteOrgApiKey.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { apiKeyOrg, apiKeys } from "@server/db/schemas"; +import { apiKeyOrg, apiKeys } from "@server/db"; import { and, eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/apiKeys/getApiKey.ts b/server/routers/apiKeys/getApiKey.ts index e0354cf1..2bb3b65c 100644 --- a/server/routers/apiKeys/getApiKey.ts +++ b/server/routers/apiKeys/getApiKey.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { apiKeys } from "@server/db/schemas"; +import { apiKeys } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/apiKeys/listApiKeyActions.ts b/server/routers/apiKeys/listApiKeyActions.ts index 5bd14411..51d20b24 100644 --- a/server/routers/apiKeys/listApiKeyActions.ts +++ b/server/routers/apiKeys/listApiKeyActions.ts @@ -1,5 +1,5 @@ import { db } from "@server/db"; -import { actions, apiKeyActions, apiKeyOrg, apiKeys } from "@server/db/schemas"; +import { actions, apiKeyActions, apiKeyOrg, apiKeys } from "@server/db"; import logger from "@server/logger"; import HttpCode from "@server/types/HttpCode"; import response from "@server/lib/response"; diff --git a/server/routers/apiKeys/listOrgApiKeys.ts b/server/routers/apiKeys/listOrgApiKeys.ts index 9833ef0f..e8c8bc1c 100644 --- a/server/routers/apiKeys/listOrgApiKeys.ts +++ b/server/routers/apiKeys/listOrgApiKeys.ts @@ -1,5 +1,5 @@ import { db } from "@server/db"; -import { apiKeyOrg, apiKeys } from "@server/db/schemas"; +import { apiKeyOrg, apiKeys } from "@server/db"; import logger from "@server/logger"; import HttpCode from "@server/types/HttpCode"; import response from "@server/lib/response"; diff --git a/server/routers/apiKeys/listRootApiKeys.ts b/server/routers/apiKeys/listRootApiKeys.ts index c639ce51..ddfade3c 100644 --- a/server/routers/apiKeys/listRootApiKeys.ts +++ b/server/routers/apiKeys/listRootApiKeys.ts @@ -1,5 +1,5 @@ import { db } from "@server/db"; -import { apiKeys } from "@server/db/schemas"; +import { apiKeys } from "@server/db"; import logger from "@server/logger"; import HttpCode from "@server/types/HttpCode"; import response from "@server/lib/response"; diff --git a/server/routers/apiKeys/setApiKeyActions.ts b/server/routers/apiKeys/setApiKeyActions.ts index 602c7798..bb16deb5 100644 --- a/server/routers/apiKeys/setApiKeyActions.ts +++ b/server/routers/apiKeys/setApiKeyActions.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { actions, apiKeyActions } from "@server/db/schemas"; +import { actions, apiKeyActions } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/apiKeys/setApiKeyOrgs.ts b/server/routers/apiKeys/setApiKeyOrgs.ts index c42046de..f03eec18 100644 --- a/server/routers/apiKeys/setApiKeyOrgs.ts +++ b/server/routers/apiKeys/setApiKeyOrgs.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { apiKeyOrg, orgs } from "@server/db/schemas"; +import { apiKeyOrg, orgs } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/auth/changePassword.ts b/server/routers/auth/changePassword.ts index 3b1e4c2f..3a9120e3 100644 --- a/server/routers/auth/changePassword.ts +++ b/server/routers/auth/changePassword.ts @@ -4,7 +4,7 @@ import HttpCode from "@server/types/HttpCode"; import { fromError } from "zod-validation-error"; import { z } from "zod"; import { db } from "@server/db"; -import { User, users } from "@server/db/schemas"; +import { User, users } from "@server/db"; import { eq } from "drizzle-orm"; import { response } from "@server/lib"; import { diff --git a/server/routers/auth/disable2fa.ts b/server/routers/auth/disable2fa.ts index b10dd9b2..7fbea2e5 100644 --- a/server/routers/auth/disable2fa.ts +++ b/server/routers/auth/disable2fa.ts @@ -4,7 +4,7 @@ import HttpCode from "@server/types/HttpCode"; import { fromError } from "zod-validation-error"; import { z } from "zod"; import { db } from "@server/db"; -import { User, users } from "@server/db/schemas"; +import { User, users } from "@server/db"; import { eq } from "drizzle-orm"; import { response } from "@server/lib"; import { verifyPassword } from "@server/auth/password"; diff --git a/server/routers/auth/login.ts b/server/routers/auth/login.ts index eda637fa..f183f998 100644 --- a/server/routers/auth/login.ts +++ b/server/routers/auth/login.ts @@ -3,8 +3,8 @@ import { generateSessionToken, serializeSessionCookie } from "@server/auth/sessions/app"; -import db from "@server/db"; -import { users } from "@server/db/schemas"; +import { db } from "@server/db"; +import { users } from "@server/db"; import HttpCode from "@server/types/HttpCode"; import response from "@server/lib/response"; import { eq, and } from "drizzle-orm"; diff --git a/server/routers/auth/requestEmailVerificationCode.ts b/server/routers/auth/requestEmailVerificationCode.ts index 0cc8825c..eeabedf2 100644 --- a/server/routers/auth/requestEmailVerificationCode.ts +++ b/server/routers/auth/requestEmailVerificationCode.ts @@ -2,7 +2,7 @@ import { Request, Response, NextFunction } from "express"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; import { response } from "@server/lib"; -import { User } from "@server/db/schemas"; +import { User } from "@server/db"; import { sendEmailVerificationCode } from "../../auth/sendEmailVerificationCode"; import config from "@server/lib/config"; import logger from "@server/logger"; diff --git a/server/routers/auth/requestPasswordReset.ts b/server/routers/auth/requestPasswordReset.ts index 087352f0..4127533f 100644 --- a/server/routers/auth/requestPasswordReset.ts +++ b/server/routers/auth/requestPasswordReset.ts @@ -5,7 +5,7 @@ import { fromError } from "zod-validation-error"; import HttpCode from "@server/types/HttpCode"; import { response } from "@server/lib"; import { db } from "@server/db"; -import { passwordResetTokens, users } from "@server/db/schemas"; +import { passwordResetTokens, users } from "@server/db"; import { eq } from "drizzle-orm"; import { alphabet, generateRandomString, sha256 } from "oslo/crypto"; import { createDate } from "oslo"; diff --git a/server/routers/auth/requestTotpSecret.ts b/server/routers/auth/requestTotpSecret.ts index a4f8bc4a..2de35412 100644 --- a/server/routers/auth/requestTotpSecret.ts +++ b/server/routers/auth/requestTotpSecret.ts @@ -6,7 +6,7 @@ import { encodeHex } from "oslo/encoding"; import HttpCode from "@server/types/HttpCode"; import { response } from "@server/lib"; import { db } from "@server/db"; -import { User, users } from "@server/db/schemas"; +import { User, users } from "@server/db"; import { eq } from "drizzle-orm"; import { createTOTPKeyURI } from "oslo/otp"; import logger from "@server/logger"; diff --git a/server/routers/auth/resetPassword.ts b/server/routers/auth/resetPassword.ts index 967ddc66..d99b8718 100644 --- a/server/routers/auth/resetPassword.ts +++ b/server/routers/auth/resetPassword.ts @@ -6,7 +6,7 @@ import { fromError } from "zod-validation-error"; import HttpCode from "@server/types/HttpCode"; import { response } from "@server/lib"; import { db } from "@server/db"; -import { passwordResetTokens, users } from "@server/db/schemas"; +import { passwordResetTokens, users } from "@server/db"; import { eq } from "drizzle-orm"; import { hashPassword, verifyPassword } from "@server/auth/password"; import { verifyTotpCode } from "@server/auth/totp"; diff --git a/server/routers/auth/signup.ts b/server/routers/auth/signup.ts index 564a1378..d2a1e730 100644 --- a/server/routers/auth/signup.ts +++ b/server/routers/auth/signup.ts @@ -1,8 +1,8 @@ import { NextFunction, Request, Response } from "express"; -import db from "@server/db"; +import { db } from "@server/db"; import HttpCode from "@server/types/HttpCode"; import { z } from "zod"; -import { users } from "@server/db/schemas"; +import { users } from "@server/db"; import { fromError } from "zod-validation-error"; import createHttpError from "http-errors"; import response from "@server/lib/response"; diff --git a/server/routers/auth/verifyEmail.ts b/server/routers/auth/verifyEmail.ts index fd7aa138..f707de22 100644 --- a/server/routers/auth/verifyEmail.ts +++ b/server/routers/auth/verifyEmail.ts @@ -5,7 +5,7 @@ import { fromError } from "zod-validation-error"; import HttpCode from "@server/types/HttpCode"; import { response } from "@server/lib"; import { db } from "@server/db"; -import { User, emailVerificationCodes, users } from "@server/db/schemas"; +import { User, emailVerificationCodes, users } from "@server/db"; import { eq } from "drizzle-orm"; import { isWithinExpirationDate } from "oslo"; import config from "@server/lib/config"; diff --git a/server/routers/auth/verifyTotp.ts b/server/routers/auth/verifyTotp.ts index db4ec1a1..70018a7d 100644 --- a/server/routers/auth/verifyTotp.ts +++ b/server/routers/auth/verifyTotp.ts @@ -5,7 +5,7 @@ import { fromError } from "zod-validation-error"; import HttpCode from "@server/types/HttpCode"; import { response } from "@server/lib"; import { db } from "@server/db"; -import { twoFactorBackupCodes, User, users } from "@server/db/schemas"; +import { twoFactorBackupCodes, User, users } from "@server/db"; import { eq } from "drizzle-orm"; import { alphabet, generateRandomString } from "oslo/crypto"; import { hashPassword } from "@server/auth/password"; diff --git a/server/routers/badger/exchangeSession.ts b/server/routers/badger/exchangeSession.ts index a9208423..8139694a 100644 --- a/server/routers/badger/exchangeSession.ts +++ b/server/routers/badger/exchangeSession.ts @@ -4,8 +4,8 @@ import createHttpError from "http-errors"; import { z } from "zod"; import { fromError } from "zod-validation-error"; import logger from "@server/logger"; -import { resourceAccessToken, resources, sessions } from "@server/db/schemas"; -import db from "@server/db"; +import { resourceAccessToken, resources, sessions } from "@server/db"; +import { db } from "@server/db"; import { eq } from "drizzle-orm"; import { createResourceSession, diff --git a/server/routers/badger/verifySession.ts b/server/routers/badger/verifySession.ts index 0c2e6493..933e9b16 100644 --- a/server/routers/badger/verifySession.ts +++ b/server/routers/badger/verifySession.ts @@ -5,7 +5,7 @@ import { validateResourceSessionToken } from "@server/auth/sessions/resource"; import { verifyResourceAccessToken } from "@server/auth/verifyResourceAccessToken"; -import db from "@server/db"; +import { db } from "@server/db"; import { Resource, ResourceAccessToken, @@ -21,7 +21,7 @@ import { userOrgs, userResources, users -} from "@server/db/schemas"; +} from "@server/db"; import config from "@server/lib/config"; import { isIpInCidr } from "@server/lib/ip"; import { response } from "@server/lib/response"; diff --git a/server/routers/domain/listDomains.ts b/server/routers/domain/listDomains.ts index c525e1d8..a8216c5f 100644 --- a/server/routers/domain/listDomains.ts +++ b/server/routers/domain/listDomains.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { domains, orgDomains, users } from "@server/db/schemas"; +import { domains, orgDomains, users } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/gerbil/getConfig.ts b/server/routers/gerbil/getConfig.ts index ee742c21..de3da171 100644 --- a/server/routers/gerbil/getConfig.ts +++ b/server/routers/gerbil/getConfig.ts @@ -1,21 +1,21 @@ -import { Request, Response, NextFunction } from 'express'; -import { z } from 'zod'; -import { sites, resources, targets, exitNodes } from '@server/db/schemas'; -import { db } from '@server/db'; -import { eq } from 'drizzle-orm'; +import { Request, Response, NextFunction } from "express"; +import { z } from "zod"; +import { sites, resources, targets, exitNodes } from "@server/db"; +import { db } from "@server/db"; +import { eq } from "drizzle-orm"; import response from "@server/lib/response"; -import HttpCode from '@server/types/HttpCode'; -import createHttpError from 'http-errors'; -import logger from '@server/logger'; +import HttpCode from "@server/types/HttpCode"; +import createHttpError from "http-errors"; +import logger from "@server/logger"; import config from "@server/lib/config"; -import { getUniqueExitNodeEndpointName } from '@server/db/names'; +import { getUniqueExitNodeEndpointName } from "../../db/names"; import { findNextAvailableCidr } from "@server/lib/ip"; -import { fromError } from 'zod-validation-error'; -import { getAllowedIps } from '../target/helpers'; +import { fromError } from "zod-validation-error"; +import { getAllowedIps } from "../target/helpers"; // Define Zod schema for request validation const getConfigSchema = z.object({ publicKey: z.string(), - reachableAt: z.string().optional(), + reachableAt: z.string().optional() }); export type GetConfigResponse = { @@ -25,9 +25,13 @@ export type GetConfigResponse = { publicKey: string | null; allowedIps: string[]; }[]; -} +}; -export async function getConfig(req: Request, res: Response, next: NextFunction): Promise { +export async function getConfig( + req: Request, + res: Response, + next: NextFunction +): Promise { try { // Validate request parameters const parsedParams = getConfigSchema.safeParse(req.body); @@ -43,11 +47,16 @@ export async function getConfig(req: Request, res: Response, next: NextFunction) const { publicKey, reachableAt } = parsedParams.data; if (!publicKey) { - return next(createHttpError(HttpCode.BAD_REQUEST, 'publicKey is required')); + return next( + createHttpError(HttpCode.BAD_REQUEST, "publicKey is required") + ); } // Fetch exit node - let exitNodeQuery = await db.select().from(exitNodes).where(eq(exitNodes.publicKey, publicKey)); + let exitNodeQuery = await db + .select() + .from(exitNodes) + .where(eq(exitNodes.publicKey, publicKey)); let exitNode; if (exitNodeQuery.length === 0) { const address = await getNextAvailableSubnet(); @@ -60,40 +69,53 @@ export async function getConfig(req: Request, res: Response, next: NextFunction) } // create a new exit node - exitNode = await db.insert(exitNodes).values({ - publicKey, - endpoint: `${subEndpoint}${subEndpoint != "" ? "." : ""}${config.getRawConfig().gerbil.base_endpoint}`, - address, - listenPort, - reachableAt, - name: `Exit Node ${publicKey.slice(0, 8)}`, - }).returning().execute(); + exitNode = await db + .insert(exitNodes) + .values({ + publicKey, + endpoint: `${subEndpoint}${subEndpoint != "" ? "." : ""}${config.getRawConfig().gerbil.base_endpoint}`, + address, + listenPort, + reachableAt, + name: `Exit Node ${publicKey.slice(0, 8)}` + }) + .returning() + .execute(); - logger.info(`Created new exit node ${exitNode[0].name} with address ${exitNode[0].address} and port ${exitNode[0].listenPort}`); + logger.info( + `Created new exit node ${exitNode[0].name} with address ${exitNode[0].address} and port ${exitNode[0].listenPort}` + ); } else { exitNode = exitNodeQuery; } if (!exitNode) { - return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "Failed to create exit node")); + return next( + createHttpError( + HttpCode.INTERNAL_SERVER_ERROR, + "Failed to create exit node" + ) + ); } - // Fetch sites for this exit node - const sitesRes = await db.query.sites.findMany({ - where: eq(sites.exitNodeId, exitNode[0].exitNodeId), - }); + const sitesRes = await db + .select() + .from(sites) + .where(eq(sites.exitNodeId, exitNode[0].exitNodeId)); - const peers = await Promise.all(sitesRes.map(async (site) => { - return { - publicKey: site.pubKey, - allowedIps: await getAllowedIps(site.siteId) - }; - })); + const peers = await Promise.all( + sitesRes.map(async (site) => { + return { + publicKey: site.pubKey, + allowedIps: await getAllowedIps(site.siteId) + }; + }) + ); const configResponse: GetConfigResponse = { listenPort: exitNode[0].listenPort || 51820, ipAddress: exitNode[0].address, - peers, + peers }; logger.debug("Sending config: ", configResponse); @@ -101,32 +123,49 @@ export async function getConfig(req: Request, res: Response, next: NextFunction) return res.status(HttpCode.OK).send(configResponse); } catch (error) { logger.error(error); - return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred...")); + return next( + createHttpError( + HttpCode.INTERNAL_SERVER_ERROR, + "An error occurred..." + ) + ); } } async function getNextAvailableSubnet(): Promise { // Get all existing subnets from routes table - const existingAddresses = await db.select({ - address: exitNodes.address, - }).from(exitNodes); + const existingAddresses = await db + .select({ + address: exitNodes.address + }) + .from(exitNodes); - const addresses = existingAddresses.map(a => a.address); - let subnet = findNextAvailableCidr(addresses, config.getRawConfig().gerbil.block_size, config.getRawConfig().gerbil.subnet_group); + const addresses = existingAddresses.map((a) => a.address); + let subnet = findNextAvailableCidr( + addresses, + config.getRawConfig().gerbil.block_size, + config.getRawConfig().gerbil.subnet_group + ); if (!subnet) { - throw new Error('No available subnets remaining in space'); + throw new Error("No available subnets remaining in space"); } // replace the last octet with 1 - subnet = subnet.split('.').slice(0, 3).join('.') + '.1' + '/' + subnet.split('/')[1]; + subnet = + subnet.split(".").slice(0, 3).join(".") + + ".1" + + "/" + + subnet.split("/")[1]; return subnet; } async function getNextAvailablePort(): Promise { // Get all existing ports from exitNodes table - const existingPorts = await db.select({ - listenPort: exitNodes.listenPort, - }).from(exitNodes); + const existingPorts = await db + .select({ + listenPort: exitNodes.listenPort + }) + .from(exitNodes); // Find the first available port between 1024 and 65535 let nextPort = config.getRawConfig().gerbil.start_port; @@ -136,7 +175,7 @@ async function getNextAvailablePort(): Promise { } nextPort++; if (nextPort > 65535) { - throw new Error('No available ports remaining in space'); + throw new Error("No available ports remaining in space"); } } diff --git a/server/routers/gerbil/peers.ts b/server/routers/gerbil/peers.ts index 47527ea0..2f339fe4 100644 --- a/server/routers/gerbil/peers.ts +++ b/server/routers/gerbil/peers.ts @@ -1,7 +1,7 @@ import axios from 'axios'; import logger from '@server/logger'; -import db from '@server/db'; -import { exitNodes } from '@server/db/schemas'; +import { db } from "@server/db"; +import { exitNodes } from '@server/db'; import { eq } from 'drizzle-orm'; export async function addPeer(exitNodeId: number, peer: { diff --git a/server/routers/gerbil/receiveBandwidth.ts b/server/routers/gerbil/receiveBandwidth.ts index a6c1e791..714e0a29 100644 --- a/server/routers/gerbil/receiveBandwidth.ts +++ b/server/routers/gerbil/receiveBandwidth.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { DrizzleError, eq } from "drizzle-orm"; -import { sites, resources, targets, exitNodes } from "@server/db/schemas"; -import db from "@server/db"; +import { sites, resources, targets, exitNodes } from "@server/db"; +import { db } from "@server/db"; import logger from "@server/logger"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; @@ -29,10 +29,11 @@ export const receiveBandwidth = async ( for (const peer of bandwidthData) { const { publicKey, bytesIn, bytesOut } = peer; - // Find the site by public key - const site = await trx.query.sites.findFirst({ - where: eq(sites.pubKey, publicKey) - }); + const [site] = await trx + .select() + .from(sites) + .where(eq(sites.pubKey, publicKey)) + .limit(1); if (!site) { logger.warn(`Site not found for public key: ${publicKey}`); diff --git a/server/routers/idp/createIdpOrgPolicy.ts b/server/routers/idp/createIdpOrgPolicy.ts index 808c7ca7..448b39cd 100644 --- a/server/routers/idp/createIdpOrgPolicy.ts +++ b/server/routers/idp/createIdpOrgPolicy.ts @@ -9,7 +9,7 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; import config from "@server/lib/config"; import { eq, and } from "drizzle-orm"; -import { idp, idpOrg } from "@server/db/schemas"; +import { idp, idpOrg } from "@server/db"; const paramsSchema = z .object({ diff --git a/server/routers/idp/createOidcIdp.ts b/server/routers/idp/createOidcIdp.ts index 22c569f2..51700701 100644 --- a/server/routers/idp/createOidcIdp.ts +++ b/server/routers/idp/createOidcIdp.ts @@ -7,7 +7,7 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -import { idp, idpOidcConfig, idpOrg, orgs } from "@server/db/schemas"; +import { idp, idpOidcConfig, idpOrg, orgs } from "@server/db"; import { generateOidcRedirectUrl } from "@server/lib/idp/generateRedirectUrl"; import { encrypt } from "@server/lib/crypto"; import config from "@server/lib/config"; diff --git a/server/routers/idp/deleteIdp.ts b/server/routers/idp/deleteIdp.ts index ac84c4f7..e862c81c 100644 --- a/server/routers/idp/deleteIdp.ts +++ b/server/routers/idp/deleteIdp.ts @@ -6,7 +6,7 @@ import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -import { idp, idpOidcConfig, idpOrg } from "@server/db/schemas"; +import { idp, idpOidcConfig, idpOrg } from "@server/db"; import { eq } from "drizzle-orm"; import { OpenAPITags, registry } from "@server/openApi"; diff --git a/server/routers/idp/deleteIdpOrgPolicy.ts b/server/routers/idp/deleteIdpOrgPolicy.ts index 9a6f6e72..8314a6d5 100644 --- a/server/routers/idp/deleteIdpOrgPolicy.ts +++ b/server/routers/idp/deleteIdpOrgPolicy.ts @@ -6,7 +6,7 @@ import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -import { idp, idpOrg } from "@server/db/schemas"; +import { idp, idpOrg } from "@server/db"; import { eq, and } from "drizzle-orm"; import { OpenAPITags, registry } from "@server/openApi"; diff --git a/server/routers/idp/generateOidcUrl.ts b/server/routers/idp/generateOidcUrl.ts index 371a2c21..36c55dcb 100644 --- a/server/routers/idp/generateOidcUrl.ts +++ b/server/routers/idp/generateOidcUrl.ts @@ -6,7 +6,7 @@ import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -import { idp, idpOidcConfig, idpOrg } from "@server/db/schemas"; +import { idp, idpOidcConfig, idpOrg } from "@server/db"; import { and, eq } from "drizzle-orm"; import * as arctic from "arctic"; import { generateOidcRedirectUrl } from "@server/lib/idp/generateRedirectUrl"; diff --git a/server/routers/idp/getIdp.ts b/server/routers/idp/getIdp.ts index 794daade..227a2429 100644 --- a/server/routers/idp/getIdp.ts +++ b/server/routers/idp/getIdp.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { idp, idpOidcConfig } from "@server/db/schemas"; +import { idp, idpOidcConfig } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/idp/listIdpOrgPolicies.ts b/server/routers/idp/listIdpOrgPolicies.ts index 08ad110c..bd288837 100644 --- a/server/routers/idp/listIdpOrgPolicies.ts +++ b/server/routers/idp/listIdpOrgPolicies.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { idpOrg } from "@server/db/schemas"; +import { idpOrg } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/idp/listIdps.ts b/server/routers/idp/listIdps.ts index a723ee05..2a0e5809 100644 --- a/server/routers/idp/listIdps.ts +++ b/server/routers/idp/listIdps.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { domains, idp, orgDomains, users, idpOrg } from "@server/db/schemas"; +import { domains, idp, orgDomains, users, idpOrg } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/idp/updateIdpOrgPolicy.ts b/server/routers/idp/updateIdpOrgPolicy.ts index a5898943..ecbc6dbd 100644 --- a/server/routers/idp/updateIdpOrgPolicy.ts +++ b/server/routers/idp/updateIdpOrgPolicy.ts @@ -8,7 +8,7 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; import { eq, and } from "drizzle-orm"; -import { idp, idpOrg } from "@server/db/schemas"; +import { idp, idpOrg } from "@server/db"; const paramsSchema = z .object({ diff --git a/server/routers/idp/updateOidcIdp.ts b/server/routers/idp/updateOidcIdp.ts index 11040679..2f4e3c66 100644 --- a/server/routers/idp/updateOidcIdp.ts +++ b/server/routers/idp/updateOidcIdp.ts @@ -7,7 +7,7 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -import { idp, idpOidcConfig } from "@server/db/schemas"; +import { idp, idpOidcConfig } from "@server/db"; import { eq } from "drizzle-orm"; import { encrypt } from "@server/lib/crypto"; import config from "@server/lib/config"; diff --git a/server/routers/idp/validateOidcCallback.ts b/server/routers/idp/validateOidcCallback.ts index d0c847da..0066693f 100644 --- a/server/routers/idp/validateOidcCallback.ts +++ b/server/routers/idp/validateOidcCallback.ts @@ -14,7 +14,7 @@ import { roles, userOrgs, users -} from "@server/db/schemas"; +} from "@server/db"; import { and, eq, inArray } from "drizzle-orm"; import * as arctic from "arctic"; import { generateOidcRedirectUrl } from "@server/lib/idp/generateRedirectUrl"; diff --git a/server/routers/license/deleteLicenseKey.ts b/server/routers/license/deleteLicenseKey.ts index 6ae5ca24..2663308e 100644 --- a/server/routers/license/deleteLicenseKey.ts +++ b/server/routers/license/deleteLicenseKey.ts @@ -5,9 +5,9 @@ import logger from "@server/logger"; import { response as sendResponse } from "@server/lib"; import { z } from "zod"; import { fromError } from "zod-validation-error"; -import db from "@server/db"; +import { db } from "@server/db"; import { eq } from "drizzle-orm"; -import { licenseKey } from "@server/db/schemas"; +import { licenseKey } from "@server/db"; import license, { LicenseStatus } from "@server/license/license"; import { encrypt } from "@server/lib/crypto"; import config from "@server/lib/config"; diff --git a/server/routers/newt/createNewt.ts b/server/routers/newt/createNewt.ts index 02517db5..3066e4ea 100644 --- a/server/routers/newt/createNewt.ts +++ b/server/routers/newt/createNewt.ts @@ -1,9 +1,9 @@ import { NextFunction, Request, Response } from "express"; -import db from "@server/db"; +import { db } from "@server/db"; import { hash } from "@node-rs/argon2"; import HttpCode from "@server/types/HttpCode"; import { z } from "zod"; -import { newts } from "@server/db/schemas"; +import { newts } from "@server/db"; import createHttpError from "http-errors"; import response from "@server/lib/response"; import { SqliteError } from "better-sqlite3"; diff --git a/server/routers/newt/getToken.ts b/server/routers/newt/getToken.ts index 7bf89ebf..15071348 100644 --- a/server/routers/newt/getToken.ts +++ b/server/routers/newt/getToken.ts @@ -1,6 +1,6 @@ import { generateSessionToken } from "@server/auth/sessions/app"; -import db from "@server/db"; -import { newts } from "@server/db/schemas"; +import { db } from "@server/db"; +import { newts } from "@server/db"; import HttpCode from "@server/types/HttpCode"; import response from "@server/lib/response"; import { eq } from "drizzle-orm"; diff --git a/server/routers/newt/handleRegisterMessage.ts b/server/routers/newt/handleRegisterMessage.ts index bf64e3ec..e63de0e0 100644 --- a/server/routers/newt/handleRegisterMessage.ts +++ b/server/routers/newt/handleRegisterMessage.ts @@ -1,4 +1,4 @@ -import db from "@server/db"; +import { db } from "@server/db"; import { MessageHandler } from "../ws"; import { exitNodes, @@ -6,7 +6,7 @@ import { sites, Target, targets -} from "@server/db/schemas"; +} from "@server/db"; import { eq, and, sql, inArray } from "drizzle-orm"; import { addPeer, deletePeer } from "../gerbil/peers"; import logger from "@server/logger"; diff --git a/server/routers/newt/targets.ts b/server/routers/newt/targets.ts index f2f5dc45..d3c541a6 100644 --- a/server/routers/newt/targets.ts +++ b/server/routers/newt/targets.ts @@ -1,4 +1,4 @@ -import { Target } from "@server/db/schemas"; +import { Target } from "@server/db"; import { sendToClient } from "../ws"; export function addTargets( diff --git a/server/routers/org/checkId.ts b/server/routers/org/checkId.ts index 40a347aa..c5d00002 100644 --- a/server/routers/org/checkId.ts +++ b/server/routers/org/checkId.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { orgs } from "@server/db/schemas"; +import { orgs } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/org/createOrg.ts b/server/routers/org/createOrg.ts index 60ff5558..ac977063 100644 --- a/server/routers/org/createOrg.ts +++ b/server/routers/org/createOrg.ts @@ -12,13 +12,13 @@ import { roleActions, roles, userOrgs, - users -} from "@server/db/schemas"; + users, + actions +} from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; -import { createAdminRole } from "@server/setup/ensureActions"; import config from "@server/lib/config"; import { fromError } from "zod-validation-error"; import { defaultRoleAllowedActions } from "../role"; @@ -78,16 +78,6 @@ export async function createOrg( ); } - // const userOrgIds = req.userOrgIds; - // if (userOrgIds && userOrgIds.length > MAX_ORGS) { - // return next( - // createHttpError( - // HttpCode.FORBIDDEN, - // `Maximum number of organizations reached.` - // ) - // ); - // } - const { orgId, name } = parsedBody.data; // make sure the orgId is unique @@ -131,14 +121,40 @@ export async function createOrg( org = newOrg[0]; - const roleId = await createAdminRole(newOrg[0].orgId); + // Create admin role within the same transaction + const [insertedRole] = await trx + .insert(roles) + .values({ + orgId: newOrg[0].orgId, + isAdmin: true, + name: "Admin", + description: "Admin role with the most permissions" + }) + .returning({ roleId: roles.roleId }); - if (!roleId) { + if (!insertedRole || !insertedRole.roleId) { error = "Failed to create Admin role"; trx.rollback(); return; } + const roleId = insertedRole.roleId; + + // Get all actions and create role actions + const actionIds = await trx.select().from(actions).execute(); + + if (actionIds.length > 0) { + await trx + .insert(roleActions) + .values( + actionIds.map((action) => ({ + roleId, + actionId: action.actionId, + orgId: newOrg[0].orgId + })) + ); + } + await trx.insert(orgDomains).values( allDomains.map((domain) => ({ orgId: newOrg[0].orgId, @@ -208,7 +224,7 @@ export async function createOrg( return next( createHttpError( HttpCode.INTERNAL_SERVER_ERROR, - "Failed to createo org" + "Failed to create org" ) ); } diff --git a/server/routers/org/deleteOrg.ts b/server/routers/org/deleteOrg.ts index 030588c5..5b2accce 100644 --- a/server/routers/org/deleteOrg.ts +++ b/server/routers/org/deleteOrg.ts @@ -7,7 +7,7 @@ import { orgs, sites, userActions -} from "@server/db/schemas"; +} from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/org/getOrg.ts b/server/routers/org/getOrg.ts index c112ab7a..35c1a5f7 100644 --- a/server/routers/org/getOrg.ts +++ b/server/routers/org/getOrg.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { Org, orgs } from "@server/db/schemas"; +import { Org, orgs } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/org/getOrgOverview.ts b/server/routers/org/getOrgOverview.ts index dcde292d..67a14464 100644 --- a/server/routers/org/getOrgOverview.ts +++ b/server/routers/org/getOrgOverview.ts @@ -10,7 +10,7 @@ import { userResources, users, userSites -} from "@server/db/schemas"; +} from "@server/db"; import { and, count, eq, inArray } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/org/listOrgs.ts b/server/routers/org/listOrgs.ts index 27114104..07705e48 100644 --- a/server/routers/org/listOrgs.ts +++ b/server/routers/org/listOrgs.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { Org, orgs, userOrgs } from "@server/db/schemas"; +import { Org, orgs, userOrgs } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/org/listUserOrgs.ts b/server/routers/org/listUserOrgs.ts index fa33d2cb..694a4fb2 100644 --- a/server/routers/org/listUserOrgs.ts +++ b/server/routers/org/listUserOrgs.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { Org, orgs, userOrgs } from "@server/db/schemas"; +import { Org, orgs, userOrgs } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/org/updateOrg.ts b/server/routers/org/updateOrg.ts index 0f0aa89a..06c92fad 100644 --- a/server/routers/org/updateOrg.ts +++ b/server/routers/org/updateOrg.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { orgs } from "@server/db/schemas"; +import { orgs } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/resource/authWithAccessToken.ts b/server/routers/resource/authWithAccessToken.ts index 961b2d8a..2d7fdf93 100644 --- a/server/routers/resource/authWithAccessToken.ts +++ b/server/routers/resource/authWithAccessToken.ts @@ -1,6 +1,6 @@ import { generateSessionToken } from "@server/auth/sessions/app"; -import db from "@server/db"; -import { Resource, resources } from "@server/db/schemas"; +import { db } from "@server/db"; +import { Resource, resources } from "@server/db"; import HttpCode from "@server/types/HttpCode"; import response from "@server/lib/response"; import { eq } from "drizzle-orm"; diff --git a/server/routers/resource/authWithPassword.ts b/server/routers/resource/authWithPassword.ts index 602ddccd..652c4e86 100644 --- a/server/routers/resource/authWithPassword.ts +++ b/server/routers/resource/authWithPassword.ts @@ -1,7 +1,7 @@ import { verify } from "@node-rs/argon2"; import { generateSessionToken } from "@server/auth/sessions/app"; -import db from "@server/db"; -import { orgs, resourcePassword, resources } from "@server/db/schemas"; +import { db } from "@server/db"; +import { orgs, resourcePassword, resources } from "@server/db"; import HttpCode from "@server/types/HttpCode"; import response from "@server/lib/response"; import { eq } from "drizzle-orm"; diff --git a/server/routers/resource/authWithPincode.ts b/server/routers/resource/authWithPincode.ts index 21640942..d8733c18 100644 --- a/server/routers/resource/authWithPincode.ts +++ b/server/routers/resource/authWithPincode.ts @@ -1,6 +1,6 @@ import { generateSessionToken } from "@server/auth/sessions/app"; -import db from "@server/db"; -import { orgs, resourcePincode, resources } from "@server/db/schemas"; +import { db } from "@server/db"; +import { orgs, resourcePincode, resources } from "@server/db"; import HttpCode from "@server/types/HttpCode"; import response from "@server/lib/response"; import { eq } from "drizzle-orm"; diff --git a/server/routers/resource/authWithWhitelist.ts b/server/routers/resource/authWithWhitelist.ts index 01c9909c..ba0d36d3 100644 --- a/server/routers/resource/authWithWhitelist.ts +++ b/server/routers/resource/authWithWhitelist.ts @@ -1,11 +1,11 @@ import { generateSessionToken } from "@server/auth/sessions/app"; -import db from "@server/db"; +import { db } from "@server/db"; import { orgs, resourceOtp, resources, resourceWhitelist -} from "@server/db/schemas"; +} from "@server/db"; import HttpCode from "@server/types/HttpCode"; import response from "@server/lib/response"; import { eq, and } from "drizzle-orm"; diff --git a/server/routers/resource/createResource.ts b/server/routers/resource/createResource.ts index e899530b..ba115f71 100644 --- a/server/routers/resource/createResource.ts +++ b/server/routers/resource/createResource.ts @@ -10,7 +10,7 @@ import { roleResources, roles, userResources -} from "@server/db/schemas"; +} from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/resource/createResourceRule.ts b/server/routers/resource/createResourceRule.ts index b52713d1..6651eee2 100644 --- a/server/routers/resource/createResourceRule.ts +++ b/server/routers/resource/createResourceRule.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { resourceRules, resources } from "@server/db/schemas"; +import { resourceRules, resources } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/resource/deleteResource.ts b/server/routers/resource/deleteResource.ts index 8b58f688..bb9a6f32 100644 --- a/server/routers/resource/deleteResource.ts +++ b/server/routers/resource/deleteResource.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { newts, resources, sites, targets } from "@server/db/schemas"; +import { newts, resources, sites, targets } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/resource/deleteResourceRule.ts b/server/routers/resource/deleteResourceRule.ts index 573825b0..6b404651 100644 --- a/server/routers/resource/deleteResourceRule.ts +++ b/server/routers/resource/deleteResourceRule.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { resourceRules, resources } from "@server/db/schemas"; +import { resourceRules, resources } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/resource/getExchangeToken.ts b/server/routers/resource/getExchangeToken.ts index f9579433..ba01f63b 100644 --- a/server/routers/resource/getExchangeToken.ts +++ b/server/routers/resource/getExchangeToken.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { resources } from "@server/db/schemas"; +import { resources } from "@server/db"; import { eq } from "drizzle-orm"; import { createResourceSession } from "@server/auth/sessions/resource"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/resource/getResource.ts b/server/routers/resource/getResource.ts index ae3c87d3..0cffb1cf 100644 --- a/server/routers/resource/getResource.ts +++ b/server/routers/resource/getResource.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { Resource, resources, sites } from "@server/db/schemas"; +import { Resource, resources, sites } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/resource/getResourceAuthInfo.ts b/server/routers/resource/getResourceAuthInfo.ts index 5f74b637..64fade89 100644 --- a/server/routers/resource/getResourceAuthInfo.ts +++ b/server/routers/resource/getResourceAuthInfo.ts @@ -5,7 +5,7 @@ import { resourcePassword, resourcePincode, resources -} from "@server/db/schemas"; +} from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/resource/getResourceWhitelist.ts b/server/routers/resource/getResourceWhitelist.ts index 321fd331..415cb714 100644 --- a/server/routers/resource/getResourceWhitelist.ts +++ b/server/routers/resource/getResourceWhitelist.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { resourceWhitelist, users } from "@server/db/schemas"; // Assuming these are the correct tables +import { resourceWhitelist, users } from "@server/db"; // Assuming these are the correct tables import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/resource/listResourceRoles.ts b/server/routers/resource/listResourceRoles.ts index c173cacb..4676b01e 100644 --- a/server/routers/resource/listResourceRoles.ts +++ b/server/routers/resource/listResourceRoles.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { roleResources, roles } from "@server/db/schemas"; +import { roleResources, roles } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/resource/listResourceRules.ts b/server/routers/resource/listResourceRules.ts index f0a0d84c..ff96afea 100644 --- a/server/routers/resource/listResourceRules.ts +++ b/server/routers/resource/listResourceRules.ts @@ -1,5 +1,5 @@ import { db } from "@server/db"; -import { resourceRules, resources } from "@server/db/schemas"; +import { resourceRules, resources } from "@server/db"; import HttpCode from "@server/types/HttpCode"; import response from "@server/lib/response"; import { eq, sql } from "drizzle-orm"; diff --git a/server/routers/resource/listResourceUsers.ts b/server/routers/resource/listResourceUsers.ts index 4699ec8b..0d96ac0d 100644 --- a/server/routers/resource/listResourceUsers.ts +++ b/server/routers/resource/listResourceUsers.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { idp, userResources, users } from "@server/db/schemas"; // Assuming these are the correct tables +import { idp, userResources, users } from "@server/db"; // Assuming these are the correct tables import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/resource/listResources.ts b/server/routers/resource/listResources.ts index 9af24740..6dc852e4 100644 --- a/server/routers/resource/listResources.ts +++ b/server/routers/resource/listResources.ts @@ -8,7 +8,7 @@ import { roleResources, resourcePassword, resourcePincode -} from "@server/db/schemas"; +} from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/resource/setResourcePassword.ts b/server/routers/resource/setResourcePassword.ts index 29eb89cb..d1d4a655 100644 --- a/server/routers/resource/setResourcePassword.ts +++ b/server/routers/resource/setResourcePassword.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { resourcePassword } from "@server/db/schemas"; +import { resourcePassword } from "@server/db"; import { eq } from "drizzle-orm"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/resource/setResourcePincode.ts b/server/routers/resource/setResourcePincode.ts index 2a1b7c1f..d8553c8c 100644 --- a/server/routers/resource/setResourcePincode.ts +++ b/server/routers/resource/setResourcePincode.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { resourcePincode } from "@server/db/schemas"; +import { resourcePincode } from "@server/db"; import { eq } from "drizzle-orm"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/resource/setResourceRoles.ts b/server/routers/resource/setResourceRoles.ts index 0f0b3df2..01991763 100644 --- a/server/routers/resource/setResourceRoles.ts +++ b/server/routers/resource/setResourceRoles.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { apiKeys, roleResources, roles } from "@server/db/schemas"; +import { apiKeys, roleResources, roles } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/resource/setResourceUsers.ts b/server/routers/resource/setResourceUsers.ts index 3080ae45..152c0f88 100644 --- a/server/routers/resource/setResourceUsers.ts +++ b/server/routers/resource/setResourceUsers.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { userResources } from "@server/db/schemas"; +import { userResources } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/resource/setResourceWhitelist.ts b/server/routers/resource/setResourceWhitelist.ts index ceec816c..16c9150b 100644 --- a/server/routers/resource/setResourceWhitelist.ts +++ b/server/routers/resource/setResourceWhitelist.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { resources, resourceWhitelist } from "@server/db/schemas"; +import { resources, resourceWhitelist } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/resource/transferResource.ts b/server/routers/resource/transferResource.ts index 9b21abb2..e0fce278 100644 --- a/server/routers/resource/transferResource.ts +++ b/server/routers/resource/transferResource.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { newts, resources, sites, targets } from "@server/db/schemas"; +import { newts, resources, sites, targets } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/resource/updateResource.ts b/server/routers/resource/updateResource.ts index 9198bb8d..68e38a3e 100644 --- a/server/routers/resource/updateResource.ts +++ b/server/routers/resource/updateResource.ts @@ -8,7 +8,7 @@ import { orgs, Resource, resources -} from "@server/db/schemas"; +} from "@server/db"; import { eq, and } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/resource/updateResourceRule.ts b/server/routers/resource/updateResourceRule.ts index 9a953500..449a92ef 100644 --- a/server/routers/resource/updateResourceRule.ts +++ b/server/routers/resource/updateResourceRule.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { resourceRules, resources } from "@server/db/schemas"; +import { resourceRules, resources } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/role/addRoleAction.ts b/server/routers/role/addRoleAction.ts index 9f364a55..62ab87b5 100644 --- a/server/routers/role/addRoleAction.ts +++ b/server/routers/role/addRoleAction.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { roleActions, roles } from "@server/db/schemas"; +import { roleActions, roles } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/role/addRoleSite.ts b/server/routers/role/addRoleSite.ts index 0db6ac4e..58da9879 100644 --- a/server/routers/role/addRoleSite.ts +++ b/server/routers/role/addRoleSite.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { resources, roleResources, roleSites } from "@server/db/schemas"; +import { resources, roleResources, roleSites } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/role/createRole.ts b/server/routers/role/createRole.ts index 3bc363f6..f66c95e2 100644 --- a/server/routers/role/createRole.ts +++ b/server/routers/role/createRole.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { orgs, Role, roleActions, roles } from "@server/db/schemas"; +import { orgs, Role, roleActions, roles } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/role/deleteRole.ts b/server/routers/role/deleteRole.ts index a89428d5..6806386e 100644 --- a/server/routers/role/deleteRole.ts +++ b/server/routers/role/deleteRole.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { roles, userOrgs } from "@server/db/schemas"; +import { roles, userOrgs } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/role/getRole.ts b/server/routers/role/getRole.ts index 20f93bf4..b7e9539f 100644 --- a/server/routers/role/getRole.ts +++ b/server/routers/role/getRole.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { roles } from "@server/db/schemas"; +import { roles } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/role/listRoleActions.ts b/server/routers/role/listRoleActions.ts index d4637092..cdf1391b 100644 --- a/server/routers/role/listRoleActions.ts +++ b/server/routers/role/listRoleActions.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { roleActions, actions } from "@server/db/schemas"; +import { roleActions, actions } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/role/listRoleResources.ts b/server/routers/role/listRoleResources.ts index 7239f6f7..ba254f1d 100644 --- a/server/routers/role/listRoleResources.ts +++ b/server/routers/role/listRoleResources.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { roleResources, resources } from "@server/db/schemas"; +import { roleResources, resources } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/role/listRoleSites.ts b/server/routers/role/listRoleSites.ts index f6594545..72f49e3a 100644 --- a/server/routers/role/listRoleSites.ts +++ b/server/routers/role/listRoleSites.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { roleSites, sites } from "@server/db/schemas"; +import { roleSites, sites } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/role/listRoles.ts b/server/routers/role/listRoles.ts index 73834b53..7e838956 100644 --- a/server/routers/role/listRoles.ts +++ b/server/routers/role/listRoles.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { roles, orgs } from "@server/db/schemas"; +import { roles, orgs } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/role/removeRoleAction.ts b/server/routers/role/removeRoleAction.ts index 72d9be53..e643ae04 100644 --- a/server/routers/role/removeRoleAction.ts +++ b/server/routers/role/removeRoleAction.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { roleActions } from "@server/db/schemas"; +import { roleActions } from "@server/db"; import { and, eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/role/removeRoleResource.ts b/server/routers/role/removeRoleResource.ts index ca068e05..4068b0bd 100644 --- a/server/routers/role/removeRoleResource.ts +++ b/server/routers/role/removeRoleResource.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { roleResources } from "@server/db/schemas"; +import { roleResources } from "@server/db"; import { and, eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/role/removeRoleSite.ts b/server/routers/role/removeRoleSite.ts index a99adf5c..c88e4711 100644 --- a/server/routers/role/removeRoleSite.ts +++ b/server/routers/role/removeRoleSite.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { resources, roleResources, roleSites } from "@server/db/schemas"; +import { resources, roleResources, roleSites } from "@server/db"; import { and, eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/role/updateRole.ts b/server/routers/role/updateRole.ts index bf029eb1..793be6eb 100644 --- a/server/routers/role/updateRole.ts +++ b/server/routers/role/updateRole.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { roles } from "@server/db/schemas"; +import { roles } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/site/createSite.ts b/server/routers/site/createSite.ts index 87eaa954..c9b54bf2 100644 --- a/server/routers/site/createSite.ts +++ b/server/routers/site/createSite.ts @@ -1,16 +1,16 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { roles, userSites, sites, roleSites, Site, orgs } from "@server/db/schemas"; +import { roles, userSites, sites, roleSites, Site, orgs } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; import { eq, and } from "drizzle-orm"; -import { getUniqueSiteName } from "@server/db/names"; +import { getUniqueSiteName } from "../../db/names"; import { addPeer } from "../gerbil/peers"; import { fromError } from "zod-validation-error"; -import { newts } from "@server/db/schemas"; +import { newts } from "@server/db"; import moment from "moment"; import { OpenAPITags, registry } from "@server/openApi"; import { hashPassword } from "@server/auth/password"; diff --git a/server/routers/site/deleteSite.ts b/server/routers/site/deleteSite.ts index 667ab5c8..1554ad2b 100644 --- a/server/routers/site/deleteSite.ts +++ b/server/routers/site/deleteSite.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { newts, newtSessions, sites } from "@server/db/schemas"; +import { newts, newtSessions, sites } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/site/getSite.ts b/server/routers/site/getSite.ts index 4baa85cc..a9785fa4 100644 --- a/server/routers/site/getSite.ts +++ b/server/routers/site/getSite.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { sites } from "@server/db/schemas"; +import { sites } from "@server/db"; import { eq, and } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/site/listSiteRoles.ts b/server/routers/site/listSiteRoles.ts index 13c8dd41..009e0907 100644 --- a/server/routers/site/listSiteRoles.ts +++ b/server/routers/site/listSiteRoles.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { roleSites, roles } from "@server/db/schemas"; +import { roleSites, roles } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/site/listSites.ts b/server/routers/site/listSites.ts index 1b8791ca..9114c395 100644 --- a/server/routers/site/listSites.ts +++ b/server/routers/site/listSites.ts @@ -1,5 +1,5 @@ import { db } from "@server/db"; -import { orgs, roleSites, sites, userSites } from "@server/db/schemas"; +import { orgs, roleSites, sites, userSites } from "@server/db"; import logger from "@server/logger"; import HttpCode from "@server/types/HttpCode"; import response from "@server/lib/response"; diff --git a/server/routers/site/pickSiteDefaults.ts b/server/routers/site/pickSiteDefaults.ts index 92b93e3c..00e0d58b 100644 --- a/server/routers/site/pickSiteDefaults.ts +++ b/server/routers/site/pickSiteDefaults.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; -import { exitNodes, sites } from "@server/db/schemas"; +import { exitNodes, sites } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/site/updateSite.ts b/server/routers/site/updateSite.ts index 43cd848a..f6374cfd 100644 --- a/server/routers/site/updateSite.ts +++ b/server/routers/site/updateSite.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { sites } from "@server/db/schemas"; +import { sites } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/supporterKey/isSupporterKeyVisible.ts b/server/routers/supporterKey/isSupporterKeyVisible.ts index 15e313de..94d0815b 100644 --- a/server/routers/supporterKey/isSupporterKeyVisible.ts +++ b/server/routers/supporterKey/isSupporterKeyVisible.ts @@ -4,9 +4,9 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { response as sendResponse } from "@server/lib"; import config from "@server/lib/config"; -import db from "@server/db"; +import { db } from "@server/db"; import { count } from "drizzle-orm"; -import { users } from "@server/db/schemas"; +import { users } from "@server/db"; import license from "@server/license/license"; export type IsSupporterKeyVisibleResponse = { diff --git a/server/routers/supporterKey/validateSupporterKey.ts b/server/routers/supporterKey/validateSupporterKey.ts index fadcdc39..a365030a 100644 --- a/server/routers/supporterKey/validateSupporterKey.ts +++ b/server/routers/supporterKey/validateSupporterKey.ts @@ -6,8 +6,8 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { response as sendResponse } from "@server/lib"; import { suppressDeprecationWarnings } from "moment"; -import { supporterKey } from "@server/db/schemas"; -import db from "@server/db"; +import { supporterKey } from "@server/db"; +import { db } from "@server/db"; import { eq } from "drizzle-orm"; import config from "@server/lib/config"; diff --git a/server/routers/target/createTarget.ts b/server/routers/target/createTarget.ts index 810ee409..52bd0417 100644 --- a/server/routers/target/createTarget.ts +++ b/server/routers/target/createTarget.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { newts, resources, sites, Target, targets } from "@server/db/schemas"; +import { newts, resources, sites, Target, targets } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/target/deleteTarget.ts b/server/routers/target/deleteTarget.ts index 979740dd..17a9c5ee 100644 --- a/server/routers/target/deleteTarget.ts +++ b/server/routers/target/deleteTarget.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { newts, resources, sites, targets } from "@server/db/schemas"; +import { newts, resources, sites, targets } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/target/getTarget.ts b/server/routers/target/getTarget.ts index a268629c..071ec8a6 100644 --- a/server/routers/target/getTarget.ts +++ b/server/routers/target/getTarget.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { targets } from "@server/db/schemas"; +import { targets } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/target/helpers.ts b/server/routers/target/helpers.ts index 8fc8797f..5b65feb7 100644 --- a/server/routers/target/helpers.ts +++ b/server/routers/target/helpers.ts @@ -1,5 +1,5 @@ import { db } from "@server/db"; -import { resources, targets } from "@server/db/schemas"; +import { resources, targets } from "@server/db"; import { eq } from "drizzle-orm"; let currentBannedPorts: number[] = []; @@ -8,10 +8,10 @@ export async function pickPort(siteId: number): Promise<{ internalPort: number; targetIps: string[]; }> { - // Fetch resources for this site - const resourcesRes = await db.query.resources.findMany({ - where: eq(resources.siteId, siteId) - }); + const resourcesRes = await db + .select() + .from(resources) + .where(eq(resources.siteId, siteId)); // TODO: is this all inefficient? // Fetch targets for all resources of this site @@ -19,9 +19,10 @@ export async function pickPort(siteId: number): Promise<{ let targetInternalPorts: number[] = []; await Promise.all( resourcesRes.map(async (resource) => { - const targetsRes = await db.query.targets.findMany({ - where: eq(targets.resourceId, resource.resourceId) - }); + const targetsRes = await db + .select() + .from(targets) + .where(eq(targets.resourceId, resource.resourceId)); targetsRes.forEach((target) => { targetIps.push(`${target.ip}/32`); if (target.internalPort) { @@ -49,16 +50,19 @@ export async function pickPort(siteId: number): Promise<{ export async function getAllowedIps(siteId: number) { // TODO: is this all inefficient? - const resourcesRes = await db.query.resources.findMany({ - where: eq(resources.siteId, siteId) - }); + + const resourcesRes = await db + .select() + .from(resources) + .where(eq(resources.siteId, siteId)); // Fetch targets for all resources of this site const targetIps = await Promise.all( resourcesRes.map(async (resource) => { - const targetsRes = await db.query.targets.findMany({ - where: eq(targets.resourceId, resource.resourceId) - }); + const targetsRes = await db + .select() + .from(targets) + .where(eq(targets.resourceId, resource.resourceId)); return targetsRes.map((target) => `${target.ip}/32`); }) ); diff --git a/server/routers/target/listTargets.ts b/server/routers/target/listTargets.ts index 3d4c573b..86599fa1 100644 --- a/server/routers/target/listTargets.ts +++ b/server/routers/target/listTargets.ts @@ -1,5 +1,5 @@ import { db } from "@server/db"; -import { targets } from "@server/db/schemas"; +import { targets } from "@server/db"; import HttpCode from "@server/types/HttpCode"; import response from "@server/lib/response"; import { eq, sql } from "drizzle-orm"; diff --git a/server/routers/target/updateTarget.ts b/server/routers/target/updateTarget.ts index 284b1a31..0138520b 100644 --- a/server/routers/target/updateTarget.ts +++ b/server/routers/target/updateTarget.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { newts, resources, sites, targets } from "@server/db/schemas"; +import { newts, resources, sites, targets } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/traefik/getTraefikConfig.ts b/server/routers/traefik/getTraefikConfig.ts index 2fd656ba..7f70dbc7 100644 --- a/server/routers/traefik/getTraefikConfig.ts +++ b/server/routers/traefik/getTraefikConfig.ts @@ -1,10 +1,10 @@ import { Request, Response } from "express"; -import db from "@server/db"; +import { db } from "@server/db"; import { and, eq, inArray } from "drizzle-orm"; import logger from "@server/logger"; import HttpCode from "@server/types/HttpCode"; import config from "@server/lib/config"; -import { orgs, resources, sites, Target, targets } from "@server/db/schemas"; +import { orgs, resources, sites, Target, targets } from "@server/db"; import { sql } from "drizzle-orm"; export async function traefikConfigProvider( diff --git a/server/routers/user/acceptInvite.ts b/server/routers/user/acceptInvite.ts index cc483b16..115168b9 100644 --- a/server/routers/user/acceptInvite.ts +++ b/server/routers/user/acceptInvite.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { roles, userInvites, userOrgs, users } from "@server/db/schemas"; +import { roles, userInvites, userOrgs, users } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/user/addUserAction.ts b/server/routers/user/addUserAction.ts index 472f4298..074ebe9b 100644 --- a/server/routers/user/addUserAction.ts +++ b/server/routers/user/addUserAction.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { userActions, users } from "@server/db/schemas"; +import { userActions, users } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/user/addUserRole.ts b/server/routers/user/addUserRole.ts index c0ac31bc..bd6d9901 100644 --- a/server/routers/user/addUserRole.ts +++ b/server/routers/user/addUserRole.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { userOrgs, roles } from "@server/db/schemas"; +import { userOrgs, roles } from "@server/db"; import { eq, and } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/user/addUserSite.ts b/server/routers/user/addUserSite.ts index 5b20ed8d..c55d5463 100644 --- a/server/routers/user/addUserSite.ts +++ b/server/routers/user/addUserSite.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { resources, userResources, userSites } from "@server/db/schemas"; +import { resources, userResources, userSites } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/user/adminListUsers.ts b/server/routers/user/adminListUsers.ts index 6de12be9..cb1e21fb 100644 --- a/server/routers/user/adminListUsers.ts +++ b/server/routers/user/adminListUsers.ts @@ -6,7 +6,7 @@ import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import { sql, eq } from "drizzle-orm"; import logger from "@server/logger"; -import { idp, users } from "@server/db/schemas"; +import { idp, users } from "@server/db"; import { fromZodError } from "zod-validation-error"; const listUsersSchema = z diff --git a/server/routers/user/adminRemoveUser.ts b/server/routers/user/adminRemoveUser.ts index fa31c52f..14916ab9 100644 --- a/server/routers/user/adminRemoveUser.ts +++ b/server/routers/user/adminRemoveUser.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { users } from "@server/db/schemas"; +import { users } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/user/createOrgUser.ts b/server/routers/user/createOrgUser.ts index a198db5d..f6fcb619 100644 --- a/server/routers/user/createOrgUser.ts +++ b/server/routers/user/createOrgUser.ts @@ -6,9 +6,9 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -import db from "@server/db"; +import { db } from "@server/db"; import { and, eq } from "drizzle-orm"; -import { idp, idpOidcConfig, roles, userOrgs, users } from "@server/db/schemas"; +import { idp, idpOidcConfig, roles, userOrgs, users } from "@server/db"; import { generateId } from "@server/auth/sessions/app"; const paramsSchema = z diff --git a/server/routers/user/getOrgUser.ts b/server/routers/user/getOrgUser.ts index 6ebd33c0..562ef34e 100644 --- a/server/routers/user/getOrgUser.ts +++ b/server/routers/user/getOrgUser.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { roles, userOrgs, users } from "@server/db/schemas"; +import { roles, userOrgs, users } from "@server/db"; import { and, eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/user/getUser.ts b/server/routers/user/getUser.ts index 2f80be90..e33daab6 100644 --- a/server/routers/user/getUser.ts +++ b/server/routers/user/getUser.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { idp, users } from "@server/db/schemas"; +import { idp, users } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/user/inviteUser.ts b/server/routers/user/inviteUser.ts index 042942ab..6b47338a 100644 --- a/server/routers/user/inviteUser.ts +++ b/server/routers/user/inviteUser.ts @@ -2,7 +2,7 @@ import NodeCache from "node-cache"; import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { orgs, userInvites, userOrgs, users } from "@server/db/schemas"; +import { orgs, userInvites, userOrgs, users } from "@server/db"; import { and, eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/user/listInvitations.ts b/server/routers/user/listInvitations.ts index 76e82db5..c91a136d 100644 --- a/server/routers/user/listInvitations.ts +++ b/server/routers/user/listInvitations.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { userInvites, roles } from "@server/db/schemas"; +import { userInvites, roles } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/user/listUsers.ts b/server/routers/user/listUsers.ts index fd2291d5..2e23f401 100644 --- a/server/routers/user/listUsers.ts +++ b/server/routers/user/listUsers.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { idp, roles, userOrgs, users } from "@server/db/schemas"; +import { idp, roles, userOrgs, users } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; diff --git a/server/routers/user/removeInvitation.ts b/server/routers/user/removeInvitation.ts index c825df6d..e3ee40d0 100644 --- a/server/routers/user/removeInvitation.ts +++ b/server/routers/user/removeInvitation.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { userInvites } from "@server/db/schemas"; +import { userInvites } from "@server/db"; import { eq, and } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/user/removeUserAction.ts b/server/routers/user/removeUserAction.ts index 9364f406..f0bd7d92 100644 --- a/server/routers/user/removeUserAction.ts +++ b/server/routers/user/removeUserAction.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { userActions } from "@server/db/schemas"; +import { userActions } from "@server/db"; import { and, eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/user/removeUserOrg.ts b/server/routers/user/removeUserOrg.ts index b344978c..a406e5ac 100644 --- a/server/routers/user/removeUserOrg.ts +++ b/server/routers/user/removeUserOrg.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { userOrgs, userResources, users, userSites } from "@server/db/schemas"; +import { userOrgs, userResources, users, userSites } from "@server/db"; import { and, eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/user/removeUserResource.ts b/server/routers/user/removeUserResource.ts index be5acab9..186e8032 100644 --- a/server/routers/user/removeUserResource.ts +++ b/server/routers/user/removeUserResource.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { userResources } from "@server/db/schemas"; +import { userResources } from "@server/db"; import { and, eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/user/removeUserSite.ts b/server/routers/user/removeUserSite.ts index 6142f45c..200999fd 100644 --- a/server/routers/user/removeUserSite.ts +++ b/server/routers/user/removeUserSite.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; -import { resources, userResources, userSites } from "@server/db/schemas"; +import { resources, userResources, userSites } from "@server/db"; import { and, eq } from "drizzle-orm"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; diff --git a/server/routers/ws.ts b/server/routers/ws.ts index c4ee8874..377047f1 100644 --- a/server/routers/ws.ts +++ b/server/routers/ws.ts @@ -3,9 +3,9 @@ import { Server as HttpServer } from "http"; import { WebSocket, WebSocketServer } from "ws"; import { IncomingMessage } from "http"; import { Socket } from "net"; -import { Newt, newts, NewtSession } from "@server/db/schemas"; +import { Newt, newts, NewtSession } from "@server/db"; import { eq } from "drizzle-orm"; -import db from "@server/db"; +import { db } from "@server/db"; import { validateNewtSessionToken } from "@server/auth/sessions/newt"; import { messageHandlers } from "./messageHandlers"; import logger from "@server/logger"; diff --git a/server/setup/clearStaleData.ts b/server/setup/clearStaleData.ts index 4d95107e..220a64f5 100644 --- a/server/setup/clearStaleData.ts +++ b/server/setup/clearStaleData.ts @@ -8,7 +8,7 @@ import { resourceSessions, sessions, userInvites -} from "@server/db/schemas"; +} from "@server/db"; import logger from "@server/logger"; import { lt } from "drizzle-orm"; diff --git a/server/setup/copyInConfig.ts b/server/setup/copyInConfig.ts index ec5a137b..6ab8d446 100644 --- a/server/setup/copyInConfig.ts +++ b/server/setup/copyInConfig.ts @@ -1,5 +1,5 @@ import { db } from "@server/db"; -import { domains, exitNodes, orgDomains, orgs, resources } from "../db/schemas/schema"; +import { domains, exitNodes, orgDomains, orgs, resources } from "@server/db"; import config from "@server/lib/config"; import { eq, ne } from "drizzle-orm"; import logger from "@server/logger"; diff --git a/server/setup/ensureActions.ts b/server/setup/ensureActions.ts index 0d789e1d..7fd5384a 100644 --- a/server/setup/ensureActions.ts +++ b/server/setup/ensureActions.ts @@ -1,6 +1,6 @@ import { ActionsEnum } from "@server/auth/actions"; import { db } from "@server/db"; -import { actions, roles, roleActions } from "../db/schemas/schema"; +import { actions, roles, roleActions } from "@server/db"; import { eq, inArray } from "drizzle-orm"; import logger from "@server/logger"; @@ -22,85 +22,37 @@ export async function ensureActions() { .where(eq(roles.isAdmin, true)) .execute(); - await db.transaction(async (trx) => { + await db.transaction(async (trx) => { + // Add new actions + for (const actionId of actionsToAdd) { + logger.debug(`Adding action: ${actionId}`); + await trx.insert(actions).values({ actionId }).execute(); + // Add new actions to the Default role + if (defaultRoles.length != 0) { + await trx + .insert(roleActions) + .values( + defaultRoles.map((role) => ({ + roleId: role.roleId!, + actionId, + orgId: role.orgId! + })) + ) + .execute(); + } + } - // Add new actions - for (const actionId of actionsToAdd) { - logger.debug(`Adding action: ${actionId}`); - await trx.insert(actions).values({ actionId }).execute(); - // Add new actions to the Default role - if (defaultRoles.length != 0) { + // Remove deprecated actions + if (actionsToRemove.length > 0) { + logger.debug(`Removing actions: ${actionsToRemove.join(", ")}`); await trx - .insert(roleActions) - .values( - defaultRoles.map((role) => ({ - roleId: role.roleId!, - actionId, - orgId: role.orgId! - })) - ) + .delete(actions) + .where(inArray(actions.actionId, actionsToRemove)) + .execute(); + await trx + .delete(roleActions) + .where(inArray(roleActions.actionId, actionsToRemove)) .execute(); } - } - - // Remove deprecated actions - if (actionsToRemove.length > 0) { - logger.debug(`Removing actions: ${actionsToRemove.join(", ")}`); - await trx - .delete(actions) - .where(inArray(actions.actionId, actionsToRemove)) - .execute(); - await trx - .delete(roleActions) - .where(inArray(roleActions.actionId, actionsToRemove)) - .execute(); - } -}); -} - -export async function createAdminRole(orgId: string) { - let roleId: any; - await db.transaction(async (trx) => { - - const [insertedRole] = await trx - .insert(roles) - .values({ - orgId, - isAdmin: true, - name: "Admin", - description: "Admin role with the most permissions" - }) - .returning({ roleId: roles.roleId }) - .execute(); - - if (!insertedRole || !insertedRole.roleId) { - throw new Error("Failed to create Admin role"); - } - - roleId = insertedRole.roleId; - - const actionIds = await trx.select().from(actions).execute(); - - if (actionIds.length === 0) { - logger.info("No actions to assign to the Admin role"); - return; - } - - await trx - .insert(roleActions) - .values( - actionIds.map((action) => ({ - roleId, - actionId: action.actionId, - orgId - })) - ) - .execute(); }); - - if (!roleId) { - throw new Error("Failed to create Admin role"); - } - - return roleId; } diff --git a/server/setup/migrationsPg.ts b/server/setup/migrationsPg.ts new file mode 100644 index 00000000..a3dc6499 --- /dev/null +++ b/server/setup/migrationsPg.ts @@ -0,0 +1,133 @@ +import { migrate } from "drizzle-orm/node-postgres/migrator"; +import { db } from "../db/pg"; +import semver from "semver"; +import { versionMigrations } from "../db/pg"; +import { __DIRNAME, APP_PATH, APP_VERSION } from "@server/lib/consts"; +import path from "path"; + +// THIS CANNOT IMPORT ANYTHING FROM THE SERVER +// EXCEPT FOR THE DATABASE AND THE SCHEMA + +// Define the migration list with versions and their corresponding functions +const migrations = [ + // Add new migrations here as they are created +] as { + version: string; + run: () => Promise; +}[]; + +await run(); + +async function run() { + // run the migrations + await runMigrations(); +} + +export async function runMigrations() { + try { + const appVersion = APP_VERSION; + + // determine if the migrations table exists + const exists = await db + .select() + .from(versionMigrations) + .limit(1) + .execute() + .then((res) => res.length > 0) + .catch(() => false); + + if (exists) { + console.log("Migrations table exists, running scripts..."); + await executeScripts(); + } else { + console.log("Migrations table does not exist, creating it..."); + console.log("Running migrations..."); + try { + await migrate(db, { + migrationsFolder: path.join(__DIRNAME, "init") // put here during the docker build + }); + console.log("Migrations completed successfully."); + } catch (error) { + console.error("Error running migrations:", error); + } + + await db + .insert(versionMigrations) + .values({ + version: appVersion, + executedAt: Date.now() + }) + .execute(); + } + } catch (e) { + console.error("Error running migrations:", e); + await new Promise((resolve) => + setTimeout(resolve, 1000 * 60 * 60 * 24 * 1) + ); + } +} + +async function executeScripts() { + try { + // Get the last executed version from the database + const lastExecuted = await db.select().from(versionMigrations); + + // Filter and sort migrations + const pendingMigrations = lastExecuted + .map((m) => m) + .sort((a, b) => semver.compare(b.version, a.version)); + const startVersion = pendingMigrations[0]?.version ?? "0.0.0"; + console.log(`Starting migrations from version ${startVersion}`); + + const migrationsToRun = migrations.filter((migration) => + semver.gt(migration.version, startVersion) + ); + + console.log( + "Migrations to run:", + migrationsToRun.map((m) => m.version).join(", ") + ); + + // Run migrations in order + for (const migration of migrationsToRun) { + console.log(`Running migration ${migration.version}`); + + try { + await migration.run(); + + // Update version in database + await db + .insert(versionMigrations) + .values({ + version: migration.version, + executedAt: Date.now() + }) + .execute(); + + console.log( + `Successfully completed migration ${migration.version}` + ); + } catch (e) { + if ( + e instanceof Error && + typeof (e as any).code === "string" && + (e as any).code === "23505" + ) { + console.error("Migration has already run! Skipping..."); + continue; // or return, depending on context + } + + console.error( + `Failed to run migration ${migration.version}:`, + e + ); + throw e; + } + } + + console.log("All migrations completed successfully"); + } catch (error) { + console.error("Migration process failed:", error); + throw error; + } +} diff --git a/server/setup/migrations.ts b/server/setup/migrationsSqlite.ts similarity index 87% rename from server/setup/migrations.ts rename to server/setup/migrationsSqlite.ts index 753ed6a7..2cd874e2 100644 --- a/server/setup/migrations.ts +++ b/server/setup/migrationsSqlite.ts @@ -1,25 +1,25 @@ import { migrate } from "drizzle-orm/better-sqlite3/migrator"; -import db, { exists } from "@server/db"; +import { db, exists } from "../db/sqlite"; import path from "path"; import semver from "semver"; -import { versionMigrations } from "@server/db/schemas"; +import { versionMigrations } from "../db/sqlite"; import { __DIRNAME, APP_PATH, APP_VERSION } from "@server/lib/consts"; import { SqliteError } from "better-sqlite3"; import fs from "fs"; -import m1 from "./scripts/1.0.0-beta1"; -import m2 from "./scripts/1.0.0-beta2"; -import m3 from "./scripts/1.0.0-beta3"; -import m4 from "./scripts/1.0.0-beta5"; -import m5 from "./scripts/1.0.0-beta6"; -import m6 from "./scripts/1.0.0-beta9"; -import m7 from "./scripts/1.0.0-beta10"; -import m8 from "./scripts/1.0.0-beta12"; -import m13 from "./scripts/1.0.0-beta13"; -import m15 from "./scripts/1.0.0-beta15"; -import m16 from "./scripts/1.0.0"; -import m17 from "./scripts/1.1.0"; -import m18 from "./scripts/1.2.0"; -import m19 from "./scripts/1.3.0"; +import m1 from "./scriptsSqlite/1.0.0-beta1"; +import m2 from "./scriptsSqlite/1.0.0-beta2"; +import m3 from "./scriptsSqlite/1.0.0-beta3"; +import m4 from "./scriptsSqlite/1.0.0-beta5"; +import m5 from "./scriptsSqlite/1.0.0-beta6"; +import m6 from "./scriptsSqlite/1.0.0-beta9"; +import m7 from "./scriptsSqlite/1.0.0-beta10"; +import m8 from "./scriptsSqlite/1.0.0-beta12"; +import m13 from "./scriptsSqlite/1.0.0-beta13"; +import m15 from "./scriptsSqlite/1.0.0-beta15"; +import m16 from "./scriptsSqlite/1.0.0"; +import m17 from "./scriptsSqlite/1.1.0"; +import m18 from "./scriptsSqlite/1.2.0"; +import m19 from "./scriptsSqlite/1.3.0"; import { setHostMeta } from "./setHostMeta"; // THIS CANNOT IMPORT ANYTHING FROM THE SERVER diff --git a/server/setup/scripts/1.0.0-beta1.ts b/server/setup/scriptsSqlite/1.0.0-beta1.ts similarity index 100% rename from server/setup/scripts/1.0.0-beta1.ts rename to server/setup/scriptsSqlite/1.0.0-beta1.ts diff --git a/server/setup/scripts/1.0.0-beta10.ts b/server/setup/scriptsSqlite/1.0.0-beta10.ts similarity index 100% rename from server/setup/scripts/1.0.0-beta10.ts rename to server/setup/scriptsSqlite/1.0.0-beta10.ts diff --git a/server/setup/scripts/1.0.0-beta12.ts b/server/setup/scriptsSqlite/1.0.0-beta12.ts similarity index 97% rename from server/setup/scripts/1.0.0-beta12.ts rename to server/setup/scriptsSqlite/1.0.0-beta12.ts index 0632b5e1..a400b3a6 100644 --- a/server/setup/scripts/1.0.0-beta12.ts +++ b/server/setup/scriptsSqlite/1.0.0-beta12.ts @@ -1,4 +1,4 @@ -import db from "@server/db"; +import { db } from "../../db/sqlite"; import { configFilePath1, configFilePath2 } from "@server/lib/consts"; import { sql } from "drizzle-orm"; import fs from "fs"; diff --git a/server/setup/scripts/1.0.0-beta13.ts b/server/setup/scriptsSqlite/1.0.0-beta13.ts similarity index 96% rename from server/setup/scripts/1.0.0-beta13.ts rename to server/setup/scriptsSqlite/1.0.0-beta13.ts index 48b68cec..9ced727f 100644 --- a/server/setup/scripts/1.0.0-beta13.ts +++ b/server/setup/scriptsSqlite/1.0.0-beta13.ts @@ -1,4 +1,4 @@ -import db from "@server/db"; +import { db } from "../../db/sqlite"; import { sql } from "drizzle-orm"; const version = "1.0.0-beta.13"; diff --git a/server/setup/scripts/1.0.0-beta15.ts b/server/setup/scriptsSqlite/1.0.0-beta15.ts similarity index 97% rename from server/setup/scripts/1.0.0-beta15.ts rename to server/setup/scriptsSqlite/1.0.0-beta15.ts index a087c5c6..e50558a5 100644 --- a/server/setup/scripts/1.0.0-beta15.ts +++ b/server/setup/scriptsSqlite/1.0.0-beta15.ts @@ -1,9 +1,9 @@ -import db from "@server/db"; +import { db } from "../../db/sqlite"; import { configFilePath1, configFilePath2 } from "@server/lib/consts"; import fs from "fs"; import yaml from "js-yaml"; import { sql } from "drizzle-orm"; -import { domains, orgDomains, resources } from "@server/db/schemas"; +import { domains, orgDomains, resources } from "@server/db"; const version = "1.0.0-beta.15"; diff --git a/server/setup/scripts/1.0.0-beta2.ts b/server/setup/scriptsSqlite/1.0.0-beta2.ts similarity index 100% rename from server/setup/scripts/1.0.0-beta2.ts rename to server/setup/scriptsSqlite/1.0.0-beta2.ts diff --git a/server/setup/scripts/1.0.0-beta3.ts b/server/setup/scriptsSqlite/1.0.0-beta3.ts similarity index 100% rename from server/setup/scripts/1.0.0-beta3.ts rename to server/setup/scriptsSqlite/1.0.0-beta3.ts diff --git a/server/setup/scripts/1.0.0-beta5.ts b/server/setup/scriptsSqlite/1.0.0-beta5.ts similarity index 100% rename from server/setup/scripts/1.0.0-beta5.ts rename to server/setup/scriptsSqlite/1.0.0-beta5.ts diff --git a/server/setup/scripts/1.0.0-beta6.ts b/server/setup/scriptsSqlite/1.0.0-beta6.ts similarity index 100% rename from server/setup/scripts/1.0.0-beta6.ts rename to server/setup/scriptsSqlite/1.0.0-beta6.ts diff --git a/server/setup/scripts/1.0.0-beta9.ts b/server/setup/scriptsSqlite/1.0.0-beta9.ts similarity index 99% rename from server/setup/scripts/1.0.0-beta9.ts rename to server/setup/scriptsSqlite/1.0.0-beta9.ts index 64f2beed..c731996b 100644 --- a/server/setup/scripts/1.0.0-beta9.ts +++ b/server/setup/scriptsSqlite/1.0.0-beta9.ts @@ -1,4 +1,4 @@ -import db from "@server/db"; +import { db } from "../../db/sqlite"; import { emailVerificationCodes, passwordResetTokens, @@ -8,7 +8,7 @@ import { targets, userInvites, users -} from "@server/db/schemas"; +} from "../../db/sqlite"; import { APP_PATH, configFilePath1, configFilePath2 } from "@server/lib/consts"; import { eq, sql } from "drizzle-orm"; import fs from "fs"; diff --git a/server/setup/scripts/1.0.0.ts b/server/setup/scriptsSqlite/1.0.0.ts similarity index 100% rename from server/setup/scripts/1.0.0.ts rename to server/setup/scriptsSqlite/1.0.0.ts diff --git a/server/setup/scripts/1.1.0.ts b/server/setup/scriptsSqlite/1.1.0.ts similarity index 94% rename from server/setup/scripts/1.1.0.ts rename to server/setup/scriptsSqlite/1.1.0.ts index 8bd2cd19..4d121852 100644 --- a/server/setup/scripts/1.1.0.ts +++ b/server/setup/scriptsSqlite/1.1.0.ts @@ -1,4 +1,4 @@ -import db from "@server/db"; +import { db } from "../../db/sqlite"; import { sql } from "drizzle-orm"; const version = "1.1.0"; diff --git a/server/setup/scripts/1.2.0.ts b/server/setup/scriptsSqlite/1.2.0.ts similarity index 98% rename from server/setup/scripts/1.2.0.ts rename to server/setup/scriptsSqlite/1.2.0.ts index fdea9fab..940d38e6 100644 --- a/server/setup/scripts/1.2.0.ts +++ b/server/setup/scriptsSqlite/1.2.0.ts @@ -1,4 +1,4 @@ -import db from "@server/db"; +import { db } from "../../db/sqlite"; import { APP_PATH, configFilePath1, configFilePath2 } from "@server/lib/consts"; import { sql } from "drizzle-orm"; import fs from "fs"; diff --git a/server/setup/scripts/1.3.0.ts b/server/setup/scriptsSqlite/1.3.0.ts similarity index 100% rename from server/setup/scripts/1.3.0.ts rename to server/setup/scriptsSqlite/1.3.0.ts diff --git a/server/setup/setHostMeta.ts b/server/setup/setHostMeta.ts index 2a5b16a5..2223d11b 100644 --- a/server/setup/setHostMeta.ts +++ b/server/setup/setHostMeta.ts @@ -1,5 +1,5 @@ -import db from "@server/db"; -import { hostMeta } from "@server/db/schemas"; +import { db } from "@server/db"; +import { hostMeta } from "@server/db"; import { v4 as uuidv4 } from "uuid"; export async function setHostMeta() { diff --git a/server/setup/setupServerAdmin.ts b/server/setup/setupServerAdmin.ts index 9a84852a..5dcf3760 100644 --- a/server/setup/setupServerAdmin.ts +++ b/server/setup/setupServerAdmin.ts @@ -1,8 +1,8 @@ import { generateId, invalidateAllSessions } from "@server/auth/sessions/app"; import { hashPassword, verifyPassword } from "@server/auth/password"; import config from "@server/lib/config"; -import db from "@server/db"; -import { users } from "@server/db/schemas"; +import { db } from "@server/db"; +import { users } from "@server/db"; import logger from "@server/logger"; import { eq } from "drizzle-orm"; import moment from "moment"; diff --git a/server/types/Auth.ts b/server/types/Auth.ts index ce86623f..8e222987 100644 --- a/server/types/Auth.ts +++ b/server/types/Auth.ts @@ -1,6 +1,6 @@ import { Request } from "express"; -import { User } from "@server/db/schemas"; -import { Session } from "@server/db/schemas"; +import { User } from "@server/db"; +import { Session } from "@server/db"; export interface AuthenticatedRequest extends Request { user: User; diff --git a/src/app/[orgId]/settings/access/roles/RolesTable.tsx b/src/app/[orgId]/settings/access/roles/RolesTable.tsx index 7ebcfbce..5369b761 100644 --- a/src/app/[orgId]/settings/access/roles/RolesTable.tsx +++ b/src/app/[orgId]/settings/access/roles/RolesTable.tsx @@ -14,7 +14,7 @@ import ConfirmDeleteDialog from "@app/components/ConfirmDeleteDialog"; import { useOrgContext } from "@app/hooks/useOrgContext"; import { toast } from "@app/hooks/useToast"; import { RolesDataTable } from "./RolesDataTable"; -import { Role } from "@server/db/schemas"; +import { Role } from "@server/db"; import CreateRoleForm from "./CreateRoleForm"; import DeleteRoleForm from "./DeleteRoleForm"; import { createApiClient } from "@app/lib/api"; diff --git a/src/app/[orgId]/settings/api-keys/create/page.tsx b/src/app/[orgId]/settings/api-keys/create/page.tsx index d3e7e346..a2fe7aa6 100644 --- a/src/app/[orgId]/settings/api-keys/create/page.tsx +++ b/src/app/[orgId]/settings/api-keys/create/page.tsx @@ -44,7 +44,7 @@ import { CreateOrgApiKeyBody, CreateOrgApiKeyResponse } from "@server/routers/apiKeys"; -import { ApiKey } from "@server/db/schemas"; +import { ApiKey } from "@server/db"; import { InfoSection, InfoSectionContent, diff --git a/src/app/[orgId]/settings/resources/[resourceId]/authentication/SetResourcePasswordForm.tsx b/src/app/[orgId]/settings/resources/[resourceId]/authentication/SetResourcePasswordForm.tsx index 3bf2966a..a0f6f9a7 100644 --- a/src/app/[orgId]/settings/resources/[resourceId]/authentication/SetResourcePasswordForm.tsx +++ b/src/app/[orgId]/settings/resources/[resourceId]/authentication/SetResourcePasswordForm.tsx @@ -28,7 +28,7 @@ import { } from "@app/components/Credenza"; import { formatAxiosError } from "@app/lib/api"; import { AxiosResponse } from "axios"; -import { Resource } from "@server/db/schemas"; +import { Resource } from "@server/db"; import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; diff --git a/src/app/[orgId]/settings/resources/[resourceId]/authentication/SetResourcePincodeForm.tsx b/src/app/[orgId]/settings/resources/[resourceId]/authentication/SetResourcePincodeForm.tsx index 31ccbea6..cf9d5e42 100644 --- a/src/app/[orgId]/settings/resources/[resourceId]/authentication/SetResourcePincodeForm.tsx +++ b/src/app/[orgId]/settings/resources/[resourceId]/authentication/SetResourcePincodeForm.tsx @@ -28,7 +28,7 @@ import { } from "@app/components/Credenza"; import { formatAxiosError } from "@app/lib/api"; import { AxiosResponse } from "axios"; -import { Resource } from "@server/db/schemas"; +import { Resource } from "@server/db"; import { InputOTP, InputOTPGroup, diff --git a/src/app/[orgId]/settings/resources/create/page.tsx b/src/app/[orgId]/settings/resources/create/page.tsx index c1be6353..7bd90349 100644 --- a/src/app/[orgId]/settings/resources/create/page.tsx +++ b/src/app/[orgId]/settings/resources/create/page.tsx @@ -32,7 +32,7 @@ import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { toast } from "@app/hooks/useToast"; import { AxiosResponse } from "axios"; -import { Resource } from "@server/db/schemas"; +import { Resource } from "@server/db"; import { StrategySelect } from "@app/components/StrategySelect"; import { Select, diff --git a/src/app/auth/idp/[idpId]/oidc/callback/page.tsx b/src/app/auth/idp/[idpId]/oidc/callback/page.tsx index cba74790..b0199ad5 100644 --- a/src/app/auth/idp/[idpId]/oidc/callback/page.tsx +++ b/src/app/auth/idp/[idpId]/oidc/callback/page.tsx @@ -1,7 +1,7 @@ import { cookies } from "next/headers"; import ValidateOidcToken from "./ValidateOidcToken"; -import { idp } from "@server/db/schemas"; -import db from "@server/db"; +import { idp } from "@server/db"; +import { db } from "@server/db"; import { eq } from "drizzle-orm"; export default async function Page(props: { diff --git a/src/app/auth/login/page.tsx b/src/app/auth/login/page.tsx index 8227c1a0..be6a7742 100644 --- a/src/app/auth/login/page.tsx +++ b/src/app/auth/login/page.tsx @@ -6,8 +6,8 @@ import DashboardLoginForm from "./DashboardLoginForm"; import { Mail } from "lucide-react"; import { pullEnv } from "@app/lib/pullEnv"; import { cleanRedirect } from "@app/lib/cleanRedirect"; -import db from "@server/db"; -import { idp } from "@server/db/schemas"; +import { db } from "@server/db"; +import { idp } from "@server/db"; import { LoginFormIDP } from "@app/components/LoginForm"; export const dynamic = "force-dynamic"; diff --git a/src/app/auth/resource/[resourceId]/page.tsx b/src/app/auth/resource/[resourceId]/page.tsx index af31de98..9ed4ce87 100644 --- a/src/app/auth/resource/[resourceId]/page.tsx +++ b/src/app/auth/resource/[resourceId]/page.tsx @@ -14,8 +14,8 @@ import ResourceAccessDenied from "./ResourceAccessDenied"; import AccessToken from "./AccessToken"; import { pullEnv } from "@app/lib/pullEnv"; import { LoginFormIDP } from "@app/components/LoginForm"; -import db from "@server/db"; -import { idp } from "@server/db/schemas"; +import { db } from "@server/db"; +import { idp } from "@server/db"; export default async function ResourceAuthPage(props: { params: Promise<{ resourceId: number }>; diff --git a/src/app/favicon.ico b/src/app/favicon.ico index 1e7b36cd..bcaab339 100644 Binary files a/src/app/favicon.ico and b/src/app/favicon.ico differ diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index d8078f58..b98e1886 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -170,6 +170,8 @@ export function Layout({ alt="Pangolin Logo" width={110} height={25} + priority={true} + quality={25} /> )}