From d8d0911afaa74caea39b59f1044202dccf5f0db4 Mon Sep 17 00:00:00 2001 From: amel Date: Mon, 2 Sep 2024 11:20:42 +0800 Subject: [PATCH] upd: task file Deskripsi: - hapus file task divisi No Issues --- src/app/api/task/file/[id]/route.ts | 71 +++++++++++++++++ src/module/task/lib/api_task.ts | 10 +++ src/module/task/ui/create_task.tsx | 2 +- src/module/task/ui/detail_list_file_task.tsx | 81 ++++++++++++++++++-- 4 files changed, 158 insertions(+), 6 deletions(-) create mode 100644 src/app/api/task/file/[id]/route.ts diff --git a/src/app/api/task/file/[id]/route.ts b/src/app/api/task/file/[id]/route.ts new file mode 100644 index 0000000..f61d76b --- /dev/null +++ b/src/app/api/task/file/[id]/route.ts @@ -0,0 +1,71 @@ +import { prisma } from "@/module/_global"; +import { funGetUserByCookies } from "@/module/auth"; +import _ from "lodash"; +import { NextResponse } from "next/server"; +import fs from "fs"; + +// HAPUS DETAIL FILE, HAPUS FILE DI ASSETS DAN DATABASE (BUKAN PAKE ISACTIVE) +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 data = await prisma.divisionProjectFile.count({ + where: { + id: id, + }, + }); + + if (data == 0) { + return NextResponse.json( + { + success: false, + message: "Hapus file gagal, data tidak ditemukan", + }, + { status: 404 } + ); + } + + const dataRelasi = await prisma.divisionProjectFile.findUnique({ + where: { + id: id, + } + }) + + const dataFile = await prisma.containerFileDivision.findUnique({ + where: { + id: dataRelasi?.idFile + } + }) + + fs.unlink(`./public/file/task/${dataFile?.id}.${dataFile?.extension}`, (err) => { }) + + const deleteRelasi = await prisma.divisionProjectFile.delete({ + where: { + id: id, + }, + }); + + const deleteFile = await prisma.containerFileDivision.delete({ + where: { + id: dataRelasi?.idFile, + }, + }); + + + return NextResponse.json( + { + success: true, + message: "File berhasil dihapus", + data, + }, + { status: 200 } + ); + + } catch (error) { + console.log(error); + return NextResponse.json({ success: false, message: "Gagal menghapus file, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/module/task/lib/api_task.ts b/src/module/task/lib/api_task.ts index 089ee99..fa5bafd 100644 --- a/src/module/task/lib/api_task.ts +++ b/src/module/task/lib/api_task.ts @@ -119,4 +119,14 @@ export const funEditTask = async (path: string, data: { title: string }) => { body: JSON.stringify(data), }); return await response.json().catch(() => null); +}; + +export const funDeleteFileTask = async (path: string) => { + const response = await fetch(`/api/task/file/${path}`, { + method: "DELETE", + headers: { + "Content-Type": "application/json", + }, + }); + return await response.json().catch(() => null); }; \ No newline at end of file diff --git a/src/module/task/ui/create_task.tsx b/src/module/task/ui/create_task.tsx index 4bc237a..c69c8c2 100644 --- a/src/module/task/ui/create_task.tsx +++ b/src/module/task/ui/create_task.tsx @@ -287,7 +287,7 @@ export default function CreateTask() { onClose={() => setOpenDrawer(false)} title={"Pilih File"} > - + { diff --git a/src/module/task/ui/detail_list_file_task.tsx b/src/module/task/ui/detail_list_file_task.tsx index 937d0f3..92d68d8 100644 --- a/src/module/task/ui/detail_list_file_task.tsx +++ b/src/module/task/ui/detail_list_file_task.tsx @@ -1,18 +1,24 @@ 'use client' -import { SkeletonDetailListTugasTask, WARNA } from "@/module/_global"; -import { Box, Group, Skeleton, Text } from "@mantine/core"; +import { LayoutDrawer, SkeletonDetailListTugasTask, WARNA } from "@/module/_global"; +import { Box, Flex, Group, SimpleGrid, Skeleton, Stack, Text } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; import { useParams } from "next/navigation"; import { useState } from "react"; import toast from "react-hot-toast"; -import { BsFiletypeCsv, BsFiletypeHeic, BsFiletypeJpg, BsFiletypePdf, BsFiletypePng } from "react-icons/bs"; -import { funGetTaskDivisionById } from "../lib/api_task"; +import { BsFileTextFill, BsFiletypeCsv, BsFiletypeHeic, BsFiletypeJpg, BsFiletypePdf, BsFiletypePng } from "react-icons/bs"; +import { funDeleteFileTask, funGetTaskDivisionById } from "../lib/api_task"; import { IDataFileTaskDivision } from "../lib/type_task"; +import { FaTrash } from "react-icons/fa6"; +import LayoutModal from "@/module/_global/layout/layout_modal"; export default function ListFileDetailTask() { const [isData, setData] = useState([]) const [loading, setLoading] = useState(true) const param = useParams<{ id: string, detail: string }>() + const [openDrawer, setOpenDrawer] = useState(false) + const [isOpenModal, setOpenModal] = useState(false) + const [idData, setIdData] = useState('') + const [nameData, setNameData] = useState('') async function getOneData() { try { setLoading(true) @@ -34,6 +40,25 @@ export default function ListFileDetailTask() { getOneData(); }, [param.detail]) + + async function onDelete() { + try { + const res = await funDeleteFileTask(idData); + if (res.success) { + toast.success(res.message) + getOneData() + setIdData("") + setOpenDrawer(false) + } else { + toast.error(res.message); + } + } catch (error) { + console.error(error); + toast.error("Gagal menghapus file, coba lagi nanti"); + } + + } + return ( File @@ -67,6 +92,12 @@ export default function ListFileDetailTask() { padding: 10 }} mb={10} + + onClick={() => { + setNameData(item.name + '.' + item.extension) + setIdData(item.id) + setOpenDrawer(true) + }} > {item.extension == "pdf" && } @@ -74,13 +105,53 @@ export default function ListFileDetailTask() { {item.extension == "png" && } {item.extension == "jpg" || item.extension == "jpeg" && } {item.extension == "heic" && } - {item.name} + {item.name + '.' + item.extension} ) }) } + + + + setOpenDrawer(false)}> + + + + { }} justify={'center'} align={'center'} direction={'column'} > + + + + + Lihat file + + + + { setOpenModal(true) }} justify={'center'} align={'center'} direction={'column'} > + + + + + Hapus file + + + + + + + + + setOpenModal(false)} + description="Apakah Anda yakin ingin menghapus file ini? File yang dihapus tidak dapat dikembalikan" + onYes={(val) => { + if (val) { + onDelete() + } + setOpenModal(false) + }} /> ) } \ No newline at end of file