diff --git a/app/api/sites/get/route.ts b/app/api/sites/get/route.ts
index 3a62a7a..67e43c8 100644
--- a/app/api/sites/get/route.ts
+++ b/app/api/sites/get/route.ts
@@ -14,6 +14,9 @@ export async function GET(request: NextRequest) {
where: {
id: Number(siteId),
},
+ include: {
+ networks: true, // Include all network relationships
+ },
});
return NextResponse.json({ site });
diff --git a/app/api/sites/networks/add/route.ts b/app/api/sites/networks/add/route.ts
new file mode 100644
index 0000000..44a5493
--- /dev/null
+++ b/app/api/sites/networks/add/route.ts
@@ -0,0 +1,31 @@
+import { NextRequest, NextResponse } from "next/server";
+import prisma from "@/app/prisma";
+
+interface Body {
+ siteId: number;
+ name: string;
+ ipv4Subnet?: string;
+ ipv6Subnet?: string;
+ gateway?: string;
+}
+
+export async function POST(request: NextRequest) {
+ const body: Body = await request.json();
+
+ try {
+ const network = await prisma.network.create({
+ data: {
+ siteId: body.siteId,
+ name: body.name,
+ ipv4Subnet: body.ipv4Subnet,
+ ipv6Subnet: body.ipv6Subnet,
+ gateway: body.gateway,
+ },
+ });
+
+ return NextResponse.json({ network }, { status: 201 });
+ } catch (error) {
+ console.error("Error creating network:", error);
+ return NextResponse.json({ error: "Failed to create network" }, { status: 500 });
+ }
+}
diff --git a/app/dashboard/sites/[siteId]/SitePage.tsx b/app/dashboard/sites/[siteId]/SitePage.tsx
index 5fb6099..b968b81 100644
--- a/app/dashboard/sites/[siteId]/SitePage.tsx
+++ b/app/dashboard/sites/[siteId]/SitePage.tsx
@@ -3,6 +3,8 @@ import Sidebar from "@/components/Sidebar"
import useSite from "@/hooks/useSite"
import { useEffect, useState } from "react"
import { EditModeToggle } from "@/components/EditModeToggle"
+import AddNetwork from "@/components/dialogues/AddNetwork"
+import { Plus } from "lucide-react"
interface SitesPageProps {
username: string
@@ -37,12 +39,20 @@ export default function SitesPage({ username, name, siteId }: SitesPageProps) {
+
Networks
+ {isEditMode ? (
+
+ ) : null}
+
- {site.networks?.length > 0 ? site.networks.join(", ") : "No networks"}
+ {site.networks?.length > 0 ? site.networks.map((network) => network.name).join(", ") : "No networks"}
+
diff --git a/components/dialogues/AddNetwork.tsx b/components/dialogues/AddNetwork.tsx
new file mode 100644
index 0000000..2e6fe1e
--- /dev/null
+++ b/components/dialogues/AddNetwork.tsx
@@ -0,0 +1,107 @@
+"use client";
+
+import { useState } from "react";
+import ErrorToast from "@/components/Error";
+import SuccessToast from "@/components/Success";
+import useNetworks from "@/hooks/useNetworks";
+
+interface AddNetworkProps {
+ onNetworkAdded?: () => void;
+ siteId: number;
+}
+
+export default function AddNetwork({ onNetworkAdded, siteId }: AddNetworkProps) {
+ const [name, setName] = useState("");
+ const [ipv4Subnet, setIpv4Subnet] = useState("");
+ const [ipv6Subnet, setIpv6Subnet] = useState("");
+ const [gateway, setGateway] = useState("");
+ const [error, setError] = useState("");
+ const [success, setSuccess] = useState("");
+ const { addNetwork } = useNetworks();
+
+
+ return (
+
+
+
setError('')} />
+ setSuccess('')} />
+
+ )
+}
\ No newline at end of file
diff --git a/hooks/useNetworks.ts b/hooks/useNetworks.ts
new file mode 100644
index 0000000..1abda76
--- /dev/null
+++ b/hooks/useNetworks.ts
@@ -0,0 +1,30 @@
+import { useState, useEffect, useCallback } from "react";
+import axios from "axios";
+
+interface AddNetwork {
+ siteId: number;
+ name: string;
+ ipv4Subnet: string;
+ ipv6Subnet: string;
+ gateway: string;
+}
+
+const useNetworks = () => {
+
+ const addNetwork = (network: AddNetwork) => {
+ axios.post('/api/sites/networks/add', network);
+ };
+
+ const deleteNetwork = (networkId: number) => {
+ axios.delete('/api/sites/networks/delete', {
+ params: { networkId }
+ });
+ };
+
+ return {
+ addNetwork,
+ deleteNetwork,
+ };
+};
+
+export default useNetworks;
\ No newline at end of file
diff --git a/hooks/useSite.ts b/hooks/useSite.ts
index 7751bca..c641269 100644
--- a/hooks/useSite.ts
+++ b/hooks/useSite.ts
@@ -1,11 +1,19 @@
import { useState, useEffect, useCallback } from "react";
import axios from "axios";
+interface Network {
+ id?: number;
+ name: string;
+ ipv4Subnet?: string;
+ ipv6Subnet?: string;
+ gateway?: string;
+}
+
interface Site {
id: number;
name: string;
description: string;
- networks: string[];
+ networks: Network[];
}
const useSite = () => {