From 4d65cc7228e83f4ee203061fc81c1c38e4986baa Mon Sep 17 00:00:00 2001 From: Param Siddharth Date: Thu, 30 Oct 2025 01:05:43 +0530 Subject: [PATCH] feat: add button and API endpoint to delete job (#423) --- src/icons/delete.tsx | 18 ++++++++++++++++++ src/index.tsx | 2 ++ src/pages/deleteJob.tsx | 38 ++++++++++++++++++++++++++++++++++++++ src/pages/results.tsx | 9 +++++++++ 4 files changed, 67 insertions(+) create mode 100644 src/icons/delete.tsx create mode 100644 src/pages/deleteJob.tsx diff --git a/src/icons/delete.tsx b/src/icons/delete.tsx new file mode 100644 index 0000000..869932d --- /dev/null +++ b/src/icons/delete.tsx @@ -0,0 +1,18 @@ +export function DeleteIcon() { + return ( + + + + ); +} diff --git a/src/index.tsx b/src/index.tsx index b95b4b8..939dbf2 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -10,6 +10,7 @@ import { AUTO_DELETE_EVERY_N_HOURS, WEBROOT } from "./helpers/env"; import { chooseConverter } from "./pages/chooseConverter"; import { convert } from "./pages/convert"; import { deleteFile } from "./pages/deleteFile"; +import { deleteJob } from "./pages/deleteJob"; import { download } from "./pages/download"; import { history } from "./pages/history"; import { listConverters } from "./pages/listConverters"; @@ -42,6 +43,7 @@ const app = new Elysia({ .use(history) .use(convert) .use(download) + .use(deleteJob) .use(results) .use(deleteFile) .use(listConverters) diff --git a/src/pages/deleteJob.tsx b/src/pages/deleteJob.tsx new file mode 100644 index 0000000..ceb38b9 --- /dev/null +++ b/src/pages/deleteJob.tsx @@ -0,0 +1,38 @@ +import { rmSync } from "node:fs"; +import { Elysia } from "elysia"; +import { outputDir, uploadsDir } from ".."; +import db from "../db/db"; +import { WEBROOT } from "../helpers/env"; +import { userService } from "./user"; +import { Jobs } from "../db/types"; + +export const deleteJob = new Elysia().use(userService).get( + "/delete/:userId/:jobId", + async ({ params, redirect, user }) => { + const job = db + .query("SELECT * FROM jobs WHERE user_id = ? AND id = ?") + .as(Jobs) + .get(user.id, params.jobId); + + if (!job) { + return redirect(`${WEBROOT}/results`, 302); + } + + // delete the directories + rmSync(`${outputDir}${job.user_id}/${job.id}`, { + recursive: true, + force: true, + }); + rmSync(`${uploadsDir}${job.user_id}/${job.id}`, { + recursive: true, + force: true, + }); + + // delete the job + db.query("DELETE FROM jobs WHERE id = ?").run(job.id); + return redirect(`${WEBROOT}/history`, 302); + }, + { + auth: true, + }, +); diff --git a/src/pages/results.tsx b/src/pages/results.tsx index 8b9a773..6feed6f 100644 --- a/src/pages/results.tsx +++ b/src/pages/results.tsx @@ -6,6 +6,7 @@ import db from "../db/db"; import { Filename, Jobs } from "../db/types"; import { ALLOW_UNAUTHENTICATED, WEBROOT } from "../helpers/env"; import { DownloadIcon } from "../icons/download"; +import { DeleteIcon } from "../icons/delete"; import { EyeIcon } from "../icons/eye"; import { userService } from "./user"; @@ -39,6 +40,14 @@ function ResultsArticle({ + +

Delete

+