69 lines
2.7 KiB
TypeScript
69 lines
2.7 KiB
TypeScript
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" });
|
|
}
|
|
});
|