From ed4a6073738c8adb6cf7886ddee4501a2a5fd4d7 Mon Sep 17 00:00:00 2001 From: headlessdev Date: Sun, 1 Jun 2025 15:14:52 +0200 Subject: [PATCH] Servers add & get_all api route | networks api route --- app/api/servers/add/route.ts | 33 +++++++++++++ app/api/servers/get_all/route.ts | 65 +++++++++++++++++++++++++ app/api/sites/networks/get_all/route.ts | 19 ++++++++ 3 files changed, 117 insertions(+) create mode 100644 app/api/servers/add/route.ts create mode 100644 app/api/servers/get_all/route.ts create mode 100644 app/api/sites/networks/get_all/route.ts diff --git a/app/api/servers/add/route.ts b/app/api/servers/add/route.ts new file mode 100644 index 0000000..43dc496 --- /dev/null +++ b/app/api/servers/add/route.ts @@ -0,0 +1,33 @@ +import { NextRequest, NextResponse } from "next/server"; +import prisma from "@/app/prisma"; +import { z } from "zod/v4"; + +const schema = z.object({ + networkId: z.number(), + name: z.string().min(3, "Server name must be at least 3 characters long").max(30, "Server name must be less than 30 characters long"), + description: z.string().optional(), + icon: z.string().optional(), +}); + +export async function POST(request: NextRequest) { + try { + const body = schema.parse(await request.json()); + + const server = await prisma.server.create({ + data: { + networkId: body.networkId, + name: body.name, + description: body.description, + icon: body.icon, + }, + }); + + return NextResponse.json({ server }, { status: 201 }); + } catch (error: any) { + if(error instanceof z.ZodError) { + return NextResponse.json({ error: error.issues[0].message }, { status: 400 }); + } + return NextResponse.json({ error: "Internal Server Error" }, { status: 500 }); + } +} + diff --git a/app/api/servers/get_all/route.ts b/app/api/servers/get_all/route.ts new file mode 100644 index 0000000..065302a --- /dev/null +++ b/app/api/servers/get_all/route.ts @@ -0,0 +1,65 @@ +import { NextRequest, NextResponse } from "next/server"; +import prisma from "@/app/prisma"; +import Fuse from 'fuse.js'; +import { z } from "zod/v4"; + +const schema = z.object({ + currentPage: z.string().optional(), + itemPerPage: z.string().optional(), + search: z.string().optional(), +}); + +export async function GET(request: NextRequest) { + const { searchParams } = request.nextUrl; + const currentPage = Number(schema.parse({ currentPage: searchParams.get("currentPage") }).currentPage) || 1; + const itemPerPage = Number(schema.parse({ itemPerPage: searchParams.get("itemPerPage") }).itemPerPage) || 10; + const search = schema.parse({ search: searchParams.get("search") }).search || ""; + + try { + if (!search) { + const skip = (currentPage - 1) * itemPerPage; + const take = itemPerPage; + + const servers = await prisma.server.findMany({ + skip, + take, + orderBy: { + name: 'asc', + }, + }); + + const total = await prisma.server.count(); + return NextResponse.json({ servers, total, currentPage, itemPerPage }, { status: 200 }); + } + + const allServers = await prisma.server.findMany({ + orderBy: { + name: 'asc', + }, + }); + + const fuseOptions = { + includeScore: true, + threshold: 0.4, + keys: ['name', 'description', 'networks.name'] + }; + + const fuse = new Fuse(allServers, fuseOptions); + const searchResults = fuse.search(search); + + const servers = searchResults.map((result) => result.item); + + const total = searchResults.length; + const skip = (currentPage - 1) * itemPerPage; + const take = itemPerPage; + + const paginatedServers = servers.slice(skip, skip + take); + + return NextResponse.json({ servers: paginatedServers, total, currentPage, itemPerPage }, { status: 200 }); + } catch (error: any) { + if(error instanceof z.ZodError) { + return NextResponse.json({ error: error.issues[0].message }, { status: 400 }); + } + return NextResponse.json({ error: "Internal Server Error" }, { status: 500 }); + } +} \ No newline at end of file diff --git a/app/api/sites/networks/get_all/route.ts b/app/api/sites/networks/get_all/route.ts new file mode 100644 index 0000000..ff3fb37 --- /dev/null +++ b/app/api/sites/networks/get_all/route.ts @@ -0,0 +1,19 @@ +import { NextRequest, NextResponse } from "next/server"; +import prisma from "@/app/prisma"; + +export async function GET(request: NextRequest) { + try { + const networks = await prisma.network.findMany({ + orderBy: { + name: 'asc', + }, + }); + + return NextResponse.json({ networks }, { status: 200 }); + } catch (error: any) { + return NextResponse.json({ error: "Internal Server Error" }, { status: 500 }); + } +} + + +