API & UI Menu Inovasi & Submenu Layan Online Desa 2 tabs

This commit is contained in:
2025-07-16 00:20:55 +08:00
parent e8ad74d118
commit 55433128a9
45 changed files with 2566 additions and 399 deletions

View File

@@ -0,0 +1,36 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormCreateAjukanIdeInovatif = Prisma.AjukanIdeInovatifGetPayload<{
select: {
name: true;
deskripsi: true;
alamat: true;
namaIde: true;
masalah: true;
benefit: true;
}
}>
export default async function ajukanIdeInovatifCreate(context: Context){
const body = context.body as FormCreateAjukanIdeInovatif;
await prisma.ajukanIdeInovatif.create({
data: {
name: body.name,
deskripsi: body.deskripsi,
alamat: body.alamat,
namaIde: body.namaIde,
masalah: body.masalah,
benefit: body.benefit,
}
})
return {
success: true,
message: "Success create ajukan ide inovatif",
data: {
...body,
}
}
}

View File

@@ -0,0 +1,34 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function ajukanIdeInovatifDelete(context: Context) {
const id = context.params?.id as string;
if (!id) {
return {
status: 400,
body: "ID tidak diberikan",
};
}
const ajukanIdeInovatif = await prisma.ajukanIdeInovatif.findUnique({
where: { id },
});
if (!ajukanIdeInovatif) {
return {
status: 404,
body: "Ajukan ide inovatif tidak ditemukan",
};
}
await prisma.ajukanIdeInovatif.delete({
where: { id },
});
return {
success: true,
message: "Ajukan ide inovatif berhasil dihapus",
status: 200,
};
}

View File

@@ -0,0 +1,19 @@
import prisma from "@/lib/prisma";
export default async function ajukanIdeInovatifFindMany() {
try {
const data = await prisma.ajukanIdeInovatif.findMany({});
return {
success: true,
message: "Success fetch ajukan ide inovatif",
data,
};
} catch (error) {
console.error("Find many error:", error);
return {
success: false,
message: "Failed fetch ajukan ide inovatif",
};
}
}

View File

@@ -0,0 +1,46 @@
import prisma from "@/lib/prisma";
export default async function ajukanIdeInovatifFindUnique(request: Request) {
const url = new URL(request.url);
const pathSegments = url.pathname.split("/");
const id = pathSegments[pathSegments.length - 1];
if (!id) {
return Response.json({
success: false,
message: "ID tidak ditemukan",
}, {status: 400});
}
try {
if (typeof id !== 'string') {
return Response.json({
success: false,
message: "ID tidak valid",
}, {status: 400});
}
const data = await prisma.ajukanIdeInovatif.findUnique({
where: { id },
});
if (!data) {
return Response.json({
success: false,
message: "Ajukan ide inovatif tidak ditemukan",
}, {status: 404});
}
return Response.json({
success: true,
message: "Success fetch ajukan ide inovatif by ID",
data,
}, {status: 200});
} catch (error) {
console.error("Find by ID error:", error);
return Response.json({
success: false,
message: "Gagal mengambil ajukan ide inovatif: " + (error instanceof Error ? error.message : 'Unknown error'),
}, {status: 500});
}
}

View File

@@ -0,0 +1,27 @@
import Elysia, { t } from "elysia";
import ajukanIdeInovatifCreate from "./create";
import ajukanIdeInovatifFindMany from "./findMany";
import ajukanIdeInovatifFindUnique from "./findUnique";
import ajukanIdeInovatifDelete from "./del";
const AjukanIdeInovatif = new Elysia({
prefix: "/ajukanideinovatif",
tags: ["Inovasi/AjukanIde"],
})
.post("/create", ajukanIdeInovatifCreate, {
body: t.Object({
name: t.String(),
deskripsi: t.String(),
alamat: t.String(),
namaIde: t.String(),
masalah: t.String(),
benefit: t.String(),
}),
})
.get("/find-many", ajukanIdeInovatifFindMany)
.get("/:id", async (context) => {
const response = await ajukanIdeInovatifFindUnique(context.request);
return response;
})
.delete("/del/:id", ajukanIdeInovatifDelete);
export default AjukanIdeInovatif;