Index: pages/dashboard/admin/adminDashboard.telefunc.ts
===================================================================
--- pages/dashboard/admin/adminDashboard.telefunc.ts	(revision 5ce5904505744192d6f836fac3fea6ddf058d6ea)
+++ pages/dashboard/admin/adminDashboard.telefunc.ts	(revision 6196d609d200de0e04c2c142c0150d778cb11ec6)
@@ -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;
+}
