Remove siteSiteResources

This commit is contained in:
Owen
2026-03-19 21:44:59 -07:00
parent 6f2e37948c
commit 2093bb5357
6 changed files with 87 additions and 48 deletions

View File

@@ -249,8 +249,8 @@ export const siteResources = pgTable("siteResources", {
export const networks = pgTable("networks", { export const networks = pgTable("networks", {
networkId: serial("networkId").primaryKey(), networkId: serial("networkId").primaryKey(),
niceId: text("niceId").notNull(), niceId: text("niceId"),
name: text("name").notNull(), name: text("name"),
scope: varchar("scope") scope: varchar("scope")
.$type<"global" | "resource">() .$type<"global" | "resource">()
.notNull() .notNull()

View File

@@ -275,8 +275,8 @@ export const siteResources = sqliteTable("siteResources", {
export const networks = sqliteTable("networks", { export const networks = sqliteTable("networks", {
networkId: integer("networkId").primaryKey({ autoIncrement: true }), networkId: integer("networkId").primaryKey({ autoIncrement: true }),
niceId: text("niceId").notNull(), niceId: text("niceId"),
name: text("name").notNull(), name: text("name"),
scope: text("scope") scope: text("scope")
.$type<"global" | "resource">() .$type<"global" | "resource">()
.notNull() .notNull()

View File

@@ -5,12 +5,13 @@ import {
roleSiteResources, roleSiteResources,
Site, Site,
SiteResource, SiteResource,
siteNetworks,
siteResources, siteResources,
siteSiteResources,
Transaction, Transaction,
userOrgs, userOrgs,
users, users,
userSiteResources userSiteResources,
networks
} from "@server/db"; } from "@server/db";
import { sites } from "@server/db"; import { sites } from "@server/db";
import { eq, and, ne, inArray, or } from "drizzle-orm"; import { eq, and, ne, inArray, or } from "drizzle-orm";
@@ -47,17 +48,12 @@ export async function updateClientResources(
) )
.limit(1); .limit(1);
const existingSiteIds = await trx const existingSiteIds = existingResource?.networkId
.select({ siteId: sites.siteId }) ? await trx
.from(siteSiteResources) .select({ siteId: sites.siteId })
.where( .from(siteNetworks)
and( .where(eq(siteNetworks.networkId, existingResource.networkId))
eq( : [];
siteSiteResources.siteResourceId,
existingResource.siteResourceId
)
)
);
let allSites: { siteId: number }[] = []; let allSites: { siteId: number }[] = [];
if (resourceData.site) { if (resourceData.site) {
@@ -144,15 +140,19 @@ export async function updateClientResources(
const siteResourceId = existingResource.siteResourceId; const siteResourceId = existingResource.siteResourceId;
const orgId = existingResource.orgId; const orgId = existingResource.orgId;
await trx if (updatedResource.networkId) {
.delete(siteSiteResources) await trx
.where(eq(siteSiteResources.siteResourceId, siteResourceId)); .delete(siteNetworks)
.where(
eq(siteNetworks.networkId, updatedResource.networkId)
);
for (const site of allSites) { for (const site of allSites) {
await trx.insert(siteSiteResources).values({ await trx.insert(siteNetworks).values({
siteId: site.siteId, siteId: site.siteId,
siteResourceId: siteResourceId networkId: updatedResource.networkId
}); });
}
} }
await trx await trx
@@ -268,12 +268,21 @@ export async function updateClientResources(
aliasAddress = await getNextAvailableAliasAddress(orgId); aliasAddress = await getNextAvailableAliasAddress(orgId);
} }
const [network] = await trx
.insert(networks)
.values({
scope: "resource",
orgId: orgId
})
.returning();
// Create new resource // Create new resource
const [newResource] = await trx const [newResource] = await trx
.insert(siteResources) .insert(siteResources)
.values({ .values({
orgId: orgId, orgId: orgId,
niceId: resourceNiceId, niceId: resourceNiceId,
networkId: network.networkId,
name: resourceData.name || resourceNiceId, name: resourceData.name || resourceNiceId,
mode: resourceData.mode, mode: resourceData.mode,
destination: resourceData.destination, destination: resourceData.destination,
@@ -290,9 +299,9 @@ export async function updateClientResources(
const siteResourceId = newResource.siteResourceId; const siteResourceId = newResource.siteResourceId;
for (const site of allSites) { for (const site of allSites) {
await trx.insert(siteSiteResources).values({ await trx.insert(siteNetworks).values({
siteId: site.siteId, siteId: site.siteId,
siteResourceId: siteResourceId networkId: network.networkId
}); });
} }

View File

@@ -5,10 +5,11 @@ import {
orgs, orgs,
roles, roles,
roleSiteResources, roleSiteResources,
siteNetworks,
networks,
SiteResource, SiteResource,
siteResources, siteResources,
sites, sites,
siteSiteResources,
userSiteResources userSiteResources
} from "@server/db"; } from "@server/db";
import { getUniqueSiteResourceName } from "@server/db/names"; import { getUniqueSiteResourceName } from "@server/db/names";
@@ -186,7 +187,9 @@ export async function createSiteResource(
.limit(1); .limit(1);
if (sitesToAssign.length !== siteIds.length) { if (sitesToAssign.length !== siteIds.length) {
return next(createHttpError(HttpCode.NOT_FOUND, "Some site not found")); return next(
createHttpError(HttpCode.NOT_FOUND, "Some site not found")
);
} }
const [org] = await db const [org] = await db
@@ -288,11 +291,29 @@ export async function createSiteResource(
let newSiteResource: SiteResource | undefined; let newSiteResource: SiteResource | undefined;
await db.transaction(async (trx) => { await db.transaction(async (trx) => {
const [network] = await trx
.insert(networks)
.values({
scope: "resource",
orgId: orgId
})
.returning();
if (!network) {
return next(
createHttpError(
HttpCode.INTERNAL_SERVER_ERROR,
`Failed to create network`
)
);
}
// Create the site resource // Create the site resource
const insertValues: typeof siteResources.$inferInsert = { const insertValues: typeof siteResources.$inferInsert = {
niceId, niceId,
orgId, orgId,
name, name,
networkId: network.networkId,
mode: mode as "host" | "cidr", mode: mode as "host" | "cidr",
destination, destination,
enabled, enabled,
@@ -318,9 +339,9 @@ export async function createSiteResource(
//////////////////// update the associations //////////////////// //////////////////// update the associations ////////////////////
for (const siteId of siteIds) { for (const siteId of siteIds) {
await trx.insert(siteSiteResources).values({ await trx.insert(siteNetworks).values({
siteId: siteId, siteId: siteId,
siteResourceId: siteResourceId networkId: network.networkId
}); });
} }
@@ -383,7 +404,6 @@ export async function createSiteResource(
} }
} }
await rebuildClientAssociationsFromSiteResource( await rebuildClientAssociationsFromSiteResource(
newSiteResource, newSiteResource,
trx trx

View File

@@ -1,4 +1,4 @@
import { db, SiteResource, siteResources, sites, siteSiteResources } from "@server/db"; import { db, SiteResource, siteNetworks, siteResources, sites } from "@server/db";
import response from "@server/lib/response"; import response from "@server/lib/response";
import logger from "@server/logger"; import logger from "@server/logger";
import { OpenAPITags, registry } from "@server/openApi"; import { OpenAPITags, registry } from "@server/openApi";
@@ -99,13 +99,15 @@ function querySiteResourcesBase() {
disableIcmp: siteResources.disableIcmp, disableIcmp: siteResources.disableIcmp,
authDaemonMode: siteResources.authDaemonMode, authDaemonMode: siteResources.authDaemonMode,
authDaemonPort: siteResources.authDaemonPort, authDaemonPort: siteResources.authDaemonPort,
networkId: siteResources.networkId,
defaultNetworkId: siteResources.defaultNetworkId,
siteNames: sql<string[]>`array_agg(${sites.name})`, siteNames: sql<string[]>`array_agg(${sites.name})`,
siteNiceIds: sql<string[]>`array_agg(${sites.niceId})`, siteNiceIds: sql<string[]>`array_agg(${sites.niceId})`,
siteAddresses: sql<(string | null)[]>`array_agg(${sites.address})` siteAddresses: sql<(string | null)[]>`array_agg(${sites.address})`
}) })
.from(siteResources) .from(siteResources)
.innerJoin(siteSiteResources, eq(siteResources.siteResourceId, siteSiteResources.siteResourceId)) .innerJoin(siteNetworks, eq(siteResources.networkId, siteNetworks.networkId))
.innerJoin(sites, eq(siteSiteResources.siteId, sites.siteId)) .innerJoin(sites, eq(siteNetworks.siteId, sites.siteId))
.groupBy(siteResources.siteResourceId); .groupBy(siteResources.siteResourceId);
} }

View File

@@ -8,8 +8,9 @@ import {
orgs, orgs,
roles, roles,
roleSiteResources, roleSiteResources,
siteNetworks,
sites, sites,
siteSiteResources, networks,
Transaction, Transaction,
userSiteResources userSiteResources
} from "@server/db"; } from "@server/db";
@@ -257,10 +258,14 @@ export async function updateSiteResource(
} }
let sitesChanged = false; let sitesChanged = false;
const existingSiteIds = await db const existingSiteIds = existingSiteResource.networkId
.select() ? await db
.from(siteSiteResources) .select()
.where(eq(siteSiteResources.siteResourceId, siteResourceId)); .from(siteNetworks)
.where(
eq(siteNetworks.networkId, existingSiteResource.networkId)
)
: [];
const existingSiteIdSet = new Set(existingSiteIds.map((s) => s.siteId)); const existingSiteIdSet = new Set(existingSiteIds.map((s) => s.siteId));
const newSiteIdSet = new Set(siteIds); const newSiteIdSet = new Set(siteIds);
@@ -460,15 +465,17 @@ export async function updateSiteResource(
// delete the site - site resources associations // delete the site - site resources associations
await trx await trx
.delete(siteSiteResources) .delete(siteNetworks)
.where( .where(
eq(siteSiteResources.siteResourceId, siteResourceId) eq(siteNetworks.networkId, updatedSiteResource.networkId!)
// TODO: HERE WE FORCE THE NETWORK TO BE DEFINED BUT THE NETWORK CAN GET DELETED and we need to handle that
); );
for (const siteId of siteIds) { for (const siteId of siteIds) {
await trx.insert(siteSiteResources).values({ await trx.insert(siteNetworks).values({
siteId: siteId, siteId: siteId,
siteResourceId: siteResourceId networkId: updatedSiteResource.networkId!
// TODO: HERE WE FORCE THE NETWORK TO BE DEFINED BUT THE NETWORK CAN GET DELETED and we need to handle that
}); });
} }
@@ -664,10 +671,11 @@ export async function handleMessagingForUpdatedSiteResource(
) )
) )
.innerJoin( .innerJoin(
siteSiteResources, siteNetworks,
eq( eq(
siteSiteResources.siteResourceId, siteNetworks.networkId,
siteResources.siteResourceId siteResources.networkId
// TODO: HERE WE FORCE THE NETWORK TO BE DEFINED BUT THE NETWORK CAN GET DELETED and we need to handle that
) )
) )
.where( .where(
@@ -676,7 +684,7 @@ export async function handleMessagingForUpdatedSiteResource(
clientSiteResourcesAssociationsCache.clientId, clientSiteResourcesAssociationsCache.clientId,
client.clientId client.clientId
), ),
eq(siteSiteResources.siteId, site.siteId), eq(siteNetworks.siteId, site.siteId),
eq( eq(
siteResources.destination, siteResources.destination,
existingSiteResource.destination existingSiteResource.destination