From 19a9d63d6cf15f2f4462c0f59f6e4ff90b3d7747 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 31 Jan 2025 10:38:28 -0500 Subject: [PATCH] feat: add file lib to routes, abstract out file upload functionality --- index.js | 67 ++++++++++++---------- migrations/003_add_asset_field_to_file.sql | 2 + 2 files changed, 38 insertions(+), 31 deletions(-) create mode 100644 migrations/003_add_asset_field_to_file.sql diff --git a/index.js b/index.js index 5c31ded..9ad7b85 100644 --- a/index.js +++ b/index.js @@ -54,6 +54,31 @@ webPush.setVapidDetails( vapidPrivateKey, ); +async function saveFile(structureId, req, uploadedFile, asset=false) { + const name = uploadedFile.name; + const [mime_type, mime_subtype] = uploadedFile.mimetype.split("/"); + const uploadPath = path.join(__dirname, "public", structureId); + const storedPath = path.join(structureId, uploadedFile.name); + + fs.mkdirSync(uploadPath, { recursive: true }); + + await uploadedFile.mv(path.join(uploadPath, name)); + let id = model.createFile( + db, + structureId, + name, + storedPath, + mime_type, + mime_subtype, + asset, + ); + + let file = model.getFile(db, id); + file.url = prefixUrlWithHost(req, file.path); + + return file +} + function bootstrapContext(db, structureId, routeId, initContext) { const allDbInstances = {}; function getDb(alias) { @@ -64,7 +89,7 @@ function bootstrapContext(db, structureId, routeId, initContext) { // for now just designing with component approach const eta = model.getTemplater(structureId); - const libs = { eta, db: getDb, push: webPush }; + const libs = { eta, db: getDb, push: webPush, files: { saveFile: (...args) => saveFile(structureId, ...args) } }; let dbs = model.getDbsForStructure(db, structureId); let context = vm.createContext({ @@ -693,44 +718,24 @@ app.get("/workshop/:structure_id/route/:route_id/logs", (req, res) => { }); // POST route to handle file upload -app.post("/workshop/:structure_id/files", (req, res) => { +app.post("/workshop/:structure_id/files", async (req, res) => { if (!req.files || Object.keys(req.files).length === 0) { return res.status(400).send("failed to upload that file"); } const { structure_id } = req.params; - const file = req.files.file; - const name = file.name; - const [mime_type, mime_subtype] = file.mimetype.split("/"); - const uploadPath = path.join(__dirname, "public", structure_id); - const storedPath = path.join(structure_id, file.name); + const targetFile = req.files.file; - fs.mkdirSync(uploadPath, { recursive: true }); - - file.mv(path.join(uploadPath, name), (err) => { - try { - if (err) { - return res.status(500).send(err); - } - - let id = model.createFile( - db, - structure_id, - name, - storedPath, - mime_type, - mime_subtype, - ); - - let file = model.getFile(db, id); - file.url = prefixUrlWithHost(req, file.path); - - return res.send(eta.render("workshop/file_detail", { file: file })); - } catch (e) { + try { + const uploadedFile = await saveFile(structure_id, req, targetFile) + return res.send(eta.render("workshop/file_detail", { file: uploadedFile })); + } + catch (e) { + console.log(e) res.status(500); return res.send(e); - } - }); + } + }); function prefixUrlWithHost(req, path) { diff --git a/migrations/003_add_asset_field_to_file.sql b/migrations/003_add_asset_field_to_file.sql new file mode 100644 index 0000000..b34b6f4 --- /dev/null +++ b/migrations/003_add_asset_field_to_file.sql @@ -0,0 +1,2 @@ +ALTER TABLE files + ADD asset INTEGER NOT NULL DEFAULT false;