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:
@@ -67,11 +67,11 @@ model Pengaduan {
|
|||||||
idWarga String
|
idWarga String
|
||||||
noPengaduan String
|
noPengaduan String
|
||||||
title String?
|
title String?
|
||||||
phone String?
|
|
||||||
detail String?
|
detail String?
|
||||||
location String?
|
location String?
|
||||||
image String?
|
image String?
|
||||||
status StatusPengaduan @default(diterima)
|
keterangan String?
|
||||||
|
status StatusPengaduan @default(antrian)
|
||||||
isActive Boolean @default(true)
|
isActive Boolean @default(true)
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
@@ -82,12 +82,10 @@ model HistoryPengaduan {
|
|||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
Pengaduan Pengaduan @relation(fields: [idPengaduan], references: [id])
|
Pengaduan Pengaduan @relation(fields: [idPengaduan], references: [id])
|
||||||
idPengaduan String
|
idPengaduan String
|
||||||
User User @relation(fields: [idUser], references: [id])
|
User User? @relation(fields: [idUser], references: [id])
|
||||||
idUser String
|
idUser String?
|
||||||
deskripsi String?
|
deskripsi String?
|
||||||
status StatusPengaduan @default(diterima)
|
status StatusPengaduan @default(antrian)
|
||||||
image String?
|
|
||||||
order Int
|
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
23
src/server/lib/no-pengaduan.ts
Normal file
23
src/server/lib/no-pengaduan.ts
Normal 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}`
|
||||||
|
}
|
||||||
@@ -23,12 +23,12 @@ const AduanRoute = new Elysia({
|
|||||||
})
|
})
|
||||||
.post("/aduan-sampah", async (ctx) => {
|
.post("/aduan-sampah", async (ctx) => {
|
||||||
const { judul, deskripsi } = ctx.body;
|
const { judul, deskripsi } = ctx.body;
|
||||||
await prisma.pengaduanSampah.create({
|
// await prisma.pengaduanSampah.create({
|
||||||
data: {
|
// data: {
|
||||||
judul,
|
// judul,
|
||||||
deskripsi,
|
// deskripsi,
|
||||||
}
|
// }
|
||||||
})
|
// })
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
data: "berhasil membuat aduan sampah"
|
data: "berhasil membuat aduan sampah"
|
||||||
@@ -44,11 +44,11 @@ const AduanRoute = new Elysia({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.get("/list-aduan-sampah", async () => {
|
.get("/list-aduan-sampah", async () => {
|
||||||
const data = await prisma.pengaduanSampah.findMany()
|
// const data = await prisma.pengaduanSampah.findMany()
|
||||||
return {
|
// return {
|
||||||
success: true,
|
// success: true,
|
||||||
data: data
|
// data: data
|
||||||
}
|
// }
|
||||||
}, {
|
}, {
|
||||||
detail: {
|
detail: {
|
||||||
summary: "list aduan sampah",
|
summary: "list aduan sampah",
|
||||||
|
|||||||
@@ -194,14 +194,14 @@ const DarmasabaRoute = new Elysia({
|
|||||||
.post("/buat-pengaduan", async ({ body }) => {
|
.post("/buat-pengaduan", async ({ body }) => {
|
||||||
const { jenis_laporan, name, phone, detail } = body
|
const { jenis_laporan, name, phone, detail } = body
|
||||||
|
|
||||||
await prisma.pengaduan.create({
|
// await prisma.pengaduan.create({
|
||||||
data: {
|
// data: {
|
||||||
jenis_laporan,
|
// jenis_laporan,
|
||||||
detail,
|
// detail,
|
||||||
name,
|
// name,
|
||||||
phone
|
// phone
|
||||||
}
|
// }
|
||||||
})
|
// })
|
||||||
|
|
||||||
return `
|
return `
|
||||||
${JSON.stringify(body)}
|
${JSON.stringify(body)}
|
||||||
@@ -223,14 +223,14 @@ const DarmasabaRoute = new Elysia({
|
|||||||
.post("/status-pengaduan", async ({ body }) => {
|
.post("/status-pengaduan", async ({ body }) => {
|
||||||
const { name, phone } = body
|
const { name, phone } = body
|
||||||
|
|
||||||
const pengaduan = await prisma.pengaduan.findMany({
|
// const pengaduan = await prisma.pengaduan.findMany({
|
||||||
where: {
|
// where: {
|
||||||
name,
|
// name,
|
||||||
phone
|
// phone
|
||||||
}
|
// }
|
||||||
})
|
// })
|
||||||
|
|
||||||
return pengaduan
|
// return pengaduan
|
||||||
|
|
||||||
}, {
|
}, {
|
||||||
body: t.Object({
|
body: t.Object({
|
||||||
|
|||||||
203
src/server/routes/pengaduan_route.ts
Normal file
203
src/server/routes/pengaduan_route.ts
Normal 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
|
||||||
Reference in New Issue
Block a user