diff --git a/app/api/sites/get_all/route.ts b/app/api/sites/get_all/route.ts index 12edd50..232a139 100644 --- a/app/api/sites/get_all/route.ts +++ b/app/api/sites/get_all/route.ts @@ -1,38 +1,39 @@ import { NextRequest, NextResponse } from "next/server"; import prisma from "@/app/prisma"; - -interface QueryParams { - currentPage: number; - itemPerPage: number; - search: string; -} +import Fuse from 'fuse.js'; +import { Site } from "@/app/types"; export async function GET(request: NextRequest) { const { searchParams } = request.nextUrl; const currentPage = Number(searchParams.get("currentPage")) || 1; - const itemPerPage = Number(searchParams.get("itemPerPage")) || 1; + const itemPerPage = Number(searchParams.get("itemPerPage")) || 10; const search = searchParams.get("search") || ""; - const skip = (currentPage - 1) * itemPerPage; - const take = itemPerPage; - try { - const sites = await prisma.site.findMany({ - skip, - take, - where: { - name: { - contains: search, - mode: "insensitive", + if (!search) { + const skip = (currentPage - 1) * itemPerPage; + const take = itemPerPage; + + const sites = await prisma.site.findMany({ + skip, + take, + orderBy: { + name: 'asc', }, - description: { - contains: search, - mode: "insensitive", + include: { + networks: { + orderBy: { + name: 'asc', + }, + }, }, - }, - orderBy: { - name: 'asc', - }, + }); + + const total = await prisma.site.count(); + return NextResponse.json({ sites, total, currentPage, itemPerPage }, { status: 200 }); + } + + const allSites = await prisma.site.findMany({ include: { networks: { orderBy: { @@ -41,20 +42,42 @@ export async function GET(request: NextRequest) { }, }, }); - const total = await prisma.site.count({ - where: { - name: { - contains: search, - mode: "insensitive", - }, - description: { - contains: search, - mode: "insensitive", - }, - }, + + const fuseOptions = { + includeScore: true, + threshold: 0.4, + keys: ['name', 'description', 'networks.name'] + }; + + const fuse = new Fuse(allSites, fuseOptions); + const searchResults = fuse.search(search); + + const filteredSites = searchResults.map(result => { + const item = result.item; + return { + ...item, + id: String(item.id), + networks: item.networks?.map(network => ({ + ...network, + id: String(network.id), + siteId: String(network.siteId) + })) || [] + } as Site; }); - return NextResponse.json({ sites, total, currentPage, itemPerPage }, { status: 200 }); + const total = filteredSites.length; + + const startIndex = (currentPage - 1) * itemPerPage; + const endIndex = startIndex + itemPerPage; + const paginatedSites = filteredSites.slice(startIndex, endIndex); + + return NextResponse.json({ + sites: paginatedSites, + total, + currentPage, + itemPerPage + }, { status: 200 }); } catch (error: any) { + console.error("Search error:", error); return NextResponse.json({ error: "Internal Server Error" }, { status: 500 }); } } diff --git a/app/setup/SetupPage.tsx b/app/setup/SetupPage.tsx index 4f13652..d5a158f 100644 --- a/app/setup/SetupPage.tsx +++ b/app/setup/SetupPage.tsx @@ -42,7 +42,7 @@ export default function SetupPage() { } try { // Create user - const response = await axios.post("/api/user/create", { + await axios.post("/api/user/create", { email, username, name, @@ -216,7 +216,7 @@ export default function SetupPage() { - + )} diff --git a/components/dialogues/AddNetwork.tsx b/components/dialogues/AddNetwork.tsx index 9507b52..692a3e8 100644 --- a/components/dialogues/AddNetwork.tsx +++ b/components/dialogues/AddNetwork.tsx @@ -38,7 +38,7 @@ export default function AddNetwork({ onNetworkAdded, siteId }: AddNetworkProps) const successMessage = await response if (onNetworkAdded && successMessage) { onNetworkAdded() - setSuccess(successMessage) + setSuccess("Network added successfully") } } catch (apiError: any) { setError(apiError) diff --git a/hooks/useNetworks.ts b/hooks/useNetworks.ts index ab466b7..441a0c0 100644 --- a/hooks/useNetworks.ts +++ b/hooks/useNetworks.ts @@ -3,14 +3,14 @@ import { Network } from "@/app/types"; const useNetworks = () => { - const addNetwork = (network: Network): Promise | string => { + const addNetwork = (network: Network): Promise | string => { if (!network.name) { return 'Network name is required'; } return axios.post('/api/sites/networks/add', network) - .then(() => { - return "Network added successfully"; + .then((response) => { + return response.data.network; }) .catch(err => { throw err.response?.data?.error || 'An error occurred'; diff --git a/package-lock.json b/package-lock.json index 62a0cf5..ea8405d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "axios": "^1.9.0", "bcryptjs": "^3.0.2", "daisyui": "^5.0.35", + "fuse.js": "^7.1.0", "js-cookie": "^3.0.5", "jsonwebtoken": "^9.0.2", "lucide-react": "^0.511.0", @@ -1379,6 +1380,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/fuse.js": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz", + "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", diff --git a/package.json b/package.json index bc99067..9fa9333 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "axios": "^1.9.0", "bcryptjs": "^3.0.2", "daisyui": "^5.0.35", + "fuse.js": "^7.1.0", "js-cookie": "^3.0.5", "jsonwebtoken": "^9.0.2", "lucide-react": "^0.511.0",