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
This commit is contained in:
2025-10-27 17:40:56 +08:00
parent addd41389a
commit 7587b3ac54
6 changed files with 257 additions and 46 deletions

View File

@@ -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
}

View File

@@ -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 (
<div>
<h1>List Pengaduan Sampah</h1>
</div>
)
}

View File

@@ -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}`
}

View File

@@ -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",

View File

@@ -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({

View File

@@ -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