322 lines
8.9 KiB
TypeScript
322 lines
8.9 KiB
TypeScript
import Elysia, { StatusMap, t } from "elysia"
|
|
import { generateNoPengajuanSurat } from "../lib/no-pengajuan-surat"
|
|
import { prisma } from "../lib/prisma"
|
|
import type { StatusPengaduan } from "generated/prisma"
|
|
import { normalizePhoneNumber } from "../lib/normalizePhone"
|
|
|
|
const PelayananRoute = new Elysia({
|
|
prefix: "pelayanan",
|
|
tags: ["pelayanan"],
|
|
})
|
|
|
|
// --- KATEGORI PELAYANAN ---
|
|
.get("/category", async () => {
|
|
const data = await prisma.categoryPelayanan.findMany({
|
|
where: {
|
|
isActive: true
|
|
},
|
|
orderBy:{
|
|
name: "asc"
|
|
}
|
|
})
|
|
return data
|
|
}, {
|
|
detail: {
|
|
summary: "List Kategori Pelayanan Surat",
|
|
description: `tool untuk mendapatkan list kategori pelayanan surat beserta syaratnya untuk memenuhi syarat dokumen sesuai kategori yg dipilih saat melakukan pengajuan 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`
|
|
}
|
|
})
|
|
|
|
|
|
// --- PELAYANAN SURAT ---
|
|
.get("/", async () => {
|
|
const data = await prisma.pelayananAjuan.findMany({
|
|
where: {
|
|
isActive: true
|
|
}
|
|
})
|
|
return data
|
|
}, {
|
|
detail: {
|
|
summary: "List Ajuan Pelayanan Surat",
|
|
description: `tool untuk mendapatkan list ajuan pelayanan surat`,
|
|
tags: ["mcp"]
|
|
}
|
|
})
|
|
.get("/detail", async ({ query }) => {
|
|
const { id } = query
|
|
const data = await prisma.pelayananAjuan.findUnique({
|
|
where: {
|
|
id,
|
|
}
|
|
})
|
|
return data
|
|
}, {
|
|
query: t.Object({
|
|
id: t.String({ minLength: 1, error: "id harus diisi" }),
|
|
}),
|
|
detail: {
|
|
summary: "Detail Ajuan Pelayanan Surat",
|
|
description: `tool untuk mendapatkan detail ajuan pelayanan surat`,
|
|
tags: ["mcp"]
|
|
}
|
|
})
|
|
.post("/create", async ({ body }) => {
|
|
const { idCategory, idWarga, phone, dataText, syaratDokumen } = body
|
|
const noPengajuan = await generateNoPengajuanSurat()
|
|
let idCategoryFix = idCategory
|
|
let idWargaFix = idWarga
|
|
const category = await prisma.categoryPelayanan.findUnique({
|
|
where: {
|
|
id: idCategory,
|
|
}
|
|
})
|
|
|
|
if (!category) {
|
|
const cariCategory = await prisma.categoryPelayanan.findFirst({
|
|
where: {
|
|
name: idCategory,
|
|
}
|
|
})
|
|
|
|
if (!cariCategory) {
|
|
throw new Error("kategori pelayanan surat tidak ditemukan")
|
|
} else {
|
|
idCategoryFix = cariCategory.id
|
|
}
|
|
|
|
}
|
|
|
|
const warga = await prisma.warga.findUnique({
|
|
where: {
|
|
id: idWarga,
|
|
}
|
|
})
|
|
|
|
if (!warga) {
|
|
const nomorHP = normalizePhoneNumber({ phone })
|
|
const cariWarga = await prisma.warga.findFirst({
|
|
where: {
|
|
phone: nomorHP,
|
|
}
|
|
})
|
|
|
|
if (!cariWarga) {
|
|
const wargaCreate = await prisma.warga.create({
|
|
data: {
|
|
name: idWarga,
|
|
phone: nomorHP,
|
|
},
|
|
select: {
|
|
id: true
|
|
}
|
|
})
|
|
idWargaFix = wargaCreate.id
|
|
} else {
|
|
idWargaFix = cariWarga.id
|
|
}
|
|
|
|
}
|
|
|
|
const pengaduan = await prisma.pelayananAjuan.create({
|
|
data: {
|
|
noPengajuan,
|
|
idCategory: idCategoryFix,
|
|
idWarga: idWargaFix,
|
|
},
|
|
select: {
|
|
id: true,
|
|
}
|
|
})
|
|
|
|
if (!pengaduan.id) {
|
|
throw new Error("gagal membuat pengajuan surat")
|
|
}
|
|
|
|
let dataInsertSyaratDokumen = []
|
|
let dataInsertDataText = []
|
|
|
|
for (const item of syaratDokumen) {
|
|
dataInsertSyaratDokumen.push({
|
|
idPengajuanLayanan: pengaduan.id,
|
|
idCategory: idCategoryFix,
|
|
jenis: item.jenis,
|
|
value: item.value,
|
|
})
|
|
}
|
|
|
|
for (const item of dataText) {
|
|
dataInsertDataText.push({
|
|
idPengajuanLayanan: pengaduan.id,
|
|
idCategory: idCategoryFix,
|
|
jenis: item.jenis,
|
|
value: item.value,
|
|
})
|
|
}
|
|
|
|
await prisma.syaratDokumenPelayanan.createMany({
|
|
data: dataInsertSyaratDokumen,
|
|
})
|
|
|
|
await prisma.dataTextPelayanan.createMany({
|
|
data: dataInsertDataText,
|
|
})
|
|
|
|
|
|
await prisma.historyPelayanan.create({
|
|
data: {
|
|
idPengajuanLayanan: pengaduan.id,
|
|
deskripsi: "Pengajuan surat dibuat",
|
|
}
|
|
})
|
|
|
|
return `
|
|
${JSON.stringify(body)}
|
|
|
|
pengaduan sudah dibuat`
|
|
}, {
|
|
body: t.Object({
|
|
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" }),
|
|
dataText: t.Array(t.Object({
|
|
jenis: t.String({ minLength: 1, error: "jenis harus diisi" }),
|
|
value: t.String({ minLength: 1, error: "value harus diisi" }),
|
|
})),
|
|
syaratDokumen: t.Array(t.Object({
|
|
jenis: t.String({ minLength: 1, error: "jenis harus diisi" }),
|
|
value: t.String({ minLength: 1, error: "value harus diisi" }),
|
|
})),
|
|
}),
|
|
detail: {
|
|
summary: "Create Pengajuan Pelayanan Surat",
|
|
description: `tool untuk membuat pengajuan pelayanan surat dengan syarat dokumen serta data text sesuai kategori pelayanan surat yang dipilih`,
|
|
tags: ["mcp"]
|
|
}
|
|
})
|
|
.post("/update-status", async ({ body }) => {
|
|
const { id, status, keterangan, idUser } = body
|
|
|
|
const pengajuan = await prisma.pelayananAjuan.update({
|
|
where: {
|
|
id,
|
|
},
|
|
data: {
|
|
status: status as StatusPengaduan,
|
|
}
|
|
})
|
|
|
|
if (!pengajuan) {
|
|
throw new Error("gagal membuat pengajuan")
|
|
}
|
|
|
|
await prisma.historyPelayanan.create({
|
|
data: {
|
|
idPengajuanLayanan: pengajuan.id,
|
|
deskripsi: "Pengajuan surat diperbarui",
|
|
keteranganAlasan: keterangan,
|
|
}
|
|
})
|
|
|
|
return `
|
|
${JSON.stringify(body)}
|
|
|
|
pengajuan surat sudah diperbarui`
|
|
}, {
|
|
body: t.Object({
|
|
id: t.String({ minLength: 1, error: "id harus diisi" }),
|
|
status: t.String({ minLength: 1, error: "status harus diisi" }),
|
|
keterangan: t.String({ minLength: 1, error: "keterangan harus diisi" }),
|
|
idUser: t.String({ minLength: 1, error: "idUser harus diisi" }),
|
|
}),
|
|
detail: {
|
|
summary: "Update Status Pengajuan Pelayanan Surat",
|
|
description: `tool untuk update status pengajuan pelayanan surat`,
|
|
tags: ["mcp"]
|
|
}
|
|
})
|
|
|
|
export default PelayananRoute
|