Index: pages/dashboard/user/userDashboard.telefunc.ts
===================================================================
--- pages/dashboard/user/userDashboard.telefunc.ts	(revision b69759dc4c8f1a000afc0d0c5c5afcc6868641fb)
+++ pages/dashboard/user/userDashboard.telefunc.ts	(revision 226fbbbab48f243ba6045007157b751910cdc7fb)
@@ -1,4 +1,5 @@
 import * as drizzleQueries from "../../../database/drizzle/queries";
 import {requireUser} from "../../../server/telefunc/ctx";
+import {Abort} from "telefunc";
 
 export async function getUserInfoAndData() {
@@ -18,2 +19,39 @@
     };
 }
+
+export async function onDeleteBuild({ buildId }
+                                  : { buildId: number }) {
+    const { c, userId } = requireUser()
+
+    if (!Number.isInteger(buildId) || buildId <= 0) throw Abort();
+
+    const result = await drizzleQueries.deleteBuild(c.db, userId, buildId);
+
+    return { success: true };
+}
+
+export async function onEditBuild({ buildId }
+                                  : { buildId: number }) {
+    const { c, userId } = requireUser()
+
+    if(!Number.isInteger(buildId) || buildId <= 0) throw Abort();
+
+    const buildDetails = await drizzleQueries.getBuildDetails(c.db, buildId, userId);
+
+    if(!buildDetails) throw Abort();
+
+    return buildDetails;
+}
+
+export async function onSaveEditBuild({ buildId, name, description, componentIds }
+                                      : { buildId: number; name: string; description: string; componentIds: number[] }) {
+    const { c, userId } = requireUser()
+
+    if (!Number.isInteger(buildId) || buildId <= 0) throw Abort();
+
+    const result = await drizzleQueries.editBuild(c.db, userId, buildId, name, description, componentIds);
+
+    if(!result) throw Abort();
+
+    return { success: true };
+}
