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 idProject String
name String name String
extension String extension String
idStorage String?
isActive Boolean @default(true) isActive Boolean @default(true)
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt

View File

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

View File

@@ -1,4 +1,4 @@
import { prisma } from "@/module/_global"; import { DIR, funUploadFile, prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth"; import { funGetUserByCookies } from "@/module/auth";
import _ from "lodash"; import _ from "lodash";
import moment from "moment"; import moment from "moment";
@@ -169,31 +169,22 @@ export async function POST(request: Request) {
} }
if (cekFile) { if (cekFile) {
const root = path.join(process.cwd(), "./public/file/project/");
for (var pair of body.entries()) { for (var pair of body.entries()) {
if (String(pair[0]).substring(0, 4) == "file") { if (String(pair[0]).substring(0, 4) == "file") {
const file = body.get(pair[0]) as File const file = body.get(pair[0]) as File
const fExt = file.name.split(".").pop() const fExt = file.name.split(".").pop()
const fName = file.name.replace("." + fExt, "") const fName = file.name.replace("." + fExt, "")
const upload = await funUploadFile({ file: file, dirId: DIR.project })
if (upload.success) {
const insertToTable = await prisma.projectFile.create({ await prisma.projectFile.create({
data: { data: {
idStorage: upload.data.id,
idProject: data.id, idProject: data.id,
name: fName, name: fName,
extension: String(fExt) 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);
} }
} }
} }

View File

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

View File

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

View File

@@ -1,6 +1,7 @@
"use client"; "use client";
import { LayoutNavbarNew, WARNA } from "@/module/_global"; import { LayoutNavbarNew, WARNA } from "@/module/_global";
import { import {
ActionIcon,
Avatar, Avatar,
Box, Box,
Button, Button,
@@ -19,9 +20,10 @@ import { useRouter } from "next/navigation";
import toast from "react-hot-toast"; import toast from "react-hot-toast";
import moment from "moment"; import moment from "moment";
import { IFormDateProject } from "../lib/type_project"; 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 [value, setValue] = useState<[Date | null, Date | null]>([null, null]);
const router = useRouter() const router = useRouter()
const [title, setTitle] = useState("") const [title, setTitle] = useState("")
@@ -36,7 +38,7 @@ export default function ViewDateEndTask({ onClose }: { onClose: (val: IFormDateP
if (title == "") if (title == "")
return toast.error("Error! harus memasukkan judul tugas") return toast.error("Error! harus memasukkan judul tugas")
onClose( onSet(
{ {
dateStart: value[0], dateStart: value[0],
dateEnd: value[1], dateEnd: value[1],
@@ -48,7 +50,13 @@ export default function ViewDateEndTask({ onClose }: { onClose: (val: IFormDateP
return ( return (
<Box> <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}> <Box p={20}>
<Group <Group
justify="center" justify="center"

View File

@@ -128,10 +128,7 @@ export default function CreateProject() {
if (openTugas) return <ViewDateEndTask onClose={(val) => { if (openTugas) return <ViewDateEndTask onClose={(val) => { setOpenTugas(false) }} onSet={(val) => { setDataTask([...dataTask, val]); setOpenTugas(false) }} />;
setDataTask([...dataTask, val])
setOpenTugas(false)
}} />;
if (isChooseAnggota) return <CreateUsersProject grup={body.idGroup} onClose={() => { setChooseAnggota(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 param = useParams<{ id: string }>()
const [loading, setLoading] = useState(true) const [loading, setLoading] = useState(true)
const [idData, setIdData] = useState('') const [idData, setIdData] = useState('')
const [idStorage, setIdStorage] = useState('')
const [nameData, setNameData] = useState('') const [nameData, setNameData] = useState('')
const [openDrawer, setOpenDrawer] = useState(false) const [openDrawer, setOpenDrawer] = useState(false)
const [isOpenModal, setOpenModal] = useState(false) const [isOpenModal, setOpenModal] = useState(false)
@@ -52,6 +53,7 @@ export default function ListFileDetailProject() {
toast.success(res.message) toast.success(res.message)
getOneData() getOneData()
setIdData("") setIdData("")
setIdStorage("")
setOpenDrawer(false) setOpenDrawer(false)
} else { } else {
toast.error(res.message); toast.error(res.message);
@@ -102,6 +104,7 @@ export default function ListFileDetailProject() {
setNameData(item.name + '.' + item.extension) setNameData(item.name + '.' + item.extension)
setExtension(item.extension) setExtension(item.extension)
setIdData(item.id) setIdData(item.id)
setIdStorage(item.idStorage)
setOpenDrawer(true) setOpenDrawer(true)
}} }}
> >
@@ -167,7 +170,7 @@ export default function ListFileDetailProject() {
setOpenModal(false) 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> </Box>
</> </>
); );