From 40bc19aa6f952a7a60b5ee8281fa159ca114161f Mon Sep 17 00:00:00 2001 From: Blake Matthes Date: Mon, 24 Nov 2025 15:22:12 -0600 Subject: [PATCH] feat(migration): settings migration from old app all is now in the new app --- app/main.ts | 13 ++- app/src/internal/system/utlis/addListeners.ts | 49 +++++++++ lstV2/server/index.ts | 52 ++++++++- .../server/controller/settings/addSetting.ts | 68 +++++++----- .../server/controller/settings/getSettings.ts | 101 ++++++++++-------- .../controller/settings/updateSetting.ts | 75 +++++++------ 6 files changed, 248 insertions(+), 110 deletions(-) diff --git a/app/main.ts b/app/main.ts index e2a76f9..d57b778 100644 --- a/app/main.ts +++ b/app/main.ts @@ -3,16 +3,14 @@ process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; import { toNodeHandler } from "better-auth/node"; import cors from "cors"; import express from "express"; -import fs from "fs"; import { createServer } from "http"; -import { createProxyMiddleware, fixRequestBody } from "http-proxy-middleware"; +import { createProxyMiddleware } from "http-proxy-middleware"; import morgan from "morgan"; import os from "os"; import { dirname, join } from "path"; import swaggerJsdoc from "swagger-jsdoc"; import swaggerUi from "swagger-ui-express"; import { fileURLToPath } from "url"; -import { userMigrate } from "./src/internal/auth/controller/userMigrate.js"; import { schedulerManager } from "./src/internal/logistics/controller/schedulerManager.js"; import { setupMobileRoutes } from "./src/internal/mobile/route.js"; import { printers } from "./src/internal/ocp/printers/printers.js"; @@ -22,6 +20,7 @@ import { baseSettings } from "./src/internal/system/controller/settings/baseSett import { addListeners, manualFixes, + settingsMigrate, } from "./src/internal/system/utlis/addListeners.js"; import { swaggerOptions } from "./src/pkg/apiDocs/swaggerOptions.js"; import { auth } from "./src/pkg/auth/auth.js"; @@ -77,6 +76,7 @@ const main = async () => { } // connect to the prod sql + console.log("Connecting to the sql server"); await initializeProdPool(); // express app @@ -218,11 +218,16 @@ const main = async () => { v1Listener(); addListeners(); //userMigrate(); - // some temp fixes + // above 230 remove these manualFixes(); + settingsMigrate(); }, 5 * 1000); + // setTimeout(() => { + // startHonoServer(); + // }, 8 * 1000); + // start the server up server.listen(PORT, "0.0.0.0", () => log.info( diff --git a/app/src/internal/system/utlis/addListeners.ts b/app/src/internal/system/utlis/addListeners.ts index d7045d0..925c32c 100644 --- a/app/src/internal/system/utlis/addListeners.ts +++ b/app/src/internal/system/utlis/addListeners.ts @@ -1,5 +1,8 @@ import { Client } from "pg"; +import { db } from "../../../pkg/db/db.js"; +import { type NewSetting, settings } from "../../../pkg/db/schema/settings.js"; import { createLogger } from "../../../pkg/logger/logger.js"; +import { tryCatch } from "../../../pkg/utils/tryCatch.js"; export const addListeners = async () => { const log = createLogger({ module: "utils", subModule: "listeners" }); @@ -60,6 +63,7 @@ export const addListeners = async () => { } }; +// all the migration stuff that will need to be moved later build 230 and above will need to remove export const manualFixes = async () => { const fixQuery = `ALTER TABLE "serverData" ADD CONSTRAINT "serverData_name_unique" UNIQUE("name");`; @@ -77,3 +81,48 @@ export const manualFixes = async () => { log.info({ error: e }, "Fix was not completed"); } }; + +export const settingsMigrate = async () => { + const log = createLogger({ module: "utils", subModule: "v1Migration" }); + const client = new Client({ + connectionString: process.env.DATABASE_URL_V1, + }); + + await client.connect(); + + let settingsV1: NewSetting[] = []; + + try { + log.info({}, "Running the manual fix"); + const s = await client.query("SELECT * FROM settings"); + + settingsV1 = s.rows.map((i) => { + return { + name: i.name, + value: i.value, + description: i.description, + moduleName: i.moduleName, + }; + }); + } catch (e) { + log.error({ error: e }, "There was an error getting the settings."); + } + + const { data, error } = await tryCatch( + db + .insert(settings) + .values(settingsV1) + .onConflictDoNothing() + .returning({ name: settings.name }), + ); + + if (error) { + log.error({ error }, "There was an error adding new settings"); + } + + if (data) { + log.info({ newSettingsAdded: data }, "New settings added"); + } +}; + +// migrations after 230 go below here so we can keep this inline. diff --git a/lstV2/server/index.ts b/lstV2/server/index.ts index 2cd72fe..831929e 100644 --- a/lstV2/server/index.ts +++ b/lstV2/server/index.ts @@ -253,12 +253,60 @@ process.on("beforeExit", async () => { process.exit(0); }); +// const port = +// process.env.NODE_ENV === "development" +// ? process.env.VITE_SERVER_PORT +// : process.env.PROD_PORT; + +// const ocmeport = process.env.OCME_PORT; + +// serve( +// { +// fetch: app.fetch, +// port: Number(port), +// hostname: "0.0.0.0", +// }, +// (info) => { +// createLog( +// "info", +// "LST", +// "server", +// `Server is running on http://${info.address}:${info.port}`, +// ); +// }, +// ); + +// /** +// * Only for ocme until we get them switched over to the single port setup. +// */ +// // const setting = await db.select().from(settings); +// const setting = serverSettings; +// const isActive = setting.filter((n) => n.name === "ocmeService"); +// if (ocmeport && isActive[0]?.value === "1") { +// serve( +// { +// fetch: app.fetch, +// port: Number(ocmeport), +// hostname: "0.0.0.0", +// }, +// (info) => { +// createLog( +// "info", +// "LST", +// "server", +// `Ocme section is listening on http://${info.address}:${info.port}`, +// ); +// }, +// ); +// } + const port = process.env.NODE_ENV === "development" ? process.env.VITE_SERVER_PORT : process.env.PROD_PORT; const ocmeport = process.env.OCME_PORT; + serve( { fetch: app.fetch, @@ -275,10 +323,6 @@ serve( }, ); -/** - * Only for ocme until we get them switched over to the single port setup. - */ -// const setting = await db.select().from(settings); const setting = serverSettings; const isActive = setting.filter((n) => n.name === "ocmeService"); if (ocmeport && isActive[0]?.value === "1") { diff --git a/lstV2/server/services/server/controller/settings/addSetting.ts b/lstV2/server/services/server/controller/settings/addSetting.ts index f357fbe..118dbe3 100644 --- a/lstV2/server/services/server/controller/settings/addSetting.ts +++ b/lstV2/server/services/server/controller/settings/addSetting.ts @@ -1,36 +1,46 @@ -import {and, eq} from "drizzle-orm"; -import {db} from "../../../../../database/dbclient.js"; -import {settings} from "../../../../../database/schema/settings.js"; -import {createLog} from "../../../logger/logger.js"; -import {userRoles} from "../../../../../database/schema/userRoles.js"; -import {modules} from "../../../../../database/schema/modules.js"; +/** + * has no value and just here until; we remove everything + */ +import { and, eq } from "drizzle-orm"; +import { db } from "../../../../../database/dbclient.js"; +import { modules } from "../../../../../database/schema/modules.js"; +import { settings } from "../../../../../database/schema/settings.js"; +import { userRoles } from "../../../../../database/schema/userRoles.js"; +import { createLog } from "../../../logger/logger.js"; export const addSetting = async (data: any, user_id: string) => { - createLog("info", "lst", "server", "Adding a new setting"); + createLog("info", "lst", "server", "Adding a new setting"); - // make sure the user is a system admin before moving forward - const sysAdmin = await db - .select() - .from(userRoles) - .where(and(eq(userRoles.user_id, user_id), eq(userRoles.role, "systemAdmin"))); + // make sure the user is a system admin before moving forward + const sysAdmin = await db + .select() + .from(userRoles) + .where( + and(eq(userRoles.user_id, user_id), eq(userRoles.role, "systemAdmin")), + ); - if (sysAdmin) { - createLog("info", "lst", "server", `Setting ${data.name} is being added`); - try { - const moduleId = await db.select().from(modules).where(eq(modules.name, data.module)); + if (sysAdmin) { + createLog("info", "lst", "server", `Setting ${data.name} is being added`); + try { + const moduleId = await db + .select() + .from(modules) + .where(eq(modules.name, data.module)); - // filter out the module and add in the module id - //delete data.module; + // filter out the module and add in the module id + //delete data.module; - //data.moduleName = moduleId[0].module_id; - // console.log(data); - const createSetting = await db.insert(settings).values(data); - } catch (error) { - createLog("error", "lst", "server", "Error adding setting"); - throw new Error("Error Adding Setting"); - } - } else { - createLog("error", "lst", "server", "This user cannot add new roles"); - throw new Error("The user trying to add a setting dose not have the correct permissions"); - } + //data.moduleName = moduleId[0].module_id; + // console.log(data); + const createSetting = await db.insert(settings).values(data); + } catch (error) { + createLog("error", "lst", "server", "Error adding setting"); + throw new Error("Error Adding Setting"); + } + } else { + createLog("error", "lst", "server", "This user cannot add new roles"); + throw new Error( + "The user trying to add a setting dose not have the correct permissions", + ); + } }; diff --git a/lstV2/server/services/server/controller/settings/getSettings.ts b/lstV2/server/services/server/controller/settings/getSettings.ts index e7bcf34..9bfc218 100644 --- a/lstV2/server/services/server/controller/settings/getSettings.ts +++ b/lstV2/server/services/server/controller/settings/getSettings.ts @@ -1,57 +1,72 @@ +/** + * This is only used now to get the settings from the new server + */ + process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; + import axios from "axios"; -import { db } from "../../../../../database/dbclient.js"; -import { settings } from "../../../../../database/schema/settings.js"; +import { Client } from "pg"; import { tryCatch } from "../../../../globalUtils/tryCatch.js"; -import { createLog } from "../../../logger/logger.js"; import type { Settings } from "../../../../types/settings.js"; +import { createLog } from "../../../logger/logger.js"; export let serverSettings: Settings[]; export const getSettings = async () => { - const settingsType = process.env.LST_USE_GO; - createLog( - "info", - "lst", - "server", - `Settings are being grabbed from: ${ - settingsType === "true" ? "Go backend" : "Localbackend" - }` - ); + const settingsType = process.env.LST_USE_GO; + createLog( + "info", + "lst", + "server", + `Settings are being grabbed from the app now`, + ); - const baseUrl = process.env.LST_BASE_URL; + //if (settingsType !== "true") { + try { + // serverSettings = (await db.select().from(settings)) as any; + const dbUrl = String(process.env.DATABASE_URL).replace("lst_db", "lst"); + const client = new Client({ + connectionString: dbUrl, + }); - if (settingsType === "true") { - const { data, error } = (await tryCatch( - axios.get(`${baseUrl}/api/v1/settings`) - )) as any; + await client.connect(); - if (error) { - createLog( - "error", - "lst", - "server", - "There was an error getting the settings" - ); - throw new Error("There was an error getting the settings"); - } + try { + const s = await client.query("SELECT * FROM settings"); - serverSettings = data.data.data; - } + serverSettings = s.rows; + } catch (e) { + console.log(e); + } + //.where(sql`${userRole} = ANY(roles)`); - if (settingsType !== "true") { - try { - serverSettings = (await db.select().from(settings)) as any; - //.where(sql`${userRole} = ANY(roles)`); - } catch (error) { - createLog( - "error", - "lst", - "server", - "There was an error getting the settings" - ); - throw new Error("There was an error getting the settings"); - } - } + // const { data, error } = (await tryCatch( + // axios.get( + // `http://localhost:${process.env.VITE_SERVER_PORT}/lst/api/system/settings`, + // ), + // )) as any; - return serverSettings; + // if (error) { + // createLog( + // "error", + // "lst", + // "server", + // "There was an error getting the settings", + // ); + // throw new Error("There was an error getting the settings"); + // } + + //serverSettings = data.data.data; + } catch (error) { + createLog( + "error", + "lst", + "server", + "There was an error getting the settings", + ); + throw new Error("There was an error getting the settings"); + } + //} + + //console.log(serverSettings); + return serverSettings; }; diff --git a/lstV2/server/services/server/controller/settings/updateSetting.ts b/lstV2/server/services/server/controller/settings/updateSetting.ts index ec86938..4ec7be9 100644 --- a/lstV2/server/services/server/controller/settings/updateSetting.ts +++ b/lstV2/server/services/server/controller/settings/updateSetting.ts @@ -1,37 +1,52 @@ -import {and, eq, sql} from "drizzle-orm"; -import {db} from "../../../../../database/dbclient.js"; -import {settings} from "../../../../../database/schema/settings.js"; -import {createLog} from "../../../logger/logger.js"; -import {userRoles} from "../../../../../database/schema/userRoles.js"; -import {users} from "../../../../../database/schema/users.js"; +/** + * has no value and just here until; we remove everything + */ + +import { and, eq, sql } from "drizzle-orm"; +import { db } from "../../../../../database/dbclient.js"; +import { settings } from "../../../../../database/schema/settings.js"; +import { userRoles } from "../../../../../database/schema/userRoles.js"; +import { users } from "../../../../../database/schema/users.js"; +import { createLog } from "../../../logger/logger.js"; export const updateSetting = async (data: any, user_id: string) => { - createLog("info", "lst", "server", "Adding a new setting"); + createLog("info", "lst", "server", "Adding a new setting"); - // make sure the user is a system admin before moving forward - const sysAdmin = await db - .select() - .from(userRoles) - .where(and(eq(userRoles.user_id, user_id), eq(userRoles.role, "systemAdmin"))); + // make sure the user is a system admin before moving forward + const sysAdmin = await db + .select() + .from(userRoles) + .where( + and(eq(userRoles.user_id, user_id), eq(userRoles.role, "systemAdmin")), + ); - if (sysAdmin) { - createLog("info", "lst", "server", `Setting ${data.name} is being updated`); + if (sysAdmin) { + createLog("info", "lst", "server", `Setting ${data.name} is being updated`); - //get the username so we can update the correct field - const user = await db.select().from(users).where(eq(users.user_id, user_id)); - try { - //const settingID = await db.select().from(settings).where(eq(settings.name, data.module)); + //get the username so we can update the correct field + const user = await db + .select() + .from(users) + .where(eq(users.user_id, user_id)); + try { + //const settingID = await db.select().from(settings).where(eq(settings.name, data.module)); - const updateSetting = await db - .update(settings) - .set({value: data.value, upd_user: user[0].username, upd_date: sql`NOW()`}) - .where(eq(settings.name, data.name)); - } catch (error) { - createLog("error", "lst", "server", "Error updating setting"); - throw new Error("Error updating Setting"); - } - } else { - createLog("error", "lst", "server", "This user cannot add new roles"); - throw new Error("The user trying to add a setting dose not have the correct permissions"); - } + const updateSetting = await db + .update(settings) + .set({ + value: data.value, + upd_user: user[0].username, + upd_date: sql`NOW()`, + }) + .where(eq(settings.name, data.name)); + } catch (error) { + createLog("error", "lst", "server", "Error updating setting"); + throw new Error("Error updating Setting"); + } + } else { + createLog("error", "lst", "server", "This user cannot add new roles"); + throw new Error( + "The user trying to add a setting dose not have the correct permissions", + ); + } };