Index: pages/forge/forge.telefunc.ts
===================================================================
--- pages/forge/forge.telefunc.ts	(revision 226fbbbab48f243ba6045007157b751910cdc7fb)
+++ pages/forge/forge.telefunc.ts	(revision 82aa6ae699fa11a88a3aa636a5ea3e4a4a41d0a0)
@@ -3,4 +3,5 @@
 import {Abort} from "telefunc";
 import type {Database} from "../../database/drizzle/db";
+import {removeComponentFromBuild} from "../../database/drizzle/queries";
 
 export async function onSaveNewBuild({ name, description, componentIds }
@@ -14,2 +15,60 @@
     return { success: true };
 }
+
+export async function onRemoveComponentFromBuild({ buildId, componentId }
+                                                 : { buildId: number, componentId: number }) {
+    const { c, userId } = requireUser()
+
+    const result = await drizzleQueries.removeComponentFromBuild(c.db, buildId, componentId);
+
+    if(!result) throw Abort();
+
+    return { success: true };
+}
+
+export async function onDeleteBuild({ buildId }: { buildId: number }) {
+    const { c, userId } = requireUser()
+
+    const result = await drizzleQueries.deleteBuild(c.db, userId, buildId);
+    if(!result) throw Abort();
+
+    return { success: true };
+}
+
+export async function onGetBuildComponents({ buildId }
+                                           : { buildId: number }) {
+    const { c, userId } = requireUser()
+
+    if(!Number.isInteger(buildId) || buildId <= 0) throw Abort();
+
+    const buildComponents = await drizzleQueries.getBuildComponents(c.db, buildId);
+
+    if(!buildComponents) throw Abort();
+
+    return buildComponents;
+}
+
+export async function onAddComponentToBuild({ buildId, componentId }: { buildId: number, componentId: number }) {
+    const { c, userId } = requireUser()
+
+    if(!Number.isInteger(buildId) || buildId <= 0) throw Abort();
+    if(!Number.isInteger(componentId) || componentId <= 0) throw Abort();
+
+    const result = await drizzleQueries.addComponentToBuild(c.db, buildId, componentId);
+
+    if(!result) throw Abort();
+
+    return { success: true };
+}
+
+export async function onGetCompatibleComponents({ buildId, componentType }: { buildId: number, componentType: string }) {
+    const { c, userId } = requireUser()
+
+    if(!Number.isInteger(buildId) || buildId <= 0) throw Abort();
+
+    const compatibleComponents = await drizzleQueries.getCompatibleComponents(c.db, buildId, componentType);
+
+    if(!compatibleComponents) throw Abort();
+
+    return compatibleComponents;
+}
