From 7c31b43a4a313237fa63c0c9bbc3690b74f63a6f Mon Sep 17 00:00:00 2001 From: Blake Matthes Date: Mon, 11 May 2026 13:25:43 -0500 Subject: [PATCH] fix(app): emit.maxlistener issue BREAKING CHANGE: moved teh middleware to call the api hits to the main app and removed from everywhere else closes #18 --- backend/admin/admin.routes.ts | 6 +-- backend/app.ts | 2 + backend/auth/auth.routes.ts | 4 +- backend/datamart/datamart.routes.ts | 4 +- backend/gpSql/gpSql.routes.ts | 3 +- backend/mobile/availableScanIds.route.ts | 54 +++++++++++++++++++++ backend/mobile/mobile.routes.ts | 5 +- backend/notification/notification.routes.ts | 16 +++--- backend/ocp/ocp.routes.ts | 4 +- backend/opendock/opendock.routes.ts | 3 +- backend/prodSql/prodSql.routes.ts | 3 +- backend/system/settingsBase.controller.ts | 11 +++++ backend/system/system.routes.ts | 3 +- backend/tcpServer/tcp.routes.ts | 8 +-- backend/utils/generateScannerPin.utils.ts | 12 ++++- backend/utils/utils.routes.ts | 3 +- 16 files changed, 105 insertions(+), 36 deletions(-) create mode 100644 backend/mobile/availableScanIds.route.ts diff --git a/backend/admin/admin.routes.ts b/backend/admin/admin.routes.ts index 4586f56..4b08e1f 100644 --- a/backend/admin/admin.routes.ts +++ b/backend/admin/admin.routes.ts @@ -1,16 +1,16 @@ import type { Express } from "express"; import { requireAuth } from "../middleware/auth.middleware.js"; -import { routeHitMiddleware } from "../middleware/routeHit.middleware.js"; + import build from "./admin.build.js"; import update from "./admin.updateServer.js"; export const setupAdminRoutes = (baseUrl: string, app: Express) => { //stats will be like this as we dont need to change this - app.use(`${baseUrl}/api/admin/build`, requireAuth, routeHitMiddleware, build); + app.use(`${baseUrl}/api/admin/build`, requireAuth, build); app.use( `${baseUrl}/api/admin/build`, requireAuth, - routeHitMiddleware, + update, ); diff --git a/backend/app.ts b/backend/app.ts index b82157a..c4c241d 100644 --- a/backend/app.ts +++ b/backend/app.ts @@ -5,6 +5,7 @@ import express from "express"; import morgan from "morgan"; import { umamiConfig } from "./configs/umami.config.js"; import { createLogger } from "./logger/logger.controller.js"; +import { routeHitMiddleware } from "./middleware/routeHit.middleware.js"; import { setupRoutes } from "./routeHandler.routes.js"; import { auth } from "./utils/auth.utils.js"; import { lstCors } from "./utils/cors.utils.js"; @@ -30,6 +31,7 @@ const createApp = async () => { app.use(morgan("dev")); app.set("trust proxy", true); app.use(lstCors()); + app.use(routeHitMiddleware); app.all(`${baseUrl}/api/auth/*splat`, toNodeHandler(auth)); app.use(express.json()); setupRoutes(baseUrl, app); diff --git a/backend/auth/auth.routes.ts b/backend/auth/auth.routes.ts index 4ae1759..f097edd 100644 --- a/backend/auth/auth.routes.ts +++ b/backend/auth/auth.routes.ts @@ -1,11 +1,11 @@ import type { Express } from "express"; -import { routeHitMiddleware } from "../middleware/routeHit.middleware.js"; + import login from "./login.route.js"; import register from "./register.route.js"; export const setupAuthRoutes = (baseUrl: string, app: Express) => { //setup all the routes - app.use(routeHitMiddleware); + app.use(`${baseUrl}/api/authentication/login`, login); app.use(`${baseUrl}/api/authentication/register`, register); }; diff --git a/backend/datamart/datamart.routes.ts b/backend/datamart/datamart.routes.ts index 511f3c4..29f4ef6 100644 --- a/backend/datamart/datamart.routes.ts +++ b/backend/datamart/datamart.routes.ts @@ -1,5 +1,5 @@ import type { Express } from "express"; -import { routeHitMiddleware } from "../middleware/routeHit.middleware.js"; + import { apiReturn } from "../utils/returnHelper.utils.js"; import { datamartData } from "./datamartData.utlis.js"; import runQuery from "./getDatamart.route.js"; @@ -30,7 +30,7 @@ export const setupDatamartRoutes = (baseUrl: string, app: Express) => { // }); //setup all the routes - app.use(routeHitMiddleware); + app.use(`${baseUrl}/api/datamart`, runQuery); // just sending a get on datamart will return all the queries that we can call. diff --git a/backend/gpSql/gpSql.routes.ts b/backend/gpSql/gpSql.routes.ts index 2250f03..bb69bde 100644 --- a/backend/gpSql/gpSql.routes.ts +++ b/backend/gpSql/gpSql.routes.ts @@ -1,6 +1,6 @@ import { type Express, Router } from "express"; import { requireAuth } from "../middleware/auth.middleware.js"; -import { routeHitMiddleware } from "../middleware/routeHit.middleware.js"; + import restart from "./gpSqlRestart.route.js"; import start from "./gpSqlStart.route.js"; import stop from "./gpSqlStop.route.js"; @@ -9,7 +9,6 @@ export const setupGPSqlRoutes = (baseUrl: string, app: Express) => { // Apply auth to entire router const router = Router(); router.use(requireAuth); - app.use(routeHitMiddleware); router.use(start); router.use(stop); diff --git a/backend/mobile/availableScanIds.route.ts b/backend/mobile/availableScanIds.route.ts new file mode 100644 index 0000000..34fd126 --- /dev/null +++ b/backend/mobile/availableScanIds.route.ts @@ -0,0 +1,54 @@ +import { eq } from "drizzle-orm"; +import { Router } from "express"; +import { db } from "../db/db.controller.js"; +import { scanUser } from "../db/schema/scanUsers.js"; +import { settings } from "../db/schema/settings.schema.js"; +import { apiReturn } from "../utils/returnHelper.utils.js"; + +const r = Router(); + +// scanners that are dedicated to specific users. +const SPECIAL_SCANNERS = [69, 98]; + +const buildAllowedScannerIds = (scannerCount: number) => { + const generatedIds = Array.from({ length: scannerCount }, (_, i) => i + 1); + + return Array.from(new Set([...generatedIds, ...SPECIAL_SCANNERS])).sort( + (a, b) => a - b, + ); +}; + +r.get("/", async (_, res) => { + // get the scan users and setting + const scanusers = await db.select().from(scanUser); + const scannerIdSetting = await db + .select() + .from(settings) + .where(eq(settings.name, "scannerIds")); + + const usedScannerIds = scanusers.map((x) => Number(x.scannerId)); + const allowedScannerIds = buildAllowedScannerIds( + Number(scannerIdSetting[0]?.value ?? 0), + ); + + const availableScannerIds = allowedScannerIds.filter( + (id) => !usedScannerIds.includes(id), + ); + + const data = availableScannerIds.map((id) => ({ + label: `${id}`, + value: id, + })); + + return apiReturn(res, { + success: true, + level: "info", + module: "mobile", + subModule: "scanner", + message: `There are ${availableScannerIds.length} scanner id's`, + data, + status: 200, + }); +}); + +export default r; diff --git a/backend/mobile/mobile.routes.ts b/backend/mobile/mobile.routes.ts index 095896e..996628e 100644 --- a/backend/mobile/mobile.routes.ts +++ b/backend/mobile/mobile.routes.ts @@ -1,5 +1,5 @@ import type { Express } from "express"; -import { routeHitMiddleware } from "../middleware/routeHit.middleware.js"; +import available from "./availableScanIds.route.js"; import downloads from "./downloadApps.route.js"; import lanes from "./laneCheck.js"; import authPin from "./mobileAuth.route.js"; @@ -10,14 +10,13 @@ import version from "./version.route.js"; export const setupMobileRoutes = (baseUrl: string, app: Express) => { //stats will be like this as we dont need to change this - app.use(routeHitMiddleware); - app.use(`${baseUrl}/api/mobile/version`, version); app.use(`${baseUrl}/api/mobile/apk`, downloads); app.use(`${baseUrl}/api/mobile/logs`, logs); app.use(`${baseUrl}/api/mobile/auth`, authPin); app.use(`${baseUrl}/api/mobile/pin`, newPin); app.use(`${baseUrl}/api/mobile/laneCheck`, lanes); + app.use(`${baseUrl}/api/mobile/available`, available); // all other system should be under /api/system/* }; diff --git a/backend/notification/notification.routes.ts b/backend/notification/notification.routes.ts index 25d3bb5..0c81765 100644 --- a/backend/notification/notification.routes.ts +++ b/backend/notification/notification.routes.ts @@ -1,6 +1,6 @@ import type { Express } from "express"; import { requireAuth } from "../middleware/auth.middleware.js"; -import { routeHitMiddleware } from "../middleware/routeHit.middleware.js"; + import manual from "./notification.manualTrigger.js"; import getNotifications from "./notification.route.js"; import updateNote from "./notification.update.route.js"; @@ -14,43 +14,43 @@ export const setupNotificationRoutes = (baseUrl: string, app: Express) => { app.use( `${baseUrl}/api/notification`, requireAuth, - routeHitMiddleware, + getNotifications, ); app.use( `${baseUrl}/api/notification`, requireAuth, - routeHitMiddleware, + updateNote, ); app.use( `${baseUrl}/api/notification/manual`, requireAuth, - routeHitMiddleware, + manual, ); app.use( `${baseUrl}/api/notification/sub`, requireAuth, - routeHitMiddleware, + subs, ); app.use( `${baseUrl}/api/notification/sub`, requireAuth, - routeHitMiddleware, + newSub, ); app.use( `${baseUrl}/api/notification/sub`, requireAuth, - routeHitMiddleware, + updateSub, ); app.use( `${baseUrl}/api/notification/sub`, requireAuth, - routeHitMiddleware, + deleteSub, ); diff --git a/backend/ocp/ocp.routes.ts b/backend/ocp/ocp.routes.ts index 68cbabb..494ba3d 100644 --- a/backend/ocp/ocp.routes.ts +++ b/backend/ocp/ocp.routes.ts @@ -1,7 +1,7 @@ import { type Express, Router } from "express"; import { requireAuth } from "../middleware/auth.middleware.js"; import { featureCheck } from "../middleware/featureActive.middleware.js"; -import { routeHitMiddleware } from "../middleware/routeHit.middleware.js"; + import listener from "./ocp.printer.listener.js"; import update from "./ocp.printer.update.js"; @@ -18,8 +18,6 @@ export const setupOCPRoutes = (baseUrl: string, app: Express) => { // auth routes below here router.use(requireAuth); - app.use(routeHitMiddleware); - router.use(update); //router.use(""); diff --git a/backend/opendock/opendock.routes.ts b/backend/opendock/opendock.routes.ts index 36d931c..ccec156 100644 --- a/backend/opendock/opendock.routes.ts +++ b/backend/opendock/opendock.routes.ts @@ -1,7 +1,7 @@ import { type Express, Router } from "express"; import { requireAuth } from "../middleware/auth.middleware.js"; import { featureCheck } from "../middleware/featureActive.middleware.js"; -import { routeHitMiddleware } from "../middleware/routeHit.middleware.js"; + import getApt from "./opendockGetRelease.route.js"; export const setupOpendockRoutes = (baseUrl: string, app: Express) => { @@ -14,7 +14,6 @@ export const setupOpendockRoutes = (baseUrl: string, app: Express) => { // we need to make sure we are authenticated to see the releases router.use(requireAuth); - app.use(routeHitMiddleware); router.use(getApt); app.use(`${baseUrl}/api/opendock`, router); diff --git a/backend/prodSql/prodSql.routes.ts b/backend/prodSql/prodSql.routes.ts index 9b64441..45e5266 100644 --- a/backend/prodSql/prodSql.routes.ts +++ b/backend/prodSql/prodSql.routes.ts @@ -1,6 +1,6 @@ import { type Express, Router } from "express"; import { requireAuth } from "../middleware/auth.middleware.js"; -import { routeHitMiddleware } from "../middleware/routeHit.middleware.js"; + import restart from "./prodSqlRestart.route.js"; import start from "./prodSqlStart.route.js"; import stop from "./prodSqlStop.route.js"; @@ -9,7 +9,6 @@ export const setupProdSqlRoutes = (baseUrl: string, app: Express) => { // Apply auth to entire router const router = Router(); router.use(requireAuth); - app.use(routeHitMiddleware); router.use(start); router.use(stop); diff --git a/backend/system/settingsBase.controller.ts b/backend/system/settingsBase.controller.ts index ee139e7..c3fa6d6 100644 --- a/backend/system/settingsBase.controller.ts +++ b/backend/system/settingsBase.controller.ts @@ -346,6 +346,17 @@ const newSettings: NewSetting[] = [ roles: ["admin"], seedVersion: 1, }, + { + name: "scannerIds", + value: "10", + active: false, + description: + "How many scanners ids are setup for this, there should be a lst_scanner instance created.", + moduleName: "mobile", + settingType: "standard", + roles: ["admin"], + seedVersion: 1, + }, ]; export const baseSettingValidationCheck = async () => { diff --git a/backend/system/system.routes.ts b/backend/system/system.routes.ts index 81b0f88..d7e451f 100644 --- a/backend/system/system.routes.ts +++ b/backend/system/system.routes.ts @@ -1,6 +1,6 @@ import type { Express } from "express"; import { requireAuth } from "../middleware/auth.middleware.js"; -import { routeHitMiddleware } from "../middleware/routeHit.middleware.js"; + import getServers from "./serverData.route.js"; import getSettings from "./settings.route.js"; import updSetting from "./settingsUpdate.route.js"; @@ -8,7 +8,6 @@ import stats from "./stats.route.js"; export const setupSystemRoutes = (baseUrl: string, app: Express) => { //stats will be like this as we dont need to change this - app.use(routeHitMiddleware); app.use(`${baseUrl}/api/stats`, stats); app.use(`${baseUrl}/api/settings`, getSettings); app.use(`${baseUrl}/api/servers`, getServers); diff --git a/backend/tcpServer/tcp.routes.ts b/backend/tcpServer/tcp.routes.ts index 67ba854..4780963 100644 --- a/backend/tcpServer/tcp.routes.ts +++ b/backend/tcpServer/tcp.routes.ts @@ -1,6 +1,6 @@ import type { Express } from "express"; import { requireAuth } from "../middleware/auth.middleware.js"; -import { routeHitMiddleware } from "../middleware/routeHit.middleware.js"; + import restart from "./tcpRestart.route.js"; import start from "./tcpStart.route.js"; import stop from "./tcpStop.route.js"; @@ -8,12 +8,12 @@ import stop from "./tcpStop.route.js"; export const setupTCPRoutes = (baseUrl: string, app: Express) => { //stats will be like this as we dont need to change this - app.use(`${baseUrl}/api/tcp/start`, requireAuth, routeHitMiddleware, start); - app.use(`${baseUrl}/api/tcp/stop`, requireAuth, routeHitMiddleware, stop); + app.use(`${baseUrl}/api/tcp/start`, requireAuth, start); + app.use(`${baseUrl}/api/tcp/stop`, requireAuth, stop); app.use( `${baseUrl}/api/tcp/restart`, requireAuth, - routeHitMiddleware, + restart, ); diff --git a/backend/utils/generateScannerPin.utils.ts b/backend/utils/generateScannerPin.utils.ts index fe8a19b..d701ad7 100644 --- a/backend/utils/generateScannerPin.utils.ts +++ b/backend/utils/generateScannerPin.utils.ts @@ -10,7 +10,7 @@ export async function generateUniquePin() { const pin = generateSixDigitPin(); const existing = await db.query.scanUser.findFirst({ - where: (u, { eq }) => eq(u.pinHash, pin), // ⚠️ we'll fix this below + where: (u, { eq }) => eq(u.pinHash, pin), }); if (!existing) @@ -37,3 +37,13 @@ export async function generateUniquePin() { room: "", }); } + +// export const pinExists = async (pin: string | number) => { +// const existing = await db.query.scanUser.findFirst({ +// where: (u, { eq }) => eq(u.pinHash, pin), +// }); + +// if (!existing) return true; + +// return false; +// }; diff --git a/backend/utils/utils.routes.ts b/backend/utils/utils.routes.ts index 75f8e2e..061f9c8 100644 --- a/backend/utils/utils.routes.ts +++ b/backend/utils/utils.routes.ts @@ -1,9 +1,8 @@ import type { Express } from "express"; -import { routeHitMiddleware } from "../middleware/routeHit.middleware.js"; + import getActiveJobs from "./cronerActiveJobs.route.js"; import jobStatusChange from "./cronerStatusChange.route.js"; export const setupUtilsRoutes = (baseUrl: string, app: Express) => { - app.use(routeHitMiddleware); app.use(`${baseUrl}/api/utils/croner`, getActiveJobs); app.use(`${baseUrl}/api/utils/croner`, jobStatusChange); };