Make feilds optional

This commit is contained in:
Owen
2026-07-07 09:02:25 -04:00
parent 633159fb77
commit 8cceed91cf
@@ -68,9 +68,9 @@ const updateSiteResourceSchema = z
"Fully qualified domain name with optional wildcards, e.g., example.internal, *.example.internal, or host-0?.example.internal", "Fully qualified domain name with optional wildcards, e.g., example.internal, *.example.internal, or host-0?.example.internal",
example: "service.example.internal" example: "service.example.internal"
}), }),
userIds: z.array(z.string()), userIds: z.array(z.string()).optional(),
roleIds: z.array(z.int()), roleIds: z.array(z.int()).optional(),
clientIds: z.array(z.int()), clientIds: z.array(z.int()).optional(),
tcpPortRangeString: portRangeStringSchema, tcpPortRangeString: portRangeStringSchema,
udpPortRangeString: portRangeStringSchema, udpPortRangeString: portRangeStringSchema,
disableIcmp: z.boolean().optional(), disableIcmp: z.boolean().optional(),
@@ -167,6 +167,10 @@ const updateSiteResourceSchema = z
) )
.refine( .refine(
(data) => { (data) => {
// if neither is provided, the existing site associations are left unchanged
if (data.siteIds === undefined && data.siteId === undefined) {
return true;
}
return ( return (
(data.siteIds !== undefined && data.siteIds.length > 0) || (data.siteIds !== undefined && data.siteIds.length > 0) ||
data.siteId !== undefined data.siteId !== undefined
@@ -263,7 +267,7 @@ export async function updateSiteResource(
const { siteResourceId } = parsedParams.data; const { siteResourceId } = parsedParams.data;
const { const {
name, name,
siteIds: siteIdsInput = [], // because it can change siteIds: siteIdsInput,
siteId, siteId,
niceId, niceId,
mode, mode,
@@ -287,10 +291,15 @@ export async function updateSiteResource(
} = parsedBody.data; } = parsedBody.data;
// Backward compatibility: merge deprecated siteId into siteIds array // Backward compatibility: merge deprecated siteId into siteIds array
const siteIds = [...siteIdsInput]; const siteIdsProvided =
siteIdsInput !== undefined || siteId !== undefined;
let siteIds: number[] | undefined;
if (siteIdsProvided) {
siteIds = [...(siteIdsInput ?? [])];
if (siteId !== undefined && !siteIds.includes(siteId)) { if (siteId !== undefined && !siteIds.includes(siteId)) {
siteIds.push(siteId); siteIds.push(siteId);
} }
}
// Check if site resource exists // Check if site resource exists
const [existingSiteResource] = await db const [existingSiteResource] = await db
@@ -356,6 +365,7 @@ export async function updateSiteResource(
} }
// Verify the site exists and belongs to the org // Verify the site exists and belongs to the org
if (siteIds !== undefined) {
const sitesToAssign = await db const sitesToAssign = await db
.select() .select()
.from(sites) .from(sites)
@@ -371,6 +381,7 @@ export async function updateSiteResource(
createHttpError(HttpCode.NOT_FOUND, "Some site not found") createHttpError(HttpCode.NOT_FOUND, "Some site not found")
); );
} }
}
// Only check if destination is an IP address // Only check if destination is an IP address
const isIp = z const isIp = z
@@ -463,7 +474,8 @@ export async function updateSiteResource(
} }
let updatedSiteResource: SiteResource | undefined; let updatedSiteResource: SiteResource | undefined;
let updatedSiteIds: number[] = []; // defaults to the existing sites; only overwritten below if siteIds/siteId was provided
let updatedSiteIds: number[] = [...existingSiteIds];
await db.transaction(async (trx) => { await db.transaction(async (trx) => {
// Update the site resource // Update the site resource
const sshPamSet = const sshPamSet =
@@ -522,13 +534,18 @@ export async function updateSiteResource(
//////////////////// update the associations //////////////////// //////////////////// update the associations ////////////////////
if (siteIds !== undefined) {
// delete the site - site resources associations // delete the site - site resources associations
await trx await trx
.delete(siteNetworks) .delete(siteNetworks)
.where( .where(
eq(siteNetworks.networkId, updatedSiteResource.networkId!) eq(
siteNetworks.networkId,
updatedSiteResource.networkId!
)
); );
updatedSiteIds = [];
for (const siteId of siteIds) { for (const siteId of siteIds) {
await trx.insert(siteNetworks).values({ await trx.insert(siteNetworks).values({
siteId: siteId, siteId: siteId,
@@ -536,10 +553,14 @@ export async function updateSiteResource(
}); });
updatedSiteIds.push(siteId); updatedSiteIds.push(siteId);
} }
}
if (clientIds !== undefined) {
await trx await trx
.delete(clientSiteResources) .delete(clientSiteResources)
.where(eq(clientSiteResources.siteResourceId, siteResourceId)); .where(
eq(clientSiteResources.siteResourceId, siteResourceId)
);
if (clientIds.length > 0) { if (clientIds.length > 0) {
await trx.insert(clientSiteResources).values( await trx.insert(clientSiteResources).values(
@@ -549,10 +570,14 @@ export async function updateSiteResource(
})) }))
); );
} }
}
if (userIds !== undefined) {
await trx await trx
.delete(userSiteResources) .delete(userSiteResources)
.where(eq(userSiteResources.siteResourceId, siteResourceId)); .where(
eq(userSiteResources.siteResourceId, siteResourceId)
);
if (userIds.length > 0) { if (userIds.length > 0) {
await trx.insert(userSiteResources).values( await trx.insert(userSiteResources).values(
@@ -562,7 +587,9 @@ export async function updateSiteResource(
})) }))
); );
} }
}
if (roleIds !== undefined) {
// Get all admin role IDs for this org to exclude from deletion // Get all admin role IDs for this org to exclude from deletion
const adminRoles = await trx const adminRoles = await trx
.select() .select()
@@ -578,7 +605,10 @@ export async function updateSiteResource(
if (adminRoleIds.length > 0) { if (adminRoleIds.length > 0) {
await trx.delete(roleSiteResources).where( await trx.delete(roleSiteResources).where(
and( and(
eq(roleSiteResources.siteResourceId, siteResourceId), eq(
roleSiteResources.siteResourceId,
siteResourceId
),
ne(roleSiteResources.roleId, adminRoleIds[0]) // delete all but the admin role ne(roleSiteResources.roleId, adminRoleIds[0]) // delete all but the admin role
) )
); );
@@ -586,7 +616,10 @@ export async function updateSiteResource(
await trx await trx
.delete(roleSiteResources) .delete(roleSiteResources)
.where( .where(
eq(roleSiteResources.siteResourceId, siteResourceId) eq(
roleSiteResources.siteResourceId,
siteResourceId
)
); );
} }
@@ -598,6 +631,7 @@ export async function updateSiteResource(
})) }))
); );
} }
}
logger.info(`Updated site resource ${siteResourceId}`); logger.info(`Updated site resource ${siteResourceId}`);
}); });