Index: pages/dashboard/admin/adminDashboard.telefunc.ts
===================================================================
--- pages/dashboard/admin/adminDashboard.telefunc.ts	(revision 5ce5904505744192d6f836fac3fea6ddf058d6ea)
+++ pages/dashboard/admin/adminDashboard.telefunc.ts	(revision ea09e98c1561d7948b3e6612bff5f2269a697451)
@@ -2,4 +2,5 @@
 import { requireAdmin } from "../../../server/telefunc/ctx";
 import {Abort} from "telefunc";
+import { validateComponentSpecificData } from "../../../database/drizzle/config/componentFieldConfig";
 
 export async function getAdminInfoAndData() {
@@ -22,5 +23,5 @@
 }
 
-export async function setPopupBuildApprovalStatus({ buildId, isApproved }
+export async function onSetBuildApprovalStatus({ buildId, isApproved }
                                                  : { buildId: number; isApproved: boolean }) {
     const { c, userId } = await requireAdmin()
@@ -35,5 +36,5 @@
 }
 
-export async function setComponentSuggestionStatus({ suggestionId, status, adminComment }
+export async function onSetComponentSuggestionStatus({ suggestionId, status, adminComment }
                                                 : { suggestionId: number; status: string; adminComment: string }) {
     const { c, userId } = await requireAdmin()
@@ -48,2 +49,16 @@
     return { success: true };
 }
+
+export async function onCreateNewComponent({ name, brand, price, imgUrl, type, specificData }
+                                            : { name: string; brand: string; price: number; imgUrl: string; type: string, specificData: any }) {
+
+    const { c, userId } = await requireAdmin()
+
+    if(!validateComponentSpecificData(type, specificData)) throw Abort();
+
+    const newComponentId = await drizzleQueries.addNewComponent(c.db, name, brand, price, imgUrl, type, specificData);
+
+    if(!newComponentId) throw Abort();
+
+    return newComponentId;
+}
Index: pages/dashboard/user/userDashboard.telefunc.ts
===================================================================
--- pages/dashboard/user/userDashboard.telefunc.ts	(revision 5ce5904505744192d6f836fac3fea6ddf058d6ea)
+++ pages/dashboard/user/userDashboard.telefunc.ts	(revision ea09e98c1561d7948b3e6612bff5f2269a697451)
@@ -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 };
+}
