From e65d8e0d7a709951182a63de7828982f81be745b Mon Sep 17 00:00:00 2001 From: amel Date: Thu, 5 Sep 2024 17:29:23 +0800 Subject: [PATCH] upd: project Deskripsi: - pembatasan user No Issues --- src/app/api/project/route.ts | 59 ++++++++++++++++--- src/module/project/ui/list_project.tsx | 57 +++++------------- src/module/project/ui/menu_drawer_project.tsx | 23 +++++--- src/module/project/ui/tab_project.tsx | 21 ++++--- 4 files changed, 93 insertions(+), 67 deletions(-) diff --git a/src/app/api/project/route.ts b/src/app/api/project/route.ts index 8e52e54..5ffa314 100644 --- a/src/app/api/project/route.ts +++ b/src/app/api/project/route.ts @@ -5,6 +5,7 @@ import moment from "moment"; import { NextResponse } from "next/server"; import path from "path"; import fs from "fs"; +import { createLogUser } from "@/module/user"; // GET ALL DATA PROJECT @@ -14,7 +15,7 @@ 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 roleUser = user.idUserRole const { searchParams } = new URL(request.url); let grup @@ -30,19 +31,49 @@ export async function GET(request: Request) { grup = idGroup } - - const data = await prisma.project.findMany({ + 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: 404 }); + } + + let kondisi: any = { + isActive: true, + idVillage: String(villageId), + idGroup: grup, + title: { + contains: (name == undefined || name == "null") ? "" : name, + mode: "insensitive" + }, + status: (status == "0" || status == "1" || status == "2" || status == "3") ? Number(status) : 0 + } + + if (roleUser != "supadmin" && roleUser != "cosupadmin" && roleUser != "admin") { + kondisi = { isActive: true, idVillage: String(villageId), idGroup: grup, - createdBy: String(userId), title: { contains: (name == undefined || name == "null") ? "" : name, mode: "insensitive" }, - status: (status == "0" || status == "1" || status == "2" || status == "3") ? Number(status) : 0 - }, + status: (status == "0" || status == "1" || status == "2" || status == "3") ? Number(status) : 0, + ProjectMember: { + some: { + idUser: String(userId) + } + } + } + } + + + const data = await prisma.project.findMany({ + where: kondisi, select: { id: true, title: true, @@ -64,12 +95,22 @@ export async function GET(request: Request) { member: v.ProjectMember.length })) + const filter = await prisma.group.findUnique({ + where: { + id: grup + }, + select: { + id: true, + name: true + } + }) - return NextResponse.json({ success: true, message: "Berhasil mendapatkan project", data: omitData, }, { status: 200 }); + + return NextResponse.json({ success: true, message: "Berhasil mendapatkan kegiatan", data: omitData, filter }, { status: 200 }); } catch (error) { console.error(error); - return NextResponse.json({ success: false, message: "Gagal mendapatkan project, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + return NextResponse.json({ success: false, message: "Gagal mendapatkan kegiatan, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); } } @@ -158,6 +199,8 @@ export async function POST(request: Request) { } + // create log user + const log = await createLogUser({ act: 'CREATE', desc: 'User membuat data kegiatan', table: 'project', data: data.id }) return NextResponse.json({ success: true, message: "Berhasil membuat kegiatan" }, { status: 200 }); } catch (error) { diff --git a/src/module/project/ui/list_project.tsx b/src/module/project/ui/list_project.tsx index 03eb872..0c706d6 100644 --- a/src/module/project/ui/list_project.tsx +++ b/src/module/project/ui/list_project.tsx @@ -1,5 +1,5 @@ "use client" -import { WARNA } from '@/module/_global'; +import { globalRole, WARNA } from '@/module/_global'; import { ActionIcon, Avatar, Badge, Box, Card, Center, Divider, Flex, Grid, Group, Text, TextInput, Title } from '@mantine/core'; import { useRouter, useSearchParams } from 'next/navigation'; import React, { useState } from 'react'; @@ -11,6 +11,7 @@ import toast from 'react-hot-toast'; import { useShallowEffect } from '@mantine/hooks'; import { IDataProject } from '../lib/type_project'; import { funGetAllGroup, IDataGroup } from '@/module/group'; +import { useHookstate } from '@hookstate/core'; export default function ListProject() { const [isList, setIsList] = useState(false) @@ -21,23 +22,22 @@ export default function ListProject() { const status = searchParams.get('status') const group = searchParams.get('group') const [searchQuery, setSearchQuery] = useState('') + const roleLogin = useHookstate(globalRole) + const [nameGroup, setNameGroup] = useState('') const fetchData = async () => { try { - setData([]); - setLoading(true); - + setLoading(true) const response = await funGetAllProject('?status=' + status + '&search=' + searchQuery + '&group=' + group) - if (response.success) { setData(response?.data) + setNameGroup(response.filter.name) } else { toast.error(response.message); } - setLoading(false); } catch (error) { - toast.error("Gagal mendapatkan Kegiatan, coba lagi nanti"); + toast.error("Gagal mendapatkan kegiatan, coba lagi nanti"); console.error(error); } finally { setLoading(false); @@ -53,31 +53,6 @@ export default function ListProject() { setIsList(!isList) } - const [checked, setChecked] = useState([]); - - const groupNameMap = (groupId: string) => { - const groupName = checked.find((group) => group.id === groupId)?.name; - return groupName || '-'; - }; - - async function getAllGroupFilter() { - try { - const response = await funGetAllGroup('?active=true') - if (response.success) { - setChecked(response.data); - } else { - toast.error(response.message); - } - } catch (error) { - console.error(error); - toast.error("Gagal mendapatkan grup, coba lagi nanti"); - } - } - - useShallowEffect(() => { - getAllGroupFilter(); - }, []); - return ( @@ -109,7 +84,7 @@ export default function ListProject() { - {group && Filter by: {groupNameMap(group)}} + {roleLogin.get() == 'supadmin' && Filter by: {nameGroup}} Total Kegiatan @@ -121,7 +96,7 @@ export default function ListProject() { {isData.map((v, i) => { return ( - + - + diff --git a/src/module/project/ui/menu_drawer_project.tsx b/src/module/project/ui/menu_drawer_project.tsx index 25e70aa..17885a7 100644 --- a/src/module/project/ui/menu_drawer_project.tsx +++ b/src/module/project/ui/menu_drawer_project.tsx @@ -1,10 +1,12 @@ -import { WARNA } from '@/module/_global'; +import { globalRole, WARNA } from '@/module/_global'; +import { useHookstate } from '@hookstate/core'; import { Box, Flex, SimpleGrid, Stack, Text } from '@mantine/core'; import React, { useState } from 'react'; import { HiOutlineFilter } from 'react-icons/hi'; import { IoAddCircle } from 'react-icons/io5'; export default function MenuDrawerProject() { + const roleLogin = useHookstate(globalRole) return ( @@ -19,14 +21,17 @@ export default function MenuDrawerProject() { Tambah Kegiatan - window.location.href = "/project?cat=filter"} justify={'center'} align={'center'} direction={'column'} > - - - - - Filter - - + { + roleLogin.get() == "supadmin" && + window.location.href = "/project?cat=filter"} justify={'center'} align={'center'} direction={'column'} > + + + + + Filter + + + } diff --git a/src/module/project/ui/tab_project.tsx b/src/module/project/ui/tab_project.tsx index 2249a9f..ea60aad 100644 --- a/src/module/project/ui/tab_project.tsx +++ b/src/module/project/ui/tab_project.tsx @@ -1,17 +1,16 @@ "use client" -import { LayoutDrawer, LayoutNavbarNew, WARNA } from '@/module/_global'; -import { ActionIcon, Avatar, Badge, Box, Card, Center, Divider, Flex, Grid, Group, rem, Tabs, Text, TextInput, Title } from '@mantine/core'; -import React, { useEffect, useState } from 'react'; +import { globalRole, LayoutDrawer, LayoutNavbarNew, WARNA } from '@/module/_global'; +import { ActionIcon, Box, rem, Tabs } from '@mantine/core'; +import React, { useState } from 'react'; import { HiMenu } from 'react-icons/hi'; -import { HiMagnifyingGlass, HiMiniPresentationChartBar, HiOutlineListBullet, HiSquares2X2 } from 'react-icons/hi2'; -import { MdAccountCircle } from 'react-icons/md'; -import { RiCircleFill, RiProgress3Line } from "react-icons/ri"; +import { RiProgress3Line } from "react-icons/ri"; import { useRouter, useSearchParams } from 'next/navigation'; import { TbClockPause } from 'react-icons/tb'; import { IoIosCheckmarkCircleOutline } from 'react-icons/io'; import { IoCloseCircleOutline } from 'react-icons/io5'; import ListProject from './list_project'; import MenuDrawerProject from './menu_drawer_project'; +import { useHookstate } from '@hookstate/core'; export default function TabProject() { const [openDrawer, setOpenDrawer] = useState(false) @@ -20,13 +19,17 @@ export default function TabProject() { const status = searchParams.get('status') const group = searchParams.get("group"); const iconStyle = { width: rem(20), height: rem(20) }; + const roleLogin = useHookstate(globalRole) return ( setOpenDrawer(true)} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings"> - - } /> + menu={(roleLogin.get() != "user" && roleLogin.get() != "coadmin") ? + setOpenDrawer(true)} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings"> + + + : <> + } />