import type { NextApiRequest, NextApiResponse } from "next"; import readFile from "@/lib/api/storage/readFile"; import { getToken } from "next-auth/jwt"; import { prisma } from "@/lib/api/db"; import { ArchivedFormat } from "@/types/global"; import verifyUser from "@/lib/api/verifyUser"; import getPermission from "@/lib/api/getPermission"; import { UsersAndCollections } from "@prisma/client"; import formidable from "formidable"; import createFile from "@/lib/api/storage/createFile"; import fs from "fs"; export const config = { api: { bodyParser: false, }, }; export default async function Index(req: NextApiRequest, res: NextApiResponse) { const linkId = Number(req.query.linkId); const format = Number(req.query.format); const isPreview = Boolean(req.query.preview); let suffix: string; if (format === ArchivedFormat.png) suffix = ".png"; else if (format === ArchivedFormat.jpeg) suffix = ".jpeg"; else if (format === ArchivedFormat.pdf) suffix = ".pdf"; else if (format === ArchivedFormat.readability) suffix = "_readability.json"; //@ts-ignore if (!linkId || !suffix) return res.status(401).json({ response: "Invalid parameters." }); if (req.method === "GET") { const token = await getToken({ req }); const userId = token?.id; const collectionIsAccessible = await prisma.collection.findFirst({ where: { links: { some: { id: linkId, }, }, OR: [ { ownerId: userId || -1 }, { members: { some: { userId: userId || -1 } } }, { isPublic: true }, ], }, }); if (!collectionIsAccessible) return res .status(401) .json({ response: "You don't have access to this collection." }); if (isPreview) { const { file, contentType, status } = await readFile( `archives/preview/${collectionIsAccessible.id}/${linkId}.jpeg` ); res.setHeader("Content-Type", contentType).status(status as number); return res.send(file); } else { const { file, contentType, status } = await readFile( `archives/${collectionIsAccessible.id}/${linkId + suffix}` ); res.setHeader("Content-Type", contentType).status(status as number); return res.send(file); } } // else if (req.method === "POST") { // const user = await verifyUser({ req, res }); // if (!user) return; // const collectionPermissions = await getPermission({ // userId: user.id, // linkId, // }); // const memberHasAccess = collectionPermissions?.members.some( // (e: UsersAndCollections) => e.userId === user.id && e.canCreate // ); // if (!(collectionPermissions?.ownerId === user.id || memberHasAccess)) // return { response: "Collection is not accessible.", status: 401 }; // // await uploadHandler(linkId, ) // const MAX_UPLOAD_SIZE = Number(process.env.NEXT_PUBLIC_MAX_FILE_SIZE); // const form = formidable({ // maxFields: 1, // maxFiles: 1, // maxFileSize: MAX_UPLOAD_SIZE || 30 * 1048576, // }); // form.parse(req, async (err, fields, files) => { // const allowedMIMETypes = [ // "application/pdf", // "image/png", // "image/jpg", // "image/jpeg", // ]; // if ( // err || // !files.file || // !files.file[0] || // !allowedMIMETypes.includes(files.file[0].mimetype || "") // ) { // // Handle parsing error // return res.status(500).json({ // response: `Sorry, we couldn't process your file. Please ensure it's a PDF, PNG, or JPG format and doesn't exceed ${MAX_UPLOAD_SIZE}MB.`, // }); // } else { // const fileBuffer = fs.readFileSync(files.file[0].filepath); // const linkStillExists = await prisma.link.findUnique({ // where: { id: linkId }, // }); // if (linkStillExists) { // await createFile({ // filePath: `archives/${collectionPermissions?.id}/${ // linkId + suffix // }`, // data: fileBuffer, // }); // await prisma.link.update({ // where: { id: linkId }, // data: { // image: `archives/${collectionPermissions?.id}/${ // linkId + suffix // }`, // lastPreserved: new Date().toISOString(), // }, // }); // } // fs.unlinkSync(files.file[0].filepath); // } // return res.status(200).json({ // response: files, // }); // }); // } }