From aec2f5094a4c8ca5ba4b298d4b78af93dbb54f0a Mon Sep 17 00:00:00 2001 From: nico Date: Thu, 3 Jul 2025 11:24:54 +0800 Subject: [PATCH] Push 1 Program Kemiskinan --- prisma/schema.prisma | 24 ++ .../_state/ekonomi/program-kemiskinan.ts | 249 ++++++++++++++++++ .../{ => [id]}/edit/page.tsx | 0 .../ekonomi/program-kemiskinan/[id]/page.tsx | 126 +++++++++ .../program-kemiskinan/create/page.tsx | 96 +++++-- .../program-kemiskinan/detail/page.tsx | 66 ----- .../ekonomi/program-kemiskinan/page.tsx | 48 +++- .../api/[[...slugs]]/_lib/ekonomi/index.ts | 2 + .../_lib/ekonomi/program-kemiskinan/create.ts | 41 +++ .../_lib/ekonomi/program-kemiskinan/del.ts | 19 ++ .../ekonomi/program-kemiskinan/findMany.ts | 18 ++ .../ekonomi/program-kemiskinan/findUnique.ts | 49 ++++ .../_lib/ekonomi/program-kemiskinan/index.ts | 42 +++ .../_lib/ekonomi/program-kemiskinan/updt.ts | 43 +++ 14 files changed, 726 insertions(+), 97 deletions(-) create mode 100644 src/app/admin/(dashboard)/_state/ekonomi/program-kemiskinan.ts rename src/app/admin/(dashboard)/ekonomi/program-kemiskinan/{ => [id]}/edit/page.tsx (100%) create mode 100644 src/app/admin/(dashboard)/ekonomi/program-kemiskinan/[id]/page.tsx delete mode 100644 src/app/admin/(dashboard)/ekonomi/program-kemiskinan/detail/page.tsx create mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/create.ts create mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/del.ts create mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/findMany.ts create mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/findUnique.ts create mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/index.ts create mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/updt.ts diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 6220f300..4fe07614 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1091,3 +1091,27 @@ model LowonganPekerjaan { updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) } + +// ========================================= PROGRAM KEMISKINAN ========================================= // +model ProgramKemiskinan { + id String @id @default(uuid()) + nama String + deskripsi String + ikonUrl String? + isActive Boolean @default(true) + // Tambahkan relasi one-to-one ke StatistikKemiskinan + statistikId String? @unique // Foreign key ke StatistikKemiskinan, unique untuk one-to-one + statistik StatistikKemiskinan? @relation(fields: [statistikId], references: [id]) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model StatistikKemiskinan { + id String @id @default(uuid()) + tahun Int @unique + jumlah Int + // Tidak perlu foreign key di sini jika relasi di ProgramLayanan + programKemiskinan ProgramKemiskinan? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} diff --git a/src/app/admin/(dashboard)/_state/ekonomi/program-kemiskinan.ts b/src/app/admin/(dashboard)/_state/ekonomi/program-kemiskinan.ts new file mode 100644 index 00000000..24b97801 --- /dev/null +++ b/src/app/admin/(dashboard)/_state/ekonomi/program-kemiskinan.ts @@ -0,0 +1,249 @@ +import ApiFetch from "@/lib/api-fetch"; +import { Prisma } from "@prisma/client"; +import { toast } from "react-toastify"; +import { proxy } from "valtio"; +import { z } from "zod"; + +const templateForm = z.object({ + nama: z.string().min(1, "Nama minimal 1 karakter"), + deskripsi: z.string().min(1, "Deskripsi minimal 1 karakter"), + ikonUrl: z.string().optional(), + statistik: z.object({ + tahun: z.string().min(1, "Tahun minimal 1 karakter"), + jumlah: z.string().min(1, "Jumlah minimal 1 karakter"), + }) + +}); + +const defaultForm = { + nama: "", + deskripsi: "", + ikonUrl: "", + statistik: { + tahun: "", + jumlah: "" + } +}; + +const programKemiskinanState = proxy({ + create: { + form: { ...defaultForm }, + loading: false, + async create() { + const cek = templateForm.safeParse(programKemiskinanState.create.form); + if (!cek.success) { + const err = `[${cek.error.issues + .map((v) => `${v.path.join(".")}`) + .join("\n")}] required`; + return toast.error(err); + } + + try { + programKemiskinanState.create.loading = true; + const res = await ApiFetch.api.ekonomi.programkemiskinan["create"].post( + programKemiskinanState.create.form + ); + if (res.status === 200) { + programKemiskinanState.findMany.load(); + return toast.success("success create"); + } + console.log(res); + return toast.error("failed create"); + } catch (error) { + console.log(error); + return toast.error("failed create"); + } finally { + programKemiskinanState.create.loading = false; + } + }, + }, + findMany: { + data: [] as Prisma.ProgramKemiskinanGetPayload<{ + include: { + statistik: true; + }; + }>[], + loading: false, + async load() { + const res = await ApiFetch.api.ekonomi.programkemiskinan[ + "find-many" + ].get(); + if (res.status === 200) { + programKemiskinanState.findMany.data = res.data?.data ?? []; + } + }, + }, + findUnique: { + data: null as Prisma.ProgramKemiskinanGetPayload<{ + include: { + statistik: true; + }; + }> | null, + loading: false, + async load(id: string) { + try { + const res = await fetch(`/api/ekonomi/programkemiskinan/${id}`); + if (res.ok) { + const data = await res.json(); + programKemiskinanState.findUnique.data = data.data ?? null; + } else { + console.error("Failed to fetch data", res.status, res.statusText); + programKemiskinanState.findUnique.data = null; + } + } catch (error) { + console.error("Error fetching data:", error); + programKemiskinanState.findUnique.data = null; + } + }, + }, + update: { + id: "", + form: { ...defaultForm }, + loading: false, + async load(id: string) { + if (!id) { + toast.warn("ID tidak valid"); + return null; + } + + try { + const response = await fetch(`/api/ekonomi/programkemiskinan/${id}`, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const result = await response.json(); + + if (result?.success) { + const data = result.data; + this.id = data.id; + this.form = { + nama: data.nama, + deskripsi: data.deskripsi, + ikonUrl: data.ikonUrl || "", + statistik: { + tahun: data.statistik.tahun, + jumlah: data.statistik.jumlah, + }, + }; + return data; // Return the loaded data + } else { + throw new Error(result?.message || "Gagal memuat data"); + } + } catch (error) { + console.error("Error loading program kemiskinan:", error); + toast.error( + error instanceof Error ? error.message : "Gagal memuat data" + ); + return null; + } + }, + async update() { + const cek = templateForm.safeParse(programKemiskinanState.update.form); + if (!cek.success) { + const err = `[${cek.error.issues + .map((v) => `${v.path.join(".")}`) + .join("\n")}] required`; + toast.error(err); + return false; + } + + try { + programKemiskinanState.update.loading = true; + + const response = await fetch( + `/api/ekonomi/programkemiskinan/${this.id}`, + { + method: "PUT", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + nama: this.form.nama, + deskripsi: this.form.deskripsi, + ikonUrl: this.form.ikonUrl, + statistik: { + tahun: this.form.statistik.tahun, + jumlah: this.form.statistik.jumlah, + }, + }), + } + ); + + if (!response.ok) { + const errorData = await response.json().catch(() => ({})); + throw new Error( + errorData.message || `HTTP error! status: ${response.status}` + ); + } + + const result = await response.json(); + + if (result.success) { + toast.success("Berhasil update program kemiskinan"); + await programKemiskinanState.findMany.load(); // refresh list + return true; + } else { + throw new Error(result.message || "Gagal update program kemiskinan"); + } + } catch (error) { + console.error("Error updating program kemiskinan:", error); + toast.error( + error instanceof Error + ? error.message + : "Terjadi kesalahan saat update program kemiskinan" + ); + return false; + } finally { + programKemiskinanState.update.loading = false; + } + }, + reset() { + programKemiskinanState.update.id = ""; + programKemiskinanState.update.form = { ...defaultForm }; + }, + }, + delete: { + loading: false, + async delete(id: string) { + if (!id) return toast.warn("ID tidak valid"); + + try { + programKemiskinanState.delete.loading = true; + + const response = await fetch( + `/api/ekonomi/programkemiskinan/del/${id}`, + { + method: "DELETE", + headers: { + "Content-Type": "application/json", + }, + } + ); + + const result = await response.json(); + + if (response.ok && result?.success) { + toast.success( + result.message || "Program kemiskinan berhasil dihapus" + ); + await programKemiskinanState.findMany.load(); // refresh list + } else { + toast.error(result?.message || "Gagal menghapus program kemiskinan"); + } + } catch (error) { + console.error("Gagal delete:", error); + toast.error("Terjadi kesalahan saat menghapus program kemiskinan"); + } finally { + programKemiskinanState.delete.loading = false; + } + }, + }, +}); + +export default programKemiskinanState; diff --git a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/edit/page.tsx b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/[id]/edit/page.tsx similarity index 100% rename from src/app/admin/(dashboard)/ekonomi/program-kemiskinan/edit/page.tsx rename to src/app/admin/(dashboard)/ekonomi/program-kemiskinan/[id]/edit/page.tsx diff --git a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/[id]/page.tsx new file mode 100644 index 00000000..83563a8f --- /dev/null +++ b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/[id]/page.tsx @@ -0,0 +1,126 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +'use client' +import colors from '@/con/colors'; +import { Box, Button, Flex, Paper, Skeleton, Stack, Text } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { IconArrowBack, IconEdit, IconX } from '@tabler/icons-react'; +import { useParams, useRouter } from 'next/navigation'; +import { useEffect, useState } from 'react'; +import { useProxy } from 'valtio/utils'; +import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; +import programKemiskinanState from '../../../_state/ekonomi/program-kemiskinan'; + + +function DetailProgramKemiskinan() { + const programState = useProxy(programKemiskinanState) + const [lineChart, setLineChart] = useState([]); + const [mounted, setMounted] = useState(false); + const [modalHapus, setModalHapus] = useState(false) + const [selectedId, setSelectedId] = useState(null) + const router = useRouter(); + const params = useParams() + + useShallowEffect(() => { + setMounted(true); + programState.findUnique.load(params?.id as string) + }, []) + + const handleHapus = () => { + if (selectedId) { + programState.delete.delete(selectedId) + setModalHapus(false) + setSelectedId(null) + router.push("/admin/ekonomi/program-kemiskinan") + } + } + + useEffect(() => { + if (programState.findUnique.data) { + setLineChart([programState.findUnique.data]); + } + }, [programState.findUnique.data]) + + if (!programState.findUnique.data) { + return ( + + + + ) + } + return ( + + + + + + + Detail Program Kemiskinan + + + + Judul Program + {programState.findUnique.data?.nama} + + + Deskripsi Singkat + + + + Ikon URL + {programState.findUnique.data?.ikonUrl} + + Statistik Jumlah Masyarakat Miskin + + Jumlah Masyarakat Miskin + {programState.findUnique.data?.statistik?.jumlah} + + + Tahun + {programState.findUnique.data?.statistik?.tahun} + + + + + + + + + + + {/* Modal Hapus */} + setModalHapus(false)} + onConfirm={handleHapus} + text="Apakah anda yakin ingin menghapus program kemiskinan ini?" + /> + + ); +} + +export default DetailProgramKemiskinan; + diff --git a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/create/page.tsx index d75821c2..d67af82a 100644 --- a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/create/page.tsx @@ -1,45 +1,107 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import colors from '@/con/colors'; import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; +import { useProxy } from 'valtio/utils'; +import programKemiskinanState from '../../../_state/ekonomi/program-kemiskinan'; +import CreateEditor from '../../../_com/createEditor'; +import { useState } from 'react'; function CreateProgramKemiskinan() { + const programState = useProxy(programKemiskinanState) const router = useRouter(); + const [lineChart, setLineChart] = useState([]); + + const resetForm = () => { + programState.create.form = { + nama: "", + deskripsi: "", + ikonUrl: "", + statistik: { + tahun: "", + jumlah: "", + } + } + } + + const handleSubmit = async () => { + const id = await programState.create.create(); + if (id) { + const idStr = String(id); + await programState.findUnique.load(idStr); + if (programState.findUnique.data) { + setLineChart([programState.findUnique.data]); + } + } + resetForm() + router.push("/admin/ekonomi/program-kemiskinan") + } + return ( - + Create Program Kemiskinan Judul Program} - placeholder='Masukkan judul program' + value={programState.create.form.nama} + onChange={(val) => { + programState.create.form.nama = val.target.value; + }} + label={Judul Program} + placeholder='Masukkan judul program' + /> + + Deskripsi + { + programState.create.form.deskripsi = val; + }} + /> + + { + programState.create.form.ikonUrl = val.target.value; + }} + label={Ikon URL} + placeholder='Masukkan ikon url' + /> + Statistik Jumlah Masyarakat Miskin + { + programState.create.form.statistik.jumlah = val.target.value; + }} + label={Jumlah Masyarakat Miskin} + placeholder='Masukkan jumlah masyarakat miskin' /> Deskripsi Singkat} - placeholder='Masukkan deskripsi' - /> - Jumlah Masyarakat Miskin} - placeholder='Masukkan jumlah masyarakat miskin' - /> - Deskripsi} - placeholder='Masukkan deskripsi' + type='number' + value={programState.create.form.statistik.tahun} + onChange={(val) => { + programState.create.form.statistik.tahun = val.target.value; + }} + label={Tahun} + placeholder='Masukkan tahun' /> - + - + - + ); } diff --git a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/detail/page.tsx b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/detail/page.tsx deleted file mode 100644 index 81f605e7..00000000 --- a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/detail/page.tsx +++ /dev/null @@ -1,66 +0,0 @@ -'use client' -import colors from '@/con/colors'; -import { Box, Button, Flex, Paper, Stack, Text } from '@mantine/core'; -import { IconArrowBack, IconEdit, IconX } from '@tabler/icons-react'; -import { useRouter } from 'next/navigation'; -// import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; - -function DetailProgramKemiskinan() { - const router = useRouter(); - return ( - - - - - - - Detail Program Kemiskinan - - - - - Judul Program - Program A - - - Deskripsi Singkat - Deskripsi Program A - - - Jumlah Masyarakat Miskin - 100 - - - Deskripsi - Deskripsi Program A - - - - - - - - - - - - - {/* Modal Hapus - setModalHapus(false)} - onConfirm={handleHapus} - text="Apakah anda yakin ingin menghapus potensi ini?" - /> */} - - ); -} - -export default DetailProgramKemiskinan; - diff --git a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/page.tsx b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/page.tsx index 256305d8..abbf94de 100644 --- a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/page.tsx @@ -1,10 +1,13 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Paper, Table, TableTbody, TableTd, TableTh, TableThead, TableTr } from '@mantine/core'; +import { Box, Button, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core'; import { IconDeviceImac, IconSearch } from '@tabler/icons-react'; import HeaderSearch from '../../_com/header'; import JudulList from '../../_com/judulList'; import { useRouter } from 'next/navigation'; +import { useProxy } from 'valtio/utils'; +import programKemiskinanState from '../../_state/ekonomi/program-kemiskinan'; +import { useShallowEffect } from '@mantine/hooks'; function ProgramKemiskinan() { return ( @@ -14,13 +17,26 @@ function ProgramKemiskinan() { placeholder='pencarian' searchIcon={} /> - + ); } function ListProgramKemiskinan() { + const programState = useProxy(programKemiskinanState) const router = useRouter(); + + useShallowEffect(() => { + programState.findMany.load() + }, []) + + if (!programState.findMany.data) { + return ( + + + + ) + } return ( @@ -35,21 +51,25 @@ function ListProgramKemiskinan() { Deskripsi Singkat Jumlah Masyarakat Miskin Detail - + - - Program A - Deskripsi Program A - 100 - - - - + {programState.findMany.data?.map((item) => ( + + {item.nama} + + + + {item.statistik?.jumlah} + + + + + ))} - + ); diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/index.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/index.ts index 550c5a49..3bc040a0 100644 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/index.ts +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/index.ts @@ -2,6 +2,7 @@ import Elysia from "elysia"; import PasarDesa from "./pasar-desa"; import KategoriMakanan from "./kategori-makanan"; import LowonganKerja from "./lowongan-kerja"; +import ProgramKemiskinan from "./program-kemiskinan"; const Ekonomi = new Elysia({ prefix: "/api/ekonomi", @@ -10,5 +11,6 @@ const Ekonomi = new Elysia({ .use(PasarDesa) .use(KategoriMakanan) .use(LowonganKerja) +.use(ProgramKemiskinan) export default Ekonomi \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/create.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/create.ts new file mode 100644 index 00000000..a34684eb --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/create.ts @@ -0,0 +1,41 @@ +import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +type FormCreate = { + nama: string; + deskripsi: string; + ikonUrl?: string; // optional karena boleh null + statistik?: { + tahun: number; + jumlah: number; + }; +}; + +export default async function programKemiskinanCreate(context: Context) { + const body = context.body as FormCreate; + + const program = await prisma.programKemiskinan.create({ + data: { + nama: body.nama, + deskripsi: body.deskripsi, + ikonUrl: body.ikonUrl, + statistik: body.statistik + ? { + create: { + tahun: Number(body.statistik.tahun), + jumlah: Number(body.statistik.jumlah), + }, + } + : undefined, + }, + include: { + statistik: true, // untuk menampilkan data relasinya juga + }, + }); + + return { + success: true, + message: "Success create program kemiskinan dengan relasi statistik", + data: program, + }; +} diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/del.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/del.ts new file mode 100644 index 00000000..340d9063 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/del.ts @@ -0,0 +1,19 @@ +import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +export default async function programKemiskinanDelete(context: Context) { + const id = context.params.id as string; + + await prisma.programKemiskinan.delete({ + where: { id }, + include: { + statistik: true, + } + }); + + return { + status: 200, + success: true, + message: "Success delete program kemiskinan", + }; +} diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/findMany.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/findMany.ts new file mode 100644 index 00000000..f1d1f597 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/findMany.ts @@ -0,0 +1,18 @@ +import prisma from "@/lib/prisma"; + +export default async function programKemiskinanFindMany() { + const data = await prisma.programKemiskinan.findMany({ + include: { + statistik: true, // ikut sertakan relasinya + }, + orderBy: { + createdAt: "desc", + }, + }); + + return { + success: true, + message: "Success get all program layanan", + data, + }; +} diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/findUnique.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/findUnique.ts new file mode 100644 index 00000000..7032c898 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/findUnique.ts @@ -0,0 +1,49 @@ +import prisma from "@/lib/prisma"; + +export default async function programKemiskinanFindUnique(request: Request) { + const url = new URL(request.url); + const pathSegments = url.pathname.split('/'); + const id = pathSegments[pathSegments.length - 1]; + + if (!id) { + return { + success: false, + message: "ID is required", + } + } + + try { + if (typeof id !== 'string') { + return { + success: false, + message: "ID is required", + } + } + + const data = await prisma.programKemiskinan.findUnique({ + where: { id }, + include: { + statistik: true, + } + }); + + if (!data) { + return { + success: false, + message: "Data not found", + } + } + + return { + success: true, + message: "Success get program layanan", + data, + } + } catch (error) { + console.error("Find by ID error:", error); + return { + success: false, + message: "Gagal mengambil data: " + (error instanceof Error ? error.message : 'Unknown error'), + } + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/index.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/index.ts new file mode 100644 index 00000000..a9967668 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/index.ts @@ -0,0 +1,42 @@ +import Elysia, { t } from "elysia"; +import programKemiskinanCreate from "./create"; +import programKemiskinanDelete from "./del"; +import programKemiskinanFindUnique from "./findUnique"; +import programKemiskinanUpdate from "./updt"; +import programKemiskinanFindMany from "./findMany"; + +const ProgramKemiskinan = new Elysia({ + prefix: '/programkemiskinan', tags: ['Ekonomi / Program Kemiskinan'] +}) +.post("/create", programKemiskinanCreate, { + body: t.Object({ + nama: t.String(), + deskripsi: t.String(), + ikonUrl: t.String(), + statistik: t.Object({ + tahun: t.String(), + jumlah: t.String(), + }), + }), +}) +.delete("/del/:id", programKemiskinanDelete) +.get("/find-many", programKemiskinanFindMany) +.get("/:id", async (context) => { + const response = await programKemiskinanFindUnique(new Request(context.request)); + return response; +}) +.put("/:id", async (context) => { + const response = await programKemiskinanUpdate(context); + return response; +}, { + body: t.Object({ + nama: t.String(), + deskripsi: t.String(), + ikonUrl: t.String(), + statistik: t.Object({ + tahun: t.String(), + jumlah: t.String(), + }), + }), +}) +export default ProgramKemiskinan; \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/updt.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/updt.ts new file mode 100644 index 00000000..515da554 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/program-kemiskinan/updt.ts @@ -0,0 +1,43 @@ +import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +type FormUpdate = { + nama: string; + deskripsi: string; + ikonUrl?: string; + statistik?: { + tahun: number; + jumlah: number; + }; +}; + +export default async function programKemiskinanUpdate(context: Context) { + const id = context.params.id as string; + const body = context.body as FormUpdate; + + const program = await prisma.programKemiskinan.update({ + where: { id }, + data: { + nama: body.nama, + deskripsi: body.deskripsi, + ikonUrl: body.ikonUrl, + statistik: body.statistik + ? { + create: { + tahun: Number(body.statistik.tahun), + jumlah: Number(body.statistik.jumlah), + }, + } + : undefined, + }, + include: { + statistik: true, + }, + }); + + return { + success: true, + message: "Success update program kemiskinan", + data: program, + }; +}