upd: api jenna ai #57

Merged
amaliadwiy merged 1 commits from amalia/02-des-25 into main 2025-12-02 14:40:07 +08:00

View File

@@ -3,7 +3,7 @@ import type { StatusPengaduan } from "generated/prisma"
import { createSurat } from "../lib/create-surat" import { createSurat } from "../lib/create-surat"
import { getLastUpdated } from "../lib/get-last-updated" import { getLastUpdated } from "../lib/get-last-updated"
import { generateNoPengajuanSurat } from "../lib/no-pengajuan-surat" import { generateNoPengajuanSurat } from "../lib/no-pengajuan-surat"
import { normalizePhoneNumber } from "../lib/normalizePhone" import { isValidPhone, normalizePhoneNumber } from "../lib/normalizePhone"
import { prisma } from "../lib/prisma" import { prisma } from "../lib/prisma"
const PelayananRoute = new Elysia({ const PelayananRoute = new Elysia({
@@ -292,10 +292,10 @@ const PelayananRoute = new Elysia({
} }
}) })
.post("/create", async ({ body }) => { .post("/create", async ({ body }) => {
const { kategoriId, wargaId, noTelepon, dataText, syaratDokumen } = body const { kategoriId, namaWarga, noTelepon, dataText, syaratDokumen } = body
const noPengajuan = await generateNoPengajuanSurat() const noPengajuan = await generateNoPengajuanSurat()
let idCategoryFix = kategoriId let idCategoryFix = kategoriId
let idWargaFix = wargaId let idWargaFix = ""
const category = await prisma.categoryPelayanan.findUnique({ const category = await prisma.categoryPelayanan.findUnique({
where: { where: {
id: kategoriId, id: kategoriId,
@@ -317,36 +317,28 @@ const PelayananRoute = new Elysia({
} }
const warga = await prisma.warga.findUnique({ if (!isValidPhone(noTelepon)) {
where: { return { success: false, message: 'nomor telepon tidak valid, harap masukkan nomor yang benar' }
id: wargaId,
} }
})
if (!warga) {
const nomorHP = normalizePhoneNumber({ phone: noTelepon }) const nomorHP = normalizePhoneNumber({ phone: noTelepon })
const cariWarga = await prisma.warga.findFirst({ const dataWarga = await prisma.warga.upsert({
where: { where: {
phone: nomorHP
},
create: {
name: namaWarga,
phone: nomorHP, phone: nomorHP,
} },
}) update: {
name: namaWarga,
if (!cariWarga) {
const wargaCreate = await prisma.warga.create({
data: {
name: wargaId,
phone: nomorHP,
}, },
select: { select: {
id: true id: true
} }
}) })
idWargaFix = wargaCreate.id
} else {
idWargaFix = cariWarga.id
}
} idWargaFix = dataWarga.id
const pengaduan = await prisma.pelayananAjuan.create({ const pengaduan = await prisma.pelayananAjuan.create({
data: { data: {
@@ -404,36 +396,30 @@ const PelayananRoute = new Elysia({
}, { }, {
body: t.Object({ body: t.Object({
kategoriId: t.String({ kategoriId: t.String({
minLength: 1,
description: "ID atau nama kategori pelayanan surat yang dipilih. Jika berupa nama, sistem akan mencocokkan secara otomatis.", description: "ID atau nama kategori pelayanan surat yang dipilih. Jika berupa nama, sistem akan mencocokkan secara otomatis.",
examples: ["skusaha"], examples: ["skusaha"],
error: "ID kategori harus diisi" error: "ID kategori harus diisi"
}), }),
namaWarga: t.String({
wargaId: t.String({ description: "Nama warga",
minLength: 1,
description: "ID warga atau nama warga. Jika ID tidak ditemukan, sistem akan mencari berdasarkan nama.",
examples: ["Budi Santoso"], examples: ["Budi Santoso"],
error: "ID warga harus diisi" error: "Nama warga harus diisi"
}), }),
noTelepon: t.String({ noTelepon: t.String({
minLength: 8, error: "Nomor telepon harus diisi",
description: "Nomor HP warga yang akan dinormalisasi. Jika data warga tidak ditemukan berdasarkan idWarga, pencarian dilakukan via nomor ini.", examples: ["08123456789", "+628123456789"],
examples: ["081234567890"], description: "Nomor telepon warga pelapor"
error: "Nomor telepon harus diisi"
}), }),
dataText: t.Array( dataText: t.Array(
t.Object({ t.Object({
jenis: t.String({ jenis: t.String({
minLength: 1,
description: "Jenis field yang dibutuhkan oleh kategori pelayanan. Biasanya dinamis.", description: "Jenis field yang dibutuhkan oleh kategori pelayanan. Biasanya dinamis.",
examples: ["nama", "jenis kelamin", "tempat tanggal lahir", "negara", "agama", "status perkawinan", "alamat", "pekerjaan", "jenis usaha", "alamat usaha"], examples: ["nama", "jenis kelamin", "tempat tanggal lahir", "negara", "agama", "status perkawinan", "alamat", "pekerjaan", "jenis usaha", "alamat usaha"],
error: "jenis harus diisi" error: "jenis harus diisi"
}), }),
value: t.String({ value: t.String({
minLength: 1,
description: "Isi atau nilai dari jenis field terkait.", description: "Isi atau nilai dari jenis field terkait.",
examples: ["Budi Santoso", "Laki-laki", "Denpasar, 28 Februari 1990", "Indonesia", "Islam", "Belum menikah", "Jl. Mawar No. 10", "Karyawan Swasta", "usaha makanan", "Jl. Melati No. 21"], examples: ["Budi Santoso", "Laki-laki", "Denpasar, 28 Februari 1990", "Indonesia", "Islam", "Belum menikah", "Jl. Mawar No. 10", "Karyawan Swasta", "usaha makanan", "Jl. Melati No. 21"],
error: "value harus diisi" error: "value harus diisi"
@@ -462,13 +448,11 @@ const PelayananRoute = new Elysia({
syaratDokumen: t.Array( syaratDokumen: t.Array(
t.Object({ t.Object({
jenis: t.String({ jenis: t.String({
minLength: 1,
description: "Jenis dokumen persyaratan yang diminta oleh kategori layanan.", description: "Jenis dokumen persyaratan yang diminta oleh kategori layanan.",
examples: ["ktp", "kk", "surat_pengantar_rt"], examples: ["ktp", "kk", "surat_pengantar_rt"],
error: "jenis harus diisi" error: "jenis harus diisi"
}), }),
value: t.String({ value: t.String({
minLength: 1,
description: "Nama file atau identifier file dokumen yang diupload.", description: "Nama file atau identifier file dokumen yang diupload.",
examples: ["ktp_budi.png", "kk_budi.png"], examples: ["ktp_budi.png", "kk_budi.png"],
error: "value harus diisi" error: "value harus diisi"
@@ -488,7 +472,7 @@ const PelayananRoute = new Elysia({
), ),
}), }),
detail: { detail: {
summary: "Create Pengajuan Pelayanan Surat", summary: "Buat Pengajuan Pelayanan Surat",
description: `tool untuk membuat pengajuan pelayanan surat dengan syarat dokumen serta data text sesuai kategori pelayanan surat yang dipilih`, description: `tool untuk membuat pengajuan pelayanan surat dengan syarat dokumen serta data text sesuai kategori pelayanan surat yang dipilih`,
tags: ["mcp"] tags: ["mcp"]
} }