diff --git a/packages/api/src/routes/vendors.ts b/packages/api/src/routes/vendors.ts index 0a9ead1..2168ed5 100644 --- a/packages/api/src/routes/vendors.ts +++ b/packages/api/src/routes/vendors.ts @@ -1,4 +1,4 @@ -import { Router, Request, Response } from "express"; +import { Router, Request, Response, NextFunction } from "express"; import { pool } from "../db/client"; import { listVendors } from "../db/queries"; @@ -114,7 +114,8 @@ vendorRouter.post("/", async (req: Request, res: Response) => { }); // GET /api/vendors/:id — Get single vendor with full stats -vendorRouter.get("/:id", async (req: Request, res: Response) => { +vendorRouter.get("/:id", async (req: Request, res: Response, next: NextFunction) => { + if (req.params.id === "market-share" || req.params.id === "intelligence") return next(); try { const { id } = req.params; const result = await pool.query( @@ -181,8 +182,8 @@ vendorRouter.get("/market-share", async (req: Request, res: Response) => { v.name AS vendor_name, v.type, COUNT(DISTINCT po.transceiver_id)::int AS sku_count, - ROUND((COUNT(DISTINCT po.transceiver_id)::numeric / NULLIF(t.total,0)) * 100, 1) AS market_share_pct, - COUNT(po.id)::int AS total_obs, + ROUND((COUNT(DISTINCT po.transceiver_id)::numeric / NULLIF(t.total,0)::numeric) * 100, 1) AS market_share_pct, + COUNT(*)::int AS total_obs, MAX(po.time) AS last_seen FROM price_observations po JOIN vendors v ON v.id = po.source_vendor_id @@ -228,7 +229,7 @@ vendorRouter.get("/market-share", async (req: Request, res: Response) => { (c.sku_count - COALESCE(p.sku_count, 0)) AS delta_skus, CASE WHEN COALESCE(p.sku_count, 0) = 0 THEN NULL - ELSE ROUND(((c.sku_count - p.sku_count)::numeric / p.sku_count) * 100, 1) + ELSE ROUND(((c.sku_count - p.sku_count)::numeric / p.sku_count::numeric) * 100, 1) END AS delta_pct FROM cur c JOIN vendors v ON v.id = c.source_vendor_id @@ -273,7 +274,7 @@ vendorRouter.get("/intelligence", async (_req: Request, res: Response) => { v.type, v.website, COUNT(DISTINCT po.transceiver_id)::int AS sku_count, - COUNT(po.id)::int AS price_obs, + COUNT(*)::int AS price_obs, ROUND(AVG(po.price)::numeric, 2) AS avg_price, ROUND(MIN(po.price)::numeric, 2) AS min_price, ROUND(MAX(po.price)::numeric, 2) AS max_price,