import { NextRequest, NextResponse } from "next/server"; import { getDb } from "@/lib/db"; export async function GET(request: NextRequest) { const sql = getDb(); const { searchParams } = new URL(request.url); const search = searchParams.get("search") || ""; const category = searchParams.get("category") || ""; const lowStock = searchParams.get("lowStock") === "true"; const supplierName = searchParams.get("supplier_name") || ""; let query = ` SELECT c.*, cat.name as category_name, cust.name as customer_name, COALESCE(( SELECT SUM(spi.quantity - spi.received_quantity) FROM supplier_po_items spi JOIN supplier_pos sp ON sp.id = spi.supplier_po_id WHERE spi.component_id = c.id AND sp.status IN ('ordered', 'partially_received') AND spi.quantity > spi.received_quantity ), 0)::int AS on_order FROM components c LEFT JOIN categories cat ON c.category_id = cat.id LEFT JOIN customers cust ON c.customer_id = cust.id WHERE 1=1 `; const params: (string | number)[] = []; if (search) { params.push(`%${search}%`, `%${search}%`, `%${search}%`); query += ` AND (c.name ILIKE $${params.length - 2} OR c.part_number ILIKE $${params.length - 1} OR c.manufacturer ILIKE $${params.length})`; } if (category) { params.push(Number(category)); query += ` AND c.category_id = $${params.length}`; } if (lowStock) { query += ` AND c.stock_quantity <= c.min_stock_level`; } if (supplierName) { params.push(supplierName); query += ` AND c.supplier = $${params.length}`; } query += ` ORDER BY c.updated_at DESC`; const rows = await sql(query, params); return NextResponse.json(rows); } export async function POST(request: NextRequest) { const sql = getDb(); const body = await request.json(); const { part_number, name, description, category_id, manufacturer, package_type, unit_price, stock_quantity, min_stock_level, datasheet_url, supplier, supplier_part_number, shelf_location, is_internal, customer_supplied, customer_id, specs, } = body; const rows = await sql( `INSERT INTO components (part_number, name, description, category_id, manufacturer, package_type, unit_price, stock_quantity, min_stock_level, datasheet_url, supplier, supplier_part_number, shelf_location, is_internal, customer_supplied, customer_id, specs) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17) RETURNING *`, [ part_number, name, description || null, category_id || null, manufacturer || null, package_type || null, unit_price || 0, stock_quantity || 0, min_stock_level || 0, datasheet_url || null, supplier || null, supplier_part_number || null, shelf_location || null, is_internal ?? false, customer_supplied ?? false, customer_supplied ? (customer_id || null) : null, JSON.stringify(specs || {}), ] ); return NextResponse.json(rows[0], { status: 201 }); }