From 28eb4d72a22eec2961c45230d13b70351417c94f Mon Sep 17 00:00:00 2001 From: amel Date: Thu, 5 Sep 2024 13:44:35 +0800 Subject: [PATCH] upd: announcement Deskripsi: - pembatasan pengumuman - fix get all No Issues --- src/app/api/announcement/[id]/route.ts | 13 +++- src/app/api/announcement/route.ts | 67 ++++++++++++++++--- src/app/api/group/get-division/route.ts | 22 ++++-- .../announcement/ui/create_announcement.tsx | 13 ++-- .../announcement/ui/navbar_announcement.tsx | 12 ++-- .../ui/navbar_detail_announcement.tsx | 13 ++-- 6 files changed, 109 insertions(+), 31 deletions(-) diff --git a/src/app/api/announcement/[id]/route.ts b/src/app/api/announcement/[id]/route.ts index efa845d..9d0b9d4 100644 --- a/src/app/api/announcement/[id]/route.ts +++ b/src/app/api/announcement/[id]/route.ts @@ -1,5 +1,6 @@ import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; +import { createLogUser } from "@/module/user"; import _ from "lodash"; import { NextResponse } from "next/server"; @@ -30,7 +31,7 @@ export async function GET(request: Request, context: { params: { id: string } }) }, { status: 404 } ); - } + } const announcement = await prisma.announcement.findUnique({ where: { @@ -126,6 +127,9 @@ export async function DELETE(request: Request, context: { params: { id: string } }, }); + // create log user + const log = await createLogUser({ act: 'DELETE', desc: 'User menghapus data pengumuman', table: 'announcement', data: id }) + return NextResponse.json( { success: true, @@ -206,11 +210,14 @@ export async function PUT(request: Request, context: { params: { id: string } }) data: memberDivision, }); - return NextResponse.json({ success: true, message: "Berhasil mengedit pengumuman" }, { status: 200 }); + // create log user + const log = await createLogUser({ act: 'UPDATE', desc: 'User mengupdate data pengumuman', table: 'announcement', data: id }) + + return NextResponse.json({ success: true, message: "Berhasil mengupdate pengumuman" }, { status: 200 }); } catch (error) { console.error(error); - return NextResponse.json({ success: false, message: "Gagal mengedit pengumuman, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + return NextResponse.json({ success: false, message: "Gagal mengeupdate pengumuman, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); } } diff --git a/src/app/api/announcement/route.ts b/src/app/api/announcement/route.ts index 90cfd9c..8380629 100644 --- a/src/app/api/announcement/route.ts +++ b/src/app/api/announcement/route.ts @@ -1,10 +1,10 @@ -import { Group } from '@mantine/core'; import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; import _ from "lodash"; import moment from "moment"; import "moment/locale/id"; import { NextResponse } from "next/server"; +import { createLogUser } from '@/module/user'; export const dynamic = 'force-dynamic' @@ -19,17 +19,63 @@ export async function GET(request: Request) { } const villageId = user.idVillage + const roleUser = user.idUserRole + const groupId = user.idGroup const { searchParams } = new URL(request.url); const name = searchParams.get('search'); - const announcements = await prisma.announcement.findMany({ - where: { - idVillage: String(villageId), - isActive: true, - title: { - contains: (name == undefined || name == null) ? "" : name, - mode: "insensitive" + + let kondisi: any = { + idVillage: String(villageId), + isActive: true, + title: { + contains: (name == undefined || name == null) ? "" : name, + mode: "insensitive" + } + } + + if (roleUser != "supadmin") { + if (roleUser == "cosupadmin" || roleUser == "admin") { + kondisi = { + idVillage: String(villageId), + isActive: true, + title: { + contains: (name == undefined || name == null) ? "" : name, + mode: "insensitive" + }, + AnnouncementMember: { + some: { + idGroup: String(groupId) + } + } + } - }, + } else { + kondisi = { + idVillage: String(villageId), + isActive: true, + title: { + contains: (name == undefined || name == null) ? "" : name, + mode: "insensitive" + }, + AnnouncementMember: { + some: { + idGroup: String(groupId), + Division: { + DivisionMember: { + some: { + idUser: String(user.id) + } + } + } + } + } + } + } + } + + + const announcements = await prisma.announcement.findMany({ + where: kondisi, select: { id: true, title: true, @@ -98,6 +144,9 @@ export async function POST(request: Request) { data: memberDivision, }); + // create log user + const log = await createLogUser({ act: 'CREATE', desc: 'User membuat data pengumuman baru', table: 'announcement', data: data.id }) + return NextResponse.json({ success: true, message: "Berhasil membuat pengumuman" }, { status: 200 }); } catch (error) { diff --git a/src/app/api/group/get-division/route.ts b/src/app/api/group/get-division/route.ts index a067bcb..00ce3c6 100644 --- a/src/app/api/group/get-division/route.ts +++ b/src/app/api/group/get-division/route.ts @@ -1,6 +1,5 @@ import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; -import { revalidatePath, revalidateTag } from "next/cache"; import { NextResponse } from "next/server"; export const dynamic = 'force-dynamic' @@ -11,13 +10,24 @@ export async function GET(request: Request) { if (user.id == undefined) { return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); } - + const role = user.idUserRole const villaId = user.idVillage - const data = await prisma.group.findMany({ - where: { + const group = user.idGroup + let kondisi: any = { + isActive: true, + idVillage: String(villaId) + } + + if (role != "supadmin") { + kondisi = { isActive: true, - idVillage: String(villaId) - }, + idVillage: String(villaId), + id: String(group) + } + } + + const data = await prisma.group.findMany({ + where: kondisi, select: { id: true, name: true, diff --git a/src/module/announcement/ui/create_announcement.tsx b/src/module/announcement/ui/create_announcement.tsx index 3424fa0..9ba2f91 100644 --- a/src/module/announcement/ui/create_announcement.tsx +++ b/src/module/announcement/ui/create_announcement.tsx @@ -11,6 +11,7 @@ import CreateUsersAnnouncement from "./create_users_announcement"; import { globalMemberAnnouncement } from "../lib/val_announcement"; import { funCreateAnnouncement } from "../lib/api_announcement"; import { GroupData, ICreateData, IGroupData } from "../lib/type_announcement"; +import { useRouter } from "next/navigation"; @@ -19,6 +20,7 @@ export default function CreateAnnouncement() { const memberGroup = useHookstate(globalMemberAnnouncement) const memberValue = memberGroup.get() as GroupData[] const [selectedFiles, setSelectedFiles] = useState([]) + const router = useRouter() const [isChooseMember, setIsChooseMember] = useState(false) @@ -42,12 +44,13 @@ export default function CreateAnnouncement() { if (response.success) { toast.success(response.message) - setisData({ - ...isData, - title: "", - desc: "", - }) + // setisData({ + // ...isData, + // title: "", + // desc: "", + // }) memberGroup.set([]) + router.push('/announcement') } else { toast.error(response.message) } diff --git a/src/module/announcement/ui/navbar_announcement.tsx b/src/module/announcement/ui/navbar_announcement.tsx index f16e2d6..1fa1b99 100644 --- a/src/module/announcement/ui/navbar_announcement.tsx +++ b/src/module/announcement/ui/navbar_announcement.tsx @@ -1,20 +1,24 @@ "use client" -import { LayoutDrawer, LayoutNavbarNew, WARNA } from '@/module/_global'; +import { globalRole, LayoutDrawer, LayoutNavbarNew, WARNA } from '@/module/_global'; import { ActionIcon } from '@mantine/core'; import React, { useState } from 'react'; import { HiMenu } from "react-icons/hi"; import DrawerAnnouncement from './drawer_announcement'; +import { useHookstate } from '@hookstate/core'; export default function NavbarAnnouncement() { const [isOpen, setOpen] = useState(false) + const roleLogin = useHookstate(globalRole) return ( <> setOpen(true)} variant="light" bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings"> - - + (roleLogin.get() != "user" && roleLogin.get() != "coadmin") ? + setOpen(true)} variant="light" bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings"> + + + : <> } /> setOpen(false)}> diff --git a/src/module/announcement/ui/navbar_detail_announcement.tsx b/src/module/announcement/ui/navbar_detail_announcement.tsx index 22c538b..8a825a8 100644 --- a/src/module/announcement/ui/navbar_detail_announcement.tsx +++ b/src/module/announcement/ui/navbar_detail_announcement.tsx @@ -1,21 +1,26 @@ 'use client' -import { LayoutDrawer, LayoutNavbarNew, WARNA } from "@/module/_global"; +import { globalRole, LayoutDrawer, LayoutNavbarNew, WARNA } from "@/module/_global"; import { ActionIcon, Box } from "@mantine/core"; import { HiMenu } from "react-icons/hi"; import DrawerDetailAnnouncement from "./drawer_detail_announcement"; import { useState } from "react"; import { useRouter } from "next/navigation"; +import { useHookstate } from "@hookstate/core"; export default function NavbarDetailAnnouncement() { const [isOpenDrawer, setOpenDrawer] = useState(false) const router = useRouter() + const roleLogin = useHookstate(globalRole) return ( setOpenDrawer(true)} variant="light" bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings"> - - } + (roleLogin.get() != "user" && roleLogin.get() != "coadmin") ? + setOpenDrawer(true)} variant="light" bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings"> + + + : <> + } /> setOpenDrawer(false)}> {