89 lines
3.9 KiB
TypeScript
89 lines
3.9 KiB
TypeScript
import { Router, Request, Response } from "express";
|
|
import { searchSwitches, getSwitchById, getCompatibleTransceivers, getFlexoptixSuggestions, getSwitchDocuments, getSwitchIssues } from "../db/queries";
|
|
|
|
export const switchRouter = Router();
|
|
|
|
// GET /api/switches — Search/list switches
|
|
// Filters: ?q=&category=&whitebox=true&sonic=true&asic_vendor=Broadcom&nos=SONiC&ocp=true
|
|
switchRouter.get("/", async (req: Request, res: Response) => {
|
|
try {
|
|
const result = await searchSwitches({
|
|
q: String(req.query.q || ""),
|
|
category: req.query.category ? String(req.query.category) : undefined,
|
|
whitebox: req.query.whitebox === "true" ? true : undefined,
|
|
sonic_compatible: req.query.sonic === "true" ? true : undefined,
|
|
asic_vendor: req.query.asic_vendor ? String(req.query.asic_vendor) : undefined,
|
|
nos: req.query.nos ? String(req.query.nos) : undefined,
|
|
ocp: req.query.ocp === "true" ? true : undefined,
|
|
max_speed_gbps: req.query.max_speed_gbps ? parseFloat(String(req.query.max_speed_gbps)) : undefined,
|
|
limit: req.query.limit ? parseInt(String(req.query.limit)) : 50,
|
|
offset: req.query.offset ? parseInt(String(req.query.offset)) : 0,
|
|
});
|
|
res.json({ success: true, ...result });
|
|
} catch (err) {
|
|
console.error("Search switches error:", err);
|
|
res.status(500).json({ success: false, error: "Internal server error" });
|
|
}
|
|
});
|
|
|
|
// GET /api/switches/:id — Get single switch
|
|
switchRouter.get("/:id", async (req: Request, res: Response) => {
|
|
try {
|
|
const sw = await getSwitchById(String(req.params.id));
|
|
if (!sw) {
|
|
res.status(404).json({ success: false, error: "Switch not found" });
|
|
return;
|
|
}
|
|
res.json({ success: true, data: sw });
|
|
} catch (err) {
|
|
console.error("Get switch error:", err);
|
|
res.status(500).json({ success: false, error: "Internal server error" });
|
|
}
|
|
});
|
|
|
|
// GET /api/switches/:id/documents — Datasheets, manuals, guides for a switch
|
|
switchRouter.get("/:id/documents", async (req: Request, res: Response) => {
|
|
try {
|
|
const docs = await getSwitchDocuments(String(req.params.id));
|
|
res.json({ success: true, data: docs, total: docs.length });
|
|
} catch (err) {
|
|
console.error("Get switch documents error:", err);
|
|
res.status(500).json({ success: false, error: "Internal server error" });
|
|
}
|
|
});
|
|
|
|
// GET /api/switches/:id/issues — Known bugs, incompatibilities from community sources
|
|
switchRouter.get("/:id/issues", async (req: Request, res: Response) => {
|
|
try {
|
|
const issues = await getSwitchIssues(String(req.params.id));
|
|
res.json({ success: true, data: issues, total: issues.length });
|
|
} catch (err) {
|
|
console.error("Get switch issues error:", err);
|
|
res.status(500).json({ success: false, error: "Internal server error" });
|
|
}
|
|
});
|
|
|
|
// GET /api/switches/:id/compatibility — Compatible transceivers for a switch
|
|
switchRouter.get("/:id/compatibility", async (req: Request, res: Response) => {
|
|
try {
|
|
const transceivers = await getCompatibleTransceivers(String(req.params.id));
|
|
res.json({ success: true, data: transceivers, total: transceivers.length });
|
|
} catch (err) {
|
|
console.error("Get compatibility error:", err);
|
|
res.status(500).json({ success: false, error: "Internal server error" });
|
|
}
|
|
});
|
|
|
|
// GET /api/switches/:id/flexoptix — Flexoptix transceivers by form factor (always available)
|
|
// Returns Flexoptix catalog items that physically fit the switch's port slots,
|
|
// derived from ports_config keys — works before the compat scraper has run.
|
|
switchRouter.get("/:id/flexoptix", async (req: Request, res: Response) => {
|
|
try {
|
|
const suggestions = await getFlexoptixSuggestions(String(req.params.id));
|
|
res.json({ success: true, data: suggestions, total: suggestions.length });
|
|
} catch (err) {
|
|
console.error("Get Flexoptix suggestions error:", err);
|
|
res.status(500).json({ success: false, error: "Internal server error" });
|
|
}
|
|
});
|