import express from "express"; import cors from "cors"; import helmet from "helmet"; import rateLimit from "express-rate-limit"; import { join } from "path"; import { cfg } from "./config"; import { transceiverRouter } from "./routes/transceivers"; import { switchRouter } from "./routes/switches"; import { vendorRouter } from "./routes/vendors"; import { standardRouter } from "./routes/standards"; import { healthRouter } from "./routes/health"; import { hypeCycleRouter } from "./routes/hype-cycle"; import { searchRouter } from "./routes/search"; import { documentRouter } from "./routes/documents"; import { blogRouter } from "./routes/blog"; import { finderRouter } from "./routes/finder"; import { competitorRouter } from "./routes/competitor-alerts"; import { forecastRouter } from "./routes/forecast"; import { transportRouter } from "./routes/transport"; import { datasheetRouter } from "./routes/datasheets"; import { hotTopicsRouter } from "./routes/hot-topics"; import { adoptionRouter } from "./routes/adoption"; const app = express(); // Trust Cloudflare proxy (required for express-rate-limit with X-Forwarded-For) app.set("trust proxy", 1); // Middleware app.use(helmet({ contentSecurityPolicy: false })); app.use(cors()); app.use(express.json()); app.use( rateLimit({ windowMs: 60 * 1000, max: 200, standardHeaders: true, legacyHeaders: false, }) ); // Routes app.use("/api/transceivers", transceiverRouter); app.use("/api/switches", switchRouter); app.use("/api/vendors", vendorRouter); app.use("/api/standards", standardRouter); app.use("/api/health", healthRouter); app.use("/api/hype-cycle", hypeCycleRouter); app.use("/api/search", searchRouter); app.use("/api/documents", documentRouter); app.use("/api/blog", blogRouter); app.use("/api/finder", finderRouter); app.use("/api/competitor-alerts", competitorRouter); app.use("/api/forecast", forecastRouter); app.use("/api/transport", transportRouter); app.use("/api/datasheets", datasheetRouter); app.use("/api/adoption", adoptionRouter); app.use("/api/hot-topics", hotTopicsRouter); // Dashboard (static HTML) app.use("/dashboard", express.static(join(__dirname, "..", "..", "dashboard"))); // Root — redirect to dashboard app.get("/", (_req, res) => { res.redirect("/dashboard/"); }); // API info app.get("/api", (_req, res) => { res.json({ name: "Transceiver Intelligence Platform", version: "0.2.5", endpoints: [ "GET /api/transceivers?q=&form_factor=&speed=&category=&fiber_type=&wdm_type=&coherent=", "GET /api/transceivers/:id", "GET /api/switches?q=&category=", "GET /api/switches/:id", "GET /api/switches/:id/compatibility", "GET /api/vendors?type=", "GET /api/standards?speed=", "GET /api/health", "GET /api/hype-cycle", "GET /api/hype-cycle/:tech", "GET /api/search?q=&collection=&limit=", "GET /api/search/products?q=&form_factor=&speed_gbps=&fiber_type=", "GET /api/search/documents?q=&doc_type=&vendor=&collection=", "GET /api/search/news?q=&source=", "GET /api/search/stats", "POST /api/documents/process {url, title?, doc_type?, vendor?, collection?}", "GET /api/documents", "GET /api/documents/:id", "POST /api/blog/generate {topic, speed?, form_factor?, use_case?}", "GET /api/blog", "GET /api/blog/:id", "PUT /api/blog/:id/status {status: draft|review|approved|published}", ], }); }); // Start app.listen(cfg.port, () => { console.log(`\n TIP API running on http://localhost:${cfg.port}`); console.log(` Environment: ${cfg.nodeEnv}`); console.log(` Database: ${cfg.db.host}:${cfg.db.port}/${cfg.db.database}\n`); });