import Elysia, { t } from "elysia"; import _ from "lodash"; import { normalizePhoneNumber } from "../lib/normalizePhone"; import { prisma } from "../lib/prisma"; const WargaRoute = new Elysia({ prefix: "warga", tags: ["warga"], }) .get("/list", async ({ query }) => { const { search, page = 1 } = query const dataSkip = page == null || page == undefined ? 0 : Number(page) * 10 - 10; const totalData = await prisma.warga.count({ where: { OR: [ { name: { contains: search, mode: "insensitive" } }, { phone: { contains: search, mode: "insensitive" } } ] } }); const data = await prisma.warga.findMany({ skip: dataSkip, take: 10, where: { OR: [ { name: { contains: search, mode: "insensitive" } }, { phone: { contains: search, mode: "insensitive" } } ] }, orderBy: { name: "asc" } }) const dataFix = { data, total: totalData, page: Number(page) || 1, pageSize: 10, totalPages: Math.ceil(totalData / 10) }; return dataFix }, { detail: { summary: "List Warga", description: `tool untuk mendapatkan list warga`, } }) .post("/edit", async ({ body }) => { const { id, name, phone } = body const nomorHP = normalizePhoneNumber({ phone }) await prisma.warga.update({ where: { id, }, data: { name, phone: nomorHP } }) return { success: true, message: 'data warga sudah diperbarui' } }, { body: t.Object({ id: t.String({ minLength: 1, error: "id harus diisi" }), name: t.String({ minLength: 1, error: "value harus diisi" }), phone: t.String({ minLength: 1 }) }), detail: { summary: "Edit Warga", description: `tool untuk edit warga` } }) .get("/detail", async ({ query }) => { const { id, category, search, page } = query const skip = !page ? 0 : (Number(page) - 1) * 5 const dataWarga = await prisma.warga.findUnique({ where: { id } }) if (!dataWarga) return { success: false, message: "data warga tidak ditemukan", data: null, totalPages: 1, totalRows: 0 } if (category == "warga") { return dataWarga } else if (category == "pengaduan") { const where: any = { isActive: true, idWarga: id, OR: [ { title: { contains: search ?? "", mode: "insensitive" }, }, { noPengaduan: { contains: search ?? "", mode: "insensitive" }, } ] } const totalData = await prisma.pengaduan.count({ where }); const dataPengaduan = await prisma.pengaduan.findMany({ skip, take: 5, orderBy: { createdAt: "desc" }, where, select: { id: true, status: true, noPengaduan: true, title: true } }) const dataReturn = { success: true, message: "data pengaduan berhasil diambil", data: dataPengaduan, totalRows: totalData, totalPages: Math.ceil(totalData / 5) } return dataReturn } else if (category == "pelayanan") { const where: any = { isActive: true, idWarga: id, OR: [ { CategoryPelayanan: { name: { contains: search ?? "", mode: "insensitive" }, }, }, { noPengajuan: { contains: search ?? "", mode: "insensitive" }, }, ] } const totalData = await prisma.pelayananAjuan.count({ where }); const dataPelayanan = await prisma.pelayananAjuan.findMany({ skip, take: 5, orderBy: { createdAt: "desc" }, where, select: { id: true, noPengajuan: true, status: true, CategoryPelayanan: { select: { name: true } } } }) const dataPelayanFix = dataPelayanan.map((v: any) => ({ ..._.omit(v, ["CategoryPelayanan"]), id: v.id, noPengaduan: v.noPengajuan, status: v.status, category: v.CategoryPelayanan.name })) const dataReturn = { success: true, message: "data pelayanan berhasil diambil", data: dataPelayanFix, totalRows: totalData, totalPages: Math.ceil(totalData / 5) } return dataReturn } }, { query: t.Object({ id: t.String({ minLength: 1, error: "id harus diisi" }), category: t.String({ minLength: 1, error: "kategori harus diisi" }), page: t.String({ optional: true }), search: t.String({ optional: true }), }), detail: { summary: "Detail Warga", description: `tool untuk mendapatkan detail warga`, } }) ; export default WargaRoute