From 9571affe058e317f733174b1eadf45c42b904707 Mon Sep 17 00:00:00 2001 From: amel Date: Mon, 5 May 2025 17:33:42 +0800 Subject: [PATCH] upd: diskusi umum Deskripsi: - api load get all diskusi umum - api send komentar dikusi umum - api mobile create diskusi umum, blm integrasi - api mobile aktifasi diskusi umum, blm integrasi No Issues --- .../discussion-general/[id]/comment/route.ts | 46 +++ .../discussion-general/[id]/member/route.ts | 92 ++++++ .../mobile/discussion-general/[id]/route.ts | 280 ++++++++++++++++++ .../api/mobile/discussion-general/route.ts | 194 ++++++++++++ 4 files changed, 612 insertions(+) create mode 100644 src/app/api/mobile/discussion-general/[id]/comment/route.ts create mode 100644 src/app/api/mobile/discussion-general/[id]/member/route.ts create mode 100644 src/app/api/mobile/discussion-general/[id]/route.ts create mode 100644 src/app/api/mobile/discussion-general/route.ts diff --git a/src/app/api/mobile/discussion-general/[id]/comment/route.ts b/src/app/api/mobile/discussion-general/[id]/comment/route.ts new file mode 100644 index 0000000..1427ff9 --- /dev/null +++ b/src/app/api/mobile/discussion-general/[id]/comment/route.ts @@ -0,0 +1,46 @@ +import { prisma } from "@/module/_global"; +import { funGetUserById } from "@/module/auth"; +import { createLogUserMobile } from "@/module/user"; +import { NextResponse } from "next/server"; + + +// KIRIM KOMENTAR DISKUSI UMUM +export async function POST(request: Request, context: { params: { id: string } }) { + try { + const { id } = context.params + const { desc, user } = (await request.json()); + const userMobile = await funGetUserById({ id: String(user) }) + + if (userMobile.id == "null" || userMobile.id == undefined || userMobile.id == "") { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); + } + + const cek = await prisma.discussion.count({ + where: { + id, + isActive: true + } + }) + + if (cek == 0) { + return NextResponse.json({ success: false, message: "Gagal menambahkan komentar, data tidak ditemukan" }, { status: 200 }); + } + + + const data = await prisma.discussionComment.create({ + data: { + comment: desc, + idDiscussion: id, + idUser: userMobile.id + } + }) + + // create log user + const log = await createLogUserMobile({ act: 'CREATE', desc: 'User menambah komentar pada diskusi umum', table: 'discussionComment', data: data.id, user: userMobile.id }) + return NextResponse.json({ success: true, message: "Berhasil menambah komentar" }, { status: 200 }); + + } catch (error) { + console.error(error) + return NextResponse.json({ success: false, message: "Gagal menambahkan komentar, coba lagi nanti (error: 500)" }) + } +} \ No newline at end of file diff --git a/src/app/api/mobile/discussion-general/[id]/member/route.ts b/src/app/api/mobile/discussion-general/[id]/member/route.ts new file mode 100644 index 0000000..806923d --- /dev/null +++ b/src/app/api/mobile/discussion-general/[id]/member/route.ts @@ -0,0 +1,92 @@ +import { prisma } from "@/module/_global"; +import { funGetUserByCookies } from "@/module/auth"; +import { createLogUser } from "@/module/user"; +import _ from "lodash"; +import { NextResponse } from "next/server"; + + +// ADD MEMBER DISCUSSION GENERAL +export async function POST(request: Request, context: { params: { id: string } }) { + try { + const user = await funGetUserByCookies() + if (user.id == undefined) { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + } + + const { id } = context.params + const { member } = (await request.json()) + + const cek = await prisma.discussion.count({ + where: { + id, + isActive: true + } + }) + + if (cek == 0) { + return NextResponse.json({ success: false, message: "Gagal menambahkan anggota, data tidak ditemukan" }, { status: 404 }); + } + + if (member.length > 0) { + const dataMember = member.map((v: any) => ({ + ..._.omit(v, ["idUser", "name", "img"]), + idDiscussion: id, + idUser: v.idUser + })) + + const insertMember = await prisma.discussionMember.createMany({ + data: dataMember + }) + } + + // create log user + const log = await createLogUser({ act: 'CREATE', desc: 'User menambah anggota diskusi umum', table: 'discussion', data: String(id) }) + return NextResponse.json({ success: true, message: "Berhasil menambahkan anggota diskusi umum" }, { status: 200 }); + + } catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal menambahkan anggota, coba lagi nanti (error : 500)" }, { status: 500 }); + } +} + + +// MENGELUARKAN ANGGOTA +export async function DELETE(request: Request, context: { params: { id: string } }) { + try { + const user = await funGetUserByCookies() + if (user.id == undefined) { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + } + + const { id } = context.params + const { idUser } = (await request.json()); + + + const cek = await prisma.discussion.count({ + where: { + id, + isActive: true + } + }) + + if (cek == 0) { + return NextResponse.json({ success: false, message: "Gagal, data tidak ditemukan" }, { status: 404 }); + } + + const deleteMember = await prisma.discussionMember.deleteMany({ + where: { + idDiscussion: id, + idUser + } + }) + + // create log user + const log = await createLogUser({ act: 'DELETE', desc: 'User mengeluarkan anggota diskusi umum', table: 'discussion', data: String(id) }) + + return NextResponse.json({ success: true, message: "Berhasil mengeluarkan anggota diskusi umum" }, { status: 200 }); + + } catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal mengeluarkan anggota, coba lagi nanti (error : 500)" }, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/app/api/mobile/discussion-general/[id]/route.ts b/src/app/api/mobile/discussion-general/[id]/route.ts new file mode 100644 index 0000000..c7fca14 --- /dev/null +++ b/src/app/api/mobile/discussion-general/[id]/route.ts @@ -0,0 +1,280 @@ +import { prisma } from "@/module/_global"; +import { funGetUserById } from "@/module/auth"; +import { createLogUserMobile } from "@/module/user"; +import _ from "lodash"; +import moment from "moment"; +import "moment/locale/id"; +import { NextResponse } from "next/server"; + + +// GET ONE DETAIL DISKUSI UMUM +export async function GET(request: Request, context: { params: { id: string } }) { + try { + let dataFix + const { id } = context.params + const { searchParams } = new URL(request.url); + const kategori = searchParams.get("cat"); + const userMobile = searchParams.get("user"); + + const user = await funGetUserById({ id: String(userMobile) }) + + if (user.id == "null" || user.id == undefined || user.id == "") { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + } + + const cek = await prisma.discussion.count({ + where: { + id + } + }) + + if (cek == 0) { + return NextResponse.json({ success: false, message: "Gagal mendapatkan diskusi, data tidak ditemukan" }, { status: 404 }); + } + + if (kategori == "detail") { + const data = await prisma.discussion.findUnique({ + where: { + id, + }, + select: { + isActive: true, + id: true, + title: true, + idGroup: true, + desc: true, + status: true, + createdAt: true, + } + }) + + dataFix = { + id: data?.id, + isActive: data?.isActive, + idGroup: data?.idGroup, + title: data?.title, + desc: data?.desc, + status: data?.status, + createdAt: moment(data?.createdAt).format("ll"), + } + + } else if (kategori == "komentar") { + const data = await prisma.discussionComment.findMany({ + where: { + idDiscussion: id, + isActive: true + }, + select: { + id: true, + comment: true, + createdAt: true, + idUser: true, + User: { + select: { + name: true, + img: true + } + } + } + }) + + dataFix = data.map((v: any) => ({ + ..._.omit(v, ["createdAt", "User",]), + createdAt: moment(v.createdAt).format("lll").replace('pukul', ''), + username: v.User.name, + img: v.User.img + })) + + } else if (kategori == "anggota") { + const data = await prisma.discussionMember.findMany({ + where: { + idDiscussion: id, + isActive: true + }, + select: { + idUser: true, + User: { + select: { + name: true, + img: true + } + } + } + }) + + dataFix = data.map((v: any) => ({ + ..._.omit(v, ["User",]), + name: v.User.name, + img: v.User.img + })) + } else if (kategori == "cek-anggota") { + const cek = await prisma.discussionMember.count({ + where: { + idDiscussion: id, + isActive: true, + idUser: user.id + } + }) + + if (cek > 0) { + dataFix = true + } else { + dataFix = false + } + } + + + return NextResponse.json({ success: true, message: "Berhasil mendapatkan diskusi", data: dataFix }, { 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 }); + } +} + + +// OPEN OR CLOSE DISKUSI UMUM +export async function POST(request: Request, context: { params: { id: string } }) { + try { + + const { id } = context.params + const { status, user } = (await request.json()); + + const userMobile = await funGetUserById({ id: String(user) }) + + if (userMobile.id == "null" || userMobile.id == undefined || userMobile.id == "") { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); + } + + let newStatus; + if (status === 1) { + newStatus = 2; + } else if (status === 2) { + newStatus = 1; + } else { + return NextResponse.json({ success: false, message: "Invalid status" }, { status: 200 }); + } + + const data = await prisma.discussion.count({ + where: { + id: id + }, + }); + + if (data == 0) { + return NextResponse.json({ success: false, message: "Gagal mendapatkan diskusi, data tidak ditemukan" }, { status: 200 }); + } + + const result = await prisma.discussion.update({ + where: { + id + }, + data: { + status: newStatus + } + }); + + // create log user + const log = await createLogUserMobile({ act: 'UPDATE', desc: 'User mengupdate status diskusi umum', table: 'discussion', data: id, user: userMobile.id }) + + return NextResponse.json({ success: true, message: "Berhasil mengedit diskusi umum" }, { status: 200 }); + + } catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal mengedit diskusi umum, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); + } +} + + +// DELETE DISCUSSION +export async function DELETE(request: Request, context: { params: { id: string } }) { + try { + const { id } = context.params + const { active, user } = (await request.json()); + + const userMobile = await funGetUserById({ id: String(user) }) + + if (userMobile.id == "null" || userMobile.id == undefined || userMobile.id == "") { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); + } + + const cek = await prisma.discussion.count({ + where: { + id: id + }, + }); + + if (cek == 0) { + return NextResponse.json({ success: false, message: "Gagal menghapus diskusi umum, data tidak ditemukan" }, { status: 200 }); + } + + + const data = await prisma.discussion.update({ + where: { + id + }, + data: { + isActive: active + } + }); + + + // create log user + if (active) { + const log = await createLogUserMobile({ act: 'DELETE', desc: 'User mengaktifkan data diskusi umum', table: 'disscussion', data: id, user: userMobile.id }) + return NextResponse.json({ success: true, message: "Berhasil mengaktifkan diskusi umum", user: user.id }, { status: 200 }); + } else { + const log = await createLogUserMobile({ act: 'DELETE', desc: 'User mengarsipkan data diskusi umum', table: 'disscussion', data: id, user: userMobile.id }) + return NextResponse.json({ success: true, message: "Berhasil mengarsipkan diskusi umum", user: user.id }, { status: 200 }); + } + + + } catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal mengubah diskusi umum, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); + } +} + + +// EDIT DISCUSSION +export async function PUT(request: Request, context: { params: { id: string } }) { + try { + const { id } = context.params + const { title, desc, user } = (await request.json()); + + const userMobile = await funGetUserById({ id: String(user) }) + + if (userMobile.id == "null" || userMobile.id == undefined || userMobile.id == "") { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); + } + + const data = await prisma.discussion.count({ + where: { + id: id + }, + }); + + if (data == 0) { + return NextResponse.json({ success: false, message: "Gagal mengedit diskusi umum, data tidak ditemukan" }, { status: 200 }); + } + + const update = await prisma.discussion.update({ + where: { + id + }, + data: { + desc, + title + } + }); + + // create log user + const log = await createLogUserMobile({ act: 'UPDATE', desc: 'User mengupdate data diskusi umum', table: 'discussion', data: id, user: userMobile.id }) + return NextResponse.json({ success: true, message: "Berhasil mengedit diskusi umum" }, { status: 200 }); + + } catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal mengedit diskusi umum, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/app/api/mobile/discussion-general/route.ts b/src/app/api/mobile/discussion-general/route.ts new file mode 100644 index 0000000..8d693ea --- /dev/null +++ b/src/app/api/mobile/discussion-general/route.ts @@ -0,0 +1,194 @@ +import { prisma } from "@/module/_global"; +import { funGetUserById } from "@/module/auth"; +import { createLogUserMobile } from "@/module/user"; +import _ from "lodash"; +import moment from "moment"; +import "moment/locale/id"; +import { NextResponse } from "next/server"; + + + +// GET ALL DISCUSSION GENERAL +export async function GET(request: Request) { + try { + const { searchParams } = new URL(request.url); + const user = searchParams.get("user") + if (user == "null" || user == undefined || user == "") { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + } + + const userMobile = await funGetUserById({ id: user }) + + let grup + const villageId = userMobile.idVillage + const idGroup = searchParams.get("group"); + const search = searchParams.get('search'); + const page = searchParams.get('page'); + const status = searchParams.get('active'); + const dataSkip = Number(page) * 10 - 10; + + if (idGroup == "null" || idGroup == undefined || idGroup == "" || idGroup == "undefined") { + grup = userMobile.idGroup + } else { + grup = idGroup + } + + const cek = await prisma.group.count({ + where: { + id: grup, + isActive: true + } + }) + + if (cek == 0) { + return NextResponse.json({ success: false, message: "Gagal mendapatkan data kegiatan, data tidak ditemukan", }, { status: 200 }); + } + + const data = await prisma.discussion.findMany({ + // skip: dataSkip, + // take: 10, + where: { + isActive: status == "false" ? false : true, + idVillage: String(villageId), + idGroup: grup, + title: { + contains: (search == undefined || search == "null") ? "" : search, + mode: "insensitive" + }, + }, + orderBy: [ + { + status: 'desc' + }, + { + createdAt: 'desc' + } + ], + + select: { + id: true, + title: true, + desc: true, + status: true, + createdAt: true, + DiscussionComment: { + select: { + id: true, + } + } + } + }); + + const fixData = data.map((v: any) => ({ + ..._.omit(v, ["DiscussionComment", "createdAt"]), + total_komentar: v.DiscussionComment.length, + createdAt: moment(v.createdAt).format("ll") + })) + + const filter = await prisma.group.findUnique({ + where: { + id: grup + }, + select: { + id: true, + name: true + } + }) + + return NextResponse.json({ success: true, message: "Berhasil mendapatkan diskusi", data: fixData, filter }, { 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 }); + } +} + + + +// CREATE DISCUSSION GENERALE +export async function POST(request: Request) { + try { + const { idGroup, user, title, desc, member } = await request.json(); + + if (user == "null" || user == undefined || user == "") { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + } + + const userMobile = await funGetUserById({ id: user }) + const userId = user + const userRoleLogin = userMobile.idUserRole + + const data = await prisma.discussion.create({ + data: { + idVillage: String(userMobile.idVillage), + idGroup: idGroup, + title: title, + desc: desc, + createdBy: String(userId), + }, + select: { + id: true + } + }); + + const dataMember = member.map((v: any) => ({ + ..._.omit(v, ["idUser", "name", "img"]), + idDiscussion: data.id, + idUser: v.idUser, + })) + + const insertMember = await prisma.discussionMember.createMany({ + data: dataMember + }) + + const dataNotif = member.map((v: any) => ({ + ..._.omit(v, ["idUser", "name", "img"]), + idUserTo: v.idUser, + idUserFrom: userId, + category: 'discussion', + idContent: data.id, + title: 'Diskusi Umum Baru', + desc: 'Terdapat diskusi umum baru. Silahkan periksa detailnya.' + })) + + if (userRoleLogin != "supadmin") { + const perbekel = await prisma.user.findFirst({ + where: { + isActive: true, + idUserRole: "supadmin", + idVillage: user.idVillage + }, + select: { + id: true, + Subscribe: { + select: { + subscription: true + } + } + } + }) + + dataNotif.push({ + idUserTo: perbekel?.id, + idUserFrom: userId, + category: 'discussion', + idContent: data.id, + title: 'Diskusi Umum Baru', + desc: 'Terdapat diskusi umum baru. Silahkan periksa detailnya.' + }) + } + + const insertNotif = await prisma.notifications.createMany({ + data: dataNotif + }) + + + // create log user + const log = await createLogUserMobile({ act: 'CREATE', desc: 'User membuat data diskusi umum', table: 'discussion', data: data.id, user }) + return NextResponse.json({ success: true, message: "Berhasil menambahkan diskusi umum", notif: dataNotif }, { status: 200 }); + + } catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal menambahkan diskusi, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); + } +} \ No newline at end of file