Migration 1.17 first pass

This commit is contained in:
Owen
2026-03-30 16:38:19 -07:00
parent 4465b05404
commit b01d266629
2 changed files with 251 additions and 6 deletions

View File

@@ -23,6 +23,66 @@ export default async function migration() {
try {
await db.execute(sql`BEGIN`);
await db.execute(sql`
CREATE TABLE "bannedEmails" (
"email" varchar(255) PRIMARY KEY NOT NULL
);
`);
await db.execute(sql`
CREATE TABLE "bannedIps" (
"ip" varchar(255) PRIMARY KEY NOT NULL
);
`);
await db.execute(sql`
CREATE TABLE "connectionAuditLog" (
"id" serial PRIMARY KEY NOT NULL,
"sessionId" text NOT NULL,
"siteResourceId" integer,
"orgId" text,
"siteId" integer,
"clientId" integer,
"userId" text,
"sourceAddr" text NOT NULL,
"destAddr" text NOT NULL,
"protocol" text NOT NULL,
"startedAt" integer NOT NULL,
"endedAt" integer,
"bytesTx" integer,
"bytesRx" integer
);
`);
await db.execute(sql`
CREATE TABLE "siteProvisioningKeyOrg" (
"siteProvisioningKeyId" varchar(255) NOT NULL,
"orgId" varchar(255) NOT NULL,
CONSTRAINT "siteProvisioningKeyOrg_siteProvisioningKeyId_orgId_pk" PRIMARY KEY("siteProvisioningKeyId","orgId")
);
`);
await db.execute(sql`
CREATE TABLE "siteProvisioningKeys" (
"siteProvisioningKeyId" varchar(255) PRIMARY KEY NOT NULL,
"name" varchar(255) NOT NULL,
"siteProvisioningKeyHash" text NOT NULL,
"lastChars" varchar(4) NOT NULL,
"dateCreated" varchar(255) NOT NULL,
"lastUsed" varchar(255),
"maxBatchSize" integer,
"numUsed" integer DEFAULT 0 NOT NULL,
"validUntil" varchar(255)
);
`);
await db.execute(sql`
CREATE TABLE "userInviteRoles" (
"inviteId" varchar NOT NULL,
"roleId" integer NOT NULL,
CONSTRAINT "userInviteRoles_inviteId_roleId_pk" PRIMARY KEY("inviteId","roleId")
);
`);
await db.execute(sql`
CREATE TABLE "userOrgRoles" (
"userId" varchar NOT NULL,
@@ -31,12 +91,80 @@ export default async function migration() {
CONSTRAINT "userOrgRoles_userId_orgId_roleId_unique" UNIQUE("userId","orgId","roleId")
);
`);
await db.execute(sql`ALTER TABLE "userOrgs" DROP CONSTRAINT "userOrgs_roleId_roles_roleId_fk";`);
await db.execute(sql`ALTER TABLE "userOrgRoles" ADD CONSTRAINT "userOrgRoles_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;`);
await db.execute(sql`ALTER TABLE "userOrgRoles" ADD CONSTRAINT "userOrgRoles_orgId_orgs_orgId_fk" FOREIGN KEY ("orgId") REFERENCES "public"."orgs"("orgId") ON DELETE cascade ON UPDATE no action;`);
await db.execute(sql`ALTER TABLE "userOrgRoles" ADD CONSTRAINT "userOrgRoles_roleId_roles_roleId_fk" FOREIGN KEY ("roleId") REFERENCES "public"."roles"("roleId") ON DELETE cascade ON UPDATE no action;`);
await db.execute(
sql`ALTER TABLE "userOrgs" DROP CONSTRAINT "userOrgs_roleId_roles_roleId_fk";`
);
await db.execute(
sql`ALTER TABLE "userOrgRoles" ADD CONSTRAINT "userOrgRoles_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;`
);
await db.execute(
sql`ALTER TABLE "userOrgRoles" ADD CONSTRAINT "userOrgRoles_orgId_orgs_orgId_fk" FOREIGN KEY ("orgId") REFERENCES "public"."orgs"("orgId") ON DELETE cascade ON UPDATE no action;`
);
await db.execute(
sql`ALTER TABLE "userOrgRoles" ADD CONSTRAINT "userOrgRoles_roleId_roles_roleId_fk" FOREIGN KEY ("roleId") REFERENCES "public"."roles"("roleId") ON DELETE cascade ON UPDATE no action;`
);
await db.execute(sql`ALTER TABLE "userOrgs" DROP COLUMN "roleId";`);
await db.execute(
sql`ALTER TABLE "userInvites" DROP CONSTRAINT "userInvites_roleId_roles_roleId_fk";`
);
await db.execute(
sql`ALTER TABLE "accessAuditLog" ADD COLUMN "siteResourceId" integer;`
);
await db.execute(
sql`ALTER TABLE "clientSitesAssociationsCache" ADD COLUMN "isJitMode" boolean DEFAULT false NOT NULL;`
);
await db.execute(
sql`ALTER TABLE "domains" ADD COLUMN "errorMessage" text;`
);
await db.execute(
sql`ALTER TABLE "orgs" ADD COLUMN "settingsLogRetentionDaysConnection" integer DEFAULT 0 NOT NULL;`
);
await db.execute(
sql`ALTER TABLE "sites" ADD COLUMN "lastPing" integer;`
);
await db.execute(
sql`ALTER TABLE "user" ADD COLUMN "marketingEmailConsent" boolean DEFAULT false;`
);
await db.execute(sql`ALTER TABLE "user" ADD COLUMN "locale" varchar;`);
await db.execute(
sql`ALTER TABLE "connectionAuditLog" ADD CONSTRAINT "connectionAuditLog_siteResourceId_siteResources_siteResourceId_fk" FOREIGN KEY ("siteResourceId") REFERENCES "public"."siteResources"("siteResourceId") ON DELETE cascade ON UPDATE no action;`
);
await db.execute(
sql`ALTER TABLE "connectionAuditLog" ADD CONSTRAINT "connectionAuditLog_orgId_orgs_orgId_fk" FOREIGN KEY ("orgId") REFERENCES "public"."orgs"("orgId") ON DELETE cascade ON UPDATE no action;`
);
await db.execute(
sql`ALTER TABLE "connectionAuditLog" ADD CONSTRAINT "connectionAuditLog_siteId_sites_siteId_fk" FOREIGN KEY ("siteId") REFERENCES "public"."sites"("siteId") ON DELETE cascade ON UPDATE no action;`
);
await db.execute(
sql`ALTER TABLE "connectionAuditLog" ADD CONSTRAINT "connectionAuditLog_clientId_clients_clientId_fk" FOREIGN KEY ("clientId") REFERENCES "public"."clients"("clientId") ON DELETE cascade ON UPDATE no action;`
);
await db.execute(
sql`ALTER TABLE "connectionAuditLog" ADD CONSTRAINT "connectionAuditLog_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;`
);
await db.execute(
sql`ALTER TABLE "siteProvisioningKeyOrg" ADD CONSTRAINT "siteProvisioningKeyOrg_siteProvisioningKeyId_siteProvisioningKeys_siteProvisioningKeyId_fk" FOREIGN KEY ("siteProvisioningKeyId") REFERENCES "public"."siteProvisioningKeys"("siteProvisioningKeyId") ON DELETE cascade ON UPDATE no action;`
);
await db.execute(
sql`ALTER TABLE "siteProvisioningKeyOrg" ADD CONSTRAINT "siteProvisioningKeyOrg_orgId_orgs_orgId_fk" FOREIGN KEY ("orgId") REFERENCES "public"."orgs"("orgId") ON DELETE cascade ON UPDATE no action;`
);
await db.execute(
sql`ALTER TABLE "userInviteRoles" ADD CONSTRAINT "userInviteRoles_inviteId_userInvites_inviteId_fk" FOREIGN KEY ("inviteId") REFERENCES "public"."userInvites"("inviteId") ON DELETE cascade ON UPDATE no action;`
);
await db.execute(
sql`ALTER TABLE "userInviteRoles" ADD CONSTRAINT "userInviteRoles_roleId_roles_roleId_fk" FOREIGN KEY ("roleId") REFERENCES "public"."roles"("roleId") ON DELETE cascade ON UPDATE no action;`
);
await db.execute(
sql`CREATE INDEX "idx_accessAuditLog_startedAt" ON "connectionAuditLog" USING btree ("startedAt");`
);
await db.execute(
sql`CREATE INDEX "idx_accessAuditLog_org_startedAt" ON "connectionAuditLog" USING btree ("orgId","startedAt");`
);
await db.execute(
sql`CREATE INDEX "idx_accessAuditLog_siteResourceId" ON "connectionAuditLog" USING btree ("siteResourceId");`
);
await db.execute(sql`ALTER TABLE "userInvites" DROP COLUMN "roleId";`);
await db.execute(sql`COMMIT`);
console.log("Migrated database");
} catch (e) {
@@ -70,4 +198,4 @@ export default async function migration() {
}
console.log(`${version} migration complete`);
}
}

View File

@@ -25,6 +25,77 @@ export default async function migration() {
);
db.transaction(() => {
db.prepare(
`
CREATE TABLE 'bannedEmails' (
'email' text PRIMARY KEY NOT NULL
);
`
).run();
db.prepare(
`
CREATE TABLE 'bannedIps' (
'ip' text PRIMARY KEY NOT NULL
);
`
).run();
db.prepare(
`
CREATE TABLE 'connectionAuditLog' (
'id' integer PRIMARY KEY AUTOINCREMENT NOT NULL,
'sessionId' text NOT NULL,
'siteResourceId' integer,
'orgId' text,
'siteId' integer,
'clientId' integer,
'userId' text,
'sourceAddr' text NOT NULL,
'destAddr' text NOT NULL,
'protocol' text NOT NULL,
'startedAt' integer NOT NULL,
'endedAt' integer,
'bytesTx' integer,
'bytesRx' integer,
FOREIGN KEY ('siteResourceId') REFERENCES 'siteResources'('siteResourceId') ON UPDATE no action ON DELETE cascade,
FOREIGN KEY ('orgId') REFERENCES 'orgs'('orgId') ON UPDATE no action ON DELETE cascade,
FOREIGN KEY ('siteId') REFERENCES 'sites'('siteId') ON UPDATE no action ON DELETE cascade,
FOREIGN KEY ('clientId') REFERENCES 'clients'('clientId') ON UPDATE no action ON DELETE cascade,
FOREIGN KEY ('userId') REFERENCES 'user'('id') ON UPDATE no action ON DELETE cascade
);
`
).run();
db.prepare(`CREATE INDEX 'idx_accessAuditLog_startedAt' ON 'connectionAuditLog' ('startedAt');`).run();
db.prepare(`CREATE INDEX 'idx_accessAuditLog_org_startedAt' ON 'connectionAuditLog' ('orgId','startedAt');`).run();
db.prepare(`CREATE INDEX 'idx_accessAuditLog_siteResourceId' ON 'connectionAuditLog' ('siteResourceId');`).run();
db.prepare(
`
CREATE TABLE 'siteProvisioningKeyOrg' (
'siteProvisioningKeyId' text NOT NULL,
'orgId' text NOT NULL,
PRIMARY KEY('siteProvisioningKeyId', 'orgId'),
FOREIGN KEY ('siteProvisioningKeyId') REFERENCES 'siteProvisioningKeys'('siteProvisioningKeyId') ON UPDATE no action ON DELETE cascade,
FOREIGN KEY ('orgId') REFERENCES 'orgs'('orgId') ON UPDATE no action ON DELETE cascade
);
`
).run();
db.prepare(
`
CREATE TABLE 'siteProvisioningKeys' (
'siteProvisioningKeyId' text PRIMARY KEY NOT NULL,
'name' text NOT NULL,
'siteProvisioningKeyHash' text NOT NULL,
'lastChars' text NOT NULL,
'dateCreated' text NOT NULL,
'lastUsed' text,
'maxBatchSize' integer,
'numUsed' integer DEFAULT 0 NOT NULL,
'validUntil' text
);
`
).run();
db.prepare(
`
CREATE TABLE 'userOrgRoles' (
@@ -63,6 +134,52 @@ export default async function migration() {
db.prepare(
`ALTER TABLE '__new_userOrgs' RENAME TO 'userOrgs';`
).run();
db.prepare(
`
CREATE TABLE 'userInviteRoles' (
'inviteId' text NOT NULL,
'roleId' integer NOT NULL,
PRIMARY KEY('inviteId', 'roleId'),
FOREIGN KEY ('inviteId') REFERENCES 'userInvites'('inviteId') ON UPDATE no action ON DELETE cascade,
FOREIGN KEY ('roleId') REFERENCES 'roles'('roleId') ON UPDATE no action ON DELETE cascade
);
`
).run();
db.prepare(
`
CREATE TABLE '__new_userInvites' (
'inviteId' text PRIMARY KEY NOT NULL,
'orgId' text NOT NULL,
'email' text NOT NULL,
'expiresAt' integer NOT NULL,
'token' text NOT NULL,
FOREIGN KEY ('orgId') REFERENCES 'orgs'('orgId') ON UPDATE no action ON DELETE cascade
);
`
).run();
db.prepare(
`INSERT INTO '__new_userInvites'("inviteId", "orgId", "email", "expiresAt", "token") SELECT "inviteId", "orgId", "email", "expiresAt", "token" FROM 'userInvites';`
).run();
db.prepare(`DROP TABLE 'userInvites';`).run();
db.prepare(
`ALTER TABLE '__new_userInvites' RENAME TO 'userInvites';`
).run();
db.prepare(
`ALTER TABLE 'accessAuditLog' ADD 'siteResourceId' integer;`
).run();
db.prepare(
`ALTER TABLE 'clientSitesAssociationsCache' ADD 'isJitMode' integer DEFAULT false NOT NULL;`
).run();
db.prepare(`ALTER TABLE 'domains' ADD 'errorMessage' text;`).run();
db.prepare(
`ALTER TABLE 'orgs' ADD 'settingsLogRetentionDaysConnection' integer DEFAULT 0 NOT NULL;`
).run();
db.prepare(`ALTER TABLE 'sites' ADD 'lastPing' integer;`).run();
db.prepare(
`ALTER TABLE 'user' ADD 'marketingEmailConsent' integer DEFAULT false;`
).run();
db.prepare(`ALTER TABLE 'user' ADD 'locale' text;`).run();
})();
db.pragma("foreign_keys = ON");
@@ -93,4 +210,4 @@ export default async function migration() {
}
console.log(`${version} migration complete`);
}
}