import type { NextApiRequest, NextApiResponse } from "next"; import { ShareDocument } from "../../../../types/Appwrite.type"; import { AppwriteFileWithPreview } from "../../../../types/File.type"; import awServer from "../../../../utils/appwriteServer.util"; import { checkSecurity } from "../../../../utils/shares/security.util"; const handler = async (req: NextApiRequest, res: NextApiResponse) => { const shareId = req.query.shareId as string; const fileList: AppwriteFileWithPreview[] = []; const hashedPassword = req.cookies[`${shareId}-password`]; if (!(await shareExists(shareId))) return res.status(404).json({ message: "not_found" }); try { await checkSecurity(shareId, hashedPassword); } catch (e) { return res.status(403).json({ message: e }); } addVisitorCount(shareId); const fileListWithoutPreview = (await awServer.storage.listFiles(shareId, undefined, 100)) .files; for (const file of fileListWithoutPreview) { const filePreview = await awServer.storage.getFilePreview( shareId, file.$id ); fileList.push({ ...file, preview: filePreview }); } if (hashedPassword) res.setHeader( "Set-Cookie", `${shareId}-password=${hashedPassword}; Path=/share/${shareId}; max-age=3600; HttpOnly` ); res.status(200).json(fileList); }; const shareExists = async (shareId: string) => { try { const shareDocument = await awServer.database.getDocument( "shares", shareId ); return shareDocument.enabled && shareDocument.expiresAt > Date.now(); } catch (e) { return false; } }; const addVisitorCount = async (shareId: string) => { const currentDocument = await awServer.database.getDocument( "shares", shareId ); currentDocument.visitorCount++; awServer.database.updateDocument("shares", shareId, currentDocument); }; export default handler;