68 lines
2.1 KiB
TypeScript
Raw Normal View History

2025-04-14 14:48:40 +02:00
import { NextResponse, NextRequest } from "next/server";
import { prisma } from "@/lib/prisma";
import Fuse from "fuse.js";
interface SearchRequest {
searchterm: string;
}
export async function POST(request: NextRequest) {
try {
const body: SearchRequest = await request.json();
const { searchterm } = body;
// Fetch all servers
2025-04-14 14:48:40 +02:00
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 || []
};
});
2025-04-14 14:48:40 +02:00
const fuseOptions = {
keys: ['name', 'description', 'cpu', 'gpu', 'ram', 'disk', 'os'],
2025-04-14 14:48:40 +02:00
threshold: 0.3,
includeScore: true,
};
const fuse = new Fuse(serversWithType, fuseOptions);
2025-04-14 14:48:40 +02:00
const searchResults = fuse.search(searchterm);
const results = searchResults.map(({ item }) => item);
return NextResponse.json({ results });
} catch (error: any) {
return NextResponse.json({ error: error.message }, { status: 500 });
}
}