refactor(migration progress): moved to start looking at the go backedn

This commit is contained in:
2025-08-04 12:48:49 -05:00
parent a36552fd9b
commit a0179a41ba
15 changed files with 201 additions and 99 deletions

View File

@@ -1,16 +1,19 @@
import { eq } from "drizzle-orm";
import { db } from "../../database/dbclient.js";
import { settings } from "../../database/schema/settings.js";
import { query } from "../services/sqlServer/prodSqlServer.js"; import { query } from "../services/sqlServer/prodSqlServer.js";
import { plantInfo } from "../services/sqlServer/querys/dataMart/plantInfo.js"; import { plantInfo } from "../services/sqlServer/querys/dataMart/plantInfo.js";
import { createLog } from "../services/logger/logger.js"; import { createLog } from "../services/logger/logger.js";
import { getSettings } from "../services/server/controller/settings/getSettings.js";
export const createSSCC = async (runningNumber: number) => { export const createSSCC = async (runningNumber: number) => {
// get the token // get the token
const plantToken = await db
.select() let serverSettings = (await getSettings()) as any;
.from(settings) const plantToken = serverSettings?.filter(
.where(eq(settings.name, "plantToken")); (n: any) => n.name === "plantToken"
);
// const plantToken = await db
// .select()
// .from(settings)
// .where(eq(settings.name, "plantToken"));
let global: any = []; // get from plant address in basis enter the entire string here. let global: any = []; // get from plant address in basis enter the entire string here.
try { try {

View File

@@ -1,6 +1,7 @@
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { db } from "../../database/dbclient.js"; import { db } from "../../database/dbclient.js";
import { settings } from "../../database/schema/settings.js";
import { getSettings } from "../services/server/controller/settings/getSettings.js";
// create the test server stuff // create the test server stuff
const testServers = [ const testServers = [
@@ -12,19 +13,22 @@ const testServers = [
export const prodEndpointCreation = async (endpoint: string) => { export const prodEndpointCreation = async (endpoint: string) => {
let url = ""; let url = "";
//get the plant token //get the plant token
const plantToken = await db let serverSettings = await getSettings();
.select() const plantToken = serverSettings?.filter((n) => n.name === "plantToken");
.from(settings) // await db
.where(eq(settings.name, "plantToken")); // .select()
// .from(settings)
// .where(eq(settings.name, "plantToken"));
// check if we are a test server // check if we are a test server
const testServer = testServers.some( const testServer = testServers.some(
(server) => server.token === plantToken[0]?.value (server) => server.token === plantToken[0]?.value
); );
const server = await db const server = serverSettings?.filter((n) => n.name === "dbServer");
.select() // await db
.from(settings) // .select()
.where(eq(settings.name, "dbServer")); // .from(settings)
// .where(eq(settings.name, "dbServer"));
if (testServer) { if (testServer) {
//filter out what testserver we are //filter out what testserver we are

View File

@@ -29,6 +29,11 @@ import eom from "./services/eom/eomService.js";
import dataMart from "./services/dataMart/dataMartService.js"; import dataMart from "./services/dataMart/dataMartService.js";
import qualityRequest from "./services/quality/qualityService.js"; import qualityRequest from "./services/quality/qualityService.js";
import produser from "./services/prodUser/prodUser.js"; import produser from "./services/prodUser/prodUser.js";
import {
getSettings,
serverSettings,
} from "./services/server/controller/settings/getSettings.js";
import type { Settings } from "./types/settings.js";
// create the main prodlogin here // create the main prodlogin here
const username = "lst_user"; const username = "lst_user";
@@ -36,15 +41,16 @@ const password = "Alpla$$Prod";
export const lstAuth = btoa(`${username}:${password}`); export const lstAuth = btoa(`${username}:${password}`);
// checking to make sure we have the settings intialized // checking to make sure we have the settings intialized
const { data: settingsData, error: settingError } = await tryCatch( // const { data: settingsData, error: settingError } = await tryCatch(
db.select().from(settings) // db.select().from(settings)
); // );
if (settingError) { // if (settingError) {
throw Error("Error getting settings from the db. critical error."); // throw Error("Error getting settings from the db. critical error.");
} // }
const serverIntialized: any = await getSettings();
const serverIntialized: any = settingsData;
export const installed = export const installed =
serverIntialized.length === 0 && process.env.NODE_ENV !== "development" serverIntialized.length === 0 && process.env.NODE_ENV !== "development"
? false ? false
@@ -211,7 +217,8 @@ serve(
/** /**
* Only for ocme until we get them switched over to the single port setup. * Only for ocme until we get them switched over to the single port setup.
*/ */
const setting = await db.select().from(settings); // const setting = await db.select().from(settings);
const setting = serverSettings;
const isActive = setting.filter((n) => n.name === "ocmeService"); const isActive = setting.filter((n) => n.name === "ocmeService");
if (ocmeport && isActive[0]?.value === "1") { if (ocmeport && isActive[0]?.value === "1") {
serve( serve(

View File

@@ -4,6 +4,7 @@ import { db } from "../../database/dbclient.js";
import { serverData } from "../../database/schema/serverData.js"; import { serverData } from "../../database/schema/serverData.js";
import { eq, sql } from "drizzle-orm"; import { eq, sql } from "drizzle-orm";
import { createLog } from "../services/logger/logger.js"; import { createLog } from "../services/logger/logger.js";
import { serverSettings } from "../services/server/controller/settings/getSettings.js";
type UpdateServerResponse = { type UpdateServerResponse = {
success: boolean; success: boolean;
@@ -48,6 +49,7 @@ export const updateServer = async (
}; };
} }
console.log(serverInfo);
const scriptPath = `${process.env.DEVFOLDER}\\server\\scripts\\update.ps1 `; const scriptPath = `${process.env.DEVFOLDER}\\server\\scripts\\update.ps1 `;
const args = [ const args = [
"-NoProfile", "-NoProfile",

View File

@@ -7,6 +7,7 @@ import { createPassword } from "../../utils/createPassword.js";
import { createLog } from "../../../logger/logger.js"; import { createLog } from "../../../logger/logger.js";
import { sendEmail } from "../../../notifications/controller/sendMail.js"; import { sendEmail } from "../../../notifications/controller/sendMail.js";
import { settings } from "../../../../../database/schema/settings.js"; import { settings } from "../../../../../database/schema/settings.js";
import { getSettings } from "../../../server/controller/settings/getSettings.js";
export const updateUserADM = async (userData: User) => { export const updateUserADM = async (userData: User) => {
/** /**
@@ -40,8 +41,8 @@ export const updateUserADM = async (userData: User) => {
}; };
} }
const { data: s, error: se } = await tryCatch(db.select().from(settings)); //const { data: s, error: se } = await tryCatch(db.select().from(settings));
const { data: s, error: se } = await tryCatch(getSettings());
if (se) { if (se) {
return { return {
success: false, success: false,

View File

@@ -7,16 +7,16 @@ import { deliveryByDateRange } from "../../sqlServer/querys/dataMart/deleveryByD
import { addDays, format } from "date-fns"; import { addDays, format } from "date-fns";
export const getDeliveryByDateRange = async (data: any | null) => { export const getDeliveryByDateRange = async (data: any | null) => {
const { data: plantToken, error: plantError } = await tryCatch( // const { data: plantToken, error: plantError } = await tryCatch(
db.select().from(settings).where(eq(settings.name, "plantToken")) // db.select().from(settings).where(eq(settings.name, "plantToken"))
); // );
if (plantError) { // if (plantError) {
return { // return {
success: false, // success: false,
message: "Error getting Settings", // message: "Error getting Settings",
data: plantError, // data: plantError,
}; // };
} // }
let deliverys: any = []; let deliverys: any = [];
let updatedQuery = deliveryByDateRange; let updatedQuery = deliveryByDateRange;

View File

@@ -4,18 +4,21 @@ import { settings } from "../../../../database/schema/settings.js";
import { tryCatch } from "../../../globalUtils/tryCatch.js"; import { tryCatch } from "../../../globalUtils/tryCatch.js";
import { query } from "../../sqlServer/prodSqlServer.js"; import { query } from "../../sqlServer/prodSqlServer.js";
import { openOrders } from "../../sqlServer/querys/dataMart/openOrders.js"; import { openOrders } from "../../sqlServer/querys/dataMart/openOrders.js";
import { serverSettings } from "../../server/controller/settings/getSettings.js";
export const getOpenOrders = async (data: any | null) => { export const getOpenOrders = async (data: any | null) => {
const { data: plantToken, error: plantError } = await tryCatch( // const { data: plantToken, error: plantError } = await tryCatch(
db.select().from(settings).where(eq(settings.name, "plantToken")) // db.select().from(settings).where(eq(settings.name, "plantToken"))
); // );
if (plantError) { // if (plantError) {
return { // return {
success: false, // success: false,
message: "Error getting Settings", // message: "Error getting Settings",
data: plantError, // data: plantError,
}; // };
} // }
const plantToken = serverSettings.filter((n) => n.name === "plantToken");
let orders: any = []; let orders: any = [];
let updatedQuery = openOrders; let updatedQuery = openOrders;

View File

@@ -1,11 +1,13 @@
import {OpenAPIHono} from "@hono/zod-openapi"; import { OpenAPIHono } from "@hono/zod-openapi";
import {apiReference} from "@scalar/hono-api-reference"; import { apiReference } from "@scalar/hono-api-reference";
import {settings} from "../../../../database/schema/settings.js"; import { settings } from "../../../../database/schema/settings.js";
import {db} from "../../../../database/dbclient.js"; import { db } from "../../../../database/dbclient.js";
import {eq} from "drizzle-orm"; import { eq } from "drizzle-orm";
import { getSettings } from "../../server/controller/settings/getSettings.js";
const app = new OpenAPIHono(); const app = new OpenAPIHono();
const plantToken = await db.select().from(settings).where(eq(settings.name, "plantToken")); const serverSettings = await getSettings();
const plantToken = serverSettings.filter((n) => n.name === "plantToken") as any; //await db.select().from(settings).where(eq(settings.name, "plantToken"));
let pToken = plantToken[0]?.value; let pToken = plantToken[0]?.value;
const testServers = ["test1", "test2", "test3"]; const testServers = ["test1", "test2", "test3"];
@@ -17,7 +19,7 @@ app.get(
apiReference({ apiReference({
theme: "kepler", theme: "kepler",
layout: "classic", layout: "classic",
defaultHttpClient: {targetKey: "node", clientKey: "axios"}, defaultHttpClient: { targetKey: "node", clientKey: "axios" },
pageTitle: "Lst API Reference", pageTitle: "Lst API Reference",
hiddenClients: [ hiddenClients: [
"libcurl", "libcurl",

View File

@@ -0,0 +1,35 @@
// goTransport.js
import { pino } from "pino";
import build from "pino-abstract-transport";
const pinoLogLevels: any = {
10: "trace",
20: "debug",
30: "info",
40: "warn",
50: "error",
60: "fatal",
};
export default async function buildGoTransport() {
try {
return build(async function (source) {
for await (let obj of source) {
// Insert log entry into the PostgreSQL database using Drizzle ORM
// convert to the name to make it more easy to find later :P
const levelName = pinoLogLevels[obj.level] || "unknown";
// await db.insert(logs).values({
// level: levelName,
// username: obj?.username.toLowerCase(),
// service: obj?.service.toLowerCase(),
// message: obj.msg,
// });
console.log(`Go log level: ${levelName}`);
}
});
} catch (err) {
console.error("Error inserting log into database:", err);
}
}

View File

@@ -18,6 +18,14 @@ const transport = pino.transport({
{ {
target: "./dbTransport.js", target: "./dbTransport.js",
}, },
// Only log to Go if LST_USE_GO=true
...(process.env.LST_USE_GO === "true"
? [
{
target: "./goTransport.js", // New transport for Go
},
]
: []),
], ],
}); });

View File

@@ -1,10 +1,10 @@
import {OpenAPIHono} from "@hono/zod-openapi"; import { OpenAPIHono } from "@hono/zod-openapi";
// routes // routes
import clearLog from "./routes/clearLog.js"; import clearLog from "./routes/clearLog.js";
import {db} from "../../../database/dbclient.js"; import { db } from "../../../database/dbclient.js";
import {settings} from "../../../database/schema/settings.js"; import { settings } from "../../../database/schema/settings.js";
import {logCleanup} from "./controller/logCleanup.js"; import { logCleanup } from "./controller/logCleanup.js";
import createNewLog from "./routes/createLog.js"; import createNewLog from "./routes/createLog.js";
import getLogs from "./routes/getLogs.js"; import getLogs from "./routes/getLogs.js";
import stream from "./routes/streamLogs.js"; import stream from "./routes/streamLogs.js";
@@ -12,14 +12,17 @@ import stream from "./routes/streamLogs.js";
const app = new OpenAPIHono(); const app = new OpenAPIHono();
const routes = [clearLog, createNewLog, getLogs, stream] as const; const routes = [clearLog, createNewLog, getLogs, stream] as const;
const setting = await db.select().from(settings); //const setting = await db.select().from(settings);
const appRoutes = routes.forEach((route) => { const appRoutes = routes.forEach((route) => {
app.route("/logger", route); app.route("/logger", route);
}); });
app.all("/logger/*", (c) => { app.all("/logger/*", (c) => {
return c.json({success: false, message: "You have encounters a log route that dose not exist."}); return c.json({
success: false,
message: "You have encounters a log route that dose not exist.",
});
}); });
// run the clean up job ones on server restart/crash/update and then once a date // run the clean up job ones on server restart/crash/update and then once a date

View File

@@ -6,6 +6,7 @@ import { settings } from "../../../database/schema/settings.js";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { installed } from "../../index.js"; import { installed } from "../../index.js";
import { checkHostnamePort } from "../../globalUtils/pingServer.js"; import { checkHostnamePort } from "../../globalUtils/pingServer.js";
import { serverSettings } from "../server/controller/settings/getSettings.js";
let pool: any; let pool: any;
let connected: boolean = false; let connected: boolean = false;
@@ -23,10 +24,16 @@ export const initializeProdPool = async () => {
return { success: false, message: "The server is not installed." }; return { success: false, message: "The server is not installed." };
} }
const dbServer = await db // const dbServer = await db
.select() // .select()
.from(settings) // .from(settings)
.where(eq(settings.name, "dbServer")); // .where(eq(settings.name, "dbServer"));
// the move to the go version for settings
const dbServer = serverSettings.filter(
(n: any) => n.name === "dbServer"
) as any;
const serverUp = await checkHostnamePort(`${dbServer[0].value}:1433`); const serverUp = await checkHostnamePort(`${dbServer[0].value}:1433`);
if (!serverUp) { if (!serverUp) {
@@ -44,10 +51,14 @@ export const initializeProdPool = async () => {
} }
// make sure the server is not set to localhost this will prevent some weird issues later but can be localhost on the dev // make sure the server is not set to localhost this will prevent some weird issues later but can be localhost on the dev
const serverLoc = await db // const serverLoc = await db
.select() // .select()
.from(settings) // .from(settings)
.where(eq(settings.name, "dbServer")); // .where(eq(settings.name, "dbServer"));
const serverLoc = serverSettings.filter(
(n: any) => n.name === "dbServer"
) as any;
if ( if (
serverLoc[0].value === "localhost" && serverLoc[0].value === "localhost" &&
process.env.NODE_ENV !== "development" process.env.NODE_ENV !== "development"
@@ -134,10 +145,14 @@ export async function query(queryToRun: string, name: string) {
/** /**
* Just an extra catch incase someone tried to run a query while we were not connected to the server or sql server * Just an extra catch incase someone tried to run a query while we were not connected to the server or sql server
*/ */
const dbServer = await db // const dbServer = await db
.select() // .select()
.from(settings) // .from(settings)
.where(eq(settings.name, "dbServer")); // .where(eq(settings.name, "dbServer"));
const dbServer = serverSettings.filter(
(n: any) => n.name === "dbServer"
) as any;
const serverUp = await checkHostnamePort(`${dbServer[0].value}:1433`); const serverUp = await checkHostnamePort(`${dbServer[0].value}:1433`);
if (!serverUp) { if (!serverUp) {
@@ -170,10 +185,13 @@ export async function query(queryToRun: string, name: string) {
/** /**
* We no longer need to send over the plant token change as we do it inside the query function. * We no longer need to send over the plant token change as we do it inside the query function.
*/ */
const plantToken = await db // const plantToken = await db
.select() // .select()
.from(settings) // .from(settings)
.where(eq(settings.name, "plantToken")); // .where(eq(settings.name, "plantToken"));
const plantToken = serverSettings.filter(
(n: any) => n.name === "plantToken"
) as any;
const query = queryToRun.replaceAll("test1", plantToken[0].value); const query = queryToRun.replaceAll("test1", plantToken[0].value);
try { try {

View File

@@ -38,6 +38,11 @@ V_Artikel.ArtikelvariantenTypBez = 'Glue' or
V_Artikel.ArtikelvariantenTypBez = 'Top Frame' or V_Artikel.ArtikelvariantenTypBez = 'Top Frame' or
V_Artikel.ArtikelvariantenTypBez = 'IML Label' or V_Artikel.ArtikelvariantenTypBez = 'IML Label' or
V_Artikel.ArtikelvariantenTypBez = 'Purch EBM Bottle' or V_Artikel.ArtikelvariantenTypBez = 'Purch EBM Bottle' or
V_Artikel.ArtikelvariantenTypBez = 'Purchased Spout' or
V_Artikel.ArtikelvariantenTypBez = 'Gaylord' or
V_Artikel.ArtikelvariantenTypBez = 'Misc. Packaging' or
V_Artikel.ArtikelvariantenTypBez = 'Sleeve' or
V_Artikel.ArtikelvariantenTypBez = 'Plastic Bag' or
V_Artikel.ArtikelvariantenTypBez = 'Purch Spout' V_Artikel.ArtikelvariantenTypBez = 'Purch Spout'
THEN 'PKG' THEN 'PKG'
WHEN V_Artikel.ArtikelvariantenTypBez='HD-PE' or WHEN V_Artikel.ArtikelvariantenTypBez='HD-PE' or

View File

@@ -1,16 +1,22 @@
import {db} from "../../../../database/dbclient.js"; import { db } from "../../../../database/dbclient.js";
import {settings} from "../../../../database/schema/settings.js"; import { settings } from "../../../../database/schema/settings.js";
import {createLog} from "../../logger/logger.js"; import { createLog } from "../../logger/logger.js";
import { serverSettings } from "../../server/controller/settings/getSettings.js";
export const prodSqlConfig = async () => { export const prodSqlConfig = async () => {
try { try {
const serverSetting = await db.select().from(settings); //const serverSetting = await db.select().from(settings);
const serverSetting = serverSettings as any;
// create dummy type data // create dummy type data
const server = serverSetting.filter((s) => s.name === "dbServer"); const server = serverSetting.filter((s: any) => s.name === "dbServer");
const plantToken = serverSetting.filter((s) => s.name === "plantToken"); const plantToken = serverSetting.filter(
const dbUser = serverSetting.filter((s) => s.name === "dbUser"); (s: any) => s.name === "plantToken"
);
const dbUser = serverSetting.filter((s: any) => s.name === "dbUser");
// if erroring out double check the password was actually encoded before saving // if erroring out double check the password was actually encoded before saving
const dbPassword = serverSetting.filter((s) => s.name === "dbPass"); const dbPassword = serverSetting.filter(
(s: any) => s.name === "dbPass"
);
const sqlConfig = { const sqlConfig = {
server: server[0].value, server: server[0].value,
@@ -37,7 +43,9 @@ export const prodSqlConfig = async () => {
"info", "info",
"lst", "lst",
"sqlProd", "sqlProd",
`${JSON.stringify(error)} "There was an error getting/setting up the config for the prod sql server."` `${JSON.stringify(
error
)} "There was an error getting/setting up the config for the prod sql server."`
); );
} }
}; };

View File

@@ -10,6 +10,7 @@ import { settings } from "../../../database/schema/settings.js";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { postLabelData } from "../ocme/controller/postRunningNr.js"; import { postLabelData } from "../ocme/controller/postRunningNr.js";
import { tryCatch } from "../../globalUtils/tryCatch.js"; import { tryCatch } from "../../globalUtils/tryCatch.js";
import { serverSettings } from "../server/controller/settings/getSettings.js";
let tcpServer: net.Server; let tcpServer: net.Server;
let tcpSockets: Set<net.Socket> = new Set(); let tcpSockets: Set<net.Socket> = new Set();
@@ -18,31 +19,33 @@ let isServerRunning = false;
/** /**
* add in proper logging * add in proper logging
*/ */
const tcpPort = await db // const tcpPort = await db
.select() // .select()
.from(settings) // .from(settings)
.where(eq(settings.name, "tcpPort")); // .where(eq(settings.name, "tcpPort"));
const app = new OpenAPIHono(); const app = new OpenAPIHono();
export const startTCPServer = () => { export const startTCPServer = () => {
const tcpPort = serverSettings.filter((n) => n.name === "tcpPort");
if (isServerRunning) if (isServerRunning)
return { success: false, message: "Server is already running" }; return { success: false, message: "Server is already running" };
tcpServer = net.createServer(async (socket) => { tcpServer = net.createServer(async (socket) => {
createLog("debug", "tcp", "tcp", "Client connected"); createLog("debug", "tcp", "tcp", "Client connected");
const { data: setting, error: settingError } = await tryCatch( // const { data: setting, error: settingError } = await tryCatch(
db.select().from(settings) // db.select().from(settings)
); // );
if (settingError) { // if (settingError) {
return { // return {
success: false, // success: false,
message: "Error getting settings", // message: "Error getting settings",
data: [], // data: [],
}; // };
} // }
const settingCheck = setting.filter( const settingCheck = serverSettings.filter(
(newData) => newData.name === "ocmeService" (newData) => newData.name === "ocmeService"
); );