diff --git a/src/app/api/ai/project/[id]/route.ts b/src/app/api/ai/project/[id]/route.ts new file mode 100644 index 0000000..83853a9 --- /dev/null +++ b/src/app/api/ai/project/[id]/route.ts @@ -0,0 +1,172 @@ +import { prisma } from "@/module/_global"; +import _ from "lodash"; +import moment from "moment"; +import { NextResponse } from "next/server"; + + +// GET DETAIL PROJECT / GET ONE PROJECT +export async function GET(request: Request, context: { params: { id: string } }) { + try { + let allData + const { id } = context.params; + const { searchParams } = new URL(request.url); + const kategori = searchParams.get("cat"); + + const data = await prisma.project.findUnique({ + where: { + id: String(id), + }, + select: { + id: true, + idVillage: true, + idGroup: true, + title: true, + status: true, + desc: true, + reason: true, + report: true, + isActive: true, + Group: { + select: { + name: true + } + } + } + }); + + if (!data) { + return NextResponse.json({ success: false, message: "Gagal mendapatkan kegiatan, data tidak ditemukan", }, { status: 404 }); + } + + + if (kategori == "data") { + const dataProgress = await prisma.projectTask.findMany({ + where: { + isActive: true, + idProject: String(id) + }, + orderBy: { + updatedAt: 'desc' + } + }) + + const semua = dataProgress.length + const selesai = _.filter(dataProgress, { status: 1 }).length + const progress = Math.ceil((selesai / semua) * 100) + + allData = { + id: data.id, + idVillage: data.idVillage, + idGroup: data.idGroup, + group: data.Group.name, + title: data.title, + status: data.status == 3 ? "batal" : data.status == 2 ? "selesai" : data.status == 1 ? "dikerjakan" : "segera", + desc: data.desc, + reason: data.reason, + report: data.report, + isActive: data.isActive, + progress: (_.isNaN(progress)) ? 0 : progress, + } + + } else if (kategori == "task") { + const dataProgress = await prisma.projectTask.findMany({ + where: { + isActive: true, + idProject: String(id) + }, + select: { + id: true, + title: true, + desc: true, + status: true, + dateStart: true, + dateEnd: true, + createdAt: true + }, + orderBy: { + createdAt: 'asc' + } + }) + + const formatData = dataProgress.map((v: any) => ({ + ..._.omit(v, ["dateStart", "dateEnd", "createdAt", "status"]), + status: v.status == 1 ? "selesai" : "belum selesai", + dateStart: moment(v.dateStart).format("DD-MM-YYYY"), + dateEnd: moment(v.dateEnd).format("DD-MM-YYYY"), + createdAt: moment(v.createdAt).format("DD-MM-YYYY HH:mm"), + })) + const dataFix = _.orderBy(formatData, 'createdAt', 'asc') + allData = dataFix + + } else if (kategori == "file") { + const dataFile = await prisma.projectFile.findMany({ + where: { + isActive: true, + idProject: String(id) + }, + orderBy: { + createdAt: 'asc' + }, + select: { + id: true, + name: true, + extension: true, + idStorage: true + } + }) + + allData = dataFile + + } else if (kategori == "member") { + const dataMember = await prisma.projectMember.findMany({ + where: { + isActive: true, + idProject: String(id) + }, + select: { + id: true, + idUser: true, + User: { + select: { + name: true, + email: true, + img: true, + Position: { + select: { + name: true + } + } + } + }, + } + }) + + const fix = dataMember.map((v: any) => ({ + ..._.omit(v, ["User"]), + name: v.User.name, + email: v.User.email, + img: v.User.img, + position: v.User.Position.name + })) + + allData = fix + } else if (kategori == "link") { + const dataLink = await prisma.projectLink.findMany({ + where: { + isActive: true, + idProject: String(id) + }, + orderBy: { + createdAt: 'asc' + } + }) + allData = dataLink + } + + return NextResponse.json({ success: true, message: "Berhasil mendapatkan kegiatan", data: allData }, { status: 200 }); + + } catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal mendapatkan kegiatan, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/app/api/ai/project/route.ts b/src/app/api/ai/project/route.ts new file mode 100644 index 0000000..7db00f3 --- /dev/null +++ b/src/app/api/ai/project/route.ts @@ -0,0 +1,107 @@ +import { prisma } from "@/module/_global"; +import _, { ceil } from "lodash"; +import { NextResponse } from "next/server"; + + +// GET ALL DATA PROJECT +export async function GET(request: Request) { + try { + const { searchParams } = new URL(request.url); + const idVillage = searchParams.get('desa'); + const name = searchParams.get('search'); + const status = searchParams.get('status'); + const idGroup = searchParams.get("group"); + const page = searchParams.get('page'); + const get = searchParams.get('get'); + + let getFix = 10; + 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: true, + idVillage: String(idVillage), + title: { + contains: (name == undefined || name == "null") ? "" : name, + mode: "insensitive" + }, + } + + if (status != "null" && status != undefined && status != "") { + kondisi = { + ...kondisi, + status: status == "segera" ? 0 : status == "dikerjakan" ? 1 : status == "selesai" ? 2 : status == "batal" ? 3 : 0 + } + } + + + if (idGroup != "null" && idGroup != undefined && idGroup != "") { + kondisi = { + ...kondisi, + idGroup: String(idGroup) + } + } + + + const data = await prisma.project.findMany({ + skip: dataSkip, + take: getFix, + where: kondisi, + select: { + id: true, + idGroup: true, + title: true, + desc: true, + status: true, + ProjectMember: { + where: { + isActive: true + }, + select: { + idUser: true + } + }, + ProjectTask: { + where: { + isActive: true + }, + select: { + title: true, + status: true + } + }, + Group: { + select: { + name: true + } + } + }, + orderBy: { + createdAt: 'desc' + } + }) + + const omitData = data.map((v: any) => ({ + ..._.omit(v, ["ProjectMember", "ProjectTask", "status", "Group"]), + group: v.Group.name, + status: v.status == 0 ? "segera" : v.status == 1 ? "dikerjakan" : v.status == 2 ? "selesai" : v.status == 3 ? "batal" : "", + progress: ceil((v.ProjectTask.filter((i: any) => i.status == 1).length * 100) / v.ProjectTask.length), + member: v.ProjectMember.length + })) + + + return NextResponse.json({ success: true, message: "Berhasil mendapatkan kegiatan", data: omitData }, { status: 200 }); + + } catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal mendapatkan kegiatan, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); + } +} \ No newline at end of file