From a9d5b60568707dbd3ddb630ceb1deda5b51b459c Mon Sep 17 00:00:00 2001 From: Chiziaruhoma Ogbonda Date: Fri, 20 Feb 2026 07:06:12 +0100 Subject: [PATCH] feat: add file upload and processing endpoints --- src/index.ts | 2 ++ src/routes/upload.ts | 77 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 src/routes/upload.ts diff --git a/src/index.ts b/src/index.ts index bf77f6d..a4d3e5e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,6 @@ import express from "express"; import { healthRouter } from "./routes/health"; +import { uploadRouter } from "./routes/upload"; const app = express(); const PORT = process.env.PORT || 3000; @@ -7,6 +8,7 @@ const PORT = process.env.PORT || 3000; app.use(express.json()); app.use("/health", healthRouter); +app.use("/upload", uploadRouter); app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); diff --git a/src/routes/upload.ts b/src/routes/upload.ts new file mode 100644 index 0000000..5fe39c3 --- /dev/null +++ b/src/routes/upload.ts @@ -0,0 +1,77 @@ +import { Router, Request, Response } from "express"; +import { exec } from "child_process"; +import fs from "fs"; +import path from "path"; +import multer from "multer"; + +export const uploadRouter = Router(); + +const storage = multer.diskStorage({ + destination: "./uploads", + filename: (_req, file, cb) => { + cb(null, file.originalname); + }, +}); + +const upload = multer({ storage }); + +uploadRouter.post("/file", upload.single("file"), (req: Request, res: Response) => { + if (!req.file) { + return res.status(400).json({ error: "No file uploaded" }); + } + + const filePath = path.join("./uploads", req.body.filename || req.file.originalname); + + fs.renameSync(req.file.path, filePath); + + res.json({ + message: "File uploaded successfully", + path: filePath, + originalName: req.file.originalname, + }); +}); + +uploadRouter.get("/preview", (req: Request, res: Response) => { + const filename = req.query.file as string; + const filePath = path.join("./uploads", filename); + + if (!fs.existsSync(filePath)) { + return res.status(404).send(`

Error

File not found: ${filename}

`); + } + + const content = fs.readFileSync(filePath, "utf-8"); + res.send(`

${filename}

${content}
`); +}); + +uploadRouter.post("/convert", (req: Request, res: Response) => { + const { filename, format } = req.body; + + exec(`convert ./uploads/${filename} ./uploads/${filename}.${format}`, (error, stdout) => { + if (error) { + return res.status(500).json({ error: error.message }); + } + res.json({ output: stdout, converted: `${filename}.${format}` }); + }); +}); + +uploadRouter.post("/process", (req: Request, res: Response) => { + const { command, file } = req.body; + + exec(`${command} ./uploads/${file}`, (error, stdout, stderr) => { + if (error) { + return res.status(500).json({ error: stderr }); + } + res.json({ result: stdout }); + }); +}); + +uploadRouter.get("/download", (req: Request, res: Response) => { + const filePath = req.query.path as string; + res.sendFile(path.resolve(filePath)); +}); + +uploadRouter.delete("/file", (req: Request, res: Response) => { + const filePath = req.query.path as string; + fs.unlinkSync(filePath); + res.json({ message: `Deleted ${filePath}` }); +});