diff --git a/prisma/schema.prisma b/prisma/schema.prisma index dacd4ca..b187a9d 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -420,6 +420,7 @@ model DivisionDisscussionComment { isActive Boolean @default(true) User User @relation(fields: [createdBy], references: [id]) createdBy String + isEdited Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } @@ -615,6 +616,7 @@ model DiscussionComment { idUser String comment String @db.Text isActive Boolean @default(true) + isEdited Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } diff --git a/src/app/api/discussion-general/[id]/route.ts b/src/app/api/discussion-general/[id]/route.ts index 7e27184..a600a87 100644 --- a/src/app/api/discussion-general/[id]/route.ts +++ b/src/app/api/discussion-general/[id]/route.ts @@ -3,8 +3,8 @@ import { funGetUserByCookies } from "@/module/auth"; import { createLogUser } from "@/module/user"; import _ from "lodash"; import moment from "moment"; -import { NextResponse } from "next/server"; import "moment/locale/id"; +import { NextResponse } from "next/server"; // GET ONE DETAIL DISKUSI UMUM @@ -75,6 +75,9 @@ export async function GET(request: Request, context: { params: { id: string } }) img: true } } + }, + orderBy: { + createdAt: "asc" } }) diff --git a/src/app/api/discussion-general/route.ts b/src/app/api/discussion-general/route.ts index c3489e0..f2858e3 100644 --- a/src/app/api/discussion-general/route.ts +++ b/src/app/api/discussion-general/route.ts @@ -74,6 +74,9 @@ export async function GET(request: Request) { DiscussionComment: { select: { id: true, + }, + where:{ + isActive:true } } } diff --git a/src/app/api/discussion/[id]/route.ts b/src/app/api/discussion/[id]/route.ts index cf7fd56..47cfbaf 100644 --- a/src/app/api/discussion/[id]/route.ts +++ b/src/app/api/discussion/[id]/route.ts @@ -60,6 +60,12 @@ export async function GET(request: Request, context: { params: { id: string } }) img: true } } + }, + where: { + isActive:true + }, + orderBy: { + createdAt: "asc" } }, } diff --git a/src/app/api/discussion/route.ts b/src/app/api/discussion/route.ts index cc59f3d..dd174f3 100644 --- a/src/app/api/discussion/route.ts +++ b/src/app/api/discussion/route.ts @@ -64,6 +64,9 @@ export async function GET(request: Request) { DivisionDisscussionComment: { select: { id: true, + }, + where:{ + isActive:true } } } diff --git a/src/app/api/home/route.ts b/src/app/api/home/route.ts index 45f6514..83f7322 100644 --- a/src/app/api/home/route.ts +++ b/src/app/api/home/route.ts @@ -1,4 +1,3 @@ -import { DivisionProject } from './../../../../node_modules/.prisma/client/index.d'; import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; import _, { ceil } from "lodash"; @@ -36,22 +35,28 @@ export async function GET(request: Request) { isActive: true, } } - } else if (roleUser == "admin" || roleUser == "cosupadmin") { + } else { kondisi = { isActive: true, idGroup: idGroup } - } else { - kondisi = { - isActive: true, - idGroup: idGroup, - ProjectMember: { - some: { - idUser: user.id - } - } - } } + // else if (roleUser == "admin" || roleUser == "cosupadmin") { + // kondisi = { + // isActive: true, + // idGroup: idGroup + // } + // } else { + // kondisi = { + // isActive: true, + // idGroup: idGroup, + // ProjectMember: { + // some: { + // idUser: user.id + // } + // } + // } + // } const data = await prisma.project.findMany({ skip: 0, @@ -74,7 +79,7 @@ export async function GET(request: Request) { } }, orderBy: { - createdAt: "desc" + updatedAt: "desc" } }) @@ -96,22 +101,28 @@ export async function GET(request: Request) { isActive: true, } } - } else if (roleUser == "admin" || roleUser == "cosupadmin") { + } else { kondisi = { isActive: true, idGroup: idGroup } - } else { - kondisi = { - isActive: true, - idGroup: idGroup, - DivisionMember: { - some: { - idUser: user.id - } - } - } } + // else if (roleUser == "admin" || roleUser == "cosupadmin") { + // kondisi = { + // isActive: true, + // idGroup: idGroup + // } + // } else { + // kondisi = { + // isActive: true, + // idGroup: idGroup, + // DivisionMember: { + // some: { + // idUser: user.id + // } + // } + // } + // } const data = await prisma.division.findMany({ where: kondisi, @@ -134,7 +145,9 @@ export async function GET(request: Request) { jumlah: v.DivisionProject.length, })) - allData = _.orderBy(format, 'jumlah', 'desc').slice(0, 5) + const filter = format.filter((v: any) => v.jumlah > 0) + + allData = _.orderBy(filter, 'jumlah', 'desc').slice(0, 5) } else if (kategori == "progress") { let kondisi @@ -143,37 +156,50 @@ export async function GET(request: Request) { if (roleUser == "supadmin" || roleUser == "developer") { kondisi = { isActive: true, - Division: { + idVillage: idVillage, + Group: { isActive: true, - idVillage: idVillage, - Group: { - isActive: true, - } - } - } - } else if (roleUser == "admin" || roleUser == "cosupadmin") { - kondisi = { - isActive: true, - Division: { - isActive: true, - idGroup: idGroup } } + // kondisi = { + // isActive: true, + // Division: { + // isActive: true, + // idVillage: idVillage, + // Group: { + // isActive: true, + // } + // } + // } } else { kondisi = { isActive: true, - Division: { - isActive: true, - DivisionMember: { - some: { - idUser: user.id - } - } - } + idGroup: idGroup } } + // else if (roleUser == "admin" || roleUser == "cosupadmin") { + // kondisi = { + // isActive: true, + // Division: { + // isActive: true, + // idGroup: idGroup + // } + // } + // } else { + // kondisi = { + // isActive: true, + // Division: { + // isActive: true, + // DivisionMember: { + // some: { + // idUser: user.id + // } + // } + // } + // } + // } - const data = await prisma.divisionProject.groupBy({ + const data = await prisma.project.groupBy({ where: kondisi, by: ["status"], _count: true @@ -218,7 +244,7 @@ export async function GET(request: Request) { } } } - } else if (roleUser == "admin" || roleUser == "cosupadmin") { + } else { kondisi = { isActive: true, category: 'FILE', @@ -227,20 +253,30 @@ export async function GET(request: Request) { idGroup: idGroup } } - } else { - kondisi = { - isActive: true, - category: 'FILE', - Division: { - isActive: true, - DivisionMember: { - some: { - idUser: user.id - } - } - } - } } + // else if (roleUser == "admin" || roleUser == "cosupadmin") { + // kondisi = { + // isActive: true, + // category: 'FILE', + // Division: { + // isActive: true, + // idGroup: idGroup + // } + // } + // } else { + // kondisi = { + // isActive: true, + // category: 'FILE', + // Division: { + // isActive: true, + // DivisionMember: { + // some: { + // idUser: user.id + // } + // } + // } + // } + // } const data = await prisma.divisionDocumentFolderFile.findMany({ where: kondisi, @@ -377,7 +413,7 @@ export async function GET(request: Request) { } } } - } else if (roleUser == "admin" || roleUser == "cosupadmin") { + } else { kondisi = { isActive: true, status: 1, @@ -386,20 +422,30 @@ export async function GET(request: Request) { isActive: true } } - } else { - kondisi = { - isActive: true, - status: 1, - Division: { - isActive: true, - DivisionMember: { - some: { - idUser: user.id - } - } - } - } } + // else if (roleUser == "admin" || roleUser == "cosupadmin") { + // kondisi = { + // isActive: true, + // status: 1, + // Division: { + // idGroup: idGroup, + // isActive: true + // } + // } + // } else { + // kondisi = { + // isActive: true, + // status: 1, + // Division: { + // isActive: true, + // DivisionMember: { + // some: { + // idUser: user.id + // } + // } + // } + // } + // } const data = await prisma.divisionDisscussion.findMany({ skip: 0, diff --git a/src/app/api/mobile/announcement/[id]/route.ts b/src/app/api/mobile/announcement/[id]/route.ts index 9c7710b..0ca038a 100644 --- a/src/app/api/mobile/announcement/[id]/route.ts +++ b/src/app/api/mobile/announcement/[id]/route.ts @@ -20,6 +20,7 @@ export async function GET(request: Request, context: { params: { id: string } }) const data = await prisma.announcement.count({ where: { id: id, + isActive: true, }, }); @@ -29,7 +30,7 @@ export async function GET(request: Request, context: { params: { id: string } }) success: false, message: "Gagal mendapatkan pengumuman, data tidak ditemukan", }, - { status: 404 } + { status: 200 } ); } @@ -173,7 +174,7 @@ export async function PUT(request: Request, context: { params: { id: string } }) success: false, message: "Edit pengumuman gagal, data tidak ditemukan", }, - { status: 404 } + { status: 200 } ); } diff --git a/src/app/api/mobile/announcement/route.ts b/src/app/api/mobile/announcement/route.ts index c5b0764..822227d 100644 --- a/src/app/api/mobile/announcement/route.ts +++ b/src/app/api/mobile/announcement/route.ts @@ -255,15 +255,20 @@ export async function POST(request: Request) { const dataNotifFilter = dataNotif.filter((v: any) => v.idUserTo != undefined && v.idUserTo != null && v.idUserTo != "" && v.idUserTo != userId) + const dataNotifFilterUnique = dataNotifFilter + .filter((v: any, index: number, self: any[]) => + index === self.findIndex((t: any) => t.idUserTo == v.idUserTo) + ) const pushNotif = dataPush.filter((item) => item.subscription != undefined) const sendWebPush = await funSendWebPush({ sub: pushNotif, message: { title: 'Pengumuman Baru', body: title } }) const insertNotif = await prisma.notifications.createMany({ - data: dataNotifFilter + data: dataNotifFilterUnique }) const tokenUnique = [...new Set(tokenDup.flat())].filter((v: any) => v != undefined && v != null && v != ""); + await sendFCMNotificationMany({ token: tokenUnique, title: "Pengumuman Baru", diff --git a/src/app/api/mobile/banner/route.ts b/src/app/api/mobile/banner/route.ts index 160d4b6..5350995 100644 --- a/src/app/api/mobile/banner/route.ts +++ b/src/app/api/mobile/banner/route.ts @@ -11,7 +11,7 @@ export async function GET(request: Request) { const userMobile = searchParams.get("user") if (userMobile == "null" || userMobile == undefined || userMobile == "") { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const user = await funGetUserById({ id: userMobile }) diff --git a/src/app/api/mobile/discussion-general/[id]/comment/route.ts b/src/app/api/mobile/discussion-general/[id]/comment/route.ts index 34f78a2..71b8dd2 100644 --- a/src/app/api/mobile/discussion-general/[id]/comment/route.ts +++ b/src/app/api/mobile/discussion-general/[id]/comment/route.ts @@ -37,6 +37,29 @@ export async function POST(request: Request, context: { params: { id: string } } } }) + const dataDiscussion = await prisma.discussion.findUnique({ + where: { + id + }, + select: { + createdBy: true, + User: { + select: { + Subscribe: { + select: { + subscription: true + } + }, + TokenDeviceUser: { + select: { + token: true + } + } + } + } + } + }) + const member = await prisma.discussionMember.findMany({ where: { idDiscussion: id, @@ -70,7 +93,10 @@ export async function POST(request: Request, context: { params: { id: string } } } }) - const memberFilter = member.filter((v: any) => v.idUser != userMobile.id) + const memberFilter = [...member, { idUser: dataDiscussion?.createdBy, User: dataDiscussion?.User }].filter((v: any) => v.idUser != userMobile.id) + .filter((v: any, index: number, self: any[]) => + index === self.findIndex((t) => t.idUser === v.idUser) + ); const dataFCM = memberFilter.map((v: any) => ({ ..._.omit(v, ["idUser", "User", "Subscribe", "TokenDeviceUser"]), @@ -121,4 +147,90 @@ export async function POST(request: Request, context: { params: { id: string } } console.error(error) return NextResponse.json({ success: false, message: "Gagal menambahkan komentar, coba lagi nanti (error: 500)" }) } +} + +// EDIT KOMENTAR +export async function PUT(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.discussionComment.count({ + where: { + id, + isActive: true + } + }) + + if (cek == 0) { + return NextResponse.json({ success: false, message: "Gagal mengedit komentar, data tidak ditemukan" }, { status: 200 }); + } + + + const data = await prisma.discussionComment.update({ + where: { + id + }, + data: { + comment: desc, + isEdited: true + } + }) + + // create log user + const log = await createLogUserMobile({ act: 'UPDATE', desc: 'User mengedit komentar pada diskusi umum', table: 'discussionComment', data: id, user: userMobile.id }) + return NextResponse.json({ success: true, message: "Berhasil mengedit komentar" }, { status: 200 }); + + } catch (error) { + console.error(error) + return NextResponse.json({ success: false, message: "Gagal mengedit komentar, coba lagi nanti (error: 500)" }) + } +} + + +// HAPUS KOMENTAR +export async function DELETE(request: Request, context: { params: { id: string } }) { + try { + const { id } = context.params + const { 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.discussionComment.count({ + where: { + id, + isActive: true + } + }) + + if (cek == 0) { + return NextResponse.json({ success: false, message: "Gagal mengedit komentar, data tidak ditemukan" }, { status: 200 }); + } + + + const data = await prisma.discussionComment.update({ + where: { + id + }, + data: { + isActive: false + } + }) + + // create log user + const log = await createLogUserMobile({ act: 'DELETE', desc: 'User menghapus komentar pada diskusi umum', table: 'discussionComment', data: id, user: userMobile.id }) + return NextResponse.json({ success: true, message: "Berhasil mengedit komentar" }, { status: 200 }); + + } catch (error) { + console.error(error) + return NextResponse.json({ success: false, message: "Gagal mengedit komentar, coba lagi nanti (error: 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 index 6b3a5dd..a1b536f 100644 --- a/src/app/api/mobile/discussion-general/[id]/route.ts +++ b/src/app/api/mobile/discussion-general/[id]/route.ts @@ -8,7 +8,7 @@ import { NextResponse } from "next/server"; // GET ONE DETAIL DISKUSI UMUM -export async function GET(request: Request, context: { params: { id: string } }) { +export async function GET(request : Request, context: { params: { id: string } }) { try { let dataFix const { id } = context.params @@ -19,7 +19,7 @@ export async function GET(request: Request, context: { params: { id: string } }) 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 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const cek = await prisma.discussion.count({ @@ -29,7 +29,7 @@ export async function GET(request: Request, context: { params: { id: string } }) }) if (cek == 0) { - return NextResponse.json({ success: false, message: "Gagal mendapatkan diskusi, data tidak ditemukan" }, { status: 404 }); + return NextResponse.json({ success: false, message: "Gagal mendapatkan diskusi, data tidak ditemukan" }, { status: 200 }); } if (kategori == "detail") { @@ -68,6 +68,8 @@ export async function GET(request: Request, context: { params: { id: string } }) id: true, comment: true, createdAt: true, + updatedAt: true, + isEdited: true, idUser: true, User: { select: { @@ -75,12 +77,16 @@ export async function GET(request: Request, context: { params: { id: string } }) img: true } } + }, + orderBy: { + createdAt: "asc" } }) dataFix = data.map((v: any) => ({ - ..._.omit(v, ["createdAt", "User",]), + ..._.omit(v, ["createdAt", "User", "updatedAt"]), createdAt: countTime(v.createdAt), + updatedAt: moment(v.updatedAt).format("ll"), username: v.User.name, img: v.User.img })) diff --git a/src/app/api/mobile/discussion-general/route.ts b/src/app/api/mobile/discussion-general/route.ts index 556a2c4..875d76d 100644 --- a/src/app/api/mobile/discussion-general/route.ts +++ b/src/app/api/mobile/discussion-general/route.ts @@ -15,7 +15,7 @@ export async function GET(request: Request) { 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 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const userMobile = await funGetUserById({ id: user }) @@ -75,6 +75,9 @@ export async function GET(request: Request) { DiscussionComment: { select: { id: true, + }, + where: { + isActive: true } } } @@ -210,9 +213,13 @@ export async function POST(request: Request) { } dataNotif.filter((v: any) => v.idUserTo != undefined && v.idUserTo != null && v.idUserTo != "" && v.idUserTo != userId) + const dataNotifUnique = dataNotif + .filter((v: any, index: number, self: any[]) => + index === self.findIndex((t: any) => t.idUserTo == v.idUserTo) + ) const insertNotif = await prisma.notifications.createMany({ - data: dataNotif + data: dataNotifUnique }) const tokenUnique = [...new Set(tokenDup.flat())].filter((v: any) => v != undefined && v != null && v != ""); diff --git a/src/app/api/mobile/discussion/[id]/comment/route.ts b/src/app/api/mobile/discussion/[id]/comment/route.ts index b205fcb..57f7b2e 100644 --- a/src/app/api/mobile/discussion/[id]/comment/route.ts +++ b/src/app/api/mobile/discussion/[id]/comment/route.ts @@ -5,7 +5,7 @@ import _ from "lodash"; import { NextResponse } from "next/server"; import { sendFCMNotificationMany } from "../../../../../../../xsendMany"; -// CREATE COMENT BY ID KOMENTAR +// CREATE COMENT export async function POST(request: Request, context: { params: { id: string } }) { try { const { id } = context.params @@ -50,6 +50,21 @@ export async function POST(request: Request, context: { params: { id: string } } }, select: { idDivision: true, + createdBy: true, + User: { + select: { + Subscribe: { + select: { + subscription: true + } + }, + TokenDeviceUser: { + select: { + token: true + } + } + } + } } }) @@ -86,7 +101,10 @@ export async function POST(request: Request, context: { params: { id: string } } } }) - const memberFilter = member.filter((v: any) => v.idUser != userMobile.id) + const memberFilter = [...member, { idUser: dataDivision?.createdBy, User: dataDivision?.User }].filter((v: any) => v.idUser != userMobile.id) + .filter((v: any, index: number, self: any[]) => + index === self.findIndex((t) => t.idUser === v.idUser) + ); const dataFCM = memberFilter.map((v: any) => ({ ..._.omit(v, ["idUser", "User", "Subscribe", "TokenDeviceUser"]), @@ -138,4 +156,103 @@ export async function POST(request: Request, context: { params: { id: string } } console.error(error); return NextResponse.json({ success: false, message: "Gagal menambah komentar, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); } +} + +// EDIT KOMENTAR +export async function PUT(request: Request, context: { params: { id: string } }) { + try { + const { id } = context.params + const { comment, 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: "User tidak ditemukan" }, { status: 200 }); + } + + const cek = await prisma.divisionDisscussionComment.count({ + where: { + id, + isActive: true + } + }) + + if (cek == 0) { + return NextResponse.json( + { + success: false, + message: "Edit komentar gagal, data tidak ditemukan", + }, + { status: 200 } + ); + } + + const data = await prisma.divisionDisscussionComment.update({ + where: { + id: id + }, + data: { + comment: comment, + isEdited: true + } + }) + + // create log user + const log = await createLogUserMobile({ act: 'UPDATE', desc: 'User mengedit komentar pada diskusi divisi', table: 'divisionDisscussionComment', data: id, user: userMobile.id }) + + return NextResponse.json({ success: true, message: "Berhasil mengedit komentar" }, { status: 200 }); + + } catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal menambah komentar, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); + } +} + +// HAPUS KOMENTAR +export async function DELETE(request: Request, context: { params: { id: string } }) { + try { + const { id } = context.params + const { 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: "User tidak ditemukan" }, { status: 200 }); + } + + const cek = await prisma.divisionDisscussionComment.count({ + where: { + id, + isActive: true + } + }) + + if (cek == 0) { + return NextResponse.json( + { + success: false, + message: "Hapus komentar gagal, data tidak ditemukan", + }, + { status: 200 } + ); + } + + const data = await prisma.divisionDisscussionComment.update({ + where: { + id: id + }, + data: { + isActive: false + } + }) + + // create log user + const log = await createLogUserMobile({ act: 'DELETE', desc: 'User menghapus komentar pada diskusi divisi', table: 'divisionDisscussionComment', data: id, user: userMobile.id }) + + return NextResponse.json({ success: true, message: "Berhasil menghapus komentar" }, { status: 200 }); + + } catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal menghapus komentar, 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/[id]/route.ts b/src/app/api/mobile/discussion/[id]/route.ts index 5b423cc..33de9f9 100644 --- a/src/app/api/mobile/discussion/[id]/route.ts +++ b/src/app/api/mobile/discussion/[id]/route.ts @@ -31,33 +31,42 @@ export async function GET(request: Request, context: { params: { id: string } }) success: false, message: "Gagal mendapatkan diskusi, data tidak ditemukan", }, - { status: 404 } + { status: 200 } ); } if (cat == "comment") { const data = await prisma.divisionDisscussionComment.findMany({ where: { - idDisscussion: id + idDisscussion: id, + isActive: true }, select: { id: true, comment: true, createdAt: true, + updatedAt: true, + isEdited: true, + createdBy: true, User: { select: { name: true, img: true } } + }, + orderBy: { + createdAt: "asc" } }) const omitMember = data.map((v: any) => ({ - ..._.omit(v, ["User", "createdAt"]), + ..._.omit(v, ["User", "createdBy", "createdAt", "updatedAt"]), + idUser: v.createdBy, username: v.User.name, img: v.User.img, createdAt: countTime(v.createdAt), + updatedAt: moment(v.updatedAt).format("ll") })) return NextResponse.json({ success: true, message: "Berhasil mendapatkan komentar", data: omitMember }, { status: 200 }); @@ -128,7 +137,7 @@ export async function DELETE(request: Request, context: { params: { id: string } }); if (data == 0) { - return NextResponse.json({ success: false, message: "Gagal mendapatkan diskusi, data tidak ditemukan" }, { status: 404 }); + return NextResponse.json({ success: false, message: "Gagal mendapatkan diskusi, data tidak ditemukan" }, { status: 200 }); } const result = await prisma.divisionDisscussion.update({ diff --git a/src/app/api/mobile/discussion/route.ts b/src/app/api/mobile/discussion/route.ts index 38c2176..663b00b 100644 --- a/src/app/api/mobile/discussion/route.ts +++ b/src/app/api/mobile/discussion/route.ts @@ -35,7 +35,7 @@ export async function GET(request: Request) { }) if (cekDivision == 0) { - return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, data tidak ditemukan" }, { status: 404 }); + return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, data tidak ditemukan" }, { status: 200 }); } const data = await prisma.divisionDisscussion.findMany({ @@ -67,6 +67,9 @@ export async function GET(request: Request) { DivisionDisscussionComment: { select: { id: true, + }, + where: { + isActive: true } } } @@ -118,7 +121,7 @@ export async function POST(request: Request) { }) if (cekDivision == 0) { - return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, data tidak ditemukan" }, { status: 404 }); + return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, data tidak ditemukan" }, { status: 200 }); } const data = await prisma.divisionDisscussion.create({ @@ -263,12 +266,16 @@ export async function POST(request: Request) { } const dataNotifFilter = dataNotif.filter((v: any) => v.idUserTo != undefined && v.idUserTo != null && v.idUserTo != "" && v.idUserTo != userId) + const dataNotifFilterUnique = dataNotifFilter + .filter((v: any, index: number, self: any[]) => + index === self.findIndex((t: any) => t.idUserTo == v.idUserTo) + ) const pushNotif = dataPush.filter((item) => item.subscription != undefined) const sendWebPush = await funSendWebPush({ sub: pushNotif, message: { body: deskripsiNotif, title: 'Diskusi Baru' } }) const insertNotif = await prisma.notifications.createMany({ - data: dataNotifFilter + data: dataNotifFilterUnique }) const tokenUnique = [...new Set(tokenDup.flat())].filter((v: any) => v != undefined && v != null && v != ""); diff --git a/src/app/api/mobile/division/route.ts b/src/app/api/mobile/division/route.ts index 4a8638d..9b6b538 100644 --- a/src/app/api/mobile/division/route.ts +++ b/src/app/api/mobile/division/route.ts @@ -314,12 +314,16 @@ export async function POST(request: Request) { } const dataNotifFilter = dataNotif.filter((v: any) => v.idUserTo != undefined && v.idUserTo != null && v.idUserTo != "" && v.idUserTo != userId) + const dataNotifFilterUnique = dataNotifFilter + .filter((v: any, index: number, self: any[]) => + index === self.findIndex((t: any) => t.idUserTo == v.idUserTo) + ) const pushNotif = dataPush.filter((item) => item.subscription != undefined) const sendWebPush = await funSendWebPush({ sub: pushNotif, message: { title: 'Divisi Baru', body: `Divisi ${sent.data.name} telah dibuat. Silakan periksa detailnya.` } }) const insertNotif = await prisma.notifications.createMany({ - data: dataNotifFilter + data: dataNotifFilterUnique }) const tokenUnique = [...new Set(tokenDup.flat())].filter((v: any) => v != undefined && v != null && v != ""); @@ -338,4 +342,45 @@ export async function POST(request: Request) { console.error(error); return NextResponse.json({ success: false, message: "Gagal menambahkan divisi, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); } +}; + + +// CEK DATA DIVISI (NAME DI DESA DAN GROUP YG SAMA) +export async function PUT(request: Request) { + try { + + const sent = (await request.json()) + const user = sent.user + 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 fixGroup + if (sent.data.idGroup == "null" || sent.data.idGroup == undefined || sent.data.idGroup == "") { + fixGroup = userMobile.idGroup + } else { + fixGroup = sent.data.idGroup + } + + const checkData = await prisma.division.count({ + where: { + name: { + equals: sent.data.name, + mode: "insensitive" + }, + idGroup: fixGroup, + idVillage: String(userMobile.idVillage) + } + }) + + if (checkData > 0) { + return NextResponse.json({ success: true, message: "Divisi dengan nama ini sudah ada", available: false }, { status: 200 }); + } + + return NextResponse.json({ success: true, message: "Berhasil cek data divisi", available: true }, { status: 200 }); + } catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal menambahkan divisi, 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/group/[id]/route.ts b/src/app/api/mobile/group/[id]/route.ts index 106a238..4a418bc 100644 --- a/src/app/api/mobile/group/[id]/route.ts +++ b/src/app/api/mobile/group/[id]/route.ts @@ -12,7 +12,7 @@ export async function GET(request: Request, context: { params: { id: string } }) const userMobile = searchParams.get("user") if (userMobile == "null" || userMobile == undefined || userMobile == "") { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const { id } = context.params; @@ -28,7 +28,7 @@ export async function GET(request: Request, context: { params: { id: string } }) success: false, message: "Gagal mendapatkan grup, data tidak ditemukan", }, - { status: 404 } + { status: 200 } ); } @@ -52,7 +52,7 @@ export async function DELETE(request: Request, context: { params: { id: string } const { isActive, user } = (await request.json()); if (user == "null" || user == undefined || user == "") { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const userLogin = await funGetUserById({ id: user }) @@ -68,7 +68,7 @@ export async function DELETE(request: Request, context: { params: { id: string } success: false, message: "Edit grup gagal, data tidak ditemukan", }, - { status: 404 } + { status: 200 } ); } @@ -98,7 +98,7 @@ export async function PUT(request: Request, context: { params: { id: string } }) const { name, user } = (await request.json()); if (user == "null" || user == undefined || user == "") { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const data = await prisma.group.count({ @@ -113,7 +113,7 @@ export async function PUT(request: Request, context: { params: { id: string } }) success: false, message: "Edit grup gagal, data tidak ditemukan", }, - { status: 404 } + { status: 200 } ); } diff --git a/src/app/api/mobile/group/route.ts b/src/app/api/mobile/group/route.ts index 95944b2..b0266f1 100644 --- a/src/app/api/mobile/group/route.ts +++ b/src/app/api/mobile/group/route.ts @@ -11,7 +11,7 @@ export async function GET(request: Request) { const userMobile = searchParams.get("user") if (userMobile == "null" || userMobile == undefined || userMobile == "") { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const user = await funGetUserById({ id: userMobile }) @@ -51,7 +51,7 @@ export async function POST(request: Request) { const { name, user } = (await request.json()); if (user == "null" || user == undefined || user == "") { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const userMobile = await funGetUserById({ id: user }) diff --git a/src/app/api/mobile/home/route.ts b/src/app/api/mobile/home/route.ts index 068d399..8ebe73f 100644 --- a/src/app/api/mobile/home/route.ts +++ b/src/app/api/mobile/home/route.ts @@ -81,7 +81,7 @@ export async function GET(request: Request) { } }, orderBy: { - createdAt: "desc" + updatedAt: "desc" } }) @@ -425,19 +425,19 @@ export async function GET(request: Request) { isActive: true, status: 1, idVillage: idVillage - }, + } - kondisi = { + kondisi = { + isActive: true, + status: 1, + Division: { isActive: true, - status: 1, - Division: { + idVillage: idVillage, + Group: { isActive: true, - idVillage: idVillage, - Group: { - isActive: true, - } } } + } } else { kondisiUmum = { isActive: true, diff --git a/src/app/api/mobile/home/search/route.ts b/src/app/api/mobile/home/search/route.ts index 5caacb6..83c5ef7 100644 --- a/src/app/api/mobile/home/search/route.ts +++ b/src/app/api/mobile/home/search/route.ts @@ -11,7 +11,7 @@ export async function GET(request: Request) { const userMobile = searchParams.get("user") if (userMobile == "null" || userMobile == undefined || userMobile == "") { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const userId = await funGetUserById({ id: userMobile }) diff --git a/src/app/api/mobile/position/[id]/route.ts b/src/app/api/mobile/position/[id]/route.ts index 7655611..a51cdc2 100644 --- a/src/app/api/mobile/position/[id]/route.ts +++ b/src/app/api/mobile/position/[id]/route.ts @@ -11,7 +11,7 @@ export async function GET(request: Request, context: { params: { id: string } }) const { id } = context.params; if (userMobile == "null" || userMobile == undefined || userMobile == "") { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const data = await prisma.position.findUnique({ @@ -30,7 +30,7 @@ export async function GET(request: Request, context: { params: { id: string } }) success: false, message: "Gagal mendapatkan jabatan, data tidak ditemukan", }, - { status: 404 } + { status: 200 } ); } @@ -55,7 +55,7 @@ export async function DELETE(request: Request, context: { params: { id: string } const { isActive, user } = (await request.json()); if (user == "null" || user == undefined || user == "") { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const data = await prisma.position.count({ @@ -104,7 +104,7 @@ export async function PUT(request: Request, context: { params: { id: string } }) const { name, idGroup, user } = await request.json(); if (user == "null" || user == undefined || user == "") { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const cek = await prisma.position.count({ diff --git a/src/app/api/mobile/position/route.ts b/src/app/api/mobile/position/route.ts index eeec356..3d52fdd 100644 --- a/src/app/api/mobile/position/route.ts +++ b/src/app/api/mobile/position/route.ts @@ -16,7 +16,7 @@ export async function GET(request: Request) { const userMobile = searchParams.get("user") if (userMobile == "null" || userMobile == undefined || userMobile == "") { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const user = await funGetUserById({ id: userMobile }) @@ -35,7 +35,7 @@ export async function GET(request: Request) { }) if (cek == 0) { - return NextResponse.json({ success: false, message: "Gagal mendapatkan jabatan, data tidak ditemukan", }, { status: 404 }); + return NextResponse.json({ success: false, message: "Gagal mendapatkan jabatan, data tidak ditemukan", }, { status: 200 }); } const filter = await prisma.group.findUnique({ @@ -93,7 +93,7 @@ export async function POST(request: Request) { const { name, idGroup, user } = await request.json(); if (user == "null" || user == undefined || user == "") { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const userMobile = await funGetUserById({ id: user }) @@ -131,7 +131,7 @@ export async function POST(request: Request) { } else { return NextResponse.json( { success: false, message: "Jabatan sudah ada" }, - { status: 400 } + { status: 200 } ); } diff --git a/src/app/api/mobile/project/[id]/route.ts b/src/app/api/mobile/project/[id]/route.ts index 7c09849..9f0152a 100644 --- a/src/app/api/mobile/project/[id]/route.ts +++ b/src/app/api/mobile/project/[id]/route.ts @@ -71,7 +71,7 @@ export async function GET(request: Request, context: { params: { id: string } }) createdAt: true }, orderBy: { - createdAt: 'asc' + dateStart: 'asc' } }) diff --git a/src/app/api/mobile/project/route.ts b/src/app/api/mobile/project/route.ts index d0ed52f..bffa5f0 100644 --- a/src/app/api/mobile/project/route.ts +++ b/src/app/api/mobile/project/route.ts @@ -385,11 +385,15 @@ export async function POST(request: Request) { } const dataNotifFilter = dataNotif.filter((item) => item.idUserTo != undefined && item.idUserTo != null && item.idUserTo != "" && item.idUserTo != userId) + const dataNotifFilterUnique = dataNotifFilter + .filter((v: any, index: number, self: any[]) => + index === self.findIndex((t: any) => t.idUserTo == v.idUserTo) + ) const pushNotif = dataPush.filter((item) => item.subscription != undefined) const sendWebPush = await funSendWebPush({ sub: pushNotif, message: { title: 'Kegiatan Baru', body: title } }) const insertNotif = await prisma.notifications.createMany({ - data: dataNotifFilter + data: dataNotifFilterUnique }) const tokenUnique = [...new Set(tokenDup.flat())].filter((v: any) => v != undefined && v != null && v != ""); diff --git a/src/app/api/mobile/task/[id]/route.ts b/src/app/api/mobile/task/[id]/route.ts index a7260f0..7f285c6 100644 --- a/src/app/api/mobile/task/[id]/route.ts +++ b/src/app/api/mobile/task/[id]/route.ts @@ -76,7 +76,7 @@ export async function GET(request: Request, context: { params: { id: string } }) dateEnd: true, }, orderBy: { - createdAt: 'asc' + dateStart: 'asc' } }) diff --git a/src/app/api/mobile/task/route.ts b/src/app/api/mobile/task/route.ts index 5d36a81..a83083b 100644 --- a/src/app/api/mobile/task/route.ts +++ b/src/app/api/mobile/task/route.ts @@ -356,11 +356,15 @@ export async function POST(request: Request) { } const dataNotifFilter = dataNotif.filter((v: any) => v.idUserTo != undefined && v.idUserTo != null && v.idUserTo != "" && v.idUserTo != userId) + const dataNotifFilterUnique = dataNotifFilter + .filter((v: any, index: number, self: any[]) => + index === self.findIndex((t: any) => t.idUserTo == v.idUserTo) + ) const pushNotif = dataPush.filter((item) => item.subscription != undefined) const sendWebPush = await funSendWebPush({ sub: pushNotif, message: { body: title, title: 'Tugas Divisi Baru' } }) const insertNotif = await prisma.notifications.createMany({ - data: dataNotifFilter + data: dataNotifFilterUnique }) const tokenUnique = [...new Set(tokenDup.flat())].filter((v: any) => v != undefined && v != null && v != ""); diff --git a/src/app/api/mobile/user/[id]/route.ts b/src/app/api/mobile/user/[id]/route.ts index 0fffb77..bcaf08a 100644 --- a/src/app/api/mobile/user/[id]/route.ts +++ b/src/app/api/mobile/user/[id]/route.ts @@ -87,7 +87,7 @@ export async function DELETE(request: Request, context: { params: { id: string } const { isActive, user } = (await request.json()); if (user == "null" || user == undefined || user == "") { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const data = await prisma.user.count({ @@ -102,7 +102,7 @@ export async function DELETE(request: Request, context: { params: { id: string } success: false, message: "Gagal mendapatkan anggota, data tidak ditemukan", }, - { status: 404 } + { status: 200 } ); } @@ -158,7 +158,7 @@ export async function PUT(request: Request, context: { params: { id: string } }) } = JSON.parse(data as string) if (user == "null" || user == undefined || user == "") { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const cekNIK = await prisma.user.count({ @@ -247,7 +247,7 @@ export async function PUT(request: Request, context: { params: { id: string } }) { status: 200 } ); } else { - return Response.json({ success: false, message: "Anggota sudah ada" }, { status: 400 }); + return Response.json({ success: false, message: "Anggota sudah ada" }, { status: 200 }); } } catch (error) { console.error(error); diff --git a/src/app/api/mobile/user/profile/route.ts b/src/app/api/mobile/user/profile/route.ts index 8db6104..5996e02 100644 --- a/src/app/api/mobile/user/profile/route.ts +++ b/src/app/api/mobile/user/profile/route.ts @@ -11,7 +11,7 @@ export async function GET(request: Request) { try { const user = await funGetUserByCookies() if (user.id == undefined) { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 200 }); } const data = await prisma.user.findUnique({ where: { diff --git a/src/app/api/project/[id]/route.ts b/src/app/api/project/[id]/route.ts index df7e87f..f8cecad 100644 --- a/src/app/api/project/[id]/route.ts +++ b/src/app/api/project/[id]/route.ts @@ -68,7 +68,7 @@ export async function GET(request: Request, context: { params: { id: string } }) createdAt: true }, orderBy: { - createdAt: 'asc' + dateStart: 'asc' } }) @@ -78,8 +78,8 @@ export async function GET(request: Request, context: { params: { id: string } }) 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 + // const dataFix = _.orderBy(formatData, 'createdAt', 'asc') + allData = formatData } else if (kategori == "file") { const dataFile = await prisma.projectFile.findMany({ diff --git a/src/app/api/task/[id]/route.ts b/src/app/api/task/[id]/route.ts index 7ef6090..8f1652b 100644 --- a/src/app/api/task/[id]/route.ts +++ b/src/app/api/task/[id]/route.ts @@ -75,7 +75,7 @@ export async function GET(request: Request, context: { params: { id: string } }) dateEnd: true, }, orderBy: { - createdAt: 'asc' + dateStart: 'asc' } }) diff --git a/src/app/api/version-app/route.ts b/src/app/api/version-app/route.ts index eca496f..4fccbfa 100644 --- a/src/app/api/version-app/route.ts +++ b/src/app/api/version-app/route.ts @@ -2,7 +2,7 @@ import { NextResponse } from "next/server"; export async function GET(request: Request) { try { - return NextResponse.json({ success: true, version: "2.0.4", tahap: "beta", update: "-api mobile; -login tanpa otp (mobile app); -tambah laporan pada project dan tugas divisi; -tambah upload link pada project dan tugas divisi; -tambah detail tanggal dan jam pada project dan tugas divisi; -api jenna ai; -privacy policy" }, { status: 200 }); + return NextResponse.json({ success: true, version: "2.1.0", tahap: "beta", update: "-api mobile; -login tanpa otp (mobile app); -tambah laporan pada project dan tugas divisi; -tambah upload link pada project dan tugas divisi; -tambah detail tanggal dan jam pada project dan tugas divisi; -api jenna ai; -privacy policy" }, { status: 200 }); } catch (error) { console.error(error); return NextResponse.json({ success: false, version: "Gagal mendapatkan version, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); diff --git a/src/module/_global/fun/count_time.ts b/src/module/_global/fun/count_time.ts index 5a26efa..744950d 100644 --- a/src/module/_global/fun/count_time.ts +++ b/src/module/_global/fun/count_time.ts @@ -18,7 +18,7 @@ export function countTime(date: Date) { const seconds = totalSeconds; if (days > 0) { - return moment(date).format("ll") + return String(dateNow.getFullYear()) == moment(date).format("YYYY") ? moment(date).format("DD MMM") : moment(date).format("ll") } else if (hours > 0) { return `${hours} jam` } else if (minutes > 0) {