Add Application API & Functionality

This commit is contained in:
headlessdev 2025-04-11 17:35:06 +02:00
parent 3d4a8a05b3
commit 9b822ad328
4 changed files with 60 additions and 7 deletions

View File

@ -0,0 +1,33 @@
import { NextResponse, NextRequest } from "next/server";
import { PrismaClient } from '@/lib/generated/prisma'
interface AddRequest {
name: string;
description: string;
icon: string;
publicURL: string;
localURL: string;
}
const prisma = new PrismaClient();
export async function POST(request: NextRequest) {
try {
const body: AddRequest = await request.json();
const { name, description, icon, publicURL, localURL } = body;
const application = await prisma.application.create({
data: {
name,
description,
icon,
publicURL,
localURL
}
});
return NextResponse.json({ message: "Success", application });
} catch (error: any) {
return NextResponse.json({ error: error.message }, { status: 500 });
}
}

View File

@ -1,3 +1,5 @@
"use client";
import { AppSidebar } from "@/components/app-sidebar"
import {
Breadcrumb,
@ -46,7 +48,24 @@ import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { Textarea } from "@/components/ui/textarea"
import { useState } from "react";
import axios from 'axios';
export default function Dashboard() {
const [name, setName] = useState("");
const [description, setDescription] = useState("");
const [icon, setIcon] = useState("");
const [publicURL, setPublicURL] = useState("");
const [localURL, setLocalURL] = useState("");
const add = async () => {
try {
const response = await axios.post('/api/applications/add', { name, description, icon, publicURL, localURL });
} catch (error: any) {
console.log(error.response.data);
}
}
return (
<SidebarProvider>
<AppSidebar />
@ -88,30 +107,30 @@ export default function Dashboard() {
<p className="space-y-4 pt-4">
<div className="grid w-full items-center gap-1.5">
<Label htmlFor="picture">Name</Label>
<Input id="name" type="text" placeholder="e.g. Portainer" />
<Input id="name" type="text" placeholder="e.g. Portainer" onChange={(e) => setName(e.target.value)}/>
</div>
<div className="grid w-full items-center gap-1.5">
<Label htmlFor="picture">Description <span className="text-stone-600">(optional)</span></Label>
<Textarea id="description" placeholder="e.g. Protainer is a self-hosted, open-source platform for managing Docker containers and services via an intuitive web interface."/>
<Textarea id="description" placeholder="e.g. Protainer is a self-hosted, open-source platform for managing Docker containers and services via an intuitive web interface." onChange={(e) => setDescription(e.target.value)}/>
</div>
<div className="grid w-full items-center gap-1.5">
<Label htmlFor="picture">Icon</Label>
<Input id="name" type="text" placeholder="e.g. https://www.portainer.io/hubfs/portainer-logo-black.svg" />
<Input id="name" type="text" placeholder="e.g. https://www.portainer.io/hubfs/portainer-logo-black.svg" onChange={(e) => setIcon(e.target.value)}/>
</div>
<div className="grid w-full items-center gap-1.5">
<Label htmlFor="picture">Public URL</Label>
<Input id="name" type="text" placeholder="e.g. https://portainer.lastname.com" />
<Input id="name" type="text" placeholder="e.g. https://portainer.lastname.com" onChange={(e) => setPublicURL(e.target.value)}/>
</div>
<div className="grid w-full items-center gap-1.5">
<Label htmlFor="picture">Local URL <span className="text-stone-600">(optional)</span></Label>
<Input id="name" type="text" placeholder="e.g. hhtp://localhost:3000" />
<Input id="name" type="text" placeholder="e.g. hhtp://localhost:3000" onChange={(e) => setLocalURL(e.target.value)}/>
</div>
</p>
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>Cancel</AlertDialogCancel>
<AlertDialogAction>Add</AlertDialogAction>
<Button onClick={add}>Add</Button>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>

2
package-lock.json generated
View File

@ -8,6 +8,7 @@
"name": "corecontrol",
"version": "0.1.0",
"dependencies": {
"@prisma/client": "^6.6.0",
"@prisma/extension-accelerate": "^1.3.0",
"@radix-ui/react-alert-dialog": "^1.1.7",
"@radix-ui/react-dialog": "^1.1.7",
@ -1045,7 +1046,6 @@
"integrity": "sha512-vfp73YT/BHsWWOAuthKQ/1lBgESSqYqAWZEYyTdGXyFAHpmewwWL2Iz6ErIzkj4aHbuc6/cGSsE6ZY+pBO04Cg==",
"hasInstallScript": true,
"license": "Apache-2.0",
"peer": true,
"engines": {
"node": ">=18.18"
},

View File

@ -9,6 +9,7 @@
"lint": "next lint"
},
"dependencies": {
"@prisma/client": "^6.6.0",
"@prisma/extension-accelerate": "^1.3.0",
"@radix-ui/react-alert-dialog": "^1.1.7",
"@radix-ui/react-dialog": "^1.1.7",