Add drizzle indexes to match db

This commit is contained in:
Owen
2026-06-21 17:43:39 -04:00
parent 604dee9aa5
commit 60c1b572ba
2 changed files with 414 additions and 293 deletions
+16 -5
View File
@@ -11,7 +11,7 @@ import {
primaryKey, primaryKey,
uniqueIndex uniqueIndex
} from "drizzle-orm/pg-core"; } from "drizzle-orm/pg-core";
import { InferSelectModel } from "drizzle-orm"; import { InferSelectModel, sql } from "drizzle-orm";
import { import {
domains, domains,
orgs, orgs,
@@ -207,17 +207,28 @@ export const remoteExitNodeSessions = pgTable("remoteExitNodeSession", {
expiresAt: bigint("expiresAt", { mode: "number" }).notNull() expiresAt: bigint("expiresAt", { mode: "number" }).notNull()
}); });
export const loginPage = pgTable("loginPage", { export const loginPage = pgTable(
"loginPage",
{
loginPageId: serial("loginPageId").primaryKey(), loginPageId: serial("loginPageId").primaryKey(),
subdomain: varchar("subdomain"), subdomain: varchar("subdomain"),
fullDomain: varchar("fullDomain"), fullDomain: varchar("fullDomain"),
exitNodeId: integer("exitNodeId").references(() => exitNodes.exitNodeId, { exitNodeId: integer("exitNodeId").references(
() => exitNodes.exitNodeId,
{
onDelete: "set null" onDelete: "set null"
}), }
),
domainId: varchar("domainId").references(() => domains.domainId, { domainId: varchar("domainId").references(() => domains.domainId, {
onDelete: "set null" onDelete: "set null"
}) })
}); },
(t) => [
index("idx_loginpage_fulldomain")
.on(t.fullDomain)
.where(sql`${t.fullDomain} IS NOT NULL`)
]
);
export const loginPageOrg = pgTable("loginPageOrg", { export const loginPageOrg = pgTable("loginPageOrg", {
loginPageId: integer("loginPageId") loginPageId: integer("loginPageId")
+144 -34
View File
@@ -1,5 +1,5 @@
import { randomUUID } from "crypto"; import { randomUUID } from "crypto";
import { InferSelectModel } from "drizzle-orm"; import { InferSelectModel, sql } from "drizzle-orm";
import { import {
bigint, bigint,
boolean, boolean,
@@ -82,7 +82,9 @@ export const orgDomains = pgTable("orgDomains", {
.references(() => domains.domainId, { onDelete: "cascade" }) .references(() => domains.domainId, { onDelete: "cascade" })
}); });
export const sites = pgTable("sites", { export const sites = pgTable(
"sites",
{
siteId: serial("siteId").primaryKey(), siteId: serial("siteId").primaryKey(),
orgId: varchar("orgId") orgId: varchar("orgId")
.references(() => orgs.orgId, { .references(() => orgs.orgId, {
@@ -107,17 +109,32 @@ export const sites = pgTable("sites", {
publicKey: varchar("publicKey"), publicKey: varchar("publicKey"),
lastHolePunch: bigint("lastHolePunch", { mode: "number" }), lastHolePunch: bigint("lastHolePunch", { mode: "number" }),
listenPort: integer("listenPort"), listenPort: integer("listenPort"),
dockerSocketEnabled: boolean("dockerSocketEnabled").notNull().default(true), dockerSocketEnabled: boolean("dockerSocketEnabled")
autoUpdateEnabled: boolean("autoUpdateEnabled").notNull().default(false), .notNull()
.default(true),
autoUpdateEnabled: boolean("autoUpdateEnabled")
.notNull()
.default(false),
autoUpdateOverrideOrg: boolean("autoUpdateOverrideOrg") autoUpdateOverrideOrg: boolean("autoUpdateOverrideOrg")
.notNull() .notNull()
.default(false), .default(false),
status: varchar("status") status: varchar("status")
.$type<"pending" | "approved">() .$type<"pending" | "approved">()
.default("approved") .default("approved")
}); },
(t) => [
index("idx_sites_exitnodeid").on(t.exitNodeId),
index("idx_sites_exitnode_type_siteid").on(
t.exitNodeId,
t.type,
t.siteId
)
]
);
export const resources = pgTable("resources", { export const resources = pgTable(
"resources",
{
resourceId: serial("resourceId").primaryKey(), resourceId: serial("resourceId").primaryKey(),
resourcePolicyId: integer("resourcePolicyId").references( resourcePolicyId: integer("resourcePolicyId").references(
() => resourcePolicies.resourcePolicyId, () => resourcePolicies.resourcePolicyId,
@@ -182,7 +199,13 @@ export const resources = pgTable("resources", {
.$type<"site" | "remote" | "native">() .$type<"site" | "remote" | "native">()
.default("site"), .default("site"),
authDaemonPort: integer("authDaemonPort").default(22123) authDaemonPort: integer("authDaemonPort").default(22123)
}); },
(t) => [
index("idx_resources_fulldomain")
.on(t.fullDomain)
.where(sql`${t.fullDomain} IS NOT NULL`)
]
);
export const labels = pgTable("labels", { export const labels = pgTable("labels", {
labelId: serial("labelId").primaryKey(), labelId: serial("labelId").primaryKey(),
@@ -267,7 +290,9 @@ export const clientLabels = pgTable(
(t) => [unique("client_label_uniq").on(t.clientId, t.labelId)] (t) => [unique("client_label_uniq").on(t.clientId, t.labelId)]
); );
export const targets = pgTable("targets", { export const targets = pgTable(
"targets",
{
targetId: serial("targetId").primaryKey(), targetId: serial("targetId").primaryKey(),
resourceId: integer("resourceId") resourceId: integer("resourceId")
.references(() => resources.resourceId, { .references(() => resources.resourceId, {
@@ -294,9 +319,18 @@ export const targets = pgTable("targets", {
.notNull() .notNull()
.default("http"), .default("http"),
authToken: varchar("authToken") authToken: varchar("authToken")
}); },
(t) => [
index("idx_targets_resourceid_siteid").on(t.resourceId, t.siteId),
index("idx_targets_site_enabled_priority_target_resource")
.on(t.siteId, t.priority.desc(), t.targetId, t.resourceId)
.where(sql`${t.enabled} = true`)
]
);
export const targetHealthCheck = pgTable("targetHealthCheck", { export const targetHealthCheck = pgTable(
"targetHealthCheck",
{
targetHealthCheckId: serial("targetHealthCheckId").primaryKey(), targetHealthCheckId: serial("targetHealthCheckId").primaryKey(),
targetId: integer("targetId").references(() => targets.targetId, { targetId: integer("targetId").references(() => targets.targetId, {
onDelete: "cascade" onDelete: "cascade"
@@ -331,7 +365,9 @@ export const targetHealthCheck = pgTable("targetHealthCheck", {
hcTlsServerName: text("hcTlsServerName"), hcTlsServerName: text("hcTlsServerName"),
hcHealthyThreshold: integer("hcHealthyThreshold").default(1), hcHealthyThreshold: integer("hcHealthyThreshold").default(1),
hcUnhealthyThreshold: integer("hcUnhealthyThreshold").default(1) hcUnhealthyThreshold: integer("hcUnhealthyThreshold").default(1)
}); },
(t) => [index("idx_targethealthcheck_targetid").on(t.targetId)]
);
export const exitNodes = pgTable("exitNodes", { export const exitNodes = pgTable("exitNodes", {
exitNodeId: serial("exitNodeId").primaryKey(), exitNodeId: serial("exitNodeId").primaryKey(),
@@ -406,7 +442,9 @@ export const networks = pgTable("networks", {
.notNull() .notNull()
}); });
export const siteNetworks = pgTable("siteNetworks", { export const siteNetworks = pgTable(
"siteNetworks",
{
siteId: integer("siteId") siteId: integer("siteId")
.notNull() .notNull()
.references(() => sites.siteId, { .references(() => sites.siteId, {
@@ -415,34 +453,63 @@ export const siteNetworks = pgTable("siteNetworks", {
networkId: integer("networkId") networkId: integer("networkId")
.notNull() .notNull()
.references(() => networks.networkId, { onDelete: "cascade" }) .references(() => networks.networkId, { onDelete: "cascade" })
}); },
(t) => [
index("idx_sitenetworks_siteid").on(t.siteId),
index("idx_sitenetworks_networkid").on(t.networkId)
]
);
export const clientSiteResources = pgTable("clientSiteResources", { export const clientSiteResources = pgTable(
"clientSiteResources",
{
clientId: integer("clientId") clientId: integer("clientId")
.notNull() .notNull()
.references(() => clients.clientId, { onDelete: "cascade" }), .references(() => clients.clientId, { onDelete: "cascade" }),
siteResourceId: integer("siteResourceId") siteResourceId: integer("siteResourceId")
.notNull() .notNull()
.references(() => siteResources.siteResourceId, { onDelete: "cascade" }) .references(() => siteResources.siteResourceId, {
}); onDelete: "cascade"
})
},
(t) => [
index("idx_clientsiteresources_clientid").on(t.clientId),
index("idx_clientsiteresources_siteresourceid").on(t.siteResourceId)
]
);
export const roleSiteResources = pgTable("roleSiteResources", { export const roleSiteResources = pgTable(
"roleSiteResources",
{
roleId: integer("roleId") roleId: integer("roleId")
.notNull() .notNull()
.references(() => roles.roleId, { onDelete: "cascade" }), .references(() => roles.roleId, { onDelete: "cascade" }),
siteResourceId: integer("siteResourceId") siteResourceId: integer("siteResourceId")
.notNull() .notNull()
.references(() => siteResources.siteResourceId, { onDelete: "cascade" }) .references(() => siteResources.siteResourceId, {
}); onDelete: "cascade"
})
},
(t) => [index("idx_rolesiteresources_siteresourceid").on(t.siteResourceId)]
);
export const userSiteResources = pgTable("userSiteResources", { export const userSiteResources = pgTable(
"userSiteResources",
{
userId: varchar("userId") userId: varchar("userId")
.notNull() .notNull()
.references(() => users.userId, { onDelete: "cascade" }), .references(() => users.userId, { onDelete: "cascade" }),
siteResourceId: integer("siteResourceId") siteResourceId: integer("siteResourceId")
.notNull() .notNull()
.references(() => siteResources.siteResourceId, { onDelete: "cascade" }) .references(() => siteResources.siteResourceId, {
}); onDelete: "cascade"
})
},
(t) => [
index("idx_usersiteresources_userid").on(t.userId),
index("idx_usersiteresources_siteresourceid").on(t.siteResourceId)
]
);
export const users = pgTable("user", { export const users = pgTable("user", {
userId: varchar("id").primaryKey(), userId: varchar("id").primaryKey(),
@@ -467,7 +534,9 @@ export const users = pgTable("user", {
locale: varchar("locale") locale: varchar("locale")
}); });
export const newts = pgTable("newt", { export const newts = pgTable(
"newt",
{
newtId: varchar("id").primaryKey(), newtId: varchar("id").primaryKey(),
secretHash: varchar("secretHash").notNull(), secretHash: varchar("secretHash").notNull(),
dateCreated: varchar("dateCreated").notNull(), dateCreated: varchar("dateCreated").notNull(),
@@ -475,7 +544,9 @@ export const newts = pgTable("newt", {
siteId: integer("siteId").references(() => sites.siteId, { siteId: integer("siteId").references(() => sites.siteId, {
onDelete: "cascade" onDelete: "cascade"
}) })
}); },
(t) => [index("idx_newt_siteid").on(t.siteId)]
);
export const twoFactorBackupCodes = pgTable("twoFactorBackupCodes", { export const twoFactorBackupCodes = pgTable("twoFactorBackupCodes", {
codeId: serial("id").primaryKey(), codeId: serial("id").primaryKey(),
@@ -576,7 +647,9 @@ export const userOrgRoles = pgTable(
(t) => [unique().on(t.userId, t.orgId, t.roleId)] (t) => [unique().on(t.userId, t.orgId, t.roleId)]
); );
export const roleActions = pgTable("roleActions", { export const roleActions = pgTable(
"roleActions",
{
roleId: integer("roleId") roleId: integer("roleId")
.notNull() .notNull()
.references(() => roles.roleId, { onDelete: "cascade" }), .references(() => roles.roleId, { onDelete: "cascade" }),
@@ -586,9 +659,19 @@ export const roleActions = pgTable("roleActions", {
orgId: varchar("orgId") orgId: varchar("orgId")
.notNull() .notNull()
.references(() => orgs.orgId, { onDelete: "cascade" }) .references(() => orgs.orgId, { onDelete: "cascade" })
}); },
(t) => [
index("idx_roleActions_roleId_orgId_actionId").on(
t.roleId,
t.orgId,
t.actionId
)
]
);
export const userActions = pgTable("userActions", { export const userActions = pgTable(
"userActions",
{
userId: varchar("userId") userId: varchar("userId")
.notNull() .notNull()
.references(() => users.userId, { onDelete: "cascade" }), .references(() => users.userId, { onDelete: "cascade" }),
@@ -598,7 +681,15 @@ export const userActions = pgTable("userActions", {
orgId: varchar("orgId") orgId: varchar("orgId")
.notNull() .notNull()
.references(() => orgs.orgId, { onDelete: "cascade" }) .references(() => orgs.orgId, { onDelete: "cascade" })
}); },
(t) => [
index("idx_userActions_userId_orgId_actionId").on(
t.userId,
t.orgId,
t.actionId
)
]
);
export const roleSites = pgTable("roleSites", { export const roleSites = pgTable("roleSites", {
roleId: integer("roleId") roleId: integer("roleId")
@@ -1004,7 +1095,9 @@ export const idpOrg = pgTable("idpOrg", {
orgMapping: varchar("orgMapping") orgMapping: varchar("orgMapping")
}); });
export const clients = pgTable("clients", { export const clients = pgTable(
"clients",
{
clientId: serial("clientId").primaryKey(), clientId: serial("clientId").primaryKey(),
orgId: varchar("orgId") orgId: varchar("orgId")
.references(() => orgs.orgId, { .references(() => orgs.orgId, {
@@ -1037,7 +1130,9 @@ export const clients = pgTable("clients", {
approvalState: varchar("approvalState").$type< approvalState: varchar("approvalState").$type<
"pending" | "approved" | "denied" "pending" | "approved" | "denied"
>() >()
}); },
(t) => [index("idx_clients_userid").on(t.userId)]
);
export const clientSitesAssociationsCache = pgTable( export const clientSitesAssociationsCache = pgTable(
"clientSitesAssociationsCache", "clientSitesAssociationsCache",
@@ -1049,7 +1144,11 @@ export const clientSitesAssociationsCache = pgTable(
isJitMode: boolean("isJitMode").notNull().default(false), isJitMode: boolean("isJitMode").notNull().default(false),
endpoint: varchar("endpoint"), endpoint: varchar("endpoint"),
publicKey: varchar("publicKey") // this will act as the session's public key for hole punching so we can track when it changes publicKey: varchar("publicKey") // this will act as the session's public key for hole punching so we can track when it changes
} },
(t) => [
primaryKey({ columns: [t.clientId, t.siteId] }),
index("idx_clientsitesassociationscache_siteid").on(t.siteId)
]
); );
export const clientSiteResourcesAssociationsCache = pgTable( export const clientSiteResourcesAssociationsCache = pgTable(
@@ -1058,7 +1157,14 @@ export const clientSiteResourcesAssociationsCache = pgTable(
clientId: integer("clientId") // not a foreign key here so after its deleted the rebuild function can delete it and send the message clientId: integer("clientId") // not a foreign key here so after its deleted the rebuild function can delete it and send the message
.notNull(), .notNull(),
siteResourceId: integer("siteResourceId").notNull() siteResourceId: integer("siteResourceId").notNull()
} },
(t) => [
primaryKey({ columns: [t.clientId, t.siteResourceId] }),
index("idx_clientSiteResourcesAssociationsCache_siteResourceId").on(
t.siteResourceId,
t.clientId
)
]
); );
export const clientPostureSnapshots = pgTable("clientPostureSnapshots", { export const clientPostureSnapshots = pgTable("clientPostureSnapshots", {
@@ -1071,7 +1177,9 @@ export const clientPostureSnapshots = pgTable("clientPostureSnapshots", {
collectedAt: integer("collectedAt").notNull() collectedAt: integer("collectedAt").notNull()
}); });
export const olms = pgTable("olms", { export const olms = pgTable(
"olms",
{
olmId: varchar("id").primaryKey(), olmId: varchar("id").primaryKey(),
secretHash: varchar("secretHash").notNull(), secretHash: varchar("secretHash").notNull(),
dateCreated: varchar("dateCreated").notNull(), dateCreated: varchar("dateCreated").notNull(),
@@ -1087,7 +1195,9 @@ export const olms = pgTable("olms", {
onDelete: "cascade" onDelete: "cascade"
}), }),
archived: boolean("archived").notNull().default(false) archived: boolean("archived").notNull().default(false)
}); },
(t) => [index("idx_olms_clientid").on(t.clientId)]
);
export const currentFingerprint = pgTable("currentFingerprint", { export const currentFingerprint = pgTable("currentFingerprint", {
fingerprintId: serial("id").primaryKey(), fingerprintId: serial("id").primaryKey(),