From 4036c157c97f9e084077279c9cef06424bf37e62 Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Thu, 12 Dec 2024 09:39:51 +0800 Subject: [PATCH] feat: use api --- app/(main)/ClientComponents/ServerIPInfo.tsx | 24 ++++++++ app/(main)/server/[id]/page.tsx | 13 +--- app/api/server-ip/route.ts | 65 ++++++++++++++++++++ lib/GetIPInfo.ts | 35 ----------- 4 files changed, 92 insertions(+), 45 deletions(-) create mode 100644 app/(main)/ClientComponents/ServerIPInfo.tsx create mode 100644 app/api/server-ip/route.ts delete mode 100644 lib/GetIPInfo.ts diff --git a/app/(main)/ClientComponents/ServerIPInfo.tsx b/app/(main)/ClientComponents/ServerIPInfo.tsx new file mode 100644 index 0000000..d36f202 --- /dev/null +++ b/app/(main)/ClientComponents/ServerIPInfo.tsx @@ -0,0 +1,24 @@ +"use client"; + +import { IPInfo } from "@/app/api/server-ip/route"; +import { nezhaFetcher } from "@/lib/utils"; +import useSWR from "swr"; + +export default function ServerIPInfo({ server_id }: { server_id: number }) { + const { data } = useSWR( + `/api/server-ip?server_id=${server_id}`, + nezhaFetcher, + ); + + if (!data) { + return
Loading...
; + } + + console.log(data); + + return ( +
+

Server IP Info

+
+ ); +} diff --git a/app/(main)/server/[id]/page.tsx b/app/(main)/server/[id]/page.tsx index 646b918..a8bb7c9 100644 --- a/app/(main)/server/[id]/page.tsx +++ b/app/(main)/server/[id]/page.tsx @@ -5,25 +5,18 @@ import ServerDetailChartClient from "@/app/(main)/ClientComponents/ServerDetailC import ServerDetailClient from "@/app/(main)/ClientComponents/ServerDetailClient"; import TabSwitch from "@/components/TabSwitch"; import { Separator } from "@/components/ui/separator"; -import GetIPInfo from "@/lib/GetIPInfo"; import { use, useEffect, useState } from "react"; +import ServerIPInfo from "../../ClientComponents/ServerIPInfo"; + export default function Page(props: { params: Promise<{ id: string }> }) { const params = use(props.params); const tabs = ["Detail", "Network"]; const [currentTab, setCurrentTab] = useState(tabs[0]); - - useEffect(() => { - const updateViews = async () => { - const ipInfo = await GetIPInfo({ server_id: params.id }); - console.log(ipInfo); - }; - updateViews(); - }, []); - return (
+
diff --git a/app/api/server-ip/route.ts b/app/api/server-ip/route.ts new file mode 100644 index 0000000..17b44b4 --- /dev/null +++ b/app/api/server-ip/route.ts @@ -0,0 +1,65 @@ +import { auth } from "@/auth"; +import getEnv from "@/lib/env-entry"; +import { GetServerIP } from "@/lib/serverFetch"; +import fs from "fs"; +import { AsnResponse, CityResponse, Reader } from "maxmind"; +import { redirect } from "next/navigation"; +import { NextRequest, NextResponse } from "next/server"; +import path from "path"; + +export const dynamic = "force-dynamic"; + +interface ResError extends Error { + statusCode: number; + message: string; +} + +export type IPInfo = { + city: CityResponse; + asn: AsnResponse; +}; + +export async function GET(req: NextRequest) { + if (getEnv("SitePassword")) { + const session = await auth(); + if (!session) { + redirect("/"); + } + } + + const { searchParams } = new URL(req.url); + const server_id = searchParams.get("server_id"); + + if (!server_id) { + return NextResponse.json( + { error: "server_id is required" }, + { status: 400 }, + ); + } + + try { + const ip = await GetServerIP({ server_id: Number(server_id) }); + + const cityDbPath = path.join(process.cwd(), "lib", "GeoLite2-City.mmdb"); + + const asnDbPath = path.join(process.cwd(), "lib", "GeoLite2-ASN.mmdb"); + + const cityDbBuffer = fs.readFileSync(cityDbPath); + const asnDbBuffer = fs.readFileSync(asnDbPath); + + const cityLookup = new Reader(cityDbBuffer); + const asnLookup = new Reader(asnDbBuffer); + + const data: IPInfo = { + city: cityLookup.get(ip) as CityResponse, + asn: asnLookup.get(ip) as AsnResponse, + }; + return NextResponse.json(data, { status: 200 }); + } catch (error) { + const err = error as ResError; + console.error("Error in GET handler:", err); + const statusCode = err.statusCode || 500; + const message = err.message || "Internal Server Error"; + return NextResponse.json({ error: message }, { status: statusCode }); + } +} diff --git a/lib/GetIPInfo.ts b/lib/GetIPInfo.ts deleted file mode 100644 index 33eb249..0000000 --- a/lib/GetIPInfo.ts +++ /dev/null @@ -1,35 +0,0 @@ -"use server"; - -import fs from "fs"; -import path from 'path'; -import { AsnResponse, CityResponse, Reader } from "maxmind"; - -import { GetServerIP } from "./serverFetch"; - -type IPInfo = { - city: CityResponse; - asn: AsnResponse; -}; - -export default async function GetIPInfo({ - server_id, -}: { - server_id: string; -}): Promise { - const ip = await GetServerIP({ server_id: Number(server_id) }); - - const cityDbPath = path.join(process.cwd(),"lib", 'GeoLite2-City.mmdb'); - - const asnDbPath = path.join(process.cwd(),"lib", 'GeoLite2-ASN.mmdb'); - - const cityDbBuffer = fs.readFileSync(cityDbPath); - const asnDbBuffer = fs.readFileSync(asnDbPath); - - const cityLookup = new Reader(cityDbBuffer); - const asnLookup = new Reader(asnDbBuffer); - - return { - city: cityLookup.get(ip) as CityResponse, - asn: asnLookup.get(ip) as AsnResponse, - }; -}