84 lines
2.1 KiB
TypeScript
84 lines
2.1 KiB
TypeScript
// routeHit.middleware.ts
|
|
|
|
import type { NextFunction, Request, Response } from "express";
|
|
import {
|
|
createRouteHit,
|
|
shouldIgnoreRoute,
|
|
} from "../utils/analyticRouteHits.utils.js";
|
|
|
|
export function routeHitMiddleware(
|
|
req: Request,
|
|
res: Response,
|
|
next: NextFunction,
|
|
) {
|
|
const start = performance.now();
|
|
|
|
res.on("finish", () => {
|
|
const actualPath = getActualPath(req);
|
|
|
|
if (shouldIgnoreRoute(actualPath)) {
|
|
return;
|
|
}
|
|
|
|
const durationMs = Math.round(performance.now() - start);
|
|
|
|
const routePattern = getRoutePattern(req) as string;
|
|
const module = getModuleName(req);
|
|
|
|
void createRouteHit({
|
|
method: req.method,
|
|
routePattern,
|
|
actualPath,
|
|
statusCode: res.statusCode,
|
|
durationMs,
|
|
module,
|
|
|
|
// adjust these names to your Better Auth/session shape
|
|
userId: req.user?.id ?? null,
|
|
userEmail: req.user?.email ?? null,
|
|
|
|
ipAddress: req.ip ?? null,
|
|
userAgent: req.get("user-agent") ?? null,
|
|
}).catch((err) => {
|
|
console.error("Failed to save route hit", err);
|
|
});
|
|
});
|
|
|
|
next();
|
|
}
|
|
|
|
function getActualPath(req: Request) {
|
|
return req.originalUrl.split("?")[0] ?? req.path ?? "unknown";
|
|
}
|
|
|
|
function getRoutePattern(req: Request) {
|
|
const baseUrl = req.baseUrl || "";
|
|
const routePath = req.route?.path;
|
|
|
|
if (typeof routePath === "string") {
|
|
return `${baseUrl}${routePath}`;
|
|
}
|
|
|
|
return getActualPath(req);
|
|
}
|
|
|
|
function getModuleName(req: Request) {
|
|
const path = req.originalUrl.split("?")[0];
|
|
|
|
if (path?.includes("/printers")) return "printers";
|
|
if (path?.includes("/releases")) return "releases";
|
|
if (path?.includes("/quality")) return "quality";
|
|
if (path?.includes("/scanner")) return "scanner";
|
|
if (path?.includes("/settings")) return "settings";
|
|
if (path?.includes("/users")) return "users";
|
|
if (path?.includes("/mobile")) return "mobile";
|
|
if (path?.includes("/servers")) return "servers";
|
|
if (path?.includes("/logistics")) return "servers";
|
|
if (path?.includes("/ocp")) return "ocp";
|
|
if (path?.includes("/auth")) return "auth";
|
|
if (path?.includes("/datamart")) return "datamart";
|
|
if (path?.includes("/opendock")) return "opendock";
|
|
|
|
return "unknown";
|
|
}
|