From 85cb36289c6282d7db2ca92b7320ac076eeecd7f Mon Sep 17 00:00:00 2001 From: bipproduction Date: Fri, 14 Nov 2025 10:46:23 +0800 Subject: [PATCH] tambahannnya --- src/index.tsx | 4 +- src/server/routes/mcp_route.ts | 2 +- src/server/routes/test.ts | 53 -------- src/server/routes/test_pengaduan.ts | 193 ++++++++++++++++++++++++++++ 4 files changed, 196 insertions(+), 56 deletions(-) delete mode 100644 src/server/routes/test.ts create mode 100644 src/server/routes/test_pengaduan.ts diff --git a/src/index.tsx b/src/index.tsx index 202417e..36a0209 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -13,7 +13,7 @@ import LayananRoute from "./server/routes/layanan_route"; import { MCPRoute } from "./server/routes/mcp_route"; import PelayananRoute from "./server/routes/pelayanan_surat_route"; import PengaduanRoute from "./server/routes/pengaduan_route"; -import TestRoute from "./server/routes/test"; +import TestPengaduanRoute from "./server/routes/test_pengaduan"; import UserRoute from "./server/routes/user_route"; import ConfigurationDesaRoute from "./server/routes/configuration_desa_route"; @@ -32,7 +32,7 @@ const Api = new Elysia({ .use(PengaduanRoute) .use(PelayananRoute) .use(ConfigurationDesaRoute) - .use(TestRoute) + .use(TestPengaduanRoute) .use(apiAuth) .use(ApiKeyRoute) .use(DarmasabaRoute) diff --git a/src/server/routes/mcp_route.ts b/src/server/routes/mcp_route.ts index 4fed010..b8a0640 100644 --- a/src/server/routes/mcp_route.ts +++ b/src/server/routes/mcp_route.ts @@ -4,7 +4,7 @@ import _ from "lodash"; var tools = [] as any[]; const OPENAPI_URL = process.env.BUN_PUBLIC_BASE_URL + "/docs/json"; -const FILTER_TAG = "mcp"; +const FILTER_TAG = "test"; if (!process.env.BUN_PUBLIC_BASE_URL) { throw new Error("BUN_PUBLIC_BASE_URL environment variable is not set"); diff --git a/src/server/routes/test.ts b/src/server/routes/test.ts deleted file mode 100644 index 3239439..0000000 --- a/src/server/routes/test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import Elysia, { t } from "elysia"; - -const TestRoute = new Elysia({ - prefix: "test", - tags: ["mcp", "test"], -}) -.get("/info-rapat-list", () => { - return { - success: true, - message: "data info rapat berhasil diambil", - data: [ - { - judul: "Info Rapat", - tanggal: "2025-11-10", - deskripsi: "Info rapat", - gambar: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/x8AAwMCAO+ip1sAAAAASUVORK5CYII=" - } - ] - } -}, { - detail: { - summary: "mendapatkan list rapat", - description: "mendapatkan list rapat dari database", - } -}) - -.post("/simpan-rapat", ({ body }) => { - if (!body.image_name) { - return { - success: false, - message: "gambar harus diisi", - } - } - return { - success: true, - message: "data info rapat berhasil diambil", - chunk: body.image_name.substring(22) - } -}, { - body: t.Object({ - judul: t.String(), - tanggal: t.String(), - deskripsi: t.String(), - image_name: t.Required(t.String()), - }), - detail: { - summary: "simpan data rapat", - description: "simpan data rapat memerlukan base64 gambar", - } -}) - -export default TestRoute - diff --git a/src/server/routes/test_pengaduan.ts b/src/server/routes/test_pengaduan.ts new file mode 100644 index 0000000..bdd9978 --- /dev/null +++ b/src/server/routes/test_pengaduan.ts @@ -0,0 +1,193 @@ +import Elysia, { t } from "elysia"; +import { prisma } from "../lib/prisma"; +import { generateNoPengaduan } from "../lib/no-pengaduan"; +import { normalizePhoneNumber } from "../lib/normalizePhone"; + +const TestPengaduanRoute = new Elysia({ + prefix: "test-pengaduan" +}) + .get("/category", async () => { + const data = await prisma.categoryPengaduan.findMany({ + where: { + isActive: true + }, + orderBy: { + name: "asc" + }, + select: { + id: true, + name: true, + } + }) + + + return { data } + }, { + detail: { + summary: "List Kategori Pengaduan", + description: `tool untuk mendapatkan list kategori pengaduan`, + tags: ["test"] + } + }) + + .post("/create", async ({ body }) => { + const { judulPengaduan, detailPengaduan, lokasi, namaGambar, kategoriId, wargaId, noTelepon } = body + let imageFix = namaGambar + const noPengaduan = await generateNoPengaduan() + let idCategoryFix = kategoriId + let idWargaFix = wargaId + const category = await prisma.categoryPengaduan.findUnique({ + where: { + id: kategoriId, + } + }) + + if (!category) { + const cariCategory = await prisma.categoryPengaduan.findFirst({ + where: { + name: kategoriId, + } + }) + + if (!cariCategory) { + idCategoryFix = "lainnya" + } else { + idCategoryFix = cariCategory.id + } + + } + + const warga = await prisma.warga.findUnique({ + where: { + id: wargaId, + } + }) + + if (!warga) { + const nomorHP = normalizePhoneNumber({ phone: noTelepon }) + const cariWarga = await prisma.warga.findUnique({ + where: { + phone: nomorHP, + } + }) + + if (!cariWarga) { + const wargaCreate = await prisma.warga.create({ + data: { + name: wargaId, + phone: nomorHP, + }, + select: { + id: true + } + }) + idWargaFix = wargaCreate.id + } else { + idWargaFix = cariWarga.id + } + + } + + const pengaduan = await prisma.pengaduan.create({ + data: { + title: judulPengaduan, + detail: detailPengaduan, + idCategory: idCategoryFix, + idWarga: idWargaFix, + location: lokasi, + image: imageFix, + noPengaduan, + }, + select: { + id: true, + } + }) + + if (!pengaduan.id) { + return { success: false, message: 'gagal membuat pengaduan' } + } + + await prisma.historyPengaduan.create({ + data: { + idPengaduan: pengaduan.id, + deskripsi: "Pengaduan dibuat", + } + }) + + return { success: true, message: 'pengaduan sudah dibuat dengan nomer ' + noPengaduan + ', nomer ini akan digunakan untuk mengakses pengaduan ini' } + }, { + body: t.Object({ + judulPengaduan: t.String({ + minLength: 3, + error: "Judul pengaduan harus diisi dan minimal 3 karakter", + examples: ["Sampah menumpuk di depan rumah"], + description: "Judul singkat dari pengaduan warga" + }), + + detailPengaduan: t.String({ + minLength: 5, + error: "Deskripsi pengaduan harus diisi dan minimal 10 karakter", + examples: ["Terdapat sampah yang menumpuk selama seminggu di depan rumah saya"], + description: "Penjelasan lebih detail mengenai pengaduan" + }), + + lokasi: t.String({ + minLength: 5, + error: "Lokasi pengaduan harus diisi", + examples: ["Jl. Raya No. 1, RT 01 RW 02, Darmasaba"], + description: "Alamat atau titik lokasi pengaduan" + }), + + namaGambar: t.String({ + optional: true, + examples: ["sampah.jpg"], + description: "Nama file gambar yang telah diupload (opsional)" + }), + + kategoriId: t.String({ + minLength: 1, + error: "ID kategori pengaduan harus diisi", + examples: ["kebersihan"], + description: "ID atau nama kategori pengaduan (contoh: kebersihan, keamanan, lainnya)" + }), + + wargaId: t.String({ + minLength: 1, + error: "ID warga harus diisi", + examples: ["budiman"], + description: "ID unik warga yang melapor (jika sudah terdaftar)" + }), + + noTelepon: t.String({ + minLength: 1, + error: "Nomor telepon harus diisi", + examples: ["08123456789", "+628123456789"], + description: "Nomor telepon warga pelapor" + }), + }), + + detail: { + summary: "Buat Pengaduan Warga", + description: ` + Endpoint ini digunakan untuk membuat data pengaduan (laporan) baru dari warga. + + Alur proses: + 1. Sistem memvalidasi kategori pengaduan berdasarkan ID. + - Jika ID kategori tidak ditemukan, sistem akan mencari berdasarkan nama kategori. + - Jika tetap tidak ditemukan, kategori akan diset menjadi "lainnya". + 2. Sistem memvalidasi data warga berdasarkan ID. + - Jika warga tidak ditemukan, sistem akan mencari berdasarkan nomor telepon. + - Jika tetap tidak ditemukan, data warga baru akan dibuat secara otomatis. + 3. Sistem menghasilkan nomor pengaduan unik (noPengaduan). + 4. Data pengaduan akan disimpan ke database, termasuk judul, detail, lokasi, gambar (opsional), dan data warga. + 5. Sistem juga membuat catatan riwayat awal pengaduan dengan deskripsi "Pengaduan dibuat". + + Respon: + - success: true jika pengaduan berhasil dibuat. + - message: berisi pesan sukses dan nomor pengaduan yang dapat digunakan untuk melacak status pengaduan.`, + tags: ["test"] + } + }) + +export default TestPengaduanRoute +