upd: project

Deskripsi:
- upload file

NO Issues
This commit is contained in:
amel
2024-09-12 13:34:40 +08:00
parent 047311c8b9
commit 656f71ef2b
9 changed files with 50 additions and 53 deletions

View File

@@ -200,6 +200,7 @@ model ProjectFile {
idProject String
name String
extension String
idStorage String?
isActive Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt

View File

@@ -91,7 +91,8 @@ export async function GET(request: Request, context: { params: { id: string } })
select: {
id: true,
name: true,
extension: true
extension: true,
idStorage: true
}
})

View File

@@ -1,4 +1,4 @@
import { prisma } from "@/module/_global";
import { DIR, funDeleteFile, funUploadFile, prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth";
import { NextResponse } from "next/server";
import fs from "fs";
@@ -36,8 +36,7 @@ export async function DELETE(request: Request, context: { params: { id: string }
}
})
fs.unlink(`./public/file/project/${dataRelasi?.id}.${dataRelasi?.extension}`, (err) => { })
const delStorage = await funDeleteFile({ fileId: String(dataRelasi?.idStorage) })
const deleteRelasi = await prisma.projectFile.delete({
where: {
@@ -166,31 +165,27 @@ export async function POST(request: Request, context: { params: { id: string } }
if (cekFile) {
const root = path.join(process.cwd(), "./public/file/project/");
for (var pair of body.entries()) {
if (String(pair[0]).substring(0, 4) == "file") {
const file = body.get(pair[0]) as File
const fExt = file.name.split(".").pop()
const fName = file.name.replace("." + fExt, "")
const upload = await funUploadFile({ file: file, dirId: DIR.project })
if (upload.success) {
const insertToTable = await prisma.projectFile.create({
data: {
idStorage: upload.data.id,
idProject: id,
name: fName,
extension: String(fExt),
const insertToTable = await prisma.projectFile.create({
data: {
idProject: id,
name: fName,
extension: String(fExt)
},
select: {
id: true
}
})
const nameFix = insertToTable.id + '.' + fExt
const filePath = path.join(root, nameFix)
// Konversi ArrayBuffer ke Buffer
const buffer = Buffer.from(await file.arrayBuffer());
// Tulis file ke sistem
fs.writeFileSync(filePath, buffer);
},
select: {
id: true
}
})
}
}
}
}

View File

@@ -1,4 +1,4 @@
import { prisma } from "@/module/_global";
import { DIR, funUploadFile, prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth";
import _ from "lodash";
import moment from "moment";
@@ -169,31 +169,22 @@ export async function POST(request: Request) {
}
if (cekFile) {
const root = path.join(process.cwd(), "./public/file/project/");
for (var pair of body.entries()) {
if (String(pair[0]).substring(0, 4) == "file") {
const file = body.get(pair[0]) as File
const fExt = file.name.split(".").pop()
const fName = file.name.replace("." + fExt, "")
const insertToTable = await prisma.projectFile.create({
data: {
idProject: data.id,
name: fName,
extension: String(fExt)
},
select: {
id: true
}
})
const nameFix = insertToTable.id + '.' + fExt
const filePath = path.join(root, nameFix)
// Konversi ArrayBuffer ke Buffer
const buffer = Buffer.from(await file.arrayBuffer());
// Tulis file ke sistem
fs.writeFileSync(filePath, buffer);
const upload = await funUploadFile({ file: file, dirId: DIR.project })
if (upload.success) {
await prisma.projectFile.create({
data: {
idStorage: upload.data.id,
idProject: data.id,
name: fName,
extension: String(fExt)
}
})
}
}
}
}

View File

@@ -55,7 +55,7 @@ export default function LayoutModal({ opened, onClose, extension, fitur, file }:
}}>
<div style={{ transform: `scale(${zoom})`, transformOrigin: 'center' }}>
{
extension === 'pdf' ? <PdfToImage md={filePdf} /> :
extension === 'pdf' ? <PdfToImage md={`https://wibu-storage.wibudev.com/api/files/${file}`} /> :
<Image
radius="md"
style={{
@@ -63,7 +63,7 @@ export default function LayoutModal({ opened, onClose, extension, fitur, file }:
maxHeight: '100%',
}}
fit="contain"
src={`/api/file/img?cat=${fitur}&file=${file}&jenis=file`}
src={`https://wibu-storage.wibudev.com/api/files/${file}`}
alt={file}
/>
}

View File

@@ -19,6 +19,7 @@ export interface IDataFileProject {
id: string
name: string
extension: string
idStorage:string
}
export interface IDataMemberProject {

View File

@@ -1,6 +1,7 @@
"use client";
import { LayoutNavbarNew, WARNA } from "@/module/_global";
import {
ActionIcon,
Avatar,
Box,
Button,
@@ -19,9 +20,10 @@ import { useRouter } from "next/navigation";
import toast from "react-hot-toast";
import moment from "moment";
import { IFormDateProject } from "../lib/type_project";
import { HiChevronLeft } from "react-icons/hi2";
export default function ViewDateEndTask({ onClose }: { onClose: (val: IFormDateProject) => void }) {
export default function ViewDateEndTask({ onClose, onSet }: {onClose: (val: boolean) => void, onSet: (val: IFormDateProject) => void }) {
const [value, setValue] = useState<[Date | null, Date | null]>([null, null]);
const router = useRouter()
const [title, setTitle] = useState("")
@@ -36,7 +38,7 @@ export default function ViewDateEndTask({ onClose }: { onClose: (val: IFormDateP
if (title == "")
return toast.error("Error! harus memasukkan judul tugas")
onClose(
onSet(
{
dateStart: value[0],
dateEnd: value[1],
@@ -48,7 +50,13 @@ export default function ViewDateEndTask({ onClose }: { onClose: (val: IFormDateP
return (
<Box>
<LayoutNavbarNew title={"Tanggal Tugas"} menu />
<LayoutNavbarNew state={
<Box>
<ActionIcon variant="light" onClick={() => { onClose(true) }} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings">
<HiChevronLeft size={20} color='white' />
</ActionIcon>
</Box>
} title={"Tanggal Tugas"} menu />
<Box p={20}>
<Group
justify="center"

View File

@@ -128,10 +128,7 @@ export default function CreateProject() {
if (openTugas) return <ViewDateEndTask onClose={(val) => {
setDataTask([...dataTask, val])
setOpenTugas(false)
}} />;
if (openTugas) return <ViewDateEndTask onClose={(val) => { setOpenTugas(false) }} onSet={(val) => { setDataTask([...dataTask, val]); setOpenTugas(false) }} />;
if (isChooseAnggota) return <CreateUsersProject grup={body.idGroup} onClose={() => { setChooseAnggota(false) }} />

View File

@@ -16,6 +16,7 @@ export default function ListFileDetailProject() {
const param = useParams<{ id: string }>()
const [loading, setLoading] = useState(true)
const [idData, setIdData] = useState('')
const [idStorage, setIdStorage] = useState('')
const [nameData, setNameData] = useState('')
const [openDrawer, setOpenDrawer] = useState(false)
const [isOpenModal, setOpenModal] = useState(false)
@@ -52,6 +53,7 @@ export default function ListFileDetailProject() {
toast.success(res.message)
getOneData()
setIdData("")
setIdStorage("")
setOpenDrawer(false)
} else {
toast.error(res.message);
@@ -102,6 +104,7 @@ export default function ListFileDetailProject() {
setNameData(item.name + '.' + item.extension)
setExtension(item.extension)
setIdData(item.id)
setIdStorage(item.idStorage)
setOpenDrawer(true)
}}
>
@@ -167,7 +170,7 @@ export default function ListFileDetailProject() {
setOpenModal(false)
}} />
<LayoutModalViewFile opened={isOpenModalView} onClose={() => setOpenModalView(false)} file={idData + '.' + isExtension} extension={isExtension} fitur='project' />
<LayoutModalViewFile opened={isOpenModalView} onClose={() => setOpenModalView(false)} file={idStorage} extension={isExtension} fitur='project' />
</Box>
</>
);