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
+