import { Router, Request, Response } from "express"; import { searchTransceivers, getTransceiverById } from "../db/queries"; import { pool } from "../db/client"; export const transceiverRouter = Router(); // GET /api/transceivers — Search/list transceivers transceiverRouter.get("/", async (req: Request, res: Response) => { try { const q = (p: string) => req.query[p] ? String(req.query[p]) : undefined; const result = await searchTransceivers({ q: q("q"), form_factor: q("form_factor"), speed: q("speed"), speed_gbps: q("speed_gbps") ? parseFloat(q("speed_gbps")!) : undefined, category: q("category"), fiber_type: q("fiber_type"), reach_min: q("reach_min") ? parseInt(q("reach_min")!) : undefined, reach_max: q("reach_max") ? parseInt(q("reach_max")!) : undefined, wdm_type: q("wdm_type"), coherent: q("coherent") === "true" ? true : q("coherent") === "false" ? false : undefined, market_status: q("market_status"), vendor: q("vendor"), limit: q("limit") ? parseInt(q("limit")!) : 50, offset: q("offset") ? parseInt(q("offset")!) : 0, }); res.json({ success: true, ...result }); } catch (err) { console.error("Search transceivers error:", err); res.status(500).json({ success: false, error: "Internal server error" }); } }); // GET /api/transceivers/:id — Get single transceiver transceiverRouter.get("/:id", async (req: Request, res: Response) => { try { const transceiver = await getTransceiverById(String(req.params.id)); if (!transceiver) { res.status(404).json({ success: false, error: "Transceiver not found" }); return; } res.json({ success: true, data: transceiver }); } catch (err) { console.error("Get transceiver error:", err); res.status(500).json({ success: false, error: "Internal server error" }); } }); // GET /api/transceivers/:id/compatibility — Compatible switches for a transceiver transceiverRouter.get("/:id/compatibility", async (req: Request, res: Response) => { try { const result = await pool.query( `SELECT sw.id, sw.model, sw.series, sw.category, sw.total_ports, sw.max_speed_gbps, sw.switching_capacity_tbps, sw.lifecycle_status, v.name as vendor_name, c.status, c.notes as compat_notes FROM compatibility c JOIN switches sw ON c.switch_id = sw.id LEFT JOIN vendors v ON sw.vendor_id = v.id WHERE c.transceiver_id::text = $1 AND c.status = 'compatible' ORDER BY v.name, sw.model`, [String(req.params.id)] ); res.json({ success: true, data: result.rows }); } catch (err) { console.error("Get transceiver compatibility error:", err); res.status(500).json({ success: false, error: "Internal server error" }); } });