Add drizzle indexes to match db

This commit is contained in:
Owen
2026-06-21 17:43:39 -04:00
parent ad3eddbc08
commit 42983a3add
2 changed files with 414 additions and 293 deletions

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(
loginPageId: serial("loginPageId").primaryKey(), "loginPage",
subdomain: varchar("subdomain"), {
fullDomain: varchar("fullDomain"), loginPageId: serial("loginPageId").primaryKey(),
exitNodeId: integer("exitNodeId").references(() => exitNodes.exitNodeId, { subdomain: varchar("subdomain"),
onDelete: "set null" fullDomain: varchar("fullDomain"),
}), exitNodeId: integer("exitNodeId").references(
domainId: varchar("domainId").references(() => domains.domainId, { () => exitNodes.exitNodeId,
onDelete: "set null" {
}) onDelete: "set null"
}); }
),
domainId: varchar("domainId").references(() => domains.domainId, {
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")

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,107 +82,130 @@ export const orgDomains = pgTable("orgDomains", {
.references(() => domains.domainId, { onDelete: "cascade" }) .references(() => domains.domainId, { onDelete: "cascade" })
}); });
export const sites = pgTable("sites", { export const sites = pgTable(
siteId: serial("siteId").primaryKey(), "sites",
orgId: varchar("orgId") {
.references(() => orgs.orgId, { siteId: serial("siteId").primaryKey(),
onDelete: "cascade" orgId: varchar("orgId")
}) .references(() => orgs.orgId, {
.notNull(), onDelete: "cascade"
niceId: varchar("niceId").notNull(), })
exitNodeId: integer("exitNode").references(() => exitNodes.exitNodeId, { .notNull(),
onDelete: "set null" niceId: varchar("niceId").notNull(),
}), exitNodeId: integer("exitNode").references(() => exitNodes.exitNodeId, {
name: varchar("name").notNull(), onDelete: "set null"
pubKey: varchar("pubKey"), }),
subnet: varchar("subnet"), name: varchar("name").notNull(),
megabytesIn: real("bytesIn").default(0), pubKey: varchar("pubKey"),
megabytesOut: real("bytesOut").default(0), subnet: varchar("subnet"),
lastBandwidthUpdate: varchar("lastBandwidthUpdate"), megabytesIn: real("bytesIn").default(0),
type: varchar("type").notNull(), // "newt" or "wireguard" megabytesOut: real("bytesOut").default(0),
online: boolean("online").notNull().default(false), lastBandwidthUpdate: varchar("lastBandwidthUpdate"),
lastPing: integer("lastPing"), type: varchar("type").notNull(), // "newt" or "wireguard"
address: varchar("address"), online: boolean("online").notNull().default(false),
endpoint: varchar("endpoint"), lastPing: integer("lastPing"),
publicKey: varchar("publicKey"), address: varchar("address"),
lastHolePunch: bigint("lastHolePunch", { mode: "number" }), endpoint: varchar("endpoint"),
listenPort: integer("listenPort"), publicKey: varchar("publicKey"),
dockerSocketEnabled: boolean("dockerSocketEnabled").notNull().default(true), lastHolePunch: bigint("lastHolePunch", { mode: "number" }),
autoUpdateEnabled: boolean("autoUpdateEnabled").notNull().default(false), listenPort: integer("listenPort"),
autoUpdateOverrideOrg: boolean("autoUpdateOverrideOrg") dockerSocketEnabled: boolean("dockerSocketEnabled")
.notNull() .notNull()
.default(false), .default(true),
status: varchar("status") autoUpdateEnabled: boolean("autoUpdateEnabled")
.$type<"pending" | "approved">() .notNull()
.default("approved") .default(false),
}); autoUpdateOverrideOrg: boolean("autoUpdateOverrideOrg")
.notNull()
.default(false),
status: varchar("status")
.$type<"pending" | "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(
resourceId: serial("resourceId").primaryKey(), "resources",
resourcePolicyId: integer("resourcePolicyId").references( {
() => resourcePolicies.resourcePolicyId, resourceId: serial("resourceId").primaryKey(),
{ onDelete: "set null" } resourcePolicyId: integer("resourcePolicyId").references(
), () => resourcePolicies.resourcePolicyId,
defaultResourcePolicyId: integer("defaultResourcePolicyId").references( { onDelete: "set null" }
() => resourcePolicies.resourcePolicyId, ),
{ defaultResourcePolicyId: integer("defaultResourcePolicyId").references(
onDelete: "restrict" () => resourcePolicies.resourcePolicyId,
} {
), onDelete: "restrict"
resourceGuid: varchar("resourceGuid", { length: 36 }) }
.unique() ),
.notNull() resourceGuid: varchar("resourceGuid", { length: 36 })
.$defaultFn(() => randomUUID()), .unique()
orgId: varchar("orgId") .notNull()
.references(() => orgs.orgId, { .$defaultFn(() => randomUUID()),
onDelete: "cascade" orgId: varchar("orgId")
}) .references(() => orgs.orgId, {
.notNull(), onDelete: "cascade"
niceId: text("niceId").notNull(), })
name: varchar("name").notNull(), .notNull(),
subdomain: varchar("subdomain"), niceId: text("niceId").notNull(),
fullDomain: varchar("fullDomain"), name: varchar("name").notNull(),
domainId: varchar("domainId").references(() => domains.domainId, { subdomain: varchar("subdomain"),
onDelete: "set null" fullDomain: varchar("fullDomain"),
}), domainId: varchar("domainId").references(() => domains.domainId, {
ssl: boolean("ssl").notNull().default(false), onDelete: "set null"
blockAccess: boolean("blockAccess").notNull().default(false), }),
proxyPort: integer("proxyPort"), ssl: boolean("ssl").notNull().default(false),
sso: boolean("sso"), blockAccess: boolean("blockAccess").notNull().default(false),
emailWhitelistEnabled: boolean("emailWhitelistEnabled"), proxyPort: integer("proxyPort"),
applyRules: boolean("applyRules"), sso: boolean("sso"),
enabled: boolean("enabled").notNull().default(true), emailWhitelistEnabled: boolean("emailWhitelistEnabled"),
stickySession: boolean("stickySession").notNull().default(false), applyRules: boolean("applyRules"),
tlsServerName: varchar("tlsServerName"), enabled: boolean("enabled").notNull().default(true),
setHostHeader: varchar("setHostHeader"), stickySession: boolean("stickySession").notNull().default(false),
enableProxy: boolean("enableProxy").default(true), tlsServerName: varchar("tlsServerName"),
skipToIdpId: integer("skipToIdpId").references(() => idp.idpId, { setHostHeader: varchar("setHostHeader"),
onDelete: "set null" enableProxy: boolean("enableProxy").default(true),
}), skipToIdpId: integer("skipToIdpId").references(() => idp.idpId, {
headers: text("headers"), // comma-separated list of headers to add to the request onDelete: "set null"
proxyProtocol: boolean("proxyProtocol").notNull().default(false), }),
proxyProtocolVersion: integer("proxyProtocolVersion").default(1), headers: text("headers"), // comma-separated list of headers to add to the request
maintenanceModeEnabled: boolean("maintenanceModeEnabled") proxyProtocol: boolean("proxyProtocol").notNull().default(false),
.notNull() proxyProtocolVersion: integer("proxyProtocolVersion").default(1),
.default(false), maintenanceModeEnabled: boolean("maintenanceModeEnabled")
maintenanceModeType: text("maintenanceModeType", { .notNull()
enum: ["forced", "automatic"] .default(false),
}).default("forced"), // "forced" = always show, "automatic" = only when down maintenanceModeType: text("maintenanceModeType", {
maintenanceTitle: text("maintenanceTitle"), enum: ["forced", "automatic"]
maintenanceMessage: text("maintenanceMessage"), }).default("forced"), // "forced" = always show, "automatic" = only when down
maintenanceEstimatedTime: text("maintenanceEstimatedTime"), maintenanceTitle: text("maintenanceTitle"),
postAuthPath: text("postAuthPath"), maintenanceMessage: text("maintenanceMessage"),
health: varchar("health").default("unknown"), // "healthy", "unhealthy", "unknown" maintenanceEstimatedTime: text("maintenanceEstimatedTime"),
wildcard: boolean("wildcard").notNull().default(false), postAuthPath: text("postAuthPath"),
mode: text("mode").default("http").notNull(), // rdp, ssh, http, vnc health: varchar("health").default("unknown"), // "healthy", "unhealthy", "unknown"
pamMode: varchar("pamMode", { length: 32 }) wildcard: boolean("wildcard").notNull().default(false),
.$type<"passthrough" | "push">() mode: text("mode").default("http").notNull(), // rdp, ssh, http, vnc
.default("passthrough"), pamMode: varchar("pamMode", { length: 32 })
authDaemonMode: varchar("authDaemonMode", { length: 32 }) .$type<"passthrough" | "push">()
.$type<"site" | "remote" | "native">() .default("passthrough"),
.default("site"), authDaemonMode: varchar("authDaemonMode", { length: 32 })
authDaemonPort: integer("authDaemonPort").default(22123) .$type<"site" | "remote" | "native">()
}); .default("site"),
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,71 +290,84 @@ 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(
targetId: serial("targetId").primaryKey(), "targets",
resourceId: integer("resourceId") {
.references(() => resources.resourceId, { targetId: serial("targetId").primaryKey(),
onDelete: "cascade" resourceId: integer("resourceId")
}) .references(() => resources.resourceId, {
.notNull(), onDelete: "cascade"
siteId: integer("siteId") })
.references(() => sites.siteId, { .notNull(),
onDelete: "cascade" siteId: integer("siteId")
}) .references(() => sites.siteId, {
.notNull(), onDelete: "cascade"
ip: varchar("ip").notNull(), })
method: varchar("method"), .notNull(),
port: integer("port").notNull(), ip: varchar("ip").notNull(),
internalPort: integer("internalPort"), method: varchar("method"),
enabled: boolean("enabled").notNull().default(true), port: integer("port").notNull(),
path: text("path"), internalPort: integer("internalPort"),
pathMatchType: text("pathMatchType"), // exact, prefix, regex enabled: boolean("enabled").notNull().default(true),
rewritePath: text("rewritePath"), // if set, rewrites the path to this value before sending to the target path: text("path"),
rewritePathType: text("rewritePathType"), // exact, prefix, regex, stripPrefix pathMatchType: text("pathMatchType"), // exact, prefix, regex
priority: integer("priority").notNull().default(100), rewritePath: text("rewritePath"), // if set, rewrites the path to this value before sending to the target
mode: varchar("mode") rewritePathType: text("rewritePathType"), // exact, prefix, regex, stripPrefix
.$type<"http" | "tcp" | "udp" | "ssh" | "rdp" | "vnc">() priority: integer("priority").notNull().default(100),
.notNull() mode: varchar("mode")
.default("http"), .$type<"http" | "tcp" | "udp" | "ssh" | "rdp" | "vnc">()
authToken: varchar("authToken") .notNull()
}); .default("http"),
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(
targetHealthCheckId: serial("targetHealthCheckId").primaryKey(), "targetHealthCheck",
targetId: integer("targetId").references(() => targets.targetId, { {
onDelete: "cascade" targetHealthCheckId: serial("targetHealthCheckId").primaryKey(),
}), targetId: integer("targetId").references(() => targets.targetId, {
orgId: varchar("orgId")
.references(() => orgs.orgId, {
onDelete: "cascade" onDelete: "cascade"
}) }),
.notNull(), orgId: varchar("orgId")
siteId: integer("siteId") .references(() => orgs.orgId, {
.references(() => sites.siteId, { onDelete: "cascade"
onDelete: "cascade" })
}) .notNull(),
.notNull(), siteId: integer("siteId")
name: varchar("name"), .references(() => sites.siteId, {
hcEnabled: boolean("hcEnabled").notNull().default(false), onDelete: "cascade"
hcPath: varchar("hcPath"), })
hcScheme: varchar("hcScheme"), .notNull(),
hcMode: varchar("hcMode").default("http"), name: varchar("name"),
hcHostname: varchar("hcHostname"), hcEnabled: boolean("hcEnabled").notNull().default(false),
hcPort: integer("hcPort"), hcPath: varchar("hcPath"),
hcInterval: integer("hcInterval").default(30), // in seconds hcScheme: varchar("hcScheme"),
hcUnhealthyInterval: integer("hcUnhealthyInterval").default(30), // in seconds hcMode: varchar("hcMode").default("http"),
hcTimeout: integer("hcTimeout").default(5), // in seconds hcHostname: varchar("hcHostname"),
hcHeaders: varchar("hcHeaders"), hcPort: integer("hcPort"),
hcFollowRedirects: boolean("hcFollowRedirects").default(true), hcInterval: integer("hcInterval").default(30), // in seconds
hcMethod: varchar("hcMethod").default("GET"), hcUnhealthyInterval: integer("hcUnhealthyInterval").default(30), // in seconds
hcStatus: integer("hcStatus"), // http code hcTimeout: integer("hcTimeout").default(5), // in seconds
hcHealth: text("hcHealth") hcHeaders: varchar("hcHeaders"),
.$type<"unknown" | "healthy" | "unhealthy">() hcFollowRedirects: boolean("hcFollowRedirects").default(true),
.default("unknown"), // "unknown", "healthy", "unhealthy" hcMethod: varchar("hcMethod").default("GET"),
hcTlsServerName: text("hcTlsServerName"), hcStatus: integer("hcStatus"), // http code
hcHealthyThreshold: integer("hcHealthyThreshold").default(1), hcHealth: text("hcHealth")
hcUnhealthyThreshold: integer("hcUnhealthyThreshold").default(1) .$type<"unknown" | "healthy" | "unhealthy">()
}); .default("unknown"), // "unknown", "healthy", "unhealthy"
hcTlsServerName: text("hcTlsServerName"),
hcHealthyThreshold: integer("hcHealthyThreshold").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,43 +442,74 @@ export const networks = pgTable("networks", {
.notNull() .notNull()
}); });
export const siteNetworks = pgTable("siteNetworks", { export const siteNetworks = pgTable(
siteId: integer("siteId") "siteNetworks",
.notNull() {
.references(() => sites.siteId, { siteId: integer("siteId")
onDelete: "cascade" .notNull()
}), .references(() => sites.siteId, {
networkId: integer("networkId") onDelete: "cascade"
.notNull() }),
.references(() => networks.networkId, { onDelete: "cascade" }) networkId: integer("networkId")
}); .notNull()
.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(
clientId: integer("clientId") "clientSiteResources",
.notNull() {
.references(() => clients.clientId, { onDelete: "cascade" }), clientId: integer("clientId")
siteResourceId: integer("siteResourceId") .notNull()
.notNull() .references(() => clients.clientId, { onDelete: "cascade" }),
.references(() => siteResources.siteResourceId, { onDelete: "cascade" }) siteResourceId: integer("siteResourceId")
}); .notNull()
.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(
roleId: integer("roleId") "roleSiteResources",
.notNull() {
.references(() => roles.roleId, { onDelete: "cascade" }), roleId: integer("roleId")
siteResourceId: integer("siteResourceId") .notNull()
.notNull() .references(() => roles.roleId, { onDelete: "cascade" }),
.references(() => siteResources.siteResourceId, { onDelete: "cascade" }) siteResourceId: integer("siteResourceId")
}); .notNull()
.references(() => siteResources.siteResourceId, {
onDelete: "cascade"
})
},
(t) => [index("idx_rolesiteresources_siteresourceid").on(t.siteResourceId)]
);
export const userSiteResources = pgTable("userSiteResources", { export const userSiteResources = pgTable(
userId: varchar("userId") "userSiteResources",
.notNull() {
.references(() => users.userId, { onDelete: "cascade" }), userId: varchar("userId")
siteResourceId: integer("siteResourceId") .notNull()
.notNull() .references(() => users.userId, { onDelete: "cascade" }),
.references(() => siteResources.siteResourceId, { onDelete: "cascade" }) siteResourceId: integer("siteResourceId")
}); .notNull()
.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,15 +534,19 @@ export const users = pgTable("user", {
locale: varchar("locale") locale: varchar("locale")
}); });
export const newts = pgTable("newt", { export const newts = pgTable(
newtId: varchar("id").primaryKey(), "newt",
secretHash: varchar("secretHash").notNull(), {
dateCreated: varchar("dateCreated").notNull(), newtId: varchar("id").primaryKey(),
version: varchar("version"), secretHash: varchar("secretHash").notNull(),
siteId: integer("siteId").references(() => sites.siteId, { dateCreated: varchar("dateCreated").notNull(),
onDelete: "cascade" version: varchar("version"),
}) siteId: integer("siteId").references(() => sites.siteId, {
}); 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,29 +647,49 @@ 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(
roleId: integer("roleId") "roleActions",
.notNull() {
.references(() => roles.roleId, { onDelete: "cascade" }), roleId: integer("roleId")
actionId: varchar("actionId") .notNull()
.notNull() .references(() => roles.roleId, { onDelete: "cascade" }),
.references(() => actions.actionId, { onDelete: "cascade" }), actionId: varchar("actionId")
orgId: varchar("orgId") .notNull()
.notNull() .references(() => actions.actionId, { onDelete: "cascade" }),
.references(() => orgs.orgId, { onDelete: "cascade" }) orgId: varchar("orgId")
}); .notNull()
.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(
userId: varchar("userId") "userActions",
.notNull() {
.references(() => users.userId, { onDelete: "cascade" }), userId: varchar("userId")
actionId: varchar("actionId") .notNull()
.notNull() .references(() => users.userId, { onDelete: "cascade" }),
.references(() => actions.actionId, { onDelete: "cascade" }), actionId: varchar("actionId")
orgId: varchar("orgId") .notNull()
.notNull() .references(() => actions.actionId, { onDelete: "cascade" }),
.references(() => orgs.orgId, { onDelete: "cascade" }) orgId: varchar("orgId")
}); .notNull()
.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,40 +1095,44 @@ export const idpOrg = pgTable("idpOrg", {
orgMapping: varchar("orgMapping") orgMapping: varchar("orgMapping")
}); });
export const clients = pgTable("clients", { export const clients = pgTable(
clientId: serial("clientId").primaryKey(), "clients",
orgId: varchar("orgId") {
.references(() => orgs.orgId, { clientId: serial("clientId").primaryKey(),
orgId: varchar("orgId")
.references(() => orgs.orgId, {
onDelete: "cascade"
})
.notNull(),
exitNodeId: integer("exitNode").references(() => exitNodes.exitNodeId, {
onDelete: "set null"
}),
userId: text("userId").references(() => users.userId, {
// optionally tied to a user and in this case delete when the user deletes
onDelete: "cascade" onDelete: "cascade"
}) }),
.notNull(), niceId: varchar("niceId").notNull(),
exitNodeId: integer("exitNode").references(() => exitNodes.exitNodeId, { olmId: text("olmId"), // to lock it to a specific olm optionally
onDelete: "set null" name: varchar("name").notNull(),
}), pubKey: varchar("pubKey"),
userId: text("userId").references(() => users.userId, { subnet: varchar("subnet").notNull(),
// optionally tied to a user and in this case delete when the user deletes megabytesIn: real("bytesIn"),
onDelete: "cascade" megabytesOut: real("bytesOut"),
}), lastBandwidthUpdate: varchar("lastBandwidthUpdate"),
niceId: varchar("niceId").notNull(), lastPing: integer("lastPing"),
olmId: text("olmId"), // to lock it to a specific olm optionally type: varchar("type").notNull(), // "olm"
name: varchar("name").notNull(), online: boolean("online").notNull().default(false),
pubKey: varchar("pubKey"), // endpoint: varchar("endpoint"),
subnet: varchar("subnet").notNull(), lastHolePunch: integer("lastHolePunch"),
megabytesIn: real("bytesIn"), maxConnections: integer("maxConnections"),
megabytesOut: real("bytesOut"), archived: boolean("archived").notNull().default(false),
lastBandwidthUpdate: varchar("lastBandwidthUpdate"), blocked: boolean("blocked").notNull().default(false),
lastPing: integer("lastPing"), approvalState: varchar("approvalState").$type<
type: varchar("type").notNull(), // "olm" "pending" | "approved" | "denied"
online: boolean("online").notNull().default(false), >()
// endpoint: varchar("endpoint"), },
lastHolePunch: integer("lastHolePunch"), (t) => [index("idx_clients_userid").on(t.userId)]
maxConnections: integer("maxConnections"), );
archived: boolean("archived").notNull().default(false),
blocked: boolean("blocked").notNull().default(false),
approvalState: varchar("approvalState").$type<
"pending" | "approved" | "denied"
>()
});
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,23 +1177,27 @@ export const clientPostureSnapshots = pgTable("clientPostureSnapshots", {
collectedAt: integer("collectedAt").notNull() collectedAt: integer("collectedAt").notNull()
}); });
export const olms = pgTable("olms", { export const olms = pgTable(
olmId: varchar("id").primaryKey(), "olms",
secretHash: varchar("secretHash").notNull(), {
dateCreated: varchar("dateCreated").notNull(), olmId: varchar("id").primaryKey(),
version: text("version"), secretHash: varchar("secretHash").notNull(),
agent: text("agent"), dateCreated: varchar("dateCreated").notNull(),
name: varchar("name"), version: text("version"),
clientId: integer("clientId").references(() => clients.clientId, { agent: text("agent"),
// we will switch this depending on the current org it wants to connect to name: varchar("name"),
onDelete: "set null" clientId: integer("clientId").references(() => clients.clientId, {
}), // we will switch this depending on the current org it wants to connect to
userId: text("userId").references(() => users.userId, { onDelete: "set null"
// optionally tied to a user and in this case delete when the user deletes }),
onDelete: "cascade" userId: text("userId").references(() => users.userId, {
}), // optionally tied to a user and in this case delete when the user deletes
archived: boolean("archived").notNull().default(false) onDelete: "cascade"
}); }),
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(),