diff --git a/src/cdn/routes/attachments.ts b/src/cdn/routes/attachments.ts
index db2b9503..b10b3b0a 100644
--- a/src/cdn/routes/attachments.ts
+++ b/src/cdn/routes/attachments.ts
@@ -16,14 +16,12 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-import { Config, hasValidSignature, NewUrlUserSignatureData, Snowflake, UrlSignResult } from "@spacebar/util";
+import { CloudAttachment, Config, hasValidSignature, NewUrlUserSignatureData, Snowflake, UrlSignResult } from "@spacebar/util";
import { Request, Response, Router } from "express";
import imageSize from "image-size";
import { HTTPError } from "lambert-server";
-import { multer } from "../util/multer";
-import { storage } from "../util/Storage";
-import { CloudAttachment } from "../../util/entities/CloudAttachment";
import { fileTypeFromBuffer } from "file-type";
+import { cache, multer, storage } from "../util";
const router = Router({ mergeParams: true });
@@ -69,7 +67,7 @@ router.post("/:channel_id", multer.single("file"), async (req: Request, res: Res
return res.json(file);
});
-router.get("/:channel_id/:id/:filename", async (req: Request, res: Response) => {
+router.get("/:channel_id/:id/:filename", cache, async (req: Request, res: Response) => {
const { channel_id, id, filename } = req.params;
// const { format } = req.query;
@@ -100,7 +98,6 @@ router.get("/:channel_id/:id/:filename", async (req: Request, res: Response) =>
}
res.set("Content-Type", content_type);
- res.set("Cache-Control", "public, max-age=31536000");
return res.send(file);
});
@@ -116,110 +113,4 @@ router.delete("/:channel_id/:id/:filename", async (req: Request, res: Response)
return res.send({ success: true });
});
-// "cloud attachments"
-router.put("/:channel_id/:batch_id/:attachment_id/:filename", multer.single("file"), async (req: Request, res: Response) => {
- const { channel_id, batch_id, attachment_id, filename } = req.params;
- const att = await CloudAttachment.findOneOrFail({
- where: {
- uploadFilename: `${channel_id}/${batch_id}/${attachment_id}/${filename}`,
- channelId: channel_id,
- userAttachmentId: attachment_id,
- userFilename: filename,
- },
- });
-
- const maxLength = Config.get().cdn.maxAttachmentSize;
-
- console.log("[Cloud Upload] Uploading attachment", att.id, att.userFilename, `Max size: ${maxLength} bytes`);
-
- const chunks: Buffer[] = [];
- let length = 0;
-
- req.on("data", (chunk) => {
- console.log(`[Cloud Upload] Received chunk of size ${chunk.length} bytes`);
- chunks.push(chunk);
- length += chunk.length;
- if (length > maxLength) {
- res.status(413).send("File too large");
- req.destroy();
- }
- });
- req.on("end", async () => {
- console.log(`[Cloud Upload] Finished receiving file, total size ${length} bytes`);
- const buffer = Buffer.concat(chunks);
- const path = `attachments/${channel_id}/${batch_id}/${attachment_id}/${filename}`;
-
- await storage.set(path, buffer);
-
- let mimeType = att.userOriginalContentType;
- if (att.userOriginalContentType === null) {
- const ft = await fileTypeFromBuffer(buffer);
- mimeType = att.contentType = ft?.mime || "application/octet-stream";
- }
-
- if (mimeType?.includes("image")) {
- const dimensions = imageSize(buffer);
- if (dimensions) {
- att.width = dimensions.width;
- att.height = dimensions.height;
- }
- }
-
- att.size = buffer.length;
- await att.save();
-
- console.log("[Cloud Upload] Saved attachment", att.id, att.userFilename);
- res.status(200).end();
- });
-});
-
-router.delete("/:channel_id/:batch_id/:attachment_id/:filename", async (req: Request, res: Response) => {
- if (req.headers.signature !== Config.get().security.requestSignature) throw new HTTPError("Invalid request signature");
- console.log("[Cloud Delete] Deleting attachment", req.params);
-
- const { channel_id, batch_id, attachment_id, filename } = req.params;
- const path = `attachments/${channel_id}/${batch_id}/${attachment_id}/${filename}`;
-
- const att = await CloudAttachment.findOne({
- where: {
- uploadFilename: `${channel_id}/${batch_id}/${attachment_id}/${filename}`,
- channelId: channel_id,
- userAttachmentId: attachment_id,
- userFilename: filename,
- },
- });
-
- if (att) {
- await att.remove();
- await storage.delete(path);
- return res.send({ success: true });
- }
- return res.status(404).send("Attachment not found");
-});
-
-router.post("/:channel_id/:batch_id/:attachment_id/:filename/clone_to_message/:message_id", async (req: Request, res: Response) => {
- if (req.headers.signature !== Config.get().security.requestSignature) throw new HTTPError("Invalid request signature");
- console.log("[Cloud Clone] Cloning attachment to message", req.params);
-
- const { channel_id, batch_id, attachment_id, filename, message_id } = req.params;
- const path = `attachments/${channel_id}/${batch_id}/${attachment_id}/${filename}`;
- const newPath = `attachments/${channel_id}/${message_id}/${filename}`;
-
- const att = await CloudAttachment.findOne({
- where: {
- uploadFilename: `${channel_id}/${batch_id}/${attachment_id}/${filename}`,
- channelId: channel_id,
- userAttachmentId: attachment_id,
- userFilename: filename,
- },
- });
-
- if (att) {
- await storage.clone(path, newPath);
- return res.send({ success: true, new_path: newPath });
- }
-
- return res.status(404).send("Attachment not found");
-});
-
export default router;
|