From f10b87f0f264bbae4a790e9ecb2596cce7882421 Mon Sep 17 00:00:00 2001 From: amal Date: Tue, 16 Sep 2025 17:10:03 +0800 Subject: [PATCH] upd : api ai diskusi divisi Deskripsi: - list diskusi divisi - detail diskusi divisi No Issues" git status --- src/app/api/ai/discussion/[id]/route.ts | 92 ++++++++++++++++++++++++ src/app/api/ai/discussion/route.ts | 95 +++++++++++++++++++++++++ 2 files changed, 187 insertions(+) create mode 100644 src/app/api/ai/discussion/[id]/route.ts create mode 100644 src/app/api/ai/discussion/route.ts diff --git a/src/app/api/ai/discussion/[id]/route.ts b/src/app/api/ai/discussion/[id]/route.ts new file mode 100644 index 0000000..c7d9876 --- /dev/null +++ b/src/app/api/ai/discussion/[id]/route.ts @@ -0,0 +1,92 @@ +import { prisma } from "@/module/_global"; +import { NextResponse } from "next/server"; + +// GET ONE DISCUSSION BY ID +export async function GET(request: Request, context: { params: { id: string } }) { + try { + const { id } = context.params + + const cek = await prisma.divisionDisscussion.count({ + where: { id } + }) + + if (cek == 0) { + return NextResponse.json( + { success: false, message: "Gagal mendapatkan diskusi, data tidak ditemukan" }, + { status: 404 } + ); + } + + const data = await prisma.divisionDisscussion.findUnique({ + where: { id }, + select: { + isActive: true, + id: true, + desc: true, + status: true, + createdAt: true, + idDivision: true, + Division: { + select: { + name: true, + } + }, + User: { select: { name: true, img: true } }, + DivisionDisscussionComment: { + select: { + id: true, + comment: true, + createdAt: true, + User: { select: { name: true, img: true } } + } + }, + } + }); + + if (!data) { + return NextResponse.json( + { success: false, message: "Diskusi tidak ditemukan" }, + { status: 404 } + ); + } + + // ambil nama creator + const createdBy = data.User.name; + const status = data.status == 1 ? "Open" : "Close" + const division = data.Division.name + + // mapping komentar → hilangkan nested User + const komentar = data.DivisionDisscussionComment.map((comment: any) => ({ + id: comment.id, + comment: comment.comment, + createdAt: comment.createdAt, + username: comment.User.name, + userimg: comment.User.img, + })); + + // bentuk hasil akhir sesuai request + const result = { + id: data.id, + idDivision: data.idDivision, + division, + isActive: data.isActive, + desc: data.desc, + status, + createdAt: data.createdAt, + createdBy, + komentar, + }; + + return NextResponse.json( + { success: true, message: "Berhasil mendapatkan diskusi", data: result }, + { status: 200 } + ); + + } catch (error) { + console.error(error); + return NextResponse.json( + { success: false, message: "Gagal mendapatkan diskusi, coba lagi nanti (error: 500)", reason: (error as Error).message }, + { status: 500 } + ); + } +} diff --git a/src/app/api/ai/discussion/route.ts b/src/app/api/ai/discussion/route.ts new file mode 100644 index 0000000..a37f0b9 --- /dev/null +++ b/src/app/api/ai/discussion/route.ts @@ -0,0 +1,95 @@ +import { prisma } from "@/module/_global"; +import _ from "lodash"; +import "moment/locale/id"; +import { NextResponse } from "next/server"; + + +// GET ALL DISCUSSION DIVISION ACTIVE = TRUE +export async function GET(request: Request) { + try { + const { searchParams } = new URL(request.url); + const idDivision = searchParams.get("division"); + const search = searchParams.get('search'); + const page = searchParams.get('page'); + const status = searchParams.get('status'); + const isActive = searchParams.get('active'); + const villageId = searchParams.get('desa'); + const get = searchParams.get('get'); + + let getFix = 0; + if (get == null || get == undefined || get == "" || _.isNaN(Number(get))) { + getFix = 10; + } else { + getFix = Number(get); + } + + const dataSkip = page == null || page == undefined ? 0 : Number(page) * getFix - getFix; + + let kondisi: any = { + isActive: isActive == "false" ? false : true, + status: status == "close" ? 2 : 1, + Division: { + idVillage: String(villageId) + }, + desc: { + contains: (search == undefined || search == "null") ? "" : search, + mode: "insensitive" + }, + } + + + if (idDivision != "null" && idDivision != null && idDivision != undefined) { + kondisi = { + isActive: isActive == "false" ? false : true, + status: status == "close" ? 2 : 1, + idDivision: idDivision, + Division: { + idVillage: String(villageId) + }, + desc: { + contains: (search == undefined || search == "null") ? "" : search, + mode: "insensitive" + }, + } + } + + const data = await prisma.divisionDisscussion.findMany({ + skip: dataSkip, + take: getFix, + where: kondisi, + orderBy: { + createdAt: 'desc' + }, + select: { + id: true, + desc: true, + status: true, + createdAt: true, + idDivision: true, + Division: { + select: { + name: true, + } + }, + DivisionDisscussionComment: { + select: { + id: true, + } + } + } + }); + + const fixData = data.map((v: any) => ({ + ..._.omit(v, ["DivisionDisscussionComment", "status", "Division"]), + totalKomentar: v.DivisionDisscussionComment.length, + status: v.status == 1 ? "Open" : "Close", + division: v.Division.name + })) + + return NextResponse.json({ success: true, message: "Berhasil mendapatkan diskusi", data: fixData, }, { status: 200 }); + + } catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal mendapatkan diskusi, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); + } +} \ No newline at end of file