Compare commits
7 Commits
amalia/28-
...
amalia/31-
| Author | SHA1 | Date | |
|---|---|---|---|
| 73bf785d13 | |||
| cc7dcccd1b | |||
| a475db688b | |||
| f93b486bbb | |||
| 06feeae9a5 | |||
| b102643675 | |||
|
|
b2f8dc3714 |
@@ -29,6 +29,7 @@ model User {
|
||||
updatedAt DateTime @updatedAt
|
||||
ApiKey ApiKey[]
|
||||
HistoryPengaduan HistoryPengaduan[]
|
||||
HistoryPelayanan HistoryPelayanan[]
|
||||
}
|
||||
|
||||
model ApiKey {
|
||||
@@ -92,13 +93,109 @@ model HistoryPengaduan {
|
||||
}
|
||||
|
||||
model Warga {
|
||||
id String @id @default(cuid())
|
||||
name String?
|
||||
phone String? @unique
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
Pengaduan Pengaduan[]
|
||||
id String @id @default(cuid())
|
||||
name String?
|
||||
phone String? @unique
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
Pengaduan Pengaduan[]
|
||||
PelayananAjuan PelayananAjuan[]
|
||||
SuratPelayanan SuratPelayanan[]
|
||||
}
|
||||
|
||||
model CategoryPelayanan {
|
||||
id String @id @default(cuid())
|
||||
name String
|
||||
syaratDokumen Json[]
|
||||
dataText String[]
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
PelayananAjuan PelayananAjuan[]
|
||||
SyaratDokumenPelayanan SyaratDokumenPelayanan[]
|
||||
DataTextPelayanan DataTextPelayanan[]
|
||||
SuratPelayanan SuratPelayanan[]
|
||||
}
|
||||
|
||||
model PelayananAjuan {
|
||||
id String @id @default(cuid())
|
||||
Warga Warga @relation(fields: [idWarga], references: [id])
|
||||
idWarga String
|
||||
CategoryPelayanan CategoryPelayanan @relation(fields: [idCategory], references: [id])
|
||||
idCategory String
|
||||
noPengajuan String
|
||||
status StatusPengaduan @default(antrian)
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
HistoryPelayanan HistoryPelayanan[]
|
||||
SyaratDokumenPelayanan SyaratDokumenPelayanan[]
|
||||
DataTextPelayanan DataTextPelayanan[]
|
||||
SuratPelayanan SuratPelayanan[]
|
||||
}
|
||||
|
||||
model HistoryPelayanan {
|
||||
id String @id @default(cuid())
|
||||
PelayananAjuan PelayananAjuan @relation(fields: [idPengajuanLayanan], references: [id])
|
||||
idPengajuanLayanan String
|
||||
User User? @relation(fields: [idUser], references: [id])
|
||||
idUser String?
|
||||
deskripsi String?
|
||||
status StatusPengaduan @default(antrian)
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
|
||||
model SyaratDokumenPelayanan {
|
||||
id String @id @default(cuid())
|
||||
PelayananAjuan PelayananAjuan @relation(fields: [idPengajuanLayanan], references: [id])
|
||||
idPengajuanLayanan String
|
||||
CategoryPelayanan CategoryPelayanan @relation(fields: [idCategory], references: [id])
|
||||
idCategory String
|
||||
jenis String
|
||||
value String
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
|
||||
model DataTextPelayanan {
|
||||
id String @id @default(cuid())
|
||||
PelayananAjuan PelayananAjuan @relation(fields: [idPengajuanLayanan], references: [id])
|
||||
idPengajuanLayanan String
|
||||
CategoryPelayanan CategoryPelayanan @relation(fields: [idCategory], references: [id])
|
||||
idCategory String
|
||||
jenis String
|
||||
value String
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
|
||||
model SuratPelayanan {
|
||||
id String @id @default(cuid())
|
||||
PelayananAjuan PelayananAjuan @relation(fields: [idPengajuanLayanan], references: [id])
|
||||
idPengajuanLayanan String
|
||||
CategoryPelayanan CategoryPelayanan @relation(fields: [idCategory], references: [id])
|
||||
idCategory String
|
||||
Warga Warga @relation(fields: [idWarga], references: [id])
|
||||
idWarga String
|
||||
noSurat String
|
||||
dateExpired DateTime @db.Date
|
||||
status Int
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
|
||||
model Configuration {
|
||||
id String @id @default(cuid())
|
||||
category String
|
||||
value String
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
|
||||
enum StatusPengaduan {
|
||||
|
||||
@@ -1,5 +1,29 @@
|
||||
import { categoryPelayananSurat } from "@/lib/categoryPelayananSurat";
|
||||
import { prisma } from "@/server/lib/prisma";
|
||||
|
||||
const category = [
|
||||
{
|
||||
id: "lainnya",
|
||||
name: "Lainnya"
|
||||
},
|
||||
{
|
||||
id: "kebersihan",
|
||||
name: "Kebersihan"
|
||||
},
|
||||
{
|
||||
id: "keamanan",
|
||||
name: "Keamanan"
|
||||
},
|
||||
{
|
||||
id: "pelayanan",
|
||||
name: "Pelayanan"
|
||||
},
|
||||
{
|
||||
id: "infrastruktur",
|
||||
name: "Infrastruktur"
|
||||
},
|
||||
]
|
||||
|
||||
const role = [
|
||||
{
|
||||
id: "developer",
|
||||
@@ -36,7 +60,7 @@ const user = [
|
||||
|
||||
console.log(`✅ Role ${r.name} seeded successfully`)
|
||||
}
|
||||
|
||||
|
||||
for (const u of user) {
|
||||
await prisma.user.upsert({
|
||||
where: { email: u.email },
|
||||
@@ -47,7 +71,27 @@ const user = [
|
||||
console.log(`✅ User ${u.email} seeded successfully`)
|
||||
}
|
||||
|
||||
|
||||
for (const c of category) {
|
||||
await prisma.categoryPengaduan.upsert({
|
||||
where: { id: c.id },
|
||||
create: c,
|
||||
update: c
|
||||
})
|
||||
|
||||
console.log(`✅ Category ${c.name} seeded successfully`)
|
||||
}
|
||||
|
||||
for (const cp of categoryPelayananSurat){
|
||||
await prisma.categoryPelayanan.upsert({
|
||||
where: { id: cp.id },
|
||||
create: cp,
|
||||
update: cp
|
||||
})
|
||||
|
||||
console.log(`✅ Category Pelayanan ${cp.name} seeded successfully`)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
})().catch((e) => {
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
import Swagger from "@elysiajs/swagger";
|
||||
import Elysia from "elysia";
|
||||
import html from "./index.html";
|
||||
import { convertOpenApiToMcp } from "./server/lib/mcp-converter";
|
||||
import { apiAuth } from "./server/middlewares/apiAuth";
|
||||
import AduanRoute from "./server/routes/aduan_route";
|
||||
import ApiKeyRoute from "./server/routes/apikey_route";
|
||||
import Auth from "./server/routes/auth_route";
|
||||
import CredentialRoute from "./server/routes/credential_route";
|
||||
import DarmasabaRoute from "./server/routes/darmasaba_route";
|
||||
import { convertOpenApiToMcp } from "./server/lib/mcp-converter";
|
||||
import UserRoute from "./server/routes/user_route";
|
||||
import LayananRoute from "./server/routes/layanan_route";
|
||||
import AduanRoute from "./server/routes/aduan_route";
|
||||
import { MCPRoute } from "./server/routes/mcp_route";
|
||||
import PelayananRoute from "./server/routes/pelayanan_surat_route";
|
||||
import PengaduanRoute from "./server/routes/pengaduan_route";
|
||||
import UserRoute from "./server/routes/user_route";
|
||||
|
||||
const Docs = new Elysia({
|
||||
tags: ["docs"],
|
||||
@@ -26,6 +27,7 @@ const Api = new Elysia({
|
||||
tags: ["api"],
|
||||
})
|
||||
.use(PengaduanRoute)
|
||||
.use(PelayananRoute)
|
||||
.use(apiAuth)
|
||||
.use(ApiKeyRoute)
|
||||
.use(DarmasabaRoute)
|
||||
|
||||
109
src/lib/categoryPelayananSurat.ts
Normal file
109
src/lib/categoryPelayananSurat.ts
Normal file
@@ -0,0 +1,109 @@
|
||||
export const categoryPelayananSurat = [
|
||||
{
|
||||
id: "skbedabiodata",
|
||||
name: "Surat Keterangan Beda Biodata Diri",
|
||||
syaratDokumen: [
|
||||
{ name: "pengantar kelian", desc: "Surat Pengantar Kelian Banjar Dinas di Wilayah Masing-masing" },
|
||||
{ name: "ktp/kk", desc: "Fotokopi KTP atau Kartu Keluarga" },
|
||||
{ name: "dokumen yang beda", desc: "Fotokopi dokumen bersangkutan yang terdapat perbedaan biodata diri, misalnya: Sertifikat Tanah, Ijazah, Polis Asuransi, dan lainnya." }
|
||||
],
|
||||
dataText: ["nik", "nama", "tempat tanggal lahir", "jenis kelamin", "alamat", "pekerjaan", "dokumen", "tertulis pada dokumen a", "tertulis pada dokumen b"]
|
||||
},
|
||||
{
|
||||
id: "skbelumkawin",
|
||||
name: "Surat Keterangan Belum Kawin",
|
||||
syaratDokumen: [
|
||||
{ name: "pengantar kelian", desc: "Surat Pengantar Kelian Banjar Dinas" },
|
||||
{ name: "ktp/kk", desc: "Fotokopi KTP dan Kartu Keluarga" },
|
||||
{ name: "akta cerai", desc: "Fotokopi Akta Cerai bagi yang berstatus janda/duda" }
|
||||
],
|
||||
dataText: ["nik", "nama", "tempat tanggal lahir", "jenis kelamin", "alamat", "status perkawinan"]
|
||||
},
|
||||
{
|
||||
id: "skdomisiliorganisasi",
|
||||
name: "Surat Keterangan Domisili Organisasi",
|
||||
syaratDokumen: [
|
||||
{ name: "pengantar kelian", desc: "Surat Pengantar Kelian Banjar Dinas" },
|
||||
{ name: "skt organisasi", desc: "Fotokopi Surat Keterangan Terdaftar (SKT) Organisasi atau Pengukuhan Kelompok" },
|
||||
{name: "susunan pengurus", desc: "Jika Pengajuan baru pembuatan SKT maka melengkapi Susunan Pengurus lengkap denganKop Organisasi"}
|
||||
],
|
||||
dataText: ["nama organisasi", "alamat organisasi", "nama pemohon", "jabatan pemohon", "kontak", "penanggung jawab", "tanggal berdiri"]
|
||||
},
|
||||
{
|
||||
id: "skkelahiran",
|
||||
name: "Surat Keterangan Kelahiran",
|
||||
syaratDokumen: [
|
||||
{ name: "pengantar kelian", desc: "Surat Pengantar Kelian Banjar Dinas" },
|
||||
{ name: "surat lahir", desc: "Fotokopi Surat Keterangan Lahir dari Bidan/Dokter (jika ada)" }
|
||||
],
|
||||
dataText: ["nama ayah", "nama ibu", "nama anak", "tanggal lahir", "tempat lahir", "jenis kelamin", "nama pelapor"]
|
||||
},
|
||||
{
|
||||
id: "skkelakuanbaik",
|
||||
name: "Surat Keterangan Kelakuan Baik (Pengantar SKCK)",
|
||||
syaratDokumen: [
|
||||
{ name: "pengantar kelian", desc: "Surat Pengantar Kelian Banjar Dinas" },
|
||||
{ name: "ktp/kk", desc: "Fotokopi KTP dan Kartu Keluarga" }
|
||||
],
|
||||
dataText: ["nik", "nama", "tempat tanggal lahir", "jenis kelamin", "alamat", "keperluan"]
|
||||
},
|
||||
{
|
||||
id: "skkematian",
|
||||
name: "Surat Keterangan Kematian",
|
||||
syaratDokumen: [
|
||||
{ name: "pengantar kelian", desc: "Surat Pengantar Kelian Banjar Dinas" },
|
||||
{ name: "ktp/kk", desc: "Fotokopi KTP atau Kartu Keluarga" },
|
||||
{ name: "surat kematian", desc: "Surat Keterangan Kematian dari Rumah Sakit/Dokter (jika ada)" }
|
||||
],
|
||||
dataText: ["nama almarhum", "nik", "tempat tanggal lahir", "alamat", "tanggal kematian", "waktu kematian", "penyebab kematian"]
|
||||
},
|
||||
{
|
||||
id: "skpenghasilan",
|
||||
name: "Surat Keterangan Penghasilan",
|
||||
syaratDokumen: [
|
||||
{ name: "pengantar kelian", desc: "Surat Pengantar Kelian Banjar Dinas" },
|
||||
{ name: "ktp ortu/kk", desc: "Fotokopi KTP orang tua atau Kartu Keluarga" },
|
||||
{ name: "surat pernyataan", desc: "Surat Pernyataan Penghasilan bermaterai" }
|
||||
],
|
||||
dataText: ["nama", "nik", "alamat", "pekerjaan", "jenis usaha", "penghasilan"]
|
||||
},
|
||||
{
|
||||
id: "sktempatusaha",
|
||||
name: "Surat Keterangan Tempat Usaha",
|
||||
syaratDokumen: [
|
||||
{ name: "pengantar kelian", desc: "Surat Pengantar Kelian Banjar Dinas" },
|
||||
{ name: "ktp/kk", desc: "Fotokopi KTP atau Kartu Keluarga" },
|
||||
{ name: "foto lokasi", desc: "Foto lokasi usaha dicetak dalam selembar kertas, diparaf dan distempel oleh Kelian" },
|
||||
{ name: "sppt/sertifikat/sewa", desc: "Fotokopi SPPT, Sertifikat Hak Milik, Surat Perjanjian Sewa, atau Kwitansi Pembayaran Sewa 3 bulan terakhir" }
|
||||
],
|
||||
dataText: ["nama usaha", "bidang usaha", "alamat usaha", "status tempat usaha", "luas tempat usaha", "jumlah karyawan", "tujuan pembuatan surat"]
|
||||
},
|
||||
{
|
||||
id: "sktidakmampu",
|
||||
name: "Surat Keterangan Tidak Mampu",
|
||||
syaratDokumen: [
|
||||
{ name: "pengantar kelian", desc: "Surat Pengantar Kelian Banjar Dinas" },
|
||||
{ name: "ktp/kia/kk", desc: "Fotokopi KTP, KIA, atau Kartu Keluarga" }
|
||||
],
|
||||
dataText: ["nik", "nama", "tempat tanggal lahir", "alamat", "alasan permohonan"]
|
||||
},
|
||||
{
|
||||
id: "skusaha",
|
||||
name: "Surat Keterangan Usaha",
|
||||
syaratDokumen: [
|
||||
{ name: "pengantar kelian", desc: "Surat Pengantar Kelian Banjar Dinas" },
|
||||
{ name: "ktp/kk", desc: "Fotokopi KTP atau Kartu Keluarga" },
|
||||
{ name: "foto lokasi", desc: "Foto lokasi usaha dicetak dalam selembar kertas, diparaf dan distempel oleh Kelian" }
|
||||
],
|
||||
dataText: ["jenis usaha", "alamat usaha"]
|
||||
},
|
||||
{
|
||||
id: "skyatimpiatu",
|
||||
name: "Surat Keterangan Yatim / Piatu / Yatim Piatu",
|
||||
syaratDokumen: [
|
||||
{ name: "pengantar kelian", desc: "Surat Pengantar Kelian Banjar Dinas" },
|
||||
{ name: "ktp/kia/kk", desc: "Fotokopi KTP, KIA, atau Kartu Keluarga" }
|
||||
],
|
||||
dataText: ["nama anak", "nama ayah", "status ayah", "nama ibu", "status ibu"]
|
||||
}
|
||||
];
|
||||
@@ -17,7 +17,7 @@ interface McpTool {
|
||||
|
||||
/**
|
||||
* Convert OpenAPI 3.x JSON spec into MCP-compatible tool definitions (without run()).
|
||||
* Each tool corresponds to an endpoint, with metadata stored under `x-props`.
|
||||
* Hanya menyertakan endpoint yang memiliki tag berisi "mcp".
|
||||
*/
|
||||
export function convertOpenApiToMcpTools(openApiJson: any): McpTool[] {
|
||||
const tools: McpTool[] = [];
|
||||
@@ -28,10 +28,14 @@ export function convertOpenApiToMcpTools(openApiJson: any): McpTool[] {
|
||||
if (path.startsWith("/mcp")) continue;
|
||||
|
||||
for (const [method, operation] of Object.entries<any>(methods as any)) {
|
||||
const tags: string[] = Array.isArray(operation.tags) ? operation.tags : [];
|
||||
|
||||
// ✅ exclude semua yang tidak punya tag atau tag-nya tidak mengandung "mcp"
|
||||
if (!tags.length || !tags.some(t => t.toLowerCase().includes("mcp"))) continue;
|
||||
|
||||
const rawName = _.snakeCase(operation.operationId || `${method}_${path}`) || "unnamed_tool";
|
||||
const name = cleanToolName(rawName);
|
||||
|
||||
const summary = operation.summary || `Execute ${method.toUpperCase()} ${path}`;
|
||||
const description =
|
||||
operation.description ||
|
||||
operation.summary ||
|
||||
@@ -51,9 +55,9 @@ export function convertOpenApiToMcpTools(openApiJson: any): McpTool[] {
|
||||
method: method.toUpperCase(),
|
||||
path,
|
||||
operationId: operation.operationId,
|
||||
tag: Array.isArray(operation.tags) ? operation.tags[0] : undefined,
|
||||
tag: tags[0],
|
||||
deprecated: operation.deprecated || false,
|
||||
summary: operation.summary, // ✅ tambahkan summary ke metadata
|
||||
summary: operation.summary,
|
||||
},
|
||||
inputSchema: {
|
||||
...schema,
|
||||
@@ -87,19 +91,18 @@ function cleanToolName(name: string): string {
|
||||
.replace(/(^_|_$)/g, "");
|
||||
}
|
||||
|
||||
// === Contoh Pemakaian ===
|
||||
// import openApiJson from "./openapi.json";
|
||||
// const tools = convertOpenApiToMcpTools(openApiJson, "https://api.wibudev.com");
|
||||
// console.log(JSON.stringify(tools, null, 2));
|
||||
|
||||
export async function getMcpTools(){
|
||||
/**
|
||||
* Ambil OpenAPI JSON dari endpoint dan konversi ke tools MCP
|
||||
*/
|
||||
export async function getMcpTools() {
|
||||
const data = await fetch(`${process.env.BUN_PUBLIC_BASE_URL}/docs/json`);
|
||||
const openApiJson = await data.json();
|
||||
const tools = convertOpenApiToMcpTools(openApiJson);
|
||||
return tools;
|
||||
}
|
||||
|
||||
// === CLI Mode ===
|
||||
if (import.meta.main) {
|
||||
const tools = await getMcpTools();
|
||||
Bun.write("./tools.json", JSON.stringify(tools, null, 2));
|
||||
await Bun.write("./tools.json", JSON.stringify(tools, null, 2));
|
||||
}
|
||||
|
||||
@@ -96,6 +96,7 @@ const LayananRoute = new Elysia({
|
||||
detail: {
|
||||
summary: "Create Layanan KTP/KK",
|
||||
description: "Create a new service request for KTP or KK.",
|
||||
tags: ["mcp"],
|
||||
},
|
||||
}
|
||||
)
|
||||
@@ -131,6 +132,7 @@ const LayananRoute = new Elysia({
|
||||
detail: {
|
||||
summary: "Cek Status KTP",
|
||||
description: "Retrieve the current status of a KTP/KK request by unique ID.",
|
||||
tags: ["mcp"],
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
@@ -151,7 +151,7 @@ async function handleMCPRequestAsync(
|
||||
// Elysia MCP Server
|
||||
// =====================
|
||||
export const MCPRoute = new Elysia({
|
||||
tags: ["MCP"]
|
||||
tags: ["MCP Server"]
|
||||
})
|
||||
.post("/mcp", async ({ request, set }) => {
|
||||
if (!tools.length) {
|
||||
|
||||
106
src/server/routes/pelayanan_surat_route.ts
Normal file
106
src/server/routes/pelayanan_surat_route.ts
Normal file
@@ -0,0 +1,106 @@
|
||||
import Elysia, { t } from "elysia"
|
||||
import { prisma } from "../lib/prisma"
|
||||
|
||||
const PelayananRoute = new Elysia({
|
||||
prefix: "pelayanan",
|
||||
tags: ["pelayanan"],
|
||||
})
|
||||
|
||||
// --- KATEGORI PELAYANAN ---
|
||||
.get("/category", async () => {
|
||||
const data = await prisma.categoryPelayanan.findMany({
|
||||
where: {
|
||||
isActive: true
|
||||
}
|
||||
})
|
||||
return data
|
||||
}, {
|
||||
detail: {
|
||||
summary: "List Kategori Pelayanan Surat",
|
||||
description: `tool untuk mendapatkan list kategori pelayanan surat`,
|
||||
tags: ["mcp"]
|
||||
}
|
||||
})
|
||||
.post("/category/create", async ({ body }) => {
|
||||
const { name, syaratDokumen, dataText } = body
|
||||
|
||||
await prisma.categoryPelayanan.create({
|
||||
data: {
|
||||
name,
|
||||
syaratDokumen,
|
||||
dataText,
|
||||
}
|
||||
})
|
||||
|
||||
return `
|
||||
${JSON.stringify(body)}
|
||||
|
||||
kategori pelayanan surat sudah dibuat`
|
||||
}, {
|
||||
body: t.Object({
|
||||
name: t.String({ minLength: 1, error: "name harus diisi" }),
|
||||
syaratDokumen: t.Array(t.String({ minLength: 1, error: "syaratDokumen harus diisi" })),
|
||||
dataText: t.Array(t.String({ minLength: 1, error: "dataText harus diisi" })),
|
||||
}),
|
||||
detail: {
|
||||
summary: "buat kategori pelayanan surat",
|
||||
description: `tool untuk membuat kategori pelayanan surat`
|
||||
}
|
||||
})
|
||||
.post("/category/update", async ({ body }) => {
|
||||
const { id, name, syaratDokumen, dataText } = body
|
||||
|
||||
await prisma.categoryPelayanan.update({
|
||||
where: {
|
||||
id,
|
||||
},
|
||||
data: {
|
||||
name,
|
||||
syaratDokumen,
|
||||
dataText,
|
||||
}
|
||||
})
|
||||
|
||||
return `
|
||||
${JSON.stringify(body)}
|
||||
|
||||
kategori pelayanan surat sudah diperbarui`
|
||||
}, {
|
||||
body: t.Object({
|
||||
id: t.String({ minLength: 1, error: "id harus diisi" }),
|
||||
name: t.String({ minLength: 1, error: "name harus diisi" }),
|
||||
syaratDokumen: t.Array(t.String({ minLength: 1, error: "syaratDokumen harus diisi" })),
|
||||
dataText: t.Array(t.String({ minLength: 1, error: "dataText harus diisi" })),
|
||||
}),
|
||||
detail: {
|
||||
summary: "update kategori pelayanan surat",
|
||||
description: `tool untuk update kategori pelayanan surat`
|
||||
}
|
||||
})
|
||||
.post("/category/delete", async ({ body }) => {
|
||||
const { id } = body
|
||||
|
||||
await prisma.categoryPelayanan.update({
|
||||
where: {
|
||||
id,
|
||||
},
|
||||
data: {
|
||||
isActive: false
|
||||
}
|
||||
})
|
||||
|
||||
return `
|
||||
${JSON.stringify(body)}
|
||||
|
||||
kategori pelayanan surat sudah dihapus`
|
||||
}, {
|
||||
body: t.Object({
|
||||
id: t.String({ minLength: 1, error: "id harus diisi" }),
|
||||
}),
|
||||
detail: {
|
||||
summary: "delete kategori pelayanan surat",
|
||||
description: `tool untuk delete kategori pelayanan surat`
|
||||
}
|
||||
})
|
||||
|
||||
export default PelayananRoute
|
||||
@@ -18,8 +18,9 @@ const PengaduanRoute = new Elysia({
|
||||
return data
|
||||
}, {
|
||||
detail: {
|
||||
summary: "get kategori pengaduan",
|
||||
description: `tool untuk mendapatkan kategori pengaduan`
|
||||
summary: "List Kategori Pengaduan",
|
||||
description: `tool untuk mendapatkan list kategori pengaduan`,
|
||||
tags: ["mcp"]
|
||||
}
|
||||
})
|
||||
.post("/category/create", async ({ body }) => {
|
||||
@@ -100,15 +101,67 @@ const PengaduanRoute = new Elysia({
|
||||
|
||||
// --- PENGADUAN ---
|
||||
.post("/create", async ({ body }) => {
|
||||
const { title, detail, location, image, idCategory, idWarga } = body
|
||||
const { title, detail, location, image, idCategory, idWarga, phone } = body
|
||||
const noPengaduan = await generateNoPengaduan()
|
||||
let idCategoryFix = idCategory
|
||||
let idWargaFix = idWarga
|
||||
const category = await prisma.categoryPengaduan.findUnique({
|
||||
where: {
|
||||
id: idCategory,
|
||||
}
|
||||
})
|
||||
|
||||
if (!category) {
|
||||
const cariCategory = await prisma.categoryPengaduan.findFirst({
|
||||
where: {
|
||||
name: idCategory,
|
||||
}
|
||||
})
|
||||
|
||||
if (!cariCategory) {
|
||||
idCategoryFix = "lainnya"
|
||||
} else {
|
||||
idCategoryFix = cariCategory.id
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const warga = await prisma.warga.findUnique({
|
||||
where: {
|
||||
id: idWarga,
|
||||
}
|
||||
})
|
||||
|
||||
if (!warga) {
|
||||
const cariWarga = await prisma.warga.findFirst({
|
||||
where: {
|
||||
phone,
|
||||
}
|
||||
})
|
||||
|
||||
if (!cariWarga) {
|
||||
const wargaCreate = await prisma.warga.create({
|
||||
data: {
|
||||
name: idWarga,
|
||||
phone,
|
||||
},
|
||||
select: {
|
||||
id: true
|
||||
}
|
||||
})
|
||||
idWargaFix = wargaCreate.id
|
||||
} else {
|
||||
idWargaFix = cariWarga.id
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const pengaduan = await prisma.pengaduan.create({
|
||||
data: {
|
||||
title,
|
||||
detail,
|
||||
idCategory,
|
||||
idWarga,
|
||||
idCategory: idCategoryFix,
|
||||
idWarga: idWargaFix,
|
||||
location,
|
||||
image,
|
||||
noPengaduan,
|
||||
@@ -138,13 +191,15 @@ const PengaduanRoute = new Elysia({
|
||||
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" }),
|
||||
image: t.Any(),
|
||||
idCategory: t.String({ minLength: 1, error: "idCategory harus diisi" }),
|
||||
idWarga: t.String({ minLength: 1, error: "idWarga harus diisi" }),
|
||||
phone: t.String({ minLength: 1, error: "phone harus diisi" }),
|
||||
}),
|
||||
detail: {
|
||||
summary: "buat pengaduan",
|
||||
description: `tool untuk membuat pengaduan`
|
||||
summary: "Create Pengaduan Warga",
|
||||
description: `tool untuk membuat pengaduan warga`,
|
||||
tags: ["mcp"]
|
||||
}
|
||||
})
|
||||
.post("/update-status", async ({ body }) => {
|
||||
@@ -197,7 +252,7 @@ const PengaduanRoute = new Elysia({
|
||||
}),
|
||||
|
||||
detail: {
|
||||
summary: "update status pengaduan",
|
||||
summary: "Update status pengaduan",
|
||||
description: `tool untuk update status pengaduan`
|
||||
}
|
||||
})
|
||||
@@ -282,8 +337,81 @@ const PengaduanRoute = new Elysia({
|
||||
return datafix
|
||||
}, {
|
||||
detail: {
|
||||
summary: "get detail pengaduan",
|
||||
description: `tool untuk mendapatkan detail pengaduan`
|
||||
summary: "Detail Pengaduan Warga",
|
||||
description: `tool untuk mendapatkan detail pengaduan warga / history pengaduan / mengecek status pengaduan`,
|
||||
tags: ["mcp"]
|
||||
}
|
||||
})
|
||||
.get("/", async ({ query }) => {
|
||||
const { take, page, search } = query
|
||||
const skip = !page ? 0 : (Number(page) - 1) * (!take ? 10 : Number(take))
|
||||
|
||||
const data = await prisma.pengaduan.findMany({
|
||||
skip,
|
||||
take: !take ? 10 : Number(take),
|
||||
orderBy: {
|
||||
createdAt: "asc"
|
||||
},
|
||||
where: {
|
||||
isActive: true,
|
||||
OR: [
|
||||
{
|
||||
title: {
|
||||
contains: search ?? "",
|
||||
mode: "insensitive"
|
||||
},
|
||||
},
|
||||
{
|
||||
noPengaduan: {
|
||||
contains: search ?? "",
|
||||
mode: "insensitive"
|
||||
},
|
||||
},
|
||||
{
|
||||
detail: {
|
||||
contains: search ?? "",
|
||||
mode: "insensitive"
|
||||
},
|
||||
}
|
||||
],
|
||||
},
|
||||
select: {
|
||||
id: true,
|
||||
noPengaduan: true,
|
||||
title: true,
|
||||
detail: true,
|
||||
location: true,
|
||||
status: true,
|
||||
createdAt: true,
|
||||
CategoryPengaduan: {
|
||||
select: {
|
||||
name: true
|
||||
}
|
||||
},
|
||||
Warga: {
|
||||
select: {
|
||||
name: true,
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
const dataFix = data.map((item) => {
|
||||
return {
|
||||
noPengaduan: item.noPengaduan,
|
||||
title: item.title,
|
||||
detail: item.detail,
|
||||
status: item.status,
|
||||
createdAt: item.createdAt.toLocaleDateString("id-ID", { day: "numeric", month: "long", year: "numeric" }),
|
||||
}
|
||||
})
|
||||
|
||||
return dataFix
|
||||
}, {
|
||||
detail: {
|
||||
summary: "List Pengaduan Warga",
|
||||
description: `tool untuk mendapatkan list pengaduan warga`,
|
||||
tags: ["mcp"]
|
||||
}
|
||||
})
|
||||
export default PengaduanRoute
|
||||
|
||||
Reference in New Issue
Block a user