import type { Database } from "../db"; import { buildsTable, cablesTable, caseMoboFormFactorsTable, casePsFormFactorsTable, caseStorageFormFactorsTable, componentsTable, coolerCPUSocketsTable, coolersTable, CPUTable, GPUTable, memoryCardsTable, memoryTable, motherboardsTable, networkAdaptersTable, networkCardsTable, opticalDrivesTable, pcCasesTable, powerSupplyTable, soundCardsTable, storageTable } from "../schema"; import {and, desc, eq, ilike} from "drizzle-orm"; export async function getAllComponents(db: Database, limit?: number, q?: string, componentType?: string) { let queryConditions = []; if (q) { queryConditions.push( ilike(componentsTable.name, `%${q}%`) ); } if(componentType && componentType.trim() !== 'all') { queryConditions.push( eq(componentsTable.type, componentType.trim().toLowerCase()) ); } const componentsList = await db .select({ id: componentsTable.id, name: componentsTable.name, brand: componentsTable.brand, price: componentsTable.price, }) .from(componentsTable) .where( queryConditions.length > 0 ? and ( ...queryConditions ) : undefined ) .orderBy( desc(componentsTable.price) ) .limit(limit || 100); // 100 placeholder return componentsList; } export async function getComponentDetails(db: Database, componentId: number) { const [component] = await db .select() .from(componentsTable) .where( eq(componentsTable.id, componentId) ) .limit(1); if(!component) return null; if (!component) return null; let details: any = {}; switch (component.type) { case 'cpu': [details] = await db.select().from(CPUTable).where(eq(CPUTable.componentId, componentId)); break; case 'gpu': [details] = await db.select().from(GPUTable).where(eq(GPUTable.componentId, componentId)); break; case 'memory': [details] = await db.select().from(memoryTable).where(eq(memoryTable.componentId, componentId)); break; case 'power_supply': [details] = await db.select().from(powerSupplyTable).where(eq(powerSupplyTable.componentId, componentId)); break; case 'case': [details] = await db.select().from(pcCasesTable).where(eq(pcCasesTable.componentId, componentId)); if (details) { details.storageFormFactors = await db.select().from(caseStorageFormFactorsTable).where(eq(caseStorageFormFactorsTable.caseId, componentId)); details.psFormFactors = await db.select().from(casePsFormFactorsTable).where(eq(casePsFormFactorsTable.caseId, componentId)); details.moboFormFactors = await db.select().from(caseMoboFormFactorsTable).where(eq(caseMoboFormFactorsTable.caseId, componentId)); } break; case 'cooler': [details] = await db.select().from(coolersTable).where(eq(coolersTable.componentId, componentId)); if (details) { details.cpuSockets = await db.select().from(coolerCPUSocketsTable).where(eq(coolerCPUSocketsTable.coolerId, componentId)); } break; case 'motherboard': [details] = await db.select().from(motherboardsTable).where(eq(motherboardsTable.componentId, componentId)); break; case 'storage': [details] = await db.select().from(storageTable).where(eq(storageTable.componentId, componentId)); break; case 'memory_card': [details] = await db.select().from(memoryCardsTable).where(eq(memoryCardsTable.componentId, componentId)); break; case 'optical_drive': [details] = await db.select().from(opticalDrivesTable).where(eq(opticalDrivesTable.componentId, componentId)); break; case 'sound_card': [details] = await db.select().from(soundCardsTable).where(eq(soundCardsTable.componentId, componentId)); break; case 'cables': [details] = await db.select().from(cablesTable).where(eq(cablesTable.componentId, componentId)); break; case 'network_adapter': [details] = await db.select().from(networkAdaptersTable).where(eq(networkAdaptersTable.componentId, componentId)); break; case 'network_card': [details] = await db.select().from(networkCardsTable).where(eq(networkCardsTable.componentId, componentId)); break; } return { ...component, details: details || null }; } export async function addNewComponent(db: Database, name: string, brand: string, price: number, imgUrl: string, type: string, specificData: any) { return db.transaction(async (tx) => { const [newComponent] = await tx .insert(componentsTable) .values({ name: name, brand: brand, price: price.toFixed(2), imgUrl: imgUrl, type: type }) .returning({ id: componentsTable.id }); const componentId = newComponent.id; switch (type) { case 'cpu': await tx.insert(CPUTable).values({ componentId, socket: specificData.socket, cores: specificData.cores, threads: specificData.threads, baseClock: specificData.baseClock, boostClock: specificData.boostClock, tdp: specificData.tdp, }); break; case 'gpu': await tx.insert(GPUTable).values({ componentId, vram: specificData.vram, tdp: specificData.tdp, baseClock: specificData.baseClock, boostClock: specificData.boostClock, chipset: specificData.chipset, length: specificData.length, }); break; case 'memory': await tx.insert(memoryTable).values({ componentId, type: specificData.type, speed: specificData.speed, capacity: specificData.capacity, modules: specificData.modules, }); break; case 'power_supply': await tx.insert(powerSupplyTable).values({ componentId, type: specificData.type, wattage: specificData.wattage, formFactor: specificData.formFactor, }); break; case 'case': await tx.insert(pcCasesTable).values({ componentId, coolerMaxHeight: specificData.coolerMaxHeight, gpuMaxLength: specificData.gpuMaxLength, }); if (specificData.storageFormFactors) { await tx.insert(caseStorageFormFactorsTable).values( specificData.storageFormFactors.map((sf: any) => ({ caseId: componentId, formFactor: sf.formFactor, numSlots: sf.numSlots, })) ); } if (specificData.psFormFactors) { await tx.insert(casePsFormFactorsTable).values( specificData.psFormFactors.map((pf: any) => ({ caseId: componentId, formFactor: pf.formFactor, })) ); } if (specificData.moboFormFactors) { await tx.insert(caseMoboFormFactorsTable).values( specificData.moboFormFactors.map((mf: any) => ({ caseId: componentId, formFactor: mf.formFactor, })) ); } break; case 'cooler': await tx.insert(coolersTable).values({ componentId, type: specificData.type, height: specificData.height, maxTdpSupported: specificData.maxTdpSupported, }); if (specificData.cpuSockets) { await tx.insert(coolerCPUSocketsTable).values( specificData.cpuSockets.map((socket: string) => ({ coolerId: componentId, socket: socket, })) ); } break; case 'motherboard': await tx.insert(motherboardsTable).values({ componentId, socket: specificData.socket, chipset: specificData.chipset, formFactor: specificData.formFactor, ramType: specificData.ramType, numRamSlots: specificData.numRamSlots, maxRamCapacity: specificData.maxRamCapacity, }); break; case 'storage': await tx.insert(storageTable).values({ componentId, type: specificData.type, capacity: specificData.capacity, formFactor: specificData.formFactor, }); break; case 'memory_card': await tx.insert(memoryCardsTable).values({ componentId, numSlots: specificData.numSlots, interface: specificData.interface, }); break; case 'optical_drive': await tx.insert(opticalDrivesTable).values({ componentId, formFactor: specificData.formFactor, type: specificData.type, interface: specificData.interface, writeSpeed: specificData.writeSpeed, readSpeed: specificData.readSpeed, }); break; case 'sound_card': await tx.insert(soundCardsTable).values({ componentId, sampleRate: specificData.sampleRate, bitDepth: specificData.bitDepth, chipset: specificData.chipset, interface: specificData.interface, channel: specificData.channel, }); break; case 'cables': await tx.insert(cablesTable).values({ componentId, lengthCm: specificData.lengthCm, type: specificData.type, }); break; case 'network_adapter': await tx.insert(networkAdaptersTable).values({ componentId, wifiVersion: specificData.wifiVersion, interface: specificData.interface, numAntennas: specificData.numAntennas, }); break; case 'network_card': await tx.insert(networkCardsTable).values({ componentId, numPorts: specificData.numPorts, speed: specificData.speed, interface: specificData.interface, }); break; default: return null; } return componentId; }); }