diff --git a/app/api/servers/get/route.ts b/app/api/servers/get/route.ts index a14ef80..7c63a45 100644 --- a/app/api/servers/get/route.ts +++ b/app/api/servers/get/route.ts @@ -20,13 +20,25 @@ export async function POST(request: NextRequest) { }); const hostsWithVms = await Promise.all( - hosts.map(async (host) => ({ - ...host, - hostedVMs: await prisma.server.findMany({ + hosts.map(async (host) => { + const vms = await prisma.server.findMany({ where: { hostServer: host.id }, orderBy: { name: 'asc' } - }) - })) + }); + + // Add isVM flag to VMs + const vmsWithFlag = vms.map(vm => ({ + ...vm, + isVM: true, + hostedVMs: [] // Initialize empty hostedVMs array for VMs + })); + + return { + ...host, + isVM: false, // Mark as physical server/not a VM + hostedVMs: vmsWithFlag + }; + }) ); const totalHosts = await prisma.server.count({ diff --git a/app/api/servers/hosts/route.ts b/app/api/servers/hosts/route.ts index de4f716..3d62621 100644 --- a/app/api/servers/hosts/route.ts +++ b/app/api/servers/hosts/route.ts @@ -6,7 +6,15 @@ export async function GET(request: NextRequest) { const servers = await prisma.server.findMany({ where: { host: true }, }); - return NextResponse.json({ servers }); + + // Add required properties to ensure consistency + const serversWithProps = servers.map(server => ({ + ...server, + isVM: false, + hostedVMs: [] // Initialize empty hostedVMs array + })); + + return NextResponse.json({ servers: serversWithProps }); } catch (error: any) { return NextResponse.json({ error: error.message }, { status: 500 }); } diff --git a/app/api/servers/search/route.ts b/app/api/servers/search/route.ts index 2797331..9266919 100644 --- a/app/api/servers/search/route.ts +++ b/app/api/servers/search/route.ts @@ -11,15 +11,51 @@ export async function POST(request: NextRequest) { const body: SearchRequest = await request.json(); const { searchterm } = body; + // Fetch all servers const servers = await prisma.server.findMany({}); + + // Create a map of host servers with their hosted VMs + const serverMap = new Map(); + servers.forEach(server => { + if (server.host) { + serverMap.set(server.id, { + ...server, + isVM: false, + hostedVMs: [] + }); + } + }); + + // Add VMs to their host servers and mark them as VMs + const serversWithType = servers.map(server => { + // If not a host and has a hostServer, it's a VM + if (!server.host && server.hostServer) { + const hostServer = serverMap.get(server.hostServer); + if (hostServer) { + hostServer.hostedVMs.push({ + ...server, + isVM: true + }); + } + return { + ...server, + isVM: true + }; + } + return { + ...server, + isVM: false, + hostedVMs: serverMap.get(server.id)?.hostedVMs || [] + }; + }); const fuseOptions = { - keys: ['name', 'description', 'cpu', 'gpu', 'ram', 'disk'], + keys: ['name', 'description', 'cpu', 'gpu', 'ram', 'disk', 'os'], threshold: 0.3, includeScore: true, }; - const fuse = new Fuse(servers, fuseOptions); + const fuse = new Fuse(serversWithType, fuseOptions); const searchResults = fuse.search(searchterm); diff --git a/app/dashboard/servers/Servers.tsx b/app/dashboard/servers/Servers.tsx index 734b740..7a7d23a 100644 --- a/app/dashboard/servers/Servers.tsx +++ b/app/dashboard/servers/Servers.tsx @@ -94,7 +94,8 @@ interface Server { gpu?: string; ram?: string; disk?: string; - hostedVMs: Server[]; + hostedVMs?: Server[]; + isVM?: boolean; } interface GetServersResponse { @@ -278,6 +279,7 @@ export default function Dashboard() { { searchterm: searchTerm } ); setServers(response.data.results); + setMaxPage(1); setIsSearching(false); } catch (error: any) { console.error("Search error:", error.response?.data); @@ -314,6 +316,13 @@ export default function Dashboard() { } }, [isAddDialogOpen, editId]); + // Add this function to get the host server name for a VM + const getHostServerName = (hostServerId: number | null) => { + if (!hostServerId) return ""; + const hostServer = servers.find(server => server.id === hostServerId); + return hostServer ? hostServer.name : ""; + }; + return ( @@ -585,7 +594,7 @@ export default function Dashboard() { } > {servers - .filter((server) => server.hostServer === 0) + .filter((server) => searchTerm ? true : server.hostServer === 0) .map((server) => (
- + {server.name} + {server.isVM && ( + VM + )} IP: {server.ip || "Not set"}
+ + {server.isVM && server.hostServer && ( +
+ + + Host: {getHostServerName(server.hostServer)} + +
+ )}
@@ -841,11 +862,11 @@ export default function Dashboard() { onCheckedChange={(checked) => setEditHost(checked === true) } - disabled={server.hostedVMs.length > 0} + disabled={server.hostedVMs && server.hostedVMs.length > 0} />