Also include direct associations

This commit is contained in:
Owen
2025-11-07 16:55:32 -08:00
parent 00df2c876f
commit 47bcadb329

View File

@@ -1,6 +1,7 @@
import { import {
Client, Client,
clients, clients,
clientSiteResources,
clientSites, clientSites,
db, db,
exitNodes, exitNodes,
@@ -83,8 +84,6 @@ export async function rebuildSiteClientAssociations(
.from(clients) .from(clients)
.where(inArray(clients.userId, newAllUserIds)); .where(inArray(clients.userId, newAllUserIds));
const newAllClientIds = newAllClients.map((client) => client.clientId);
const existingClientSites = await trx const existingClientSites = await trx
.select({ .select({
clientId: clientSites.clientId clientId: clientSites.clientId
@@ -92,7 +91,9 @@ export async function rebuildSiteClientAssociations(
.from(clientSites) .from(clientSites)
.where(eq(clientSites.siteId, siteId)); .where(eq(clientSites.siteId, siteId));
const existingClientSiteIds = existingClientSites.map((row) => row.clientId); const existingClientSiteIds = existingClientSites.map(
(row) => row.clientId
);
// Get full client details for existing clients (needed for sending delete messages) // Get full client details for existing clients (needed for sending delete messages)
const existingClients = await trx const existingClients = await trx
@@ -104,11 +105,39 @@ export async function rebuildSiteClientAssociations(
.from(clients) .from(clients)
.where(inArray(clients.clientId, existingClientSiteIds)); .where(inArray(clients.clientId, existingClientSiteIds));
const clientSitesToAdd = newAllClientIds.filter( const allClientSiteResources = await trx // this is for if a client is directly associated with a resource instead of implicitly via a user
.select()
.from(clientSiteResources)
.where(
eq(clientSiteResources.siteResourceId, siteResource.siteResourceId)
);
const directClientIds = allClientSiteResources.map((row) => row.clientId);
// Get full client details for directly associated clients
const directClients = await trx
.select({
clientId: clients.clientId,
pubKey: clients.pubKey,
subnet: clients.subnet
})
.from(clients)
.where(inArray(clients.clientId, directClientIds));
// Merge user-based clients with directly associated clients
const allClientsMap = new Map(
[...newAllClients, ...directClients].map((c) => [c.clientId, c])
);
const mergedAllClients = Array.from(allClientsMap.values());
const mergedAllClientIds = mergedAllClients.map((c) => c.clientId);
// ------------- calculations begin below -------------
const clientSitesToAdd = mergedAllClientIds.filter(
(clientId) => !existingClientSiteIds.includes(clientId) (clientId) => !existingClientSiteIds.includes(clientId)
); );
const clientSitesToInsert = newAllClientIds const clientSitesToInsert = mergedAllClientIds
.filter((clientId) => !existingClientSiteIds.includes(clientId)) .filter((clientId) => !existingClientSiteIds.includes(clientId))
.map((clientId) => ({ .map((clientId) => ({
clientId, clientId,
@@ -121,7 +150,7 @@ export async function rebuildSiteClientAssociations(
// Now remove any client-site associations that should no longer exist // Now remove any client-site associations that should no longer exist
const clientSitesToRemove = existingClientSiteIds.filter( const clientSitesToRemove = existingClientSiteIds.filter(
(clientId) => !newAllClientIds.includes(clientId) (clientId) => !mergedAllClientIds.includes(clientId)
); );
if (clientSitesToRemove.length > 0) { if (clientSitesToRemove.length > 0) {
@@ -139,7 +168,7 @@ export async function rebuildSiteClientAssociations(
await handleMessagesForSiteClients( await handleMessagesForSiteClients(
site, site,
siteId, siteId,
newAllClients, mergedAllClients,
existingClients, existingClients,
clientSitesToAdd, clientSitesToAdd,
clientSitesToRemove, clientSitesToRemove,
@@ -211,11 +240,14 @@ async function handleMessagesForSiteClients(
let exitNodeJobs: Promise<any>[] = []; let exitNodeJobs: Promise<any>[] = [];
// Combine all clients that need processing (those being added or removed) // Combine all clients that need processing (those being added or removed)
const clientsToProcess = new Map<number, { const clientsToProcess = new Map<
clientId: number; number,
pubKey: string | null; {
subnet: string | null; clientId: number;
}>(); pubKey: string | null;
subnet: string | null;
}
>();
// Add clients that are being added (from newAllClients) // Add clients that are being added (from newAllClients)
for (const client of allClients) { for (const client of allClients) {