many bug fixes and improvements

This commit is contained in:
daniel31x13 2024-04-08 19:35:06 -04:00
parent e67fef1d04
commit 07b87be7f1
9 changed files with 95 additions and 66 deletions

View File

@ -7,10 +7,9 @@ import { JSDOM } from "jsdom";
import DOMPurify from "dompurify"; import DOMPurify from "dompurify";
import { Collection, Link, User } from "@prisma/client"; import { Collection, Link, User } from "@prisma/client";
import validateUrlSize from "./validateUrlSize"; import validateUrlSize from "./validateUrlSize";
import removeFile from "./storage/removeFile";
import Jimp from "jimp";
import createFolder from "./storage/createFolder"; import createFolder from "./storage/createFolder";
import generatePreview from "./generatePreview"; import generatePreview from "./generatePreview";
import { removeFiles } from "./manageLinkFiles";
type LinksAndCollectionAndOwner = Link & { type LinksAndCollectionAndOwner = Link & {
collection: Collection & { collection: Collection & {
@ -52,6 +51,14 @@ export default async function archiveHandler(link: LinksAndCollectionAndOwner) {
); );
}); });
createFolder({
filePath: `archives/preview/${link.collectionId}`,
});
createFolder({
filePath: `archives/${link.collectionId}`,
});
try { try {
await Promise.race([ await Promise.race([
(async () => { (async () => {
@ -163,10 +170,6 @@ export default async function archiveHandler(link: LinksAndCollectionAndOwner) {
return metaTag ? (metaTag as any).content : null; return metaTag ? (metaTag as any).content : null;
}); });
createFolder({
filePath: `archives/preview/${link.collectionId}`,
});
if (ogImageUrl) { if (ogImageUrl) {
console.log("Found og:image URL:", ogImageUrl); console.log("Found og:image URL:", ogImageUrl);
@ -296,14 +299,7 @@ export default async function archiveHandler(link: LinksAndCollectionAndOwner) {
}, },
}); });
else { else {
removeFile({ filePath: `archives/${link.collectionId}/${link.id}.png` }); await removeFiles(link.id, link.collectionId);
removeFile({ filePath: `archives/${link.collectionId}/${link.id}.pdf` });
removeFile({
filePath: `archives/${link.collectionId}/${link.id}_readability.json`,
});
removeFile({
filePath: `archives/preview/${link.collectionId}/${link.id}.jpeg`,
});
} }
await browser.close(); await browser.close();

View File

@ -2,6 +2,7 @@ import { prisma } from "@/lib/api/db";
import { UsersAndCollections } from "@prisma/client"; import { UsersAndCollections } from "@prisma/client";
import getPermission from "@/lib/api/getPermission"; import getPermission from "@/lib/api/getPermission";
import removeFile from "@/lib/api/storage/removeFile"; import removeFile from "@/lib/api/storage/removeFile";
import { removeFiles } from "@/lib/api/manageLinkFiles";
export default async function deleteLinksById( export default async function deleteLinksById(
userId: number, userId: number,
@ -43,15 +44,7 @@ export default async function deleteLinksById(
const linkId = linkIds[i]; const linkId = linkIds[i];
const collectionIsAccessible = collectionIsAccessibleArray[i]; const collectionIsAccessible = collectionIsAccessibleArray[i];
removeFile({ if (collectionIsAccessible) removeFiles(linkId, collectionIsAccessible.id);
filePath: `archives/${collectionIsAccessible?.id}/${linkId}.pdf`,
});
removeFile({
filePath: `archives/${collectionIsAccessible?.id}/${linkId}.png`,
});
removeFile({
filePath: `archives/${collectionIsAccessible?.id}/${linkId}_readability.json`,
});
} }
return { response: deletedLinks, status: 200 }; return { response: deletedLinks, status: 200 };

View File

@ -2,6 +2,7 @@ import { prisma } from "@/lib/api/db";
import { Link, UsersAndCollections } from "@prisma/client"; import { Link, UsersAndCollections } from "@prisma/client";
import getPermission from "@/lib/api/getPermission"; import getPermission from "@/lib/api/getPermission";
import removeFile from "@/lib/api/storage/removeFile"; import removeFile from "@/lib/api/storage/removeFile";
import { removeFiles } from "@/lib/api/manageLinkFiles";
export default async function deleteLink(userId: number, linkId: number) { export default async function deleteLink(userId: number, linkId: number) {
if (!linkId) return { response: "Please choose a valid link.", status: 401 }; if (!linkId) return { response: "Please choose a valid link.", status: 401 };
@ -12,7 +13,10 @@ export default async function deleteLink(userId: number, linkId: number) {
(e: UsersAndCollections) => e.userId === userId && e.canDelete (e: UsersAndCollections) => e.userId === userId && e.canDelete
); );
if (!(collectionIsAccessible?.ownerId === userId || memberHasAccess)) if (
!collectionIsAccessible ||
!(collectionIsAccessible?.ownerId === userId || memberHasAccess)
)
return { response: "Collection is not accessible.", status: 401 }; return { response: "Collection is not accessible.", status: 401 };
const deleteLink: Link = await prisma.link.delete({ const deleteLink: Link = await prisma.link.delete({
@ -21,15 +25,7 @@ export default async function deleteLink(userId: number, linkId: number) {
}, },
}); });
removeFile({ removeFiles(linkId, collectionIsAccessible.id);
filePath: `archives/${collectionIsAccessible?.id}/${linkId}.pdf`,
});
removeFile({
filePath: `archives/${collectionIsAccessible?.id}/${linkId}.png`,
});
removeFile({
filePath: `archives/${collectionIsAccessible?.id}/${linkId}_readability.json`,
});
return { response: deleteLink, status: 200 }; return { response: deleteLink, status: 200 };
} }

View File

@ -2,7 +2,7 @@ import { prisma } from "@/lib/api/db";
import { LinkIncludingShortenedCollectionAndTags } from "@/types/global"; import { LinkIncludingShortenedCollectionAndTags } from "@/types/global";
import { UsersAndCollections } from "@prisma/client"; import { UsersAndCollections } from "@prisma/client";
import getPermission from "@/lib/api/getPermission"; import getPermission from "@/lib/api/getPermission";
import moveFile from "@/lib/api/storage/moveFile"; import { moveFiles } from "@/lib/api/manageLinkFiles";
export default async function updateLinkById( export default async function updateLinkById(
userId: number, userId: number,
@ -146,20 +146,7 @@ export default async function updateLinkById(
}); });
if (collectionIsAccessible?.id !== data.collection.id) { if (collectionIsAccessible?.id !== data.collection.id) {
await moveFile( await moveFiles(linkId, collectionIsAccessible?.id, data.collection.id);
`archives/${collectionIsAccessible?.id}/${linkId}.pdf`,
`archives/${data.collection.id}/${linkId}.pdf`
);
await moveFile(
`archives/${collectionIsAccessible?.id}/${linkId}.png`,
`archives/${data.collection.id}/${linkId}.png`
);
await moveFile(
`archives/${collectionIsAccessible?.id}/${linkId}_readability.json`,
`archives/${data.collection.id}/${linkId}_readability.json`
);
} }
return { response: updatedLink, status: 200 }; return { response: updatedLink, status: 200 };

View File

@ -71,6 +71,10 @@ export default async function deleteUserById(
// Delete archive folders // Delete archive folders
removeFolder({ filePath: `archives/${collection.id}` }); removeFolder({ filePath: `archives/${collection.id}` });
await removeFolder({
filePath: `archives/preview/${collection.id}`,
});
} }
// Delete collections after cleaning up related data // Delete collections after cleaning up related data

View File

@ -1,6 +1,7 @@
import Jimp from "jimp"; import Jimp from "jimp";
import { prisma } from "./db"; import { prisma } from "./db";
import createFile from "./storage/createFile"; import createFile from "./storage/createFile";
import createFolder from "./storage/createFolder";
const generatePreview = async ( const generatePreview = async (
buffer: Buffer, buffer: Buffer,

View File

@ -0,0 +1,61 @@
import moveFile from "./storage/moveFile";
import removeFile from "./storage/removeFile";
const removeFiles = async (linkId: number, collectionId: number) => {
// PDF
await removeFile({
filePath: `archives/${collectionId}/${linkId}.pdf`,
});
// Images
await removeFile({
filePath: `archives/${collectionId}/${linkId}.png`,
});
await removeFile({
filePath: `archives/${collectionId}/${linkId}.jpeg`,
});
await removeFile({
filePath: `archives/${collectionId}/${linkId}.jpg`,
});
// Preview
await removeFile({
filePath: `archives/preview/${collectionId}/${linkId}.jpeg`,
});
// Readability
await removeFile({
filePath: `archives/${collectionId}/${linkId}_readability.json`,
});
};
const moveFiles = async (linkId: number, from: number, to: number) => {
await moveFile(
`archives/${from}/${linkId}.pdf`,
`archives/${to}/${linkId}.pdf`
);
await moveFile(
`archives/${from}/${linkId}.png`,
`archives/${to}/${linkId}.png`
);
await moveFile(
`archives/${from}/${linkId}.jpeg`,
`archives/${to}/${linkId}.jpeg`
);
await moveFile(
`archives/${from}/${linkId}.jpg`,
`archives/${to}/${linkId}.jpg`
);
await moveFile(
`archives/preview/${from}/${linkId}.jpeg`,
`archives/preview/${to}/${linkId}.jpeg`
);
await moveFile(
`archives/${from}/${linkId}_readability.json`,
`archives/${to}/${linkId}_readability.json`
);
};
export { removeFiles, moveFiles };

View File

@ -11,6 +11,7 @@ import fs from "fs";
import verifyToken from "@/lib/api/verifyToken"; import verifyToken from "@/lib/api/verifyToken";
import Jimp from "jimp"; import Jimp from "jimp";
import generatePreview from "@/lib/api/generatePreview"; import generatePreview from "@/lib/api/generatePreview";
import createFolder from "@/lib/api/storage/createFolder";
export const config = { export const config = {
api: { api: {
@ -127,11 +128,12 @@ export default async function Index(req: NextApiRequest, res: NextApiResponse) {
}); });
if (linkStillExists && files.file[0].mimetype?.includes("image")) { if (linkStillExists && files.file[0].mimetype?.includes("image")) {
generatePreview( const collectionId = collectionPermissions?.id as number;
fileBuffer, createFolder({
collectionPermissions?.id as number, filePath: `archives/preview/${collectionId}`,
linkId });
);
generatePreview(fileBuffer, collectionId, linkId);
} }
if (linkStillExists) { if (linkStillExists) {

View File

@ -2,8 +2,8 @@ import type { NextApiRequest, NextApiResponse } from "next";
import { prisma } from "@/lib/api/db"; import { prisma } from "@/lib/api/db";
import verifyUser from "@/lib/api/verifyUser"; import verifyUser from "@/lib/api/verifyUser";
import isValidUrl from "@/lib/shared/isValidUrl"; import isValidUrl from "@/lib/shared/isValidUrl";
import removeFile from "@/lib/api/storage/removeFile";
import { Collection, Link } from "@prisma/client"; import { Collection, Link } from "@prisma/client";
import { removeFiles } from "@/lib/api/manageLinkFiles";
const RE_ARCHIVE_LIMIT = Number(process.env.RE_ARCHIVE_LIMIT) || 5; const RE_ARCHIVE_LIMIT = Number(process.env.RE_ARCHIVE_LIMIT) || 5;
@ -80,16 +80,5 @@ const deleteArchivedFiles = async (link: Link & { collection: Collection }) => {
}, },
}); });
await removeFile({ await removeFiles(link.id, link.collection.id);
filePath: `archives/${link.collection.id}/${link.id}.pdf`,
});
await removeFile({
filePath: `archives/${link.collection.id}/${link.id}.png`,
});
await removeFile({
filePath: `archives/${link.collection.id}/${link.id}_readability.json`,
});
await removeFile({
filePath: `archives/preview/${link.collection.id}/${link.id}.png`,
});
}; };