From f6b2c5bbf34f7f28c4034e9f2d47a3f008c79e91 Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 15 Jul 2025 15:52:15 -0700 Subject: [PATCH 1/5] Initial migration created for sqlite --- server/setup/scriptsSqlite/1.7.0.ts | 156 ++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 server/setup/scriptsSqlite/1.7.0.ts diff --git a/server/setup/scriptsSqlite/1.7.0.ts b/server/setup/scriptsSqlite/1.7.0.ts new file mode 100644 index 00000000..57d4f376 --- /dev/null +++ b/server/setup/scriptsSqlite/1.7.0.ts @@ -0,0 +1,156 @@ +import { APP_PATH } from "@server/lib/consts"; +import Database from "better-sqlite3"; +import path from "path"; + +const version = "1.7.0"; + +export default async function migration() { + console.log(`Running setup script ${version}...`); + + const location = path.join(APP_PATH, "db", "db.sqlite"); + const db = new Database(location); + + try { + db.transaction(() => { + db.exec(` + CREATE TABLE 'clientSites' ( + 'clientId' integer NOT NULL, + 'siteId' integer NOT NULL, + 'isRelayed' integer DEFAULT false NOT NULL, + FOREIGN KEY ('clientId') REFERENCES 'clients'('id') ON UPDATE no action ON DELETE cascade, + FOREIGN KEY ('siteId') REFERENCES 'sites'('siteId') ON UPDATE no action ON DELETE cascade + ); + + CREATE TABLE 'clients' ( + 'id' integer PRIMARY KEY AUTOINCREMENT NOT NULL, + 'orgId' text NOT NULL, + 'exitNode' integer, + 'name' text NOT NULL, + 'pubKey' text, + 'subnet' text NOT NULL, + 'bytesIn' integer, + 'bytesOut' integer, + 'lastBandwidthUpdate' text, + 'lastPing' text, + 'type' text NOT NULL, + 'online' integer DEFAULT false NOT NULL, + 'endpoint' text, + 'lastHolePunch' integer, + FOREIGN KEY ('orgId') REFERENCES 'orgs'('orgId') ON UPDATE no action ON DELETE cascade, + FOREIGN KEY ('exitNode') REFERENCES 'exitNodes'('exitNodeId') ON UPDATE no action ON DELETE set null + ); + + CREATE TABLE 'clientSession' ( + 'id' text PRIMARY KEY NOT NULL, + 'olmId' text NOT NULL, + 'expiresAt' integer NOT NULL, + FOREIGN KEY ('olmId') REFERENCES 'olms'('id') ON UPDATE no action ON DELETE cascade + ); + + CREATE TABLE 'olms' ( + 'id' text PRIMARY KEY NOT NULL, + 'secretHash' text NOT NULL, + 'dateCreated' text NOT NULL, + 'clientId' integer, + FOREIGN KEY ('clientId') REFERENCES 'clients'('id') ON UPDATE no action ON DELETE cascade + ); + + CREATE TABLE 'roleClients' ( + 'roleId' integer NOT NULL, + 'clientId' integer NOT NULL, + FOREIGN KEY ('roleId') REFERENCES 'roles'('roleId') ON UPDATE no action ON DELETE cascade, + FOREIGN KEY ('clientId') REFERENCES 'clients'('id') ON UPDATE no action ON DELETE cascade + ); + + CREATE TABLE 'webauthnCredentials' ( + 'credentialId' text PRIMARY KEY NOT NULL, + 'userId' text NOT NULL, + 'publicKey' text NOT NULL, + 'signCount' integer NOT NULL, + 'transports' text, + 'name' text, + 'lastUsed' text NOT NULL, + 'dateCreated' text NOT NULL, + FOREIGN KEY ('userId') REFERENCES 'user'('id') ON UPDATE no action ON DELETE cascade + ); + + CREATE TABLE 'userClients' ( + 'userId' text NOT NULL, + 'clientId' integer NOT NULL, + FOREIGN KEY ('userId') REFERENCES 'user'('id') ON UPDATE no action ON DELETE cascade, + FOREIGN KEY ('clientId') REFERENCES 'clients'('id') ON UPDATE no action ON DELETE cascade + ); + + CREATE TABLE 'userDomains' ( + 'userId' text NOT NULL, + 'domainId' text NOT NULL, + FOREIGN KEY ('userId') REFERENCES 'user'('id') ON UPDATE no action ON DELETE cascade, + FOREIGN KEY ('domainId') REFERENCES 'domains'('domainId') ON UPDATE no action ON DELETE cascade + ); + + CREATE TABLE 'webauthnChallenge' ( + 'sessionId' text PRIMARY KEY NOT NULL, + 'challenge' text NOT NULL, + 'securityKeyName' text, + 'userId' text, + 'expiresAt' integer NOT NULL, + FOREIGN KEY ('userId') REFERENCES 'user'('id') ON UPDATE no action ON DELETE cascade + ); + + `); + })(); // <-- executes the transaction immediately + + db.pragma("foreign_keys = OFF"); + db.transaction(() => { + db.exec(` + CREATE TABLE '__new_sites' ( + 'siteId' integer PRIMARY KEY AUTOINCREMENT NOT NULL, + 'orgId' text NOT NULL, + 'niceId' text NOT NULL, + 'exitNode' integer, + 'name' text NOT NULL, + 'pubKey' text, + 'subnet' text, + 'bytesIn' integer DEFAULT 0, + 'bytesOut' integer DEFAULT 0, + 'lastBandwidthUpdate' text, + 'type' text NOT NULL, + 'online' integer DEFAULT false NOT NULL, + 'address' text, + 'endpoint' text, + 'publicKey' text, + 'lastHolePunch' integer, + 'listenPort' integer, + 'dockerSocketEnabled' integer DEFAULT true NOT NULL, + FOREIGN KEY ('orgId') REFERENCES 'orgs'('orgId') ON UPDATE no action ON DELETE cascade, + FOREIGN KEY ('exitNode') REFERENCES 'exitNodes'('exitNodeId') ON UPDATE no action ON DELETE set null + ); + + INSERT INTO '__new_sites'("siteId", "orgId", "niceId", "exitNode", "name", "pubKey", "subnet", "bytesIn", "bytesOut", "lastBandwidthUpdate", "type", "online", "address", "endpoint", "publicKey", "lastHolePunch", "listenPort", "dockerSocketEnabled") SELECT "siteId", "orgId", "niceId", "exitNode", "name", "pubKey", "subnet", "bytesIn", "bytesOut", "lastBandwidthUpdate", "type", "online", "address", "endpoint", "publicKey", "lastHolePunch", "listenPort", "dockerSocketEnabled" FROM 'sites'; + DROP TABLE 'sites'; + ALTER TABLE '__new_sites' RENAME TO 'sites'; + `); + })(); // <-- executes the transaction immediately + db.pragma("foreign_keys = ON"); + + db.transaction(() => { + db.exec(` + ALTER TABLE 'domains' ADD 'type' text; + ALTER TABLE 'domains' ADD 'verified' integer DEFAULT false NOT NULL; + ALTER TABLE 'domains' ADD 'failed' integer DEFAULT false NOT NULL; + ALTER TABLE 'domains' ADD 'tries' integer DEFAULT 0 NOT NULL; + ALTER TABLE 'exitNodes' ADD 'maxConnections' integer; + ALTER TABLE 'newt' ADD 'version' text; + ALTER TABLE 'orgs' ADD 'subnet' text NOT NULL; + ALTER TABLE 'user' ADD 'twoFactorSetupRequested' integer DEFAULT false; + ALTER TABLE 'resources' DROP COLUMN 'isBaseDomain'; + `); + })(); // <-- executes the transaction immediately + console.log(`Migrated database schema`); + } catch (e) { + console.log("Unable to migrate database schema"); + console.log(e); + } + + console.log(`${version} migration complete`); +} From b446c2ce4b2bca5fe5b685d2754d6b6b65869028 Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 15 Jul 2025 15:58:01 -0700 Subject: [PATCH 2/5] Add initial migration --- server/setup/scriptsPg/1.7.0.ts | 118 ++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 server/setup/scriptsPg/1.7.0.ts diff --git a/server/setup/scriptsPg/1.7.0.ts b/server/setup/scriptsPg/1.7.0.ts new file mode 100644 index 00000000..9814db34 --- /dev/null +++ b/server/setup/scriptsPg/1.7.0.ts @@ -0,0 +1,118 @@ +import { db } from "@server/db/pg/driver"; +import { sql } from "drizzle-orm"; + +const version = "1.7.0"; + +export default async function migration() { + console.log(`Running setup script ${version}...`); + + try { + db.execute(sql` + CREATE TABLE "clientSites" ( + "clientId" integer NOT NULL, + "siteId" integer NOT NULL, + "isRelayed" boolean DEFAULT false NOT NULL + ); + --> statement-breakpoint + CREATE TABLE "clients" ( + "id" serial PRIMARY KEY NOT NULL, + "orgId" varchar NOT NULL, + "exitNode" integer, + "name" varchar NOT NULL, + "pubKey" varchar, + "subnet" varchar NOT NULL, + "bytesIn" integer, + "bytesOut" integer, + "lastBandwidthUpdate" varchar, + "lastPing" varchar, + "type" varchar NOT NULL, + "online" boolean DEFAULT false NOT NULL, + "endpoint" varchar, + "lastHolePunch" integer, + "maxConnections" integer + ); + --> statement-breakpoint + CREATE TABLE "clientSession" ( + "id" varchar PRIMARY KEY NOT NULL, + "olmId" varchar NOT NULL, + "expiresAt" integer NOT NULL + ); + --> statement-breakpoint + CREATE TABLE "olms" ( + "id" varchar PRIMARY KEY NOT NULL, + "secretHash" varchar NOT NULL, + "dateCreated" varchar NOT NULL, + "clientId" integer + ); + --> statement-breakpoint + CREATE TABLE "roleClients" ( + "roleId" integer NOT NULL, + "clientId" integer NOT NULL + ); + --> statement-breakpoint + CREATE TABLE "webauthnCredentials" ( + "credentialId" varchar PRIMARY KEY NOT NULL, + "userId" varchar NOT NULL, + "publicKey" varchar NOT NULL, + "signCount" integer NOT NULL, + "transports" varchar, + "name" varchar, + "lastUsed" varchar NOT NULL, + "dateCreated" varchar NOT NULL, + "securityKeyName" varchar + ); + --> statement-breakpoint + CREATE TABLE "userClients" ( + "userId" varchar NOT NULL, + "clientId" integer NOT NULL + ); + --> statement-breakpoint + CREATE TABLE "webauthnChallenge" ( + "sessionId" varchar PRIMARY KEY NOT NULL, + "challenge" varchar NOT NULL, + "securityKeyName" varchar, + "userId" varchar, + "expiresAt" bigint NOT NULL + ); + --> statement-breakpoint + ALTER TABLE "limits" DISABLE ROW LEVEL SECURITY;--> statement-breakpoint + DROP TABLE "limits" CASCADE;--> statement-breakpoint + ALTER TABLE "sites" ALTER COLUMN "subnet" DROP NOT NULL;--> statement-breakpoint + ALTER TABLE "sites" ALTER COLUMN "bytesIn" SET DEFAULT 0;--> statement-breakpoint + ALTER TABLE "sites" ALTER COLUMN "bytesOut" SET DEFAULT 0;--> statement-breakpoint + ALTER TABLE "domains" ADD COLUMN "type" varchar;--> statement-breakpoint + ALTER TABLE "domains" ADD COLUMN "verified" boolean DEFAULT false NOT NULL;--> statement-breakpoint + ALTER TABLE "domains" ADD COLUMN "failed" boolean DEFAULT false NOT NULL;--> statement-breakpoint + ALTER TABLE "domains" ADD COLUMN "tries" integer DEFAULT 0 NOT NULL;--> statement-breakpoint + ALTER TABLE "exitNodes" ADD COLUMN "maxConnections" integer;--> statement-breakpoint + ALTER TABLE "newt" ADD COLUMN "version" varchar;--> statement-breakpoint + ALTER TABLE "orgs" ADD COLUMN "subnet" varchar NOT NULL;--> statement-breakpoint + ALTER TABLE "sites" ADD COLUMN "address" varchar;--> statement-breakpoint + ALTER TABLE "sites" ADD COLUMN "endpoint" varchar;--> statement-breakpoint + ALTER TABLE "sites" ADD COLUMN "publicKey" varchar;--> statement-breakpoint + ALTER TABLE "sites" ADD COLUMN "lastHolePunch" bigint;--> statement-breakpoint + ALTER TABLE "sites" ADD COLUMN "listenPort" integer;--> statement-breakpoint + ALTER TABLE "user" ADD COLUMN "twoFactorSetupRequested" boolean DEFAULT false;--> statement-breakpoint + ALTER TABLE "clientSites" ADD CONSTRAINT "clientSites_clientId_clients_id_fk" FOREIGN KEY ("clientId") REFERENCES "public"."clients"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint + ALTER TABLE "clientSites" ADD CONSTRAINT "clientSites_siteId_sites_siteId_fk" FOREIGN KEY ("siteId") REFERENCES "public"."sites"("siteId") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint + ALTER TABLE "clients" ADD CONSTRAINT "clients_orgId_orgs_orgId_fk" FOREIGN KEY ("orgId") REFERENCES "public"."orgs"("orgId") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint + ALTER TABLE "clients" ADD CONSTRAINT "clients_exitNode_exitNodes_exitNodeId_fk" FOREIGN KEY ("exitNode") REFERENCES "public"."exitNodes"("exitNodeId") ON DELETE set null ON UPDATE no action;--> statement-breakpoint + ALTER TABLE "clientSession" ADD CONSTRAINT "clientSession_olmId_olms_id_fk" FOREIGN KEY ("olmId") REFERENCES "public"."olms"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint + ALTER TABLE "olms" ADD CONSTRAINT "olms_clientId_clients_id_fk" FOREIGN KEY ("clientId") REFERENCES "public"."clients"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint + ALTER TABLE "roleClients" ADD CONSTRAINT "roleClients_roleId_roles_roleId_fk" FOREIGN KEY ("roleId") REFERENCES "public"."roles"("roleId") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint + ALTER TABLE "roleClients" ADD CONSTRAINT "roleClients_clientId_clients_id_fk" FOREIGN KEY ("clientId") REFERENCES "public"."clients"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint + ALTER TABLE "webauthnCredentials" ADD CONSTRAINT "webauthnCredentials_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint + ALTER TABLE "userClients" ADD CONSTRAINT "userClients_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint + ALTER TABLE "userClients" ADD CONSTRAINT "userClients_clientId_clients_id_fk" FOREIGN KEY ("clientId") REFERENCES "public"."clients"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint + ALTER TABLE "webauthnChallenge" ADD CONSTRAINT "webauthnChallenge_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint + ALTER TABLE "resources" DROP COLUMN "isBaseDomain"; + `); + + console.log(`Migrated database schema`); + } catch (e) { + console.log("Unable to migrate database schema"); + console.log(e); + } + + console.log(`${version} migration complete`); +} From 963bc5f0bccdeabd1ad4d0be072b0ca77837296c Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 15 Jul 2025 15:59:37 -0700 Subject: [PATCH 3/5] Add migrations to the callers --- server/setup/migrationsPg.ts | 4 +++- server/setup/migrationsSqlite.ts | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/server/setup/migrationsPg.ts b/server/setup/migrationsPg.ts index aeec86ff..d5e2f46d 100644 --- a/server/setup/migrationsPg.ts +++ b/server/setup/migrationsPg.ts @@ -5,13 +5,15 @@ import { versionMigrations } from "../db/pg"; import { __DIRNAME, APP_VERSION } from "@server/lib/consts"; import path from "path"; import m1 from "./scriptsPg/1.6.0"; +import m2 from "./scriptsPg/1.7.0"; // 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 = [ - { version: "1.6.0", run: m1 } + { version: "1.6.0", run: m1 }, + { version: "1.7.0", run: m2 } // Add new migrations here as they are created ] as { version: string; diff --git a/server/setup/migrationsSqlite.ts b/server/setup/migrationsSqlite.ts index fadb094a..68da0a27 100644 --- a/server/setup/migrationsSqlite.ts +++ b/server/setup/migrationsSqlite.ts @@ -22,6 +22,7 @@ import m18 from "./scriptsSqlite/1.2.0"; import m19 from "./scriptsSqlite/1.3.0"; import m20 from "./scriptsSqlite/1.5.0"; import m21 from "./scriptsSqlite/1.6.0"; +import m22 from "./scriptsSqlite/1.7.0"; // THIS CANNOT IMPORT ANYTHING FROM THE SERVER // EXCEPT FOR THE DATABASE AND THE SCHEMA @@ -43,7 +44,8 @@ const migrations = [ { version: "1.2.0", run: m18 }, { version: "1.3.0", run: m19 }, { version: "1.5.0", run: m20 }, - { version: "1.6.0", run: m21 } + { version: "1.6.0", run: m21 }, + { version: "1.7.0", run: m22 }, // Add new migrations here as they are created ] as const; From 84ca275f1ea99f332d249f88b79a4741a526e2c2 Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 15 Jul 2025 16:15:22 -0700 Subject: [PATCH 4/5] Remove subnet check on the org for now --- server/routers/org/createOrg.ts | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/server/routers/org/createOrg.ts b/server/routers/org/createOrg.ts index 245e0928..9ac65115 100644 --- a/server/routers/org/createOrg.ts +++ b/server/routers/org/createOrg.ts @@ -89,21 +89,22 @@ export async function createOrg( ); } + // TODO: for now we are making all of the orgs the same subnet // make sure the subnet is unique - const subnetExists = await db - .select() - .from(orgs) - .where(eq(orgs.subnet, subnet)) - .limit(1); + // const subnetExists = await db + // .select() + // .from(orgs) + // .where(eq(orgs.subnet, subnet)) + // .limit(1); - if (subnetExists.length > 0) { - return next( - createHttpError( - HttpCode.CONFLICT, - `Subnet ${subnet} already exists` - ) - ); - } + // if (subnetExists.length > 0) { + // return next( + // createHttpError( + // HttpCode.CONFLICT, + // `Subnet ${subnet} already exists` + // ) + // ); + // } // make sure the orgId is unique const orgExists = await db From 99d0fa974b9429ff9949d13b50b2472c2e75d2d8 Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 15 Jul 2025 16:17:31 -0700 Subject: [PATCH 5/5] Remove breakpoints --- server/setup/scriptsPg/1.7.0.ts | 76 ++++++++++++++++----------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/server/setup/scriptsPg/1.7.0.ts b/server/setup/scriptsPg/1.7.0.ts index 9814db34..63438b06 100644 --- a/server/setup/scriptsPg/1.7.0.ts +++ b/server/setup/scriptsPg/1.7.0.ts @@ -13,7 +13,7 @@ export default async function migration() { "siteId" integer NOT NULL, "isRelayed" boolean DEFAULT false NOT NULL ); - --> statement-breakpoint + CREATE TABLE "clients" ( "id" serial PRIMARY KEY NOT NULL, "orgId" varchar NOT NULL, @@ -31,25 +31,25 @@ export default async function migration() { "lastHolePunch" integer, "maxConnections" integer ); - --> statement-breakpoint + CREATE TABLE "clientSession" ( "id" varchar PRIMARY KEY NOT NULL, "olmId" varchar NOT NULL, "expiresAt" integer NOT NULL ); - --> statement-breakpoint + CREATE TABLE "olms" ( "id" varchar PRIMARY KEY NOT NULL, "secretHash" varchar NOT NULL, "dateCreated" varchar NOT NULL, "clientId" integer ); - --> statement-breakpoint + CREATE TABLE "roleClients" ( "roleId" integer NOT NULL, "clientId" integer NOT NULL ); - --> statement-breakpoint + CREATE TABLE "webauthnCredentials" ( "credentialId" varchar PRIMARY KEY NOT NULL, "userId" varchar NOT NULL, @@ -61,12 +61,12 @@ export default async function migration() { "dateCreated" varchar NOT NULL, "securityKeyName" varchar ); - --> statement-breakpoint + CREATE TABLE "userClients" ( "userId" varchar NOT NULL, "clientId" integer NOT NULL ); - --> statement-breakpoint + CREATE TABLE "webauthnChallenge" ( "sessionId" varchar PRIMARY KEY NOT NULL, "challenge" varchar NOT NULL, @@ -74,37 +74,37 @@ export default async function migration() { "userId" varchar, "expiresAt" bigint NOT NULL ); - --> statement-breakpoint - ALTER TABLE "limits" DISABLE ROW LEVEL SECURITY;--> statement-breakpoint - DROP TABLE "limits" CASCADE;--> statement-breakpoint - ALTER TABLE "sites" ALTER COLUMN "subnet" DROP NOT NULL;--> statement-breakpoint - ALTER TABLE "sites" ALTER COLUMN "bytesIn" SET DEFAULT 0;--> statement-breakpoint - ALTER TABLE "sites" ALTER COLUMN "bytesOut" SET DEFAULT 0;--> statement-breakpoint - ALTER TABLE "domains" ADD COLUMN "type" varchar;--> statement-breakpoint - ALTER TABLE "domains" ADD COLUMN "verified" boolean DEFAULT false NOT NULL;--> statement-breakpoint - ALTER TABLE "domains" ADD COLUMN "failed" boolean DEFAULT false NOT NULL;--> statement-breakpoint - ALTER TABLE "domains" ADD COLUMN "tries" integer DEFAULT 0 NOT NULL;--> statement-breakpoint - ALTER TABLE "exitNodes" ADD COLUMN "maxConnections" integer;--> statement-breakpoint - ALTER TABLE "newt" ADD COLUMN "version" varchar;--> statement-breakpoint - ALTER TABLE "orgs" ADD COLUMN "subnet" varchar NOT NULL;--> statement-breakpoint - ALTER TABLE "sites" ADD COLUMN "address" varchar;--> statement-breakpoint - ALTER TABLE "sites" ADD COLUMN "endpoint" varchar;--> statement-breakpoint - ALTER TABLE "sites" ADD COLUMN "publicKey" varchar;--> statement-breakpoint - ALTER TABLE "sites" ADD COLUMN "lastHolePunch" bigint;--> statement-breakpoint - ALTER TABLE "sites" ADD COLUMN "listenPort" integer;--> statement-breakpoint - ALTER TABLE "user" ADD COLUMN "twoFactorSetupRequested" boolean DEFAULT false;--> statement-breakpoint - ALTER TABLE "clientSites" ADD CONSTRAINT "clientSites_clientId_clients_id_fk" FOREIGN KEY ("clientId") REFERENCES "public"."clients"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint - ALTER TABLE "clientSites" ADD CONSTRAINT "clientSites_siteId_sites_siteId_fk" FOREIGN KEY ("siteId") REFERENCES "public"."sites"("siteId") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint - ALTER TABLE "clients" ADD CONSTRAINT "clients_orgId_orgs_orgId_fk" FOREIGN KEY ("orgId") REFERENCES "public"."orgs"("orgId") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint - ALTER TABLE "clients" ADD CONSTRAINT "clients_exitNode_exitNodes_exitNodeId_fk" FOREIGN KEY ("exitNode") REFERENCES "public"."exitNodes"("exitNodeId") ON DELETE set null ON UPDATE no action;--> statement-breakpoint - ALTER TABLE "clientSession" ADD CONSTRAINT "clientSession_olmId_olms_id_fk" FOREIGN KEY ("olmId") REFERENCES "public"."olms"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint - ALTER TABLE "olms" ADD CONSTRAINT "olms_clientId_clients_id_fk" FOREIGN KEY ("clientId") REFERENCES "public"."clients"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint - ALTER TABLE "roleClients" ADD CONSTRAINT "roleClients_roleId_roles_roleId_fk" FOREIGN KEY ("roleId") REFERENCES "public"."roles"("roleId") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint - ALTER TABLE "roleClients" ADD CONSTRAINT "roleClients_clientId_clients_id_fk" FOREIGN KEY ("clientId") REFERENCES "public"."clients"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint - ALTER TABLE "webauthnCredentials" ADD CONSTRAINT "webauthnCredentials_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint - ALTER TABLE "userClients" ADD CONSTRAINT "userClients_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint - ALTER TABLE "userClients" ADD CONSTRAINT "userClients_clientId_clients_id_fk" FOREIGN KEY ("clientId") REFERENCES "public"."clients"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint - ALTER TABLE "webauthnChallenge" ADD CONSTRAINT "webauthnChallenge_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint + + ALTER TABLE "limits" DISABLE ROW LEVEL SECURITY; + DROP TABLE "limits" CASCADE; + ALTER TABLE "sites" ALTER COLUMN "subnet" DROP NOT NULL; + ALTER TABLE "sites" ALTER COLUMN "bytesIn" SET DEFAULT 0; + ALTER TABLE "sites" ALTER COLUMN "bytesOut" SET DEFAULT 0; + ALTER TABLE "domains" ADD COLUMN "type" varchar; + ALTER TABLE "domains" ADD COLUMN "verified" boolean DEFAULT false NOT NULL; + ALTER TABLE "domains" ADD COLUMN "failed" boolean DEFAULT false NOT NULL; + ALTER TABLE "domains" ADD COLUMN "tries" integer DEFAULT 0 NOT NULL; + ALTER TABLE "exitNodes" ADD COLUMN "maxConnections" integer; + ALTER TABLE "newt" ADD COLUMN "version" varchar; + ALTER TABLE "orgs" ADD COLUMN "subnet" varchar NOT NULL; + ALTER TABLE "sites" ADD COLUMN "address" varchar; + ALTER TABLE "sites" ADD COLUMN "endpoint" varchar; + ALTER TABLE "sites" ADD COLUMN "publicKey" varchar; + ALTER TABLE "sites" ADD COLUMN "lastHolePunch" bigint; + ALTER TABLE "sites" ADD COLUMN "listenPort" integer; + ALTER TABLE "user" ADD COLUMN "twoFactorSetupRequested" boolean DEFAULT false; + ALTER TABLE "clientSites" ADD CONSTRAINT "clientSites_clientId_clients_id_fk" FOREIGN KEY ("clientId") REFERENCES "public"."clients"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "clientSites" ADD CONSTRAINT "clientSites_siteId_sites_siteId_fk" FOREIGN KEY ("siteId") REFERENCES "public"."sites"("siteId") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "clients" ADD CONSTRAINT "clients_orgId_orgs_orgId_fk" FOREIGN KEY ("orgId") REFERENCES "public"."orgs"("orgId") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "clients" ADD CONSTRAINT "clients_exitNode_exitNodes_exitNodeId_fk" FOREIGN KEY ("exitNode") REFERENCES "public"."exitNodes"("exitNodeId") ON DELETE set null ON UPDATE no action; + ALTER TABLE "clientSession" ADD CONSTRAINT "clientSession_olmId_olms_id_fk" FOREIGN KEY ("olmId") REFERENCES "public"."olms"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "olms" ADD CONSTRAINT "olms_clientId_clients_id_fk" FOREIGN KEY ("clientId") REFERENCES "public"."clients"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "roleClients" ADD CONSTRAINT "roleClients_roleId_roles_roleId_fk" FOREIGN KEY ("roleId") REFERENCES "public"."roles"("roleId") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "roleClients" ADD CONSTRAINT "roleClients_clientId_clients_id_fk" FOREIGN KEY ("clientId") REFERENCES "public"."clients"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "webauthnCredentials" ADD CONSTRAINT "webauthnCredentials_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "userClients" ADD CONSTRAINT "userClients_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "userClients" ADD CONSTRAINT "userClients_clientId_clients_id_fk" FOREIGN KEY ("clientId") REFERENCES "public"."clients"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "webauthnChallenge" ADD CONSTRAINT "webauthnChallenge_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action; ALTER TABLE "resources" DROP COLUMN "isBaseDomain"; `);