diff --git a/src/app/api/server/route.ts b/src/app/api/server/route.ts index 8197678..bbafd6d 100644 --- a/src/app/api/server/route.ts +++ b/src/app/api/server/route.ts @@ -1,12 +1,9 @@ -import { HttpStatusCode } from "axios"; +import axios, { HttpStatusCode } from "axios"; import { NextResponse } from "next/server"; import { servers } from "../servers/servers"; import validate from "../auth/auth"; -/* - Vision: This will be -*/ -export function GET(request: Request) { +export async function GET(request: Request) { const { searchParams } = new URL(request.url); if (!validate(searchParams.get("sessionId"))) @@ -17,7 +14,7 @@ export function GET(request: Request) { const index = searchParams.get("index"); - if (!index) + if (!index || !servers.data[parseInt(index)]) return NextResponse.json( { message: "The index is invalid", @@ -27,7 +24,12 @@ export function GET(request: Request) { } ); + const server = servers.data[parseInt(index)]; + + const apps = await axios.get(`http://${server.ip}:8080/apps`, {params: {auth: 'my-key'}}); + return NextResponse.json({ message: "ok", + apps: apps.data, }); } diff --git a/src/app/servers/[server]/page.tsx b/src/app/servers/[server]/page.tsx index 06f54ed..d19e914 100644 --- a/src/app/servers/[server]/page.tsx +++ b/src/app/servers/[server]/page.tsx @@ -2,10 +2,15 @@ import useSession from "@/hooks/useSession"; import Server from "@/types/server"; import { useEffect, useState } from "react"; +import ServiceComponent from "./service"; + +interface Server2 extends Server { + apps: { name?: string }[] +} export default function ServerPage() { const session = useSession(); - const [server, setServer] = useState(); + const [server, setServer] = useState(); useEffect(() => { session?.getServerIndex(0).then((s) => { @@ -13,5 +18,11 @@ export default function ServerPage() { }); }, [session]); - return

{JSON.stringify(server)}

; + return server && ( +
+ {server.apps.map((a, i) => ( + + ))} +
+ ); } diff --git a/src/app/servers/[server]/service.tsx b/src/app/servers/[server]/service.tsx new file mode 100644 index 0000000..526c14e --- /dev/null +++ b/src/app/servers/[server]/service.tsx @@ -0,0 +1,219 @@ +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from "@/components/ui/alert-dialog"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { + ContextMenu, + ContextMenuContent, + ContextMenuItem, + ContextMenuTrigger, +} from "@/components/ui/context-menu"; +import { Label } from "@/components/ui/label"; +import { Progress } from "@/components/ui/progress"; +import Session from "@/lib/session"; +import Server from "@/types/server"; +import { + AppWindow, + AppWindowMac, + Cpu, + HardDrive, + MapPin, + MemoryStick, + Network, + Pencil, + ServerIcon, + Trash, + Wifi, +} from "lucide-react"; +import { redirect } from "next/navigation"; +import { useState } from "react"; +import { toast } from "sonner"; + +export function UsageBar({ + value, + Icon, + text, + color, +}: { + value: number; + Icon: React.ElementType; + text: string; + color: string; +}) { + return ( +
+
+ + +
+ +
+ ); +} + +function formatBytes(bytes: number, decimals = 2): string { + if (bytes === 0) return "0 Bytes"; + + const k = 1024; + const dm = decimals < 0 ? 0 : decimals; + + const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + + const size = parseFloat((bytes / Math.pow(k, i)).toFixed(dm)); + + return `${size} ${sizes[i]}`; +} + +export function ByteUnit({ + value, + Icon, + text, + color, +}: { + value: number; + Icon: React.ElementType; + text: string; + color: string; +}) { + return ( +
+
+ + +
+
+ ) +} + +export default function ServiceComponent({ + server: service, + index, + session, +}: { + server: { name?: string, description?: string }; + index: number; + session: Session | null; +}) { + const [deleteAlert, setDeleteAlert] = useState(false); + + return ( + <> + + + { + redirect(`/servers/${index}`); + }} + > + +
+
+ +
+
+ {service.name} + + {(service.description && + {service.description} {(service as any).cpu} + )} +
+
+
+ + {/* + + */} + {/*
+
+ + +
+
*/} +
+
+
+ + + + Edit + + setDeleteAlert(true)} + > + + Delete + + +
+ + + + + Are you sure? + + This action will permanently remove your server from the server + list + + + + Cancel + + session + ?.removeServer(index) + .then(() => { + toast.info("Server successfully deleted"); + }) + .catch((e) => { + toast.error( + `Error deleting server: ` + e.response.data.message + ); + }) + } + > + Delete + + + + + + ); +}