diff options
Diffstat (limited to 'lib/upload.js')
| -rw-r--r-- | lib/upload.js | 64 |
1 files changed, 26 insertions, 38 deletions
diff --git a/lib/upload.js b/lib/upload.js index 8d1c85ef..954e8d4d 100644 --- a/lib/upload.js +++ b/lib/upload.js @@ -1,7 +1,3 @@ -import app from "$app"; -import { auth } from "./passport"; -import fastifyMultipart from "@fastify/multipart"; -import fastifyStatic from "@fastify/static"; import { fileTypeFromStream } from "file-type"; import pump from "pump"; import Clone from "readable-stream-clone"; @@ -9,46 +5,38 @@ import fs from "fs"; import path from "path"; import sharp from "sharp"; import { pipeline } from "stream"; +import { g, s, db } from "$lib/db"; -app.register(fastifyMultipart); +export default async (req, res) => { + let { + params: { type }, + user + } = req; + console.log("TYPE", type); + if (!["banner", "profile"].includes(type)) throw new Error("invalid upload"); -app.register(fastifyStatic, { - root: path.join("/app/uploads"), - prefix: "/public/" -}); + let data = await req.file(); + let s1 = new Clone(data.file); + let s2 = new Clone(data.file); -app.post("/upload/:type", auth, async function(req, res) { - try { - let { type } = req.params; - if (!["banner", "profile"].includes(type)) - throw new Error("invalid upload"); + let [format, ext] = (await fileTypeFromStream(s1)).mime.split("/"); - let data = await req.file(); - let s1 = new Clone(data.file); - let s2 = new Clone(data.file); + if (format !== "image" && !["jpg", "jpeg", "png"].includes(ext)) + throw new Error("unsupported file type"); - let [format, ext] = (await fileTypeFromStream(s1)).mime.split("/"); + let name = `${user.id}-${type}.webp`; + let path = `/app/data/uploads/${name}`; + let size = type === "banner" ? 1920 : 240; - if (format !== "image" && !["jpg", "jpeg", "png"].includes(ext)) - throw new Error("unsupported file type"); + let t = sharp() + .rotate() + .resize(size) + .webp(); - let name = `${req.user.username}-${type}.webp`; - let path = `/app/uploads/${name}`; - let size = type === "banner" ? 1920 : 240; + await new Promise(r => pipeline(s2, t, fs.createWriteStream(path), r)); - let t = sharp() - .rotate() - .resize(size) - .webp(); + user[type] = true; + await s(`user:${user.id}`, user); - await new Promise(r => pipeline(s2, t, fs.createWriteStream(path), r)); - - req.user[type] = true; - await req.user.save(); - - res.send(name); - } catch (e) { - console.log(e); - return res.code(500).send(e); - } -}); + res.send(name); +}; |
