From 5886bea85da30fe43635e05de1e9bc4f5789fa64 Mon Sep 17 00:00:00 2001 From: Blake Matthes Date: Mon, 24 Mar 2025 11:43:52 -0500 Subject: [PATCH 1/3] chore(release): bump build number to 52 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index dd6c089..ee6f6ca 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "deploy": "standard-version --conventional-commits && npm run prodBuild", "zipServer": "dotenvx run -f .env -- tsx server/scripts/zipUpBuild.ts \"C:\\Users\\matthes01\\Documents\\lstv2\"", "v1Build": "cd C:\\Users\\matthes01\\Documents\\logisticsSupportTool && npm run oldBuilder", - "prodBuild": "npm run v1Build && powershell -ExecutionPolicy Bypass -File server/scripts/build.ps1 -dir \"C:\\Users\\matthes01\\Documents\\lstv2\" && npm run zipServer", + "prodBuild": "npm run v1Build && powershell -ExecutionPolicy Bypass -File server/scripts/build.ps1 -dir \"C:\\Users\\matthes01\\Documents\\lstv2-dev\" && npm run zipServer", "commit": "cz", "prodinstall": "npm i --omit=dev && npm run db:migrate", "checkupdates": "npx npm-check-updates" @@ -78,4 +78,4 @@ "ws": "^8.18.1", "zod": "^3.24.2" } -} \ No newline at end of file +} From 0c5fc1dfb0a8bee5cf7414733a555fe1b5888b8e Mon Sep 17 00:00:00 2001 From: Blake Matthes Date: Mon, 24 Mar 2025 15:28:10 -0500 Subject: [PATCH 2/3] chore(release): bump build number to 55 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ee6f6ca..46db329 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ } }, "admConfig": { - "build": 50, + "build": 53, "oldBuild": "backend-0.1.3.zip" }, "devDependencies": { From 6dd9ed848bc7d4e8a62778cfe36f89e077187157 Mon Sep 17 00:00:00 2001 From: Blake Matthes Date: Mon, 24 Mar 2025 15:31:31 -0500 Subject: [PATCH 3/3] test(ocme): lots of changes to get it working in production --- .../src/components/ocme/ocmeCycleCount.tsx | 381 ++++++++++-------- package.json | 2 +- server/index.ts | 20 +- server/scripts/update.ps1 | 8 +- server/scripts/updateServers.ts | 320 ++++++++------- server/scripts/zipUpBuild.ts | 2 +- .../controller/cycleCount/ocmeInventory.ts | 27 +- .../services/ocme/controller/postRunningNr.ts | 100 +++-- server/services/ocme/route/cycleCount.ts | 103 ++--- server/services/ocme/route/getInfo.ts | 155 +++---- .../services/ocme/route/getShipmentPallets.ts | 178 ++++---- server/services/ocme/route/pickedUp.ts | 179 ++++---- .../services/ocme/route/postRunningNumber.ts | 168 ++++---- server/services/tcpServer/tcpServer.ts | 93 +++-- 14 files changed, 957 insertions(+), 779 deletions(-) diff --git a/frontend/src/components/ocme/ocmeCycleCount.tsx b/frontend/src/components/ocme/ocmeCycleCount.tsx index 71c4348..da2802c 100644 --- a/frontend/src/components/ocme/ocmeCycleCount.tsx +++ b/frontend/src/components/ocme/ocmeCycleCount.tsx @@ -1,185 +1,212 @@ -import {toast} from "sonner"; -import {LstCard} from "../extendedUI/LstCard"; -import {Button} from "../ui/button"; -import {Input} from "../ui/input"; -import {Table, TableBody, TableCell, TableHead, TableHeader, TableRow} from "../ui/table"; -import {Skeleton} from "../ui/skeleton"; +import { toast } from "sonner"; +import { LstCard } from "../extendedUI/LstCard"; +import { Button } from "../ui/button"; +import { Input } from "../ui/input"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "../ui/table"; +import { Skeleton } from "../ui/skeleton"; //import CycleCountLog from "./CycleCountLog"; -import {Select, SelectContent, SelectItem, SelectTrigger, SelectValue} from "../ui/select"; -import {Controller, useForm} from "react-hook-form"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "../ui/select"; +import { Controller, useForm } from "react-hook-form"; import axios from "axios"; -import {useState} from "react"; +import { useState } from "react"; export default function OcmeCycleCount() { - const token = localStorage.getItem("auth_token"); - const [data, setData] = useState([]); - const [counting, setCounting] = useState(false); - const { - register, - handleSubmit, - //watch, - formState: {errors}, - reset, - control, - } = useForm(); + const token = localStorage.getItem("auth_token"); + const [data, setData] = useState([]); + const [counting, setCounting] = useState(false); + const { + register, + handleSubmit, + //watch, + formState: { errors }, + reset, + control, + } = useForm(); - const onSubmit = async (data: any) => { - setData([]); - setCounting(true); - toast.success(`Cycle count started`); - try { - const res = await axios.post("/ocme/api/v1/cyclecount", data, { - headers: {Authorization: `Bearer ${token}`}, - }); - toast.success(res.data.message); - setData(res.data.data); - setCounting(false); - reset(); - } catch (error) { - toast.error("There was an error cycle counting"); - setCounting(false); - reset(); - } - }; - return ( -
-
- -

Please enter the name or laneID you want to cycle count.

-
-
-
-
- -
- ( - - )} - /> -
-
- -
-
-
-
- - - - LaneID - Lane - AV - Description - Running Number - In Ocme - In Stock - Result - - - {data.length === 0 ? ( - - {Array(10) - .fill(0) - .map((_, i) => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - ))} - - ) : ( - <> - {data.map((i: any) => { - let classname = ``; - if (i.info === "Quality Check Required") { - classname = `bg-red-500`; - } - if (i.info === "Sent to Inv") { - classname = `bg-amber-700`; - } - return ( - - - {i.alpla_laneID} - - - {i.alpla_laneDescription} - - - {i.Article} - - - {i.alpla_laneDescription} - - - {i.runningNumber} - - {i.ocme} - {i.stock} - {i.info} - - ); - })} - - )} -
-
-
-
- {/*
+ const onSubmit = async (data: any) => { + setData([]); + setCounting(true); + toast.success(`Cycle count started`); + try { + const res = await axios.post("/ocme/api/v1/cycleCount", data, { + headers: { Authorization: `Bearer ${token}` }, + }); + console.log(data); + toast.success(res.data.message); + setData(res.data.data); + setCounting(false); + reset(); + } catch (error) { + toast.error("There was an error cycle counting"); + setCounting(false); + reset(); + } + }; + + return ( +
+
+ +

+ Please enter the name or laneID you want to cycle count. +

+
+
+
+
+ +
+ ( + + )} + /> +
+
+ +
+
+
+
+ + + + LaneID + Lane + AV + Description + Running Number + In Ocme + In Stock + Result + + + {data?.length === 0 ? ( + + {Array(10) + .fill(0) + .map((_, i) => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + ))} + + ) : ( + <> + {data?.map((i: any) => { + let classname = ``; + if (i.info === "Quality Check Required") { + classname = `bg-red-500`; + } + if (i.info === "Sent to Inv") { + classname = `bg-amber-700`; + } + return ( + + + {i.alpla_laneID} + + + {i.alpla_laneDescription} + + + {i.Article} + + + {i.alpla_laneDescription} + + + {i.runningNumber} + + + {i.ocme} + + + {i.stock} + + + {i.info} + + + ); + })} + + )} +
+
+
+
+ {/*
*/} -
- ); +
+ ); } diff --git a/package.json b/package.json index 46db329..23d8615 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ } }, "admConfig": { - "build": 53, + "build": 54, "oldBuild": "backend-0.1.3.zip" }, "devDependencies": { diff --git a/server/index.ts b/server/index.ts index 87305ba..3bddcc2 100644 --- a/server/index.ts +++ b/server/index.ts @@ -53,17 +53,17 @@ app.use( ); // Middleware to normalize route case -app.use("*", async (c, next) => { - const lowercasedUrl = c.req.url.toLowerCase(); - //console.log("Incoming Request:", c.req.url, c.req.method); - // If the URL is already lowercase, continue as usual - if (c.req.url === lowercasedUrl) { - return next(); - } +// app.use("*", async (c, next) => { +// const lowercasedUrl = c.req.url.toLowerCase(); +// //console.log("Incoming Request:", c.req.url, c.req.method); +// // If the URL is already lowercase, continue as usual +// if (c.req.url === lowercasedUrl) { +// await next(); +// } - // Otherwise, re-route internally - return c.redirect(lowercasedUrl, 308); // 308 preserves the HTTP method -}); +// // Otherwise, re-route internally +// return c.redirect(lowercasedUrl, 308); // 308 preserves the HTTP method +// }); app.doc("/api/ref", { openapi: "3.0.0", diff --git a/server/scripts/update.ps1 b/server/scripts/update.ps1 index f2931b5..1a78291 100644 --- a/server/scripts/update.ps1 +++ b/server/scripts/update.ps1 @@ -415,10 +415,10 @@ try { Start-Service -DisplayName $serviceLstV2 Start-Sleep -Seconds 1 Write-Host "$($server) finished updating" - if($token -eq "usday1"){ - Write-Host "Starting $($serviceOcme)" - Start-Service -DisplayName $serviceOcme - } + # if($token -eq "usday1"){ + # Write-Host "Starting $($serviceOcme)" + # Start-Service -DisplayName $serviceOcme + # } } Invoke-Command -ComputerName $server -ScriptBlock $plantFunness -ArgumentList $server, $token, $location, $buildZip, $buildLoc, $obslst, $obsBuild -Credential $credentials \ No newline at end of file diff --git a/server/scripts/updateServers.ts b/server/scripts/updateServers.ts index 987b05f..ff31d7f 100644 --- a/server/scripts/updateServers.ts +++ b/server/scripts/updateServers.ts @@ -1,173 +1,189 @@ -import {spawn} from "child_process"; -import {getAppInfo} from "../globalUtils/appInfo.js"; -import {db} from "../../database/dbclient.js"; -import {serverData} from "../../database/schema/serverData.js"; -import {eq, sql} from "drizzle-orm"; -import {createLog} from "../services/logger/logger.js"; +import { spawn } from "child_process"; +import { getAppInfo } from "../globalUtils/appInfo.js"; +import { db } from "../../database/dbclient.js"; +import { serverData } from "../../database/schema/serverData.js"; +import { eq, sql } from "drizzle-orm"; +import { createLog } from "../services/logger/logger.js"; type UpdateServerResponse = { - success: boolean; - message: string; + success: boolean; + message: string; }; -export const updateServer = async (devApp: string, server: string | null): Promise => { - const app = await getAppInfo(devApp); - const serverInfo = await db +export const updateServer = async ( + devApp: string, + server: string | null +): Promise => { + const app = await getAppInfo(devApp); + const serverInfo = await db .select() .from(serverData) .where(eq(serverData.plantToken, server?.toLowerCase() ?? "")); - if (serverInfo.length === 0) { - createLog( - "error", - "lst", - "serverUpdater", - `Looks like you are missing the plant token or have entered an incorrect one please try again.` - ); - return { - success: false, - message: "Looks like you are missing the plant token or have entered an incorrect one please try again.", - }; - } + if (serverInfo.length === 0) { + createLog( + "error", + "lst", + "serverUpdater", + `Looks like you are missing the plant token or have entered an incorrect one please try again.` + ); + return { + success: false, + message: + "Looks like you are missing the plant token or have entered an incorrect one please try again.", + }; + } - if (serverInfo[0].isUpgrading) { - createLog( - "error", - "lst", - "serverUpdater", - `Looks like ${serverInfo[0].plantToken} is upgrading already you cant do this again.` - ); - return { - success: false, - message: `Looks like ${serverInfo[0].plantToken} is upgrading already you cant do this again.`, - }; - } + if (serverInfo[0].isUpgrading) { + createLog( + "error", + "lst", + "serverUpdater", + `Looks like ${serverInfo[0].plantToken} is upgrading already you cant do this again.` + ); + return { + success: false, + message: `Looks like ${serverInfo[0].plantToken} is upgrading already you cant do this again.`, + }; + } - const scriptPath = `${process.env.DEVFOLDER}\\server\\scripts\\update.ps1 `; - const args = [ - "-NoProfile", - "-ExecutionPolicy", - "Bypass", - "-File", - scriptPath, - "-username", - process.env.ADMUSER, // needs moved to somewhere else. - "-admpass", - process.env.ADMPASSWORD, // needs moved to somewhere else. - "-devFolder", - process.env.DEVFOLDER, - "-server", - serverInfo[0].serverDNS, - "-serverIP", - serverInfo[0].idAddress, - "-token", - serverInfo[0].plantToken, - "-build", - `${process.env.DEVFOLDER}\\builds`, - "-location", - serverInfo[0].serverLoc, - "-obslst", - serverInfo[0].oldVersion, - "-obsBuild", - app.admConfig.oldBuild, - , - ]; + const scriptPath = `${process.env.DEVFOLDER}\\server\\scripts\\update.ps1 `; + const args = [ + "-NoProfile", + "-ExecutionPolicy", + "Bypass", + "-File", + scriptPath, + "-username", + process.env.ADMUSER, // needs moved to somewhere else. + "-admpass", + process.env.ADMPASSWORD, // needs moved to somewhere else. + "-devFolder", + process.env.DEVFOLDER, + "-server", + serverInfo[0].serverDNS, + "-serverIP", + serverInfo[0].idAddress, + "-token", + serverInfo[0].plantToken, + "-build", + `${process.env.DEVFOLDER}\\builds`, + "-location", + serverInfo[0].serverLoc, + "-obslst", + serverInfo[0].oldVersion, + "-obsBuild", + app.admConfig.oldBuild, + , + ]; - return new Promise(async (resolve, reject) => { - const process = spawn("powershell", args); - // change the server to upgradeing - await db - .update(serverData) - .set({isUpgrading: true}) - .where(eq(serverData.plantToken, server?.toLowerCase() ?? "")); - //let stdout = ""; - //let stderr = ""; + console.log(args); - // Collect stdout data - process.stdout.on("data", (data) => { - const output = data.toString().trim(); - createLog("info", "lst", "serverUpdater", `${output}`); - //onData(output); - }); + return new Promise(async (resolve, reject) => { + const process = spawn("powershell", args); + // change the server to upgradeing + await db + .update(serverData) + .set({ isUpgrading: true }) + .where(eq(serverData.plantToken, server?.toLowerCase() ?? "")); + //let stdout = ""; + //let stderr = ""; - // Collect stderr data - process.stderr.on("data", (data) => { - const output = data.toString().trim(); - createLog("info", "lst", "serverUpdater", `${output}`); - //onData(output); - }); - - // Handle process close - process.on("close", async (code) => { - if (code === 0) { - // if (count >= servers) { - // //onClose(`Server completed with code: ${code}`); - // } - createLog("info", "lst", "serverUpdater", `${server}`); - - //update the last build. - try { - await db - .update(serverData) - .set({lastUpdated: sql`NOW()`, isUpgrading: false}) - .where(eq(serverData.plantToken, server?.toLowerCase() ?? "")); - createLog( - "info", - "lst", - "serverUpdater", - `${server?.toLowerCase()}, has been updated and can now be used again.` - ); - } catch (error) { - createLog( - "error", - "lst", - "serverUpdater", - `There was an error updating the last time the server was updated: ${error}` - ); - } - - resolve({ - success: true, - message: `${server?.toLowerCase()}, has been updated and can now be used again.`, - }); - } else { - const errorMessage = `Process exited with code ${code}`; - - // if (count >= servers) { - // //onClose(code); - // } - - reject({ - success: false, - message: `${server?.toLowerCase()}, Has encounted an error while updating.`, - }); - } - }); - - // Handle errors with the process itself - process.on("error", (error) => { - //onError(err.message); - createLog("error", "lst", "serverUpdater", `${error}`); - reject(error); - }); + // Collect stdout data + process.stdout.on("data", (data) => { + const output = data.toString().trim(); + createLog("info", "lst", "serverUpdater", `${output}`); + //onData(output); }); + + // Collect stderr data + process.stderr.on("data", (data) => { + const output = data.toString().trim(); + createLog("info", "lst", "serverUpdater", `${output}`); + //onData(output); + }); + + // Handle process close + process.on("close", async (code) => { + if (code === 0) { + // if (count >= servers) { + // //onClose(`Server completed with code: ${code}`); + // } + createLog("info", "lst", "serverUpdater", `${server}`); + + //update the last build. + try { + await db + .update(serverData) + .set({ lastUpdated: sql`NOW()`, isUpgrading: false }) + .where(eq(serverData.plantToken, server?.toLowerCase() ?? "")); + createLog( + "info", + "lst", + "serverUpdater", + `${server?.toLowerCase()}, has been updated and can now be used again.` + ); + } catch (error) { + createLog( + "error", + "lst", + "serverUpdater", + `There was an error updating the last time the server was updated: ${error}` + ); + } + + resolve({ + success: true, + message: `${server?.toLowerCase()}, has been updated and can now be used again.`, + }); + } else { + const errorMessage = `Process exited with code ${code}`; + + // if (count >= servers) { + // //onClose(code); + // } + + reject({ + success: false, + message: `${server?.toLowerCase()}, Has encounted an error while updating.`, + }); + } + }); + + // Handle errors with the process itself + process.on("error", (error) => { + //onError(err.message); + createLog("error", "lst", "serverUpdater", `${error}`); + reject(error); + }); + }); }; export async function processAllServers(devApp: string) { - const servers = await db.select().from(serverData); + const servers = await db.select().from(serverData); - createLog("info", "lst", "serverUpdater", `Running the update on all servers`); - let count = 1; - for (const server of servers) { - try { - const updateToServer = await updateServer(devApp, server.plantToken); - createLog("info", "lst", "serverUpdater", `${server.sName} was updated.`); - count = count + 1; + createLog( + "info", + "lst", + "serverUpdater", + `Running the update on all servers` + ); + let count = 1; + for (const server of servers) { + try { + const updateToServer = await updateServer(devApp, server.plantToken); + createLog("info", "lst", "serverUpdater", `${server.sName} was updated.`); + count = count + 1; - //return {success: true, message: `${server.sName} was updated.`, data: updateToServer}; - } catch (error: any) { - createLog("info", "lst", "serverUpdater", `Error updating ${server.sName}: ${error.message}`); - //return {success: false, message: `Error updating ${server.sName}: ${error.message}`}; - } + //return {success: true, message: `${server.sName} was updated.`, data: updateToServer}; + } catch (error: any) { + createLog( + "info", + "lst", + "serverUpdater", + `Error updating ${server.sName}: ${error.message}` + ); + //return {success: false, message: `Error updating ${server.sName}: ${error.message}`}; } + } } diff --git a/server/scripts/zipUpBuild.ts b/server/scripts/zipUpBuild.ts index e45651c..6b80a50 100644 --- a/server/scripts/zipUpBuild.ts +++ b/server/scripts/zipUpBuild.ts @@ -99,7 +99,7 @@ const updateBuildNumber = (appLock: string) => { // Auto-commit changes execSync("git add package.json"); execSync( - `git commit -m "build: bump build number to ${pkgJson.admConfig.build}"` + `git commit -m "chore(release): bump build number to ${pkgJson.admConfig.build}"` ); } else { createLog( diff --git a/server/services/ocme/controller/cycleCount/ocmeInventory.ts b/server/services/ocme/controller/cycleCount/ocmeInventory.ts index 964d2f3..8e2e024 100644 --- a/server/services/ocme/controller/cycleCount/ocmeInventory.ts +++ b/server/services/ocme/controller/cycleCount/ocmeInventory.ts @@ -1,16 +1,21 @@ import axios from "axios"; export const ocmeInv = async (data: any) => { - try { - const res = await axios.post( - "http://usday1vms010:3250/api/v1/getLaneData", - {lane: data.lane, laneType: data.laneType}, - {headers: {"Content-Type": "application/json", Connection: "keep-alive"}} - ); - // console.log(res.data.data); + try { + const res = await axios.post( + "http://usday1vms010:3250/api/v1/getlanedata", + { lane: data.lane, laneType: data.laneType }, + { + headers: { + "Content-Type": "application/json", + Connection: "keep-alive", + }, + } + ); + // console.log(res.data.data); - return res.data.data; - } catch (error: any) { - console.log(error.code); - } + return res.data.data; + } catch (error: any) { + console.log(error.code); + } }; diff --git a/server/services/ocme/controller/postRunningNr.ts b/server/services/ocme/controller/postRunningNr.ts index 897b2ad..79aa903 100644 --- a/server/services/ocme/controller/postRunningNr.ts +++ b/server/services/ocme/controller/postRunningNr.ts @@ -1,43 +1,67 @@ -import {db} from "../../../../database/dbclient.js"; -import {ocmeData} from "../../../../database/schema/ocme.js"; -import {createSSCC} from "../../../globalUtils/createSSCC.js"; -import {createLog} from "../../logger/logger.js"; -import {query} from "../../sqlServer/prodSqlServer.js"; -import {labelData} from "../../sqlServer/querys/materialHelpers/labelInfo.js"; +import { db } from "../../../../database/dbclient.js"; +import { ocmeData } from "../../../../database/schema/ocme.js"; +import { createSSCC } from "../../../globalUtils/createSSCC.js"; +import { createLog } from "../../logger/logger.js"; +import { query } from "../../sqlServer/prodSqlServer.js"; +import { labelData } from "../../sqlServer/querys/materialHelpers/labelInfo.js"; export const postLabelData = async (data: any) => { - // if we have sscc we will do everything here and ignore the rn even it its sent over - if (data.sscc && !data.runningNr) { - data.runningNr = data.sscc.slice(10, -1); - } - - if (!data.sscc && !data.runningNr) { - // data.runningNr = data.sscc.slice(10, -1); - return {success: false, message: "Missing data please try again", data: []}; - } - - let label; - const filterQuery = labelData.replaceAll("[rn]", data.runningNr); - - try { - label = await query(filterQuery, "Label data"); - } catch (error) { - createLog("error", "ocme", "ocme", "There was an error getting the labelData"); - } - const newPost = { - sscc: data.sscc ? data.sscc : await createSSCC(data.runningNr), - runningNr: data.runningNr, - completed: data.completed, - lineNum: label[0].machineLocation, - areaFrom: data.areaFrom, - pickedUp: false, + console.log(data); + let newData = data; + if (Array.isArray(data)) { + newData = { + sscc: data[1], + areaFrom: data[0], + completed: true, }; + } - try { - const enterNewData = await db.insert(ocmeData).values(newPost).returning({sscc: ocmeData.sscc}); - return {success: true, message: "Data was posted to ocme info", data: enterNewData}; - } catch (error) { - console.log(error); - return {success: false, message: "Data was posted to ocme info", data: newPost}; - } + if (newData.sscc && !newData.runningNr) { + newData.runningNr = newData.sscc.slice(10, -1); + } + if (!newData.sscc && !newData.runningNr) { + return { + success: false, + message: "Missing data please try again", + data: [], + }; + } + let label; + const filterQuery = labelData.replaceAll("[rn]", newData.runningNr); + try { + label = await query(filterQuery, "Label data"); + } catch (error) { + createLog( + "error", + "ocme", + "ocme", + "There was an error getting the labelData" + ); + } + const newPost = { + sscc: newData.sscc ? newData.sscc : await createSSCC(newData.runningNr), + runningNr: newData.runningNr, + completed: newData.completed, + lineNum: label[0].machineLocation, + areaFrom: newData.areaFrom, + pickedUp: false, + }; + try { + const enterNewData = await db + .insert(ocmeData) + .values(newPost) + .returning({ sscc: ocmeData.sscc }); + return { + success: true, + message: "Data was posted to ocme info", + data: enterNewData, + }; + } catch (error) { + console.log(error); + return { + success: false, + message: "Data was posted to ocme info", + data: newPost, + }; + } }; diff --git a/server/services/ocme/route/cycleCount.ts b/server/services/ocme/route/cycleCount.ts index e045db3..903f750 100644 --- a/server/services/ocme/route/cycleCount.ts +++ b/server/services/ocme/route/cycleCount.ts @@ -1,60 +1,71 @@ -import {createRoute, OpenAPIHono, z} from "@hono/zod-openapi"; +import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi"; -import {apiHit} from "../../../globalUtils/apiHits.js"; -import {responses} from "../../../globalUtils/routeDefs/responses.js"; -import {authMiddleware} from "../../auth/middleware/authMiddleware.js"; -import {cycleCount} from "../controller/cycleCount.js"; -import type {User} from "../../../types/users.js"; -import {verify} from "hono/jwt"; +import { apiHit } from "../../../globalUtils/apiHits.js"; +import { responses } from "../../../globalUtils/routeDefs/responses.js"; +import { authMiddleware } from "../../auth/middleware/authMiddleware.js"; +import { cycleCount } from "../controller/cycleCount.js"; +import type { User } from "../../../types/users.js"; +import { verify } from "hono/jwt"; -const app = new OpenAPIHono({strict: false}); +const app = new OpenAPIHono({ strict: false }); const AddSetting = z.object({ - lane: z.string().openapi({example: "L064"}), + lane: z.string().openapi({ example: "L064" }), }); app.openapi( - createRoute({ - tags: ["ocme"], - summary: "Cycle counts a lane based on the lane Alias", - method: "post", - path: "/cyclecount", - middleware: authMiddleware, - request: { - body: { - content: { - "application/json": {schema: AddSetting}, - }, - }, + createRoute({ + tags: ["ocme"], + summary: "Cycle counts a lane based on the lane Alias", + method: "post", + path: "/cycleCount", + middleware: authMiddleware, + request: { + body: { + content: { + "application/json": { schema: AddSetting }, }, - responses: responses(), - }), - async (c) => { - apiHit(c, {endpoint: "api/auth/register"}); - // make sure we have a vaid user being accessed thats really logged in - const body = await c.req.json(); + }, + }, + responses: responses(), + }), + async (c) => { + apiHit(c, { endpoint: "api/auth/register" }); + // make sure we have a vaid user being accessed thats really logged in + const body = await c.req.json(); - const authHeader = c.req.header("Authorization"); + const authHeader = c.req.header("Authorization"); - const token = authHeader?.split("Bearer ")[1] || ""; - let user: User; + const token = authHeader?.split("Bearer ")[1] || ""; + let user: User; - try { - const payload = await verify(token, process.env.JWT_SECRET!); - user = payload.user as User; - } catch (error) { - return c.json({message: "Unauthorized"}, 401); - } - - try { - const cycleData = await cycleCount(body, user); - return c.json({success: true, message: `${body.lane} was just cycle counted.`, data: cycleData}, 200); - } catch (error) { - return c.json( - {success: false, message: `There was an error cycle counting ${body.lane}`, data: error}, - 400 - ); - } + try { + const payload = await verify(token, process.env.JWT_SECRET!); + user = payload.user as User; + } catch (error) { + return c.json({ message: "Unauthorized" }, 401); } + + try { + const cycleData = await cycleCount(body, user); + return c.json( + { + success: true, + message: `${body.lane} was just cycle counted.`, + data: cycleData, + }, + 200 + ); + } catch (error) { + return c.json( + { + success: false, + message: `There was an error cycle counting ${body.lane}`, + data: error, + }, + 400 + ); + } + } ); export default app; diff --git a/server/services/ocme/route/getInfo.ts b/server/services/ocme/route/getInfo.ts index a65b71d..8d33f27 100644 --- a/server/services/ocme/route/getInfo.ts +++ b/server/services/ocme/route/getInfo.ts @@ -1,81 +1,96 @@ -import {createRoute, OpenAPIHono, z} from "@hono/zod-openapi"; -import {getInfo} from "../controller/getInfo.js"; -import {apiHit} from "../../../globalUtils/apiHits.js"; +import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi"; +import { getInfo } from "../controller/getInfo.js"; +import { apiHit } from "../../../globalUtils/apiHits.js"; -const app = new OpenAPIHono({strict: false}); +const app = new OpenAPIHono({ strict: false }); const AddSetting = z.object({ - name: z.string().openapi({example: "server"}), - value: z.string().openapi({example: "localhost"}), - description: z.string().openapi({example: "The server we are going to connect to"}), - roles: z.string().openapi({example: "admin"}), - module: z.string().openapi({example: "production"}), + name: z.string().openapi({ example: "server" }), + value: z.string().openapi({ example: "localhost" }), + description: z + .string() + .openapi({ example: "The server we are going to connect to" }), + roles: z.string().openapi({ example: "admin" }), + module: z.string().openapi({ example: "production" }), }); app.openapi( - createRoute({ - tags: ["ocme"], - summary: "Get all current info", - method: "get", - path: "/getinfo", - request: { - body: { - content: { - "application/json": {schema: AddSetting}, - }, - }, + createRoute({ + tags: ["ocme"], + summary: "Get all current info", + method: "get", + path: "/getInfo", + request: { + body: { + content: { + "application/json": { schema: AddSetting }, }, - responses: { - 200: { - content: { - "application/json": { - schema: z.object({ - success: z.boolean().openapi({example: true}), - message: z.string().openapi({example: "Starter"}), - data: z.array(z.object({})).optional().openapi({example: []}), - }), - }, - }, - description: "Response message", - }, - 400: { - content: { - "application/json": { - schema: z.object({ - success: z.boolean().openapi({example: false}), - message: z.string().optional().openapi({example: "Internal Server error"}), - data: z.array(z.object({})).optional().openapi({example: []}), - }), - }, - }, - description: "Internal Server Error", - }, - // 401: { - // content: { - // "application/json": { - // schema: z.object({message: z.string().optional().openapi({example: "Unauthenticated"})}), - // }, - // }, - // description: "Unauthorized", - // }, - // 500: { - // content: { - // "application/json": { - // schema: z.object({message: z.string().optional().openapi({example: "Internal Server error"})}), - // }, - // }, - // description: "Internal Server Error", - // }, + }, + }, + responses: { + 200: { + content: { + "application/json": { + schema: z.object({ + success: z.boolean().openapi({ example: true }), + message: z.string().openapi({ example: "Starter" }), + data: z.array(z.object({})).optional().openapi({ example: [] }), + }), + }, }, - }), - async (c) => { - // make sure we have a vaid user being accessed thats really logged in - apiHit(c, {endpoint: "api/auth/register"}); - try { - return c.json({success: true, message: "Ocme Info", data: await getInfo()}, 200); - } catch (error) { - return c.json({success: false, message: "There was an error getting ocmeInfo data", data: error}, 400); - } + description: "Response message", + }, + 400: { + content: { + "application/json": { + schema: z.object({ + success: z.boolean().openapi({ example: false }), + message: z + .string() + .optional() + .openapi({ example: "Internal Server error" }), + data: z.array(z.object({})).optional().openapi({ example: [] }), + }), + }, + }, + description: "Internal Server Error", + }, + // 401: { + // content: { + // "application/json": { + // schema: z.object({message: z.string().optional().openapi({example: "Unauthenticated"})}), + // }, + // }, + // description: "Unauthorized", + // }, + // 500: { + // content: { + // "application/json": { + // schema: z.object({message: z.string().optional().openapi({example: "Internal Server error"})}), + // }, + // }, + // description: "Internal Server Error", + // }, + }, + }), + async (c) => { + // make sure we have a vaid user being accessed thats really logged in + apiHit(c, { endpoint: "api/auth/register" }); + try { + return c.json( + { success: true, message: "Ocme Info", data: await getInfo() }, + 200 + ); + } catch (error) { + return c.json( + { + success: false, + message: "There was an error getting ocmeInfo data", + data: error, + }, + 400 + ); } + } ); export default app; diff --git a/server/services/ocme/route/getShipmentPallets.ts b/server/services/ocme/route/getShipmentPallets.ts index ddcfb0a..32e727d 100644 --- a/server/services/ocme/route/getShipmentPallets.ts +++ b/server/services/ocme/route/getShipmentPallets.ts @@ -1,94 +1,114 @@ -import {createRoute, OpenAPIHono, z} from "@hono/zod-openapi"; -import {apiHit} from "../../../globalUtils/apiHits.js"; -import {getShipmentPallets} from "../controller/getShipmentPallets.js"; +import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi"; +import { apiHit } from "../../../globalUtils/apiHits.js"; +import { getShipmentPallets } from "../controller/getShipmentPallets.js"; const app = new OpenAPIHono(); const ShipmentID = z.object({ - shipmentID: z.string().optional().openapi({example: "14558"}), + shipmentID: z.string().optional().openapi({ example: "14558" }), }); app.openapi( - createRoute({ - tags: ["ocme"], - summary: "Post New running number to be picked up.", - method: "post", - path: "/getshipmentpallets", - request: { - body: { - content: { - "application/json": {schema: ShipmentID}, - }, - }, + createRoute({ + tags: ["ocme"], + summary: "Post New running number to be picked up.", + method: "post", + path: "/GetShipmentPallets", + request: { + body: { + content: { + "application/json": { schema: ShipmentID }, }, - responses: { - 200: { - content: { - "application/json": { - schema: z.object({ - success: z.boolean().openapi({example: true}), - message: z.string().openapi({example: "Starter"}), - // data: z - // .array(z.object({sscc: z.string().optional()})) - // .optional() - // .openapi({example: []}), - }), - }, - }, - description: "Response message", - }, - 400: { - content: { - "application/json": { - schema: z.object({ - success: z.boolean().openapi({example: false}), - message: z.string().optional().openapi({example: "Internal Server error"}), - data: z.array(z.object({})).optional().openapi({example: []}), - }), - }, - }, - description: "Internal Server Error", - }, - // 401: { - // content: { - // "application/json": { - // schema: z.object({message: z.string().optional().openapi({example: "Unauthenticated"})}), - // }, - // }, - // description: "Unauthorized", - // }, - // 500: { - // content: { - // "application/json": { - // schema: z.object({message: z.string().optional().openapi({example: "Internal Server error"})}), - // }, - // }, - // description: "Internal Server Error", - // }, + }, + }, + responses: { + 200: { + content: { + "application/json": { + schema: z.object({ + success: z.boolean().openapi({ example: true }), + message: z.string().openapi({ example: "Starter" }), + // data: z + // .array(z.object({sscc: z.string().optional()})) + // .optional() + // .openapi({example: []}), + }), + }, }, - }), - async (c) => { - // make sure we have a vaid user being accessed thats really logged in - try { - const data = await c.req.json(); - apiHit(c, {endpoint: "api/ocme/getshipmentpallets", lastBody: data}); + description: "Response message", + }, + 400: { + content: { + "application/json": { + schema: z.object({ + success: z.boolean().openapi({ example: false }), + message: z + .string() + .optional() + .openapi({ example: "Internal Server error" }), + data: z.array(z.object({})).optional().openapi({ example: [] }), + }), + }, + }, + description: "Internal Server Error", + }, + // 401: { + // content: { + // "application/json": { + // schema: z.object({message: z.string().optional().openapi({example: "Unauthenticated"})}), + // }, + // }, + // description: "Unauthorized", + // }, + // 500: { + // content: { + // "application/json": { + // schema: z.object({message: z.string().optional().openapi({example: "Internal Server error"})}), + // }, + // }, + // description: "Internal Server Error", + // }, + }, + }), + async (c) => { + // make sure we have a vaid user being accessed thats really logged in + try { + const data = await c.req.json(); + apiHit(c, { endpoint: "api/ocme/getshipmentpallets", lastBody: data }); - if (!data.shipmentID) { - return c.json( - {success: false, message: "You are missing the shipment id please try again.", data: []}, - 400 - ); - } + console.log; - const shiptmentData = await getShipmentPallets(data.shipmentID); + if (!data.shipmentID) { + return c.json( + { + success: false, + message: "You are missing the shipment id please try again.", + data: [], + }, + 400 + ); + } - return c.json( - {success: shiptmentData.success, message: shiptmentData.message, data: shiptmentData.data ?? []}, - 200 - ); - } catch (error) { - return c.json({success: false, message: "There was an error getting the shipment data.", data: error}, 400); - } + const shiptmentData = await getShipmentPallets(data.shipmentID); + + return c.json( + { + success: shiptmentData.success, + message: shiptmentData.message, + data: shiptmentData.data ?? [], + }, + 200 + ); + } catch (error) { + return c.json( + { + success: false, + message: "There was an error getting the shipment data.", + data: error, + }, + 400 + ); } + } ); export default app; diff --git a/server/services/ocme/route/pickedUp.ts b/server/services/ocme/route/pickedUp.ts index 6d7ef88..856a8e4 100644 --- a/server/services/ocme/route/pickedUp.ts +++ b/server/services/ocme/route/pickedUp.ts @@ -1,89 +1,114 @@ -import {createRoute, OpenAPIHono, z} from "@hono/zod-openapi"; -import {postLabelData} from "../controller/postRunningNr.js"; -import {apiHit} from "../../../globalUtils/apiHits.js"; -import {pickedup} from "../controller/pickedup.js"; +import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi"; +import { postLabelData } from "../controller/postRunningNr.js"; +import { apiHit } from "../../../globalUtils/apiHits.js"; +import { pickedup } from "../controller/pickedup.js"; const app = new OpenAPIHono(); const PostRunningNr = z.object({ - sscc: z.string().optional().openapi({example: "00090103830005710997"}), - runningNr: z.string().optional().openapi({example: "localhost"}), - areaFrom: z.string().optional().openapi({example: "The server we are going to connect to"}), - completed: z.boolean().optional().openapi({example: true}), - all: z.boolean().optional().openapi({example: false}), + sscc: z.string().optional().openapi({ example: "00090103830005710997" }), + runningNr: z.string().optional().openapi({ example: "localhost" }), + areaFrom: z + .string() + .optional() + .openapi({ example: "The server we are going to connect to" }), + completed: z.boolean().optional().openapi({ example: true }), + all: z.boolean().optional().openapi({ example: false }), }); app.openapi( - createRoute({ - tags: ["ocme"], - summary: "Picks up a pallet in the system.", - method: "patch", - description: - "removes the pallet(s) from showing as needed to be picked up, we clear everything related to the pallet number to reduce the risk of a mix, passing `all` will just clear everything that is pending.", - path: "/pickedup", - request: { - body: { - content: { - "application/json": {schema: PostRunningNr}, - }, - }, + createRoute({ + tags: ["ocme"], + summary: "Picks up a pallet in the system.", + method: "patch", + description: + "removes the pallet(s) from showing as needed to be picked up, we clear everything related to the pallet number to reduce the risk of a mix, passing `all` will just clear everything that is pending.", + path: "/pickedUp", + request: { + body: { + content: { + "application/json": { schema: PostRunningNr }, }, - responses: { - 200: { - content: { - "application/json": { - schema: z.object({ - success: z.boolean().openapi({example: true}), - message: z.string().openapi({example: "Starter"}), - // data: z - // .array(z.object({sscc: z.string().optional()})) - // .optional() - // .openapi({example: []}), - }), - }, - }, - description: "Response message", - }, - 400: { - content: { - "application/json": { - schema: z.object({ - success: z.boolean().openapi({example: false}), - message: z.string().optional().openapi({example: "Internal Server error"}), - data: z.array(z.object({})).optional().openapi({example: []}), - }), - }, - }, - description: "Internal Server Error", - }, - // 401: { - // content: { - // "application/json": { - // schema: z.object({message: z.string().optional().openapi({example: "Unauthenticated"})}), - // }, - // }, - // description: "Unauthorized", - // }, - 500: { - content: { - "application/json": { - schema: z.object({message: z.string().optional().openapi({example: "Internal Server error"})}), - }, - }, - description: "Internal Server Error", - }, + }, + }, + responses: { + 200: { + content: { + "application/json": { + schema: z.object({ + success: z.boolean().openapi({ example: true }), + message: z.string().openapi({ example: "Starter" }), + // data: z + // .array(z.object({sscc: z.string().optional()})) + // .optional() + // .openapi({example: []}), + }), + }, }, - }), - async (c) => { - // make sure we have a vaid user being accessed thats really logged in - try { - const data = await c.req.json(); - apiHit(c, {endpoint: "api/ocme/pickedup", lastBody: data}); - const postPallet = await pickedup(data); - return c.json({success: postPallet.success, message: postPallet.message, data: postPallet.data}, 200); - } catch (error) { - return c.json({success: false, message: "There was an error getting ocmeInfo data", data: error}, 400); - } + description: "Response message", + }, + 400: { + content: { + "application/json": { + schema: z.object({ + success: z.boolean().openapi({ example: false }), + message: z + .string() + .optional() + .openapi({ example: "Internal Server error" }), + data: z.array(z.object({})).optional().openapi({ example: [] }), + }), + }, + }, + description: "Internal Server Error", + }, + // 401: { + // content: { + // "application/json": { + // schema: z.object({message: z.string().optional().openapi({example: "Unauthenticated"})}), + // }, + // }, + // description: "Unauthorized", + // }, + 500: { + content: { + "application/json": { + schema: z.object({ + message: z + .string() + .optional() + .openapi({ example: "Internal Server error" }), + }), + }, + }, + description: "Internal Server Error", + }, + }, + }), + async (c) => { + // make sure we have a vaid user being accessed thats really logged in + try { + const data = await c.req.json(); + apiHit(c, { endpoint: "api/ocme/pickedup", lastBody: data }); + const postPallet = await pickedup(data); + return c.json( + { + success: postPallet.success, + message: postPallet.message, + data: postPallet.data, + }, + 200 + ); + } catch (error) { + return c.json( + { + success: false, + message: "There was an error getting ocmeInfo data", + data: error, + }, + 400 + ); } + } ); export default app; diff --git a/server/services/ocme/route/postRunningNumber.ts b/server/services/ocme/route/postRunningNumber.ts index 1c8721d..4afe104 100644 --- a/server/services/ocme/route/postRunningNumber.ts +++ b/server/services/ocme/route/postRunningNumber.ts @@ -1,86 +1,106 @@ -import {createRoute, OpenAPIHono, z} from "@hono/zod-openapi"; -import {getInfo} from "../controller/getInfo.js"; -import {postLabelData} from "../controller/postRunningNr.js"; -import {apiHit} from "../../../globalUtils/apiHits.js"; +import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi"; +import { getInfo } from "../controller/getInfo.js"; +import { postLabelData } from "../controller/postRunningNr.js"; +import { apiHit } from "../../../globalUtils/apiHits.js"; const app = new OpenAPIHono(); const PostRunningNr = z.object({ - sscc: z.string().optional().openapi({example: "00090103830005710997"}), - runningNr: z.string().optional().openapi({example: "localhost"}), - areaFrom: z.string().optional().openapi({example: "The server we are going to connect to"}), - completed: z.boolean().optional().openapi({example: true}), + sscc: z.string().optional().openapi({ example: "00090103830005710997" }), + runningNr: z.string().optional().openapi({ example: "localhost" }), + areaFrom: z + .string() + .optional() + .openapi({ example: "The server we are going to connect to" }), + completed: z.boolean().optional().openapi({ example: true }), }); app.openapi( - createRoute({ - tags: ["ocme"], - summary: "Post New running number to be picked up.", - method: "post", - path: "/postrunningnumber", - request: { - body: { - content: { - "application/json": {schema: PostRunningNr}, - }, - }, + createRoute({ + tags: ["ocme"], + summary: "Post New running number to be picked up.", + method: "post", + path: "/postRunningNumber", + request: { + body: { + content: { + "application/json": { schema: PostRunningNr }, }, - responses: { - 200: { - content: { - "application/json": { - schema: z.object({ - success: z.boolean().openapi({example: true}), - message: z.string().openapi({example: "Starter"}), - // data: z - // .array(z.object({sscc: z.string().optional()})) - // .optional() - // .openapi({example: []}), - }), - }, - }, - description: "Response message", - }, - 400: { - content: { - "application/json": { - schema: z.object({ - success: z.boolean().openapi({example: false}), - message: z.string().optional().openapi({example: "Internal Server error"}), - data: z.array(z.object({})).optional().openapi({example: []}), - }), - }, - }, - description: "Internal Server Error", - }, - // 401: { - // content: { - // "application/json": { - // schema: z.object({message: z.string().optional().openapi({example: "Unauthenticated"})}), - // }, - // }, - // description: "Unauthorized", - // }, - // 500: { - // content: { - // "application/json": { - // schema: z.object({message: z.string().optional().openapi({example: "Internal Server error"})}), - // }, - // }, - // description: "Internal Server Error", - // }, + }, + }, + responses: { + 200: { + content: { + "application/json": { + schema: z.object({ + success: z.boolean().openapi({ example: true }), + message: z.string().openapi({ example: "Starter" }), + // data: z + // .array(z.object({sscc: z.string().optional()})) + // .optional() + // .openapi({example: []}), + }), + }, }, - }), - async (c) => { - // make sure we have a vaid user being accessed thats really logged in - try { - const data = await c.req.json(); - apiHit(c, {endpoint: "api/ocme/postRunningNumber", lastBody: data}); - const postPallet = await postLabelData(data); - return c.json({success: postPallet.success, message: postPallet.message, data: postPallet.data ?? []}, 200); - } catch (error) { - return c.json({success: false, message: "There was an error getting ocmeInfo data", data: error}, 400); - } + description: "Response message", + }, + 400: { + content: { + "application/json": { + schema: z.object({ + success: z.boolean().openapi({ example: false }), + message: z + .string() + .optional() + .openapi({ example: "Internal Server error" }), + data: z.array(z.object({})).optional().openapi({ example: [] }), + }), + }, + }, + description: "Internal Server Error", + }, + // 401: { + // content: { + // "application/json": { + // schema: z.object({message: z.string().optional().openapi({example: "Unauthenticated"})}), + // }, + // }, + // description: "Unauthorized", + // }, + // 500: { + // content: { + // "application/json": { + // schema: z.object({message: z.string().optional().openapi({example: "Internal Server error"})}), + // }, + // }, + // description: "Internal Server Error", + // }, + }, + }), + async (c) => { + // make sure we have a vaid user being accessed thats really logged in + try { + const data = await c.req.json(); + apiHit(c, { endpoint: "api/ocme/postRunningNumber", lastBody: data }); + const postPallet = await postLabelData(data); + return c.json( + { + success: postPallet.success, + message: postPallet.message, + data: postPallet.data ?? [], + }, + 200 + ); + } catch (error) { + return c.json( + { + success: false, + message: "There was an error getting ocmeInfo data", + data: error, + }, + 400 + ); } + } ); export default app; diff --git a/server/services/tcpServer/tcpServer.ts b/server/services/tcpServer/tcpServer.ts index 25a1c2b..4d5d06f 100644 --- a/server/services/tcpServer/tcpServer.ts +++ b/server/services/tcpServer/tcpServer.ts @@ -1,64 +1,79 @@ import net from "net"; -import {OpenAPIHono} from "@hono/zod-openapi"; -import {createLog} from "../logger/logger.js"; +import { OpenAPIHono } from "@hono/zod-openapi"; +import { createLog } from "../logger/logger.js"; import startTCP from "./route/startServer.js"; import stopTCP from "./route/stopServer.js"; import restartTCP from "./route/restartServer.js"; -import {db} from "../../../database/dbclient.js"; -import {settings} from "../../../database/schema/settings.js"; -import {eq} from "drizzle-orm"; +import { db } from "../../../database/dbclient.js"; +import { settings } from "../../../database/schema/settings.js"; +import { eq } from "drizzle-orm"; +import { postLabelData } from "../ocme/controller/postRunningNr.js"; let tcpServer: net.Server; let tcpSockets: Set = new Set(); let isServerRunning = false; -const tcpPort = await db.select().from(settings).where(eq(settings.name, "tcpPort")); +const tcpPort = await db + .select() + .from(settings) + .where(eq(settings.name, "tcpPort")); const app = new OpenAPIHono(); export const startTCPServer = () => { - if (isServerRunning) return {success: false, message: "Server is already running"}; + if (isServerRunning) + return { success: false, message: "Server is already running" }; - tcpServer = net.createServer((socket) => { - console.log("Client connected"); + tcpServer = net.createServer((socket) => { + console.log("Client connected"); - tcpSockets.add(socket); - socket.on("data", (data: Buffer) => { - console.log("Received:", data.toString()); - socket.write("Message received"); - }); - - socket.on("end", () => { - console.log("Client disconnected"); - tcpSockets.delete(socket); - }); - - socket.on("error", (err: Error) => { - console.error("Socket error:", err); - tcpSockets.delete(socket); - }); + tcpSockets.add(socket); + socket.on("data", (data: Buffer) => { + console.log("Received:", data.toString()); + const parseData = data.toString("utf-8").trimEnd().split(" "); + if (parseData[0] === "HB") { + return; + } + postLabelData(parseData); }); - tcpServer.listen(tcpPort[0]?.value ?? 2222, () => { - createLog("info", "lst", "tcp", `TCP Server listening on port ${tcpPort[0]?.value ?? 2222}`); + socket.on("end", () => { + console.log("Client disconnected"); + tcpSockets.delete(socket); }); - isServerRunning = true; - return {success: true, message: "TCP Server started"}; + socket.on("error", (err: Error) => { + console.error("Socket error:", err); + tcpSockets.delete(socket); + }); + }); + + tcpServer.listen(tcpPort[0]?.value ?? 2222, () => { + createLog( + "info", + "lst", + "tcp", + `TCP Server listening on port ${tcpPort[0]?.value ?? 2222}` + ); + }); + + isServerRunning = true; + return { success: true, message: "TCP Server started" }; }; // Function to stop the TCP server export const stopTCPServer = () => { - if (!isServerRunning) return {success: false, message: "Server is not running"}; - for (const socket of tcpSockets) { - socket.destroy(); - } - tcpSockets.clear(); - tcpServer.close(() => { - console.log("TCP Server stopped"); - }); - isServerRunning = false; - return {success: true, message: "TCP Server stopped"}; + if (!isServerRunning) + return { success: false, message: "Server is not running" }; + for (const socket of tcpSockets) { + socket.destroy(); + } + tcpSockets.clear(); + tcpServer.close(() => { + console.log("TCP Server stopped"); + }); + isServerRunning = false; + return { success: true, message: "TCP Server stopped" }; }; app.route("/tcpserver/start", startTCP); @@ -67,7 +82,7 @@ app.route("/tcpserver/restart", restartTCP); // start the server after on system start up setTimeout(() => { - startTCPServer(); + startTCPServer(); }, 5000); export default app;