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 ( +
+ +
+
+
+

Add New Network

+

Provide details for the new network

+
+ +
+
+ + setName(e.target.value)} + /> +
+ +
+ + setIpv4Subnet(e.target.value)} + /> +
+
+ + setIpv6Subnet(e.target.value)} + /> +
+
+ + setGateway(e.target.value)} + /> +
+
+ +
+
+ + +
+
+
+
+
+ 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 = () => {