From 7587b3ac540626c66cb2bbe9a32e55e72ecccf85 Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Mon, 27 Oct 2025 17:40:56 +0800 Subject: [PATCH] upd: mcp pengaduan Deskripsi: - database pengaduan - api categori pengaduan > create list update hapus - api pengaduan > create pengaduan dan history, update status dan create history No Issues --- prisma/schema.prisma | 12 +- src/pages/list/list_pengaduan_sampah.tsx | 13 -- src/server/lib/no-pengaduan.ts | 23 +++ src/server/routes/aduan_route.ts | 22 +-- src/server/routes/darmasaba_route.ts | 30 ++-- src/server/routes/pengaduan_route.ts | 203 +++++++++++++++++++++++ 6 files changed, 257 insertions(+), 46 deletions(-) delete mode 100644 src/pages/list/list_pengaduan_sampah.tsx create mode 100644 src/server/lib/no-pengaduan.ts create mode 100644 src/server/routes/pengaduan_route.ts diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 6f92e9a..858f99f 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -67,11 +67,11 @@ model Pengaduan { idWarga String noPengaduan String title String? - phone String? detail String? location String? image String? - status StatusPengaduan @default(diterima) + keterangan String? + status StatusPengaduan @default(antrian) isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@ -82,12 +82,10 @@ model HistoryPengaduan { id String @id @default(cuid()) Pengaduan Pengaduan @relation(fields: [idPengaduan], references: [id]) idPengaduan String - User User @relation(fields: [idUser], references: [id]) - idUser String + User User? @relation(fields: [idUser], references: [id]) + idUser String? deskripsi String? - status StatusPengaduan @default(diterima) - image String? - order Int + status StatusPengaduan @default(antrian) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } diff --git a/src/pages/list/list_pengaduan_sampah.tsx b/src/pages/list/list_pengaduan_sampah.tsx deleted file mode 100644 index e1fc389..0000000 --- a/src/pages/list/list_pengaduan_sampah.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import apiFetch from "@/lib/apiFetch" -import useSWR from "swr" - -export default function ListPengaduanSampah() { - // const { data, error, isLoading, mutate } = useSWR("/", apiFetch.api.aduan["list-aduan-sampah"].get) - - - return ( -
-

List Pengaduan Sampah

-
- ) -} \ No newline at end of file diff --git a/src/server/lib/no-pengaduan.ts b/src/server/lib/no-pengaduan.ts new file mode 100644 index 0000000..634e5e7 --- /dev/null +++ b/src/server/lib/no-pengaduan.ts @@ -0,0 +1,23 @@ +import { prisma } from "./prisma" + +export const generateNoPengaduan = async () => { + const date = new Date() + const year = String(date.getFullYear()).slice(-2) // ambil 2 digit terakhir + const month = String(date.getMonth() + 1).padStart(2, "0") + const day = String(date.getDate()).padStart(2, "0") + + const prefix = `PGD-${day}${month}${year}` + + const count = await prisma.pengaduan.count({ + where: { + noPengaduan: { + contains: prefix + } + } + }) + + // pastikan nomor urut selalu 3 digit + const number = String(count + 1).padStart(3, "0") + + return `${prefix}-${number}` +} diff --git a/src/server/routes/aduan_route.ts b/src/server/routes/aduan_route.ts index a9d6d32..e652600 100644 --- a/src/server/routes/aduan_route.ts +++ b/src/server/routes/aduan_route.ts @@ -23,12 +23,12 @@ const AduanRoute = new Elysia({ }) .post("/aduan-sampah", async (ctx) => { const { judul, deskripsi } = ctx.body; - await prisma.pengaduanSampah.create({ - data: { - judul, - deskripsi, - } - }) + // await prisma.pengaduanSampah.create({ + // data: { + // judul, + // deskripsi, + // } + // }) return { success: true, data: "berhasil membuat aduan sampah" @@ -44,11 +44,11 @@ const AduanRoute = new Elysia({ } }) .get("/list-aduan-sampah", async () => { - const data = await prisma.pengaduanSampah.findMany() - return { - success: true, - data: data - } + // const data = await prisma.pengaduanSampah.findMany() + // return { + // success: true, + // data: data + // } }, { detail: { summary: "list aduan sampah", diff --git a/src/server/routes/darmasaba_route.ts b/src/server/routes/darmasaba_route.ts index c7827f6..ab3b3ea 100644 --- a/src/server/routes/darmasaba_route.ts +++ b/src/server/routes/darmasaba_route.ts @@ -194,14 +194,14 @@ const DarmasabaRoute = new Elysia({ .post("/buat-pengaduan", async ({ body }) => { const { jenis_laporan, name, phone, detail } = body - await prisma.pengaduan.create({ - data: { - jenis_laporan, - detail, - name, - phone - } - }) + // await prisma.pengaduan.create({ + // data: { + // jenis_laporan, + // detail, + // name, + // phone + // } + // }) return ` ${JSON.stringify(body)} @@ -223,14 +223,14 @@ const DarmasabaRoute = new Elysia({ .post("/status-pengaduan", async ({ body }) => { const { name, phone } = body - const pengaduan = await prisma.pengaduan.findMany({ - where: { - name, - phone - } - }) + // const pengaduan = await prisma.pengaduan.findMany({ + // where: { + // name, + // phone + // } + // }) - return pengaduan + // return pengaduan }, { body: t.Object({ diff --git a/src/server/routes/pengaduan_route.ts b/src/server/routes/pengaduan_route.ts new file mode 100644 index 0000000..2772ad5 --- /dev/null +++ b/src/server/routes/pengaduan_route.ts @@ -0,0 +1,203 @@ +import Elysia, { t } from "elysia" +import type { StatusPengaduan } from "generated/prisma" +import { generateNoPengaduan } from "../lib/no-pengaduan" +import { prisma } from "../lib/prisma" + +const PengaduanRoute = new Elysia({ + prefix: "pengaduan", + tags: ["pengaduan"], +}) + + // --- KATEGORI PENGADUAN --- + .get("/category", async () => { + const data = await prisma.categoryPengaduan.findMany({ + where: { + isActive: true + } + }) + return data + }, { + detail: { + summary: "get kategori pengaduan", + description: `tool untuk mendapatkan kategori pengaduan` + } + }) + .post("/category/create", async ({ body }) => { + const { name } = body + + await prisma.categoryPengaduan.create({ + data: { + name, + } + }) + + return ` + ${JSON.stringify(body)} + + kategori pengaduan sudah dibuat` + }, { + body: t.Object({ + name: t.String({ minLength: 1, error: "name harus diisi" }), + }), + detail: { + summary: "buat kategori pengaduan", + description: `tool untuk membuat kategori pengaduan` + } + }) + .post("/category/update", async ({ body }) => { + const { id, name } = body + + await prisma.categoryPengaduan.update({ + where: { + id, + }, + data: { + name + } + }) + + return ` + ${JSON.stringify(body)} + + kategori pengaduan sudah diperbarui` + }, { + body: t.Object({ + id: t.String({ minLength: 1, error: "id harus diisi" }), + name: t.String({ minLength: 1, error: "name harus diisi" }), + }), + detail: { + summary: "update kategori pengaduan", + description: `tool untuk update kategori pengaduan` + } + }) + .post("/category/delete", async ({ body }) => { + const { id } = body + + await prisma.categoryPengaduan.update({ + where: { + id, + }, + data: { + isActive: false + } + }) + + return ` + ${JSON.stringify(body)} + + kategori pengaduan sudah dihapus` + }, { + body: t.Object({ + id: t.String({ minLength: 1, error: "id harus diisi" }), + }), + detail: { + summary: "delete kategori pengaduan", + description: `tool untuk delete kategori pengaduan` + } + }) + + + + // --- PENGADUAN --- + .post("/create", async ({ body }) => { + const { title, detail, location, image, idCategory, idWarga } = body + const noPengaduan = await generateNoPengaduan() + + const pengaduan = await prisma.pengaduan.create({ + data: { + title, + detail, + idCategory, + idWarga, + location, + image, + noPengaduan, + }, + select: { + id: true, + } + }) + + if (!pengaduan.id) { + throw new Error("gagal membuat pengaduan") + } + + await prisma.historyPengaduan.create({ + data: { + idPengaduan: pengaduan.id, + deskripsi: "Pengaduan dibuat", + } + }) + + return ` + ${JSON.stringify(body)} + + pengaduan sudah dibuat` + }, { + body: t.Object({ + title: t.String({ minLength: 1, error: "title harus diisi" }), + detail: t.String({ minLength: 1, error: "detail harus diisi" }), + location: t.String({ minLength: 1, error: "location harus diisi" }), + image: t.String({ minLength: 1, error: "image harus diisi" }), + idCategory: t.String({ minLength: 1, error: "idCategory harus diisi" }), + idWarga: t.String({ minLength: 1, error: "idWarga harus diisi" }), + }), + detail: { + summary: "buat pengaduan", + description: `tool untuk membuat pengaduan` + } + }) + .post("/update-status", async ({ body }) => { + const { id, status, keterangan } = body + let deskripsi = "" + + const pengaduan = await prisma.pengaduan.update({ + where: { + id, + }, + data: { + status: status as StatusPengaduan, + keterangan, + } + }) + + if (!pengaduan) { + throw new Error("gagal membuat pengaduan") + } + + if(status === "diterima") { + deskripsi = "Pengaduan diterima oleh admin" + } else if(status === "dikerjakan") { + deskripsi = "Pengaduan dikerjakan oleh petugas" + } else if(status === "ditolak") { + deskripsi = "Pengaduan ditolak dengan keterangan " + keterangan + } else if(status === "selesai") { + deskripsi = "Pengaduan selesai" + } + + await prisma.historyPengaduan.create({ + data: { + idPengaduan: pengaduan.id, + deskripsi, + status: status as StatusPengaduan, + idUser: "" + } + }) + + return ` + ${JSON.stringify(body)} + + status pengaduan sudah diupdate` + }, { + body: t.Object({ + id: t.String({ minLength: 1, error: "id harus diisi" }), + status: t.String({ minLength: 1, error: "status harus diisi" }), + keterangan: t.Any() + }), + + detail: { + summary: "update status pengaduan", + description: `tool untuk update status pengaduan` + } + }) +export default PengaduanRoute