refactor(old app): login migration to new app
This commit is contained in:
@@ -1,35 +1,34 @@
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
|
||||
|
||||
import { serve } from "@hono/node-server";
|
||||
import { OpenAPIHono } from "@hono/zod-openapi";
|
||||
|
||||
import { serveStatic } from "@hono/node-server/serve-static";
|
||||
import { logger } from "hono/logger";
|
||||
import { OpenAPIHono } from "@hono/zod-openapi";
|
||||
import { cors } from "hono/cors";
|
||||
import { createLog } from "./services/logger/logger.js";
|
||||
|
||||
import { logger } from "hono/logger";
|
||||
import os from "os";
|
||||
import auth from "./services/auth/authService.js";
|
||||
import dataMart from "./services/dataMart/dataMartService.js";
|
||||
import eom from "./services/eom/eomService.js";
|
||||
// custom routes
|
||||
import scalar from "./services/general/route/scalar.js";
|
||||
import system from "./services/server/systemServer.js";
|
||||
import auth from "./services/auth/authService.js";
|
||||
import tcpServer from "./services/tcpServer/tcpServer.js";
|
||||
import ocme from "./services/ocme/ocmeService.js";
|
||||
import sqlService from "./services/sqlServer/sqlService.js";
|
||||
import logistics from "./services/logistics/logisticsService.js";
|
||||
import rfid from "./services/rfid/rfidService.js";
|
||||
import printers from "./services/printers/printerService.js";
|
||||
import { createLog } from "./services/logger/logger.js";
|
||||
import loggerService from "./services/logger/loggerService.js";
|
||||
import ocpService from "./services/ocp/ocpService.js";
|
||||
import os from "os";
|
||||
import logistics from "./services/logistics/logisticsService.js";
|
||||
import { sendEmail } from "./services/notifications/controller/sendMail.js";
|
||||
import notify from "./services/notifications/notifyService.js";
|
||||
import eom from "./services/eom/eomService.js";
|
||||
import dataMart from "./services/dataMart/dataMartService.js";
|
||||
import qualityRequest from "./services/quality/qualityService.js";
|
||||
import ocme from "./services/ocme/ocmeService.js";
|
||||
import ocpService from "./services/ocp/ocpService.js";
|
||||
import printers from "./services/printers/printerService.js";
|
||||
import produser from "./services/prodUser/prodUser.js";
|
||||
import qualityRequest from "./services/quality/qualityService.js";
|
||||
import rfid from "./services/rfid/rfidService.js";
|
||||
import {
|
||||
getSettings,
|
||||
serverSettings,
|
||||
getSettings,
|
||||
serverSettings,
|
||||
} from "./services/server/controller/settings/getSettings.js";
|
||||
import system from "./services/server/systemServer.js";
|
||||
import sqlService from "./services/sqlServer/sqlService.js";
|
||||
import tcpServer from "./services/tcpServer/tcpServer.js";
|
||||
|
||||
// create the main prodlogin here
|
||||
const username = "lst_user";
|
||||
@@ -48,28 +47,33 @@ export const lstAuth = btoa(`${username}:${password}`);
|
||||
const serverIntialized: any = await getSettings();
|
||||
|
||||
export const installed =
|
||||
serverIntialized.length === 0 && process.env.NODE_ENV !== "development"
|
||||
? false
|
||||
: true;
|
||||
serverIntialized.length === 0 && process.env.NODE_ENV !== "development"
|
||||
? false
|
||||
: true;
|
||||
createLog("info", "LST", "server", `Server is installed: ${installed}`);
|
||||
|
||||
const app = new OpenAPIHono({ strict: false });
|
||||
|
||||
// middle ware
|
||||
if (process.env.NODE_ENV === "development") {
|
||||
app.use("*", logger());
|
||||
app.use("*", logger());
|
||||
}
|
||||
|
||||
app.use(
|
||||
"*",
|
||||
cors({
|
||||
origin: "*", // Allow all origins
|
||||
allowHeaders: ["Content-Type", "Authorization", "X-Requested-With"],
|
||||
allowMethods: ["GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"],
|
||||
//exposeHeaders: ["Content-Length", "X-Kuma-Revision"],
|
||||
credentials: true, // Allow credentials if needed
|
||||
maxAge: 600,
|
||||
})
|
||||
"*",
|
||||
cors({
|
||||
origin: [
|
||||
"http://localhost:3000",
|
||||
"http://localhost:5173",
|
||||
"http://localhost:4000",
|
||||
"http://localhost:4200",
|
||||
], // Allow all origins
|
||||
allowHeaders: ["Content-Type", "Authorization", "X-Requested-With"],
|
||||
allowMethods: ["GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"],
|
||||
//exposeHeaders: ["Content-Length", "X-Kuma-Revision"],
|
||||
credentials: true, // Allow credentials if needed
|
||||
maxAge: 600,
|
||||
}),
|
||||
);
|
||||
|
||||
// Middleware to normalize route case
|
||||
@@ -86,34 +90,34 @@ app.use(
|
||||
// });
|
||||
|
||||
app.doc("/api/ref", {
|
||||
openapi: "3.0.0",
|
||||
info: {
|
||||
version: "2.0.0",
|
||||
title: "LST API",
|
||||
},
|
||||
openapi: "3.0.0",
|
||||
info: {
|
||||
version: "2.0.0",
|
||||
title: "LST API",
|
||||
},
|
||||
});
|
||||
|
||||
const routes = [
|
||||
scalar,
|
||||
auth,
|
||||
// apiHits,
|
||||
system,
|
||||
tcpServer,
|
||||
sqlService,
|
||||
logistics,
|
||||
rfid,
|
||||
printers,
|
||||
loggerService,
|
||||
ocpService,
|
||||
notify,
|
||||
eom,
|
||||
dataMart,
|
||||
qualityRequest,
|
||||
produser,
|
||||
scalar,
|
||||
auth,
|
||||
// apiHits,
|
||||
system,
|
||||
tcpServer,
|
||||
sqlService,
|
||||
logistics,
|
||||
rfid,
|
||||
printers,
|
||||
loggerService,
|
||||
ocpService,
|
||||
notify,
|
||||
eom,
|
||||
dataMart,
|
||||
qualityRequest,
|
||||
produser,
|
||||
] as const;
|
||||
|
||||
const appRoutes = routes.forEach((route) => {
|
||||
app.route("/api/", route);
|
||||
app.route("/api/", route);
|
||||
});
|
||||
|
||||
app.route("/ocme/", ocme);
|
||||
@@ -154,60 +158,60 @@ app.use("*", serveStatic({ path: "./frontend/dist/index.html" }));
|
||||
|
||||
// Handle app exit signals
|
||||
process.on("SIGINT", async () => {
|
||||
console.log("\nGracefully shutting down...");
|
||||
//await closePool();
|
||||
process.exit(0);
|
||||
console.log("\nGracefully shutting down...");
|
||||
//await closePool();
|
||||
process.exit(0);
|
||||
});
|
||||
|
||||
process.on("SIGTERM", async () => {
|
||||
console.log("Received termination signal, closing database...");
|
||||
//await closePool();
|
||||
process.exit(0);
|
||||
console.log("Received termination signal, closing database...");
|
||||
//await closePool();
|
||||
process.exit(0);
|
||||
});
|
||||
|
||||
process.on("uncaughtException", async (err) => {
|
||||
console.log("Uncaught Exception:", err);
|
||||
//await closePool();
|
||||
const emailData = {
|
||||
email: "blake.matthes@alpla.com", // should be moved to the db so it can be reused.
|
||||
subject: `${os.hostname()} has just encountered a crash.`,
|
||||
template: "serverCrash",
|
||||
context: {
|
||||
error: err,
|
||||
plant: `${os.hostname()}`,
|
||||
},
|
||||
};
|
||||
console.log("Uncaught Exception:", err);
|
||||
//await closePool();
|
||||
const emailData = {
|
||||
email: "blake.matthes@alpla.com", // should be moved to the db so it can be reused.
|
||||
subject: `${os.hostname()} has just encountered a crash.`,
|
||||
template: "serverCrash",
|
||||
context: {
|
||||
error: err,
|
||||
plant: `${os.hostname()}`,
|
||||
},
|
||||
};
|
||||
|
||||
await sendEmail(emailData);
|
||||
//process.exit(1);
|
||||
await sendEmail(emailData);
|
||||
//process.exit(1);
|
||||
});
|
||||
|
||||
process.on("beforeExit", async () => {
|
||||
console.log("Process is about to exit...");
|
||||
//await closePool();
|
||||
process.exit(0);
|
||||
console.log("Process is about to exit...");
|
||||
//await closePool();
|
||||
process.exit(0);
|
||||
});
|
||||
|
||||
const port =
|
||||
process.env.NODE_ENV === "development"
|
||||
? process.env.VITE_SERVER_PORT
|
||||
: process.env.PROD_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}`
|
||||
);
|
||||
}
|
||||
{
|
||||
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}`,
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -217,21 +221,21 @@ serve(
|
||||
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}`
|
||||
);
|
||||
}
|
||||
);
|
||||
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}`,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
export type AppRoutes = typeof appRoutes;
|
||||
|
||||
@@ -1,45 +1,62 @@
|
||||
import {type MiddlewareHandler} from "hono";
|
||||
import axios from "axios";
|
||||
import { type MiddlewareHandler } from "hono";
|
||||
import jwt from "jsonwebtoken";
|
||||
|
||||
const {sign, verify} = jwt;
|
||||
const { sign, verify } = jwt;
|
||||
|
||||
export const authMiddleware: MiddlewareHandler = async (c, next) => {
|
||||
const authHeader = c.req.header("Authorization");
|
||||
console.log("middleware checked");
|
||||
const cookieHeader = c.req.header("Cookie");
|
||||
if (!cookieHeader) return c.json({ error: "Unauthorized" }, 401);
|
||||
|
||||
if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
||||
return c.json({error: "Unauthorized"}, 401);
|
||||
}
|
||||
const res = await axios.get(`${process.env.LST_BASE_URL}/api/user/me`, {
|
||||
headers: { Cookie: cookieHeader },
|
||||
});
|
||||
|
||||
const token = authHeader.split(" ")[1];
|
||||
if (res.status === 401) return c.json({ error: "Unauthorized" }, 401);
|
||||
|
||||
try {
|
||||
const decoded = verify(token, process.env.JWT_SECRET!, {ignoreExpiration: false}) as {
|
||||
userId: number;
|
||||
exp: number;
|
||||
};
|
||||
|
||||
const currentTime = Math.floor(Date.now() / 1000); // Get current timestamp
|
||||
const timeLeft = decoded.exp - currentTime;
|
||||
|
||||
// If the token has less than REFRESH_THRESHOLD seconds left, refresh it
|
||||
let newToken = null;
|
||||
|
||||
if (timeLeft < parseInt(process.env.REFRESH_THRESHOLD!)) {
|
||||
newToken = sign({userId: decoded.userId}, process.env.JWT_SECRET!, {
|
||||
expiresIn: parseInt(process.env.EXPIRATION_TIME!),
|
||||
});
|
||||
c.res.headers.set("Authorization", `Bearer ${newToken}`);
|
||||
}
|
||||
|
||||
c.set("user", {id: decoded.userId});
|
||||
await next();
|
||||
|
||||
// If a new token was generated, send it in response headers
|
||||
if (newToken) {
|
||||
console.log("token was refreshed");
|
||||
c.res.headers.set("X-Refreshed-Token", newToken);
|
||||
}
|
||||
} catch (err) {
|
||||
return c.json({error: "Invalid token"}, 401);
|
||||
}
|
||||
//const user = await resp.json();
|
||||
c.set("user", res.data.user);
|
||||
return next();
|
||||
};
|
||||
|
||||
// export const authMiddleware: MiddlewareHandler = async (c, next) => {
|
||||
// const authHeader = c.req.header("Authorization");
|
||||
|
||||
// if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
||||
// return c.json({error: "Unauthorized"}, 401);
|
||||
// }
|
||||
|
||||
// const token = authHeader.split(" ")[1];
|
||||
|
||||
// try {
|
||||
// const decoded = verify(token, process.env.JWT_SECRET!, {ignoreExpiration: false}) as {
|
||||
// userId: number;
|
||||
// exp: number;
|
||||
// };
|
||||
|
||||
// const currentTime = Math.floor(Date.now() / 1000); // Get current timestamp
|
||||
// const timeLeft = decoded.exp - currentTime;
|
||||
|
||||
// // If the token has less than REFRESH_THRESHOLD seconds left, refresh it
|
||||
// let newToken = null;
|
||||
|
||||
// if (timeLeft < parseInt(process.env.REFRESH_THRESHOLD!)) {
|
||||
// newToken = sign({userId: decoded.userId}, process.env.JWT_SECRET!, {
|
||||
// expiresIn: parseInt(process.env.EXPIRATION_TIME!),
|
||||
// });
|
||||
// c.res.headers.set("Authorization", `Bearer ${newToken}`);
|
||||
// }
|
||||
|
||||
// c.set("user", {id: decoded.userId});
|
||||
// await next();
|
||||
|
||||
// // If a new token was generated, send it in response headers
|
||||
// if (newToken) {
|
||||
// console.log("token was refreshed");
|
||||
// c.res.headers.set("X-Refreshed-Token", newToken);
|
||||
// }
|
||||
// } catch (err) {
|
||||
// return c.json({error: "Invalid token"}, 401);
|
||||
// }
|
||||
// };
|
||||
|
||||
@@ -1,85 +1,111 @@
|
||||
import axios from "axios";
|
||||
import { createMiddleware } from "hono/factory";
|
||||
|
||||
import type { CustomJwtPayload } from "../../../types/jwtToken.js";
|
||||
import { verify } from "hono/jwt";
|
||||
import { db } from "../../../../database/dbclient.js";
|
||||
import { modules } from "../../../../database/schema/modules.js";
|
||||
import { and, eq } from "drizzle-orm";
|
||||
import { userRoles } from "../../../../database/schema/userRoles.js";
|
||||
import { tryCatch } from "../../../globalUtils/tryCatch.js";
|
||||
// const hasCorrectRole = (requiredRole: string[], module: string) =>
|
||||
// createMiddleware(async (c, next) => {
|
||||
// /**
|
||||
// * We want to check to make sure you have the correct role to be here
|
||||
// */
|
||||
// const authHeader = c.req.header("Authorization");
|
||||
|
||||
// if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
||||
// return c.json({ error: "Unauthorized" }, 401);
|
||||
// }
|
||||
|
||||
// const token = authHeader.split(" ")[1];
|
||||
|
||||
// // deal with token data
|
||||
// const { data: tokenData, error: tokenError } = await tryCatch(
|
||||
// verify(token, process.env.JWT_SECRET!),
|
||||
// );
|
||||
|
||||
// if (tokenError) {
|
||||
// return c.json({ error: "Invalid token" }, 401);
|
||||
// }
|
||||
|
||||
// const customToken = tokenData as CustomJwtPayload;
|
||||
|
||||
// // Get the module
|
||||
// const { data: mod, error: modError } = await tryCatch(
|
||||
// db.select().from(modules).where(eq(modules.name, module)),
|
||||
// );
|
||||
// if (modError) {
|
||||
// console.log(modError);
|
||||
// return;
|
||||
// }
|
||||
|
||||
// if (mod.length === 0) {
|
||||
// return c.json({ error: "You have entered an invalid module name" }, 403);
|
||||
// }
|
||||
|
||||
// // check if the user has the role needed to get into this module
|
||||
// const { data: userRole, error: userRoleError } = await tryCatch(
|
||||
// db
|
||||
// .select()
|
||||
// .from(userRoles)
|
||||
// .where(
|
||||
// and(
|
||||
// eq(userRoles.module_id, mod[0].module_id),
|
||||
// eq(userRoles.user_id, customToken.user?.user_id!),
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
|
||||
// if (userRoleError) {
|
||||
// return;
|
||||
// }
|
||||
|
||||
// if (!userRole) {
|
||||
// return c.json(
|
||||
// {
|
||||
// error:
|
||||
// "The module you are trying to access is not active or is invalid.",
|
||||
// },
|
||||
// 403,
|
||||
// );
|
||||
// }
|
||||
|
||||
// if (!requiredRole.includes(userRole[0]?.role)) {
|
||||
// return c.json(
|
||||
// { error: "You do not have access to this part of the app." },
|
||||
// 403,
|
||||
// );
|
||||
// }
|
||||
|
||||
// await next();
|
||||
// });
|
||||
|
||||
interface UserRole {
|
||||
userRoleId: string;
|
||||
userId: string;
|
||||
module: string;
|
||||
role: string;
|
||||
}
|
||||
|
||||
const hasCorrectRole = (requiredRole: string[], module: string) =>
|
||||
createMiddleware(async (c, next) => {
|
||||
/**
|
||||
* We want to check to make sure you have the correct role to be here
|
||||
*/
|
||||
const authHeader = c.req.header("Authorization");
|
||||
createMiddleware(async (c, next) => {
|
||||
const cookieHeader = c.req.header("Cookie");
|
||||
if (!cookieHeader) return c.json({ error: "Unauthorized" }, 401);
|
||||
|
||||
if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
||||
return c.json({ error: "Unauthorized" }, 401);
|
||||
}
|
||||
const res = await axios.get(`${process.env.LST_BASE_URL}/api/user/roles`, {
|
||||
headers: { Cookie: cookieHeader },
|
||||
});
|
||||
|
||||
const token = authHeader.split(" ")[1];
|
||||
const currentRoles: UserRole[] = res.data.data;
|
||||
const canAccess = currentRoles.some(
|
||||
(r) => r.module === module && requiredRole.includes(r.role),
|
||||
);
|
||||
if (!canAccess) {
|
||||
return c.json(
|
||||
{
|
||||
error: "Unauthorized",
|
||||
message: `You do not have access to ${module}`,
|
||||
},
|
||||
400,
|
||||
);
|
||||
}
|
||||
|
||||
// deal with token data
|
||||
const { data: tokenData, error: tokenError } = await tryCatch(
|
||||
verify(token, process.env.JWT_SECRET!)
|
||||
);
|
||||
|
||||
if (tokenError) {
|
||||
return c.json({ error: "Invalid token" }, 401);
|
||||
}
|
||||
|
||||
const customToken = tokenData as CustomJwtPayload;
|
||||
|
||||
// Get the module
|
||||
const { data: mod, error: modError } = await tryCatch(
|
||||
db.select().from(modules).where(eq(modules.name, module))
|
||||
);
|
||||
if (modError) {
|
||||
console.log(modError);
|
||||
return;
|
||||
}
|
||||
|
||||
if (mod.length === 0) {
|
||||
return c.json({ error: "You have entered an invalid module name" }, 403);
|
||||
}
|
||||
|
||||
// check if the user has the role needed to get into this module
|
||||
const { data: userRole, error: userRoleError } = await tryCatch(
|
||||
db
|
||||
.select()
|
||||
.from(userRoles)
|
||||
.where(
|
||||
and(
|
||||
eq(userRoles.module_id, mod[0].module_id),
|
||||
eq(userRoles.user_id, customToken.user?.user_id!)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
if (userRoleError) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!userRole) {
|
||||
return c.json(
|
||||
{
|
||||
error:
|
||||
"The module you are trying to access is not active or is invalid.",
|
||||
},
|
||||
403
|
||||
);
|
||||
}
|
||||
|
||||
if (!requiredRole.includes(userRole[0]?.role)) {
|
||||
return c.json(
|
||||
{ error: "You do not have access to this part of the app." },
|
||||
403
|
||||
);
|
||||
}
|
||||
|
||||
await next();
|
||||
});
|
||||
return next();
|
||||
});
|
||||
|
||||
export default hasCorrectRole;
|
||||
|
||||
@@ -1,97 +1,117 @@
|
||||
import { z, createRoute, OpenAPIHono } from "@hono/zod-openapi";
|
||||
import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi";
|
||||
import axios from "axios";
|
||||
import { login } from "../controllers/login.js";
|
||||
|
||||
const app = new OpenAPIHono();
|
||||
|
||||
const UserSchema = z
|
||||
.object({
|
||||
username: z.string().optional().openapi({ example: "smith002" }),
|
||||
//email: z.string().optional().openapi({example: "s.smith@example.com"}),
|
||||
password: z.string().openapi({ example: "password123" }),
|
||||
})
|
||||
.openapi("User");
|
||||
.object({
|
||||
username: z.string().optional().openapi({ example: "smith002" }),
|
||||
//email: z.string().optional().openapi({example: "s.smith@example.com"}),
|
||||
password: z.string().openapi({ example: "password123" }),
|
||||
})
|
||||
.openapi("User");
|
||||
|
||||
const route = createRoute({
|
||||
tags: ["Auth"],
|
||||
summary: "Login as user",
|
||||
description: "Login as a user to get a JWT token",
|
||||
method: "post",
|
||||
path: "/login",
|
||||
request: {
|
||||
body: {
|
||||
content: {
|
||||
"application/json": { schema: UserSchema },
|
||||
},
|
||||
},
|
||||
},
|
||||
responses: {
|
||||
200: {
|
||||
content: {
|
||||
"application/json": {
|
||||
schema: z.object({
|
||||
success: z.boolean().openapi({ example: true }),
|
||||
message: z.string().openapi({ example: "Logged in" }),
|
||||
}),
|
||||
},
|
||||
},
|
||||
description: "Response message",
|
||||
},
|
||||
tags: ["Auth"],
|
||||
summary: "Login as user",
|
||||
description: "Login as a user to get a JWT token",
|
||||
method: "post",
|
||||
path: "/login",
|
||||
request: {
|
||||
body: {
|
||||
content: {
|
||||
"application/json": { schema: UserSchema },
|
||||
},
|
||||
},
|
||||
},
|
||||
responses: {
|
||||
200: {
|
||||
content: {
|
||||
"application/json": {
|
||||
schema: z.object({
|
||||
success: z.boolean().openapi({ example: true }),
|
||||
message: z.string().openapi({ example: "Logged in" }),
|
||||
}),
|
||||
},
|
||||
},
|
||||
description: "Response message",
|
||||
},
|
||||
|
||||
400: {
|
||||
content: {
|
||||
"application/json": {
|
||||
schema: z.object({
|
||||
success: z.boolean().openapi({ example: false }),
|
||||
message: z
|
||||
.string()
|
||||
.openapi({ example: "Username and password required" }),
|
||||
}),
|
||||
},
|
||||
},
|
||||
description: "Bad request",
|
||||
},
|
||||
401: {
|
||||
content: {
|
||||
"application/json": {
|
||||
schema: z.object({
|
||||
success: z.boolean().openapi({ example: false }),
|
||||
message: z
|
||||
.string()
|
||||
.openapi({ example: "Username and password required" }),
|
||||
}),
|
||||
},
|
||||
},
|
||||
description: "Bad request",
|
||||
},
|
||||
},
|
||||
400: {
|
||||
content: {
|
||||
"application/json": {
|
||||
schema: z.object({
|
||||
success: z.boolean().openapi({ example: false }),
|
||||
message: z
|
||||
.string()
|
||||
.openapi({ example: "Username and password required" }),
|
||||
}),
|
||||
},
|
||||
},
|
||||
description: "Bad request",
|
||||
},
|
||||
401: {
|
||||
content: {
|
||||
"application/json": {
|
||||
schema: z.object({
|
||||
success: z.boolean().openapi({ example: false }),
|
||||
message: z
|
||||
.string()
|
||||
.openapi({ example: "Username and password required" }),
|
||||
}),
|
||||
},
|
||||
},
|
||||
description: "Bad request",
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
app.openapi(route, async (c) => {
|
||||
const { username, password, email } = await c.req.json();
|
||||
app.openapi(route, async (c: any) => {
|
||||
const { username, password, email } = await c.req.json();
|
||||
|
||||
if (!username || !password) {
|
||||
return c.json(
|
||||
{
|
||||
success: false,
|
||||
message: "Username and password are required",
|
||||
},
|
||||
400
|
||||
);
|
||||
}
|
||||
if (!username || !password) {
|
||||
return c.json(
|
||||
{
|
||||
success: false,
|
||||
message: "Username and password are required",
|
||||
},
|
||||
400,
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
const { token, user } = await login(username.toLowerCase(), password);
|
||||
try {
|
||||
const loginResp = await axios.post(
|
||||
`${process.env.LST_BASE_URL}/api/user/login`,
|
||||
{ username: username.toLowerCase(), password },
|
||||
{ withCredentials: true },
|
||||
);
|
||||
|
||||
// Set the JWT as an HTTP-only cookie
|
||||
//c.header("Set-Cookie", `auth_token=${token}; HttpOnly; Secure; Path=/; SameSite=None; Max-Age=3600`);
|
||||
// Set the JWT as an HTTP-only cookie
|
||||
//c.header("Set-Cookie", `auth_token=${token}; HttpOnly; Secure; Path=/; SameSite=None; Max-Age=3600`);
|
||||
|
||||
return c.json(
|
||||
{ success: true, message: "Login successful", user, token },
|
||||
200
|
||||
);
|
||||
} catch (err) {
|
||||
return c.json({ success: false, message: "Incorrect Credentials" }, 401);
|
||||
}
|
||||
const setCookie = loginResp.headers["set-cookie"] as any;
|
||||
|
||||
if (setCookie) {
|
||||
c.header("Set-Cookie", setCookie);
|
||||
}
|
||||
return c.json(
|
||||
{ success: true, message: "Login successful", data: loginResp.data },
|
||||
200,
|
||||
);
|
||||
} catch (err) {
|
||||
// @ts-ignore
|
||||
if (!err.response.data.success) {
|
||||
// @ts-ignore
|
||||
return c.json(
|
||||
// @ts-ignore
|
||||
{ success: false, message: err.response.data.message },
|
||||
401,
|
||||
);
|
||||
} else {
|
||||
return c.json({ success: false, message: "Incorrect Credentials" }, 401);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
export default app;
|
||||
|
||||
@@ -1,110 +1,149 @@
|
||||
import { z, createRoute, OpenAPIHono } from "@hono/zod-openapi";
|
||||
import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi";
|
||||
import axios from "axios";
|
||||
import { verify } from "hono/jwt";
|
||||
|
||||
import { authMiddleware } from "../middleware/authMiddleware.js";
|
||||
import jwt from "jsonwebtoken";
|
||||
import { authMiddleware } from "../middleware/authMiddleware.js";
|
||||
|
||||
const session = new OpenAPIHono();
|
||||
const expiresIn = Number(process.env.JWT_EXPIRES!) || 60;
|
||||
const secret: string = process.env.JWT_SECRET!;
|
||||
|
||||
const { sign } = jwt;
|
||||
|
||||
const UserSchema = z.object({
|
||||
username: z
|
||||
.string()
|
||||
.regex(/^[a-zA-Z0-9_]{3,30}$/)
|
||||
.openapi({ example: "smith034" }),
|
||||
email: z.string().email().openapi({ example: "smith@example.com" }),
|
||||
password: z
|
||||
.string()
|
||||
.min(6, { message: "Passwords must be longer than 3 characters" })
|
||||
.regex(/[A-Z]/, {
|
||||
message: "Password must contain at least one uppercase letter",
|
||||
})
|
||||
.regex(/[\W_]/, {
|
||||
message: "Password must contain at least one special character",
|
||||
})
|
||||
.openapi({ example: "Password1!" }),
|
||||
username: z
|
||||
.string()
|
||||
.regex(/^[a-zA-Z0-9_]{3,30}$/)
|
||||
.openapi({ example: "smith034" }),
|
||||
email: z.string().email().openapi({ example: "smith@example.com" }),
|
||||
password: z
|
||||
.string()
|
||||
.min(6, { message: "Passwords must be longer than 3 characters" })
|
||||
.regex(/[A-Z]/, {
|
||||
message: "Password must contain at least one uppercase letter",
|
||||
})
|
||||
.regex(/[\W_]/, {
|
||||
message: "Password must contain at least one special character",
|
||||
})
|
||||
.openapi({ example: "Password1!" }),
|
||||
});
|
||||
|
||||
const activeSessions: Record<string, { lastSeen: number; expiresAt: number }> =
|
||||
{};
|
||||
const SESSION_TIMEOUT_MS = 60 * 60 * 1000; // 1 hour
|
||||
|
||||
session.openapi(
|
||||
createRoute({
|
||||
tags: ["Auth"],
|
||||
summary: "Checks a user session based on there token",
|
||||
description: "Can post there via Authentiaction header or cookies",
|
||||
method: "get",
|
||||
path: "/session",
|
||||
middleware: authMiddleware,
|
||||
// request: {
|
||||
// body: {
|
||||
// content: {
|
||||
// "application/json": {schema: UserSchema},
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
responses: {
|
||||
200: {
|
||||
content: {
|
||||
"application/json": {
|
||||
schema: z.object({
|
||||
data: z.object({
|
||||
token: z
|
||||
.string()
|
||||
.openapi({
|
||||
example: "sdkjhgsldkvhdakl;jvhs;adkjfhvds.kvnsad;ovhads",
|
||||
}),
|
||||
// user: z.object({
|
||||
// user_id: z.string().openapi({example: "04316c86-f086-4cc6-b3d4-cca164a26f3f"}),
|
||||
// username: z.string().openapi({example: "smith"}),
|
||||
// email: z.string().openapi({example: "smith@example.com"}).optional(),
|
||||
// }),
|
||||
}),
|
||||
}),
|
||||
},
|
||||
},
|
||||
description: "Login successful",
|
||||
},
|
||||
401: {
|
||||
content: {
|
||||
"application/json": {
|
||||
schema: z.object({
|
||||
message: z.string().openapi({ example: "Unathenticated" }),
|
||||
}),
|
||||
},
|
||||
},
|
||||
description: "Error of why you were not logged in.",
|
||||
},
|
||||
},
|
||||
}),
|
||||
async (c) => {
|
||||
const authHeader = c.req.header("Authorization");
|
||||
createRoute({
|
||||
tags: ["Auth"],
|
||||
summary: "Checks a user session based on there token",
|
||||
description: "Can post there via Authentiaction header or cookies",
|
||||
method: "get",
|
||||
path: "/session",
|
||||
middleware: authMiddleware,
|
||||
// request: {
|
||||
// body: {
|
||||
// content: {
|
||||
// "application/json": {schema: UserSchema},
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
responses: {
|
||||
200: {
|
||||
content: {
|
||||
"application/json": {
|
||||
schema: z.object({
|
||||
data: z.object({
|
||||
token: z.string().openapi({
|
||||
example: "sdkjhgsldkvhdakl;jvhs;adkjfhvds.kvnsad;ovhads",
|
||||
}),
|
||||
// user: z.object({
|
||||
// user_id: z.string().openapi({example: "04316c86-f086-4cc6-b3d4-cca164a26f3f"}),
|
||||
// username: z.string().openapi({example: "smith"}),
|
||||
// email: z.string().openapi({example: "smith@example.com"}).optional(),
|
||||
// }),
|
||||
}),
|
||||
}),
|
||||
},
|
||||
},
|
||||
description: "Login successful",
|
||||
},
|
||||
401: {
|
||||
content: {
|
||||
"application/json": {
|
||||
schema: z.object({
|
||||
message: z.string().openapi({ example: "Unathenticated" }),
|
||||
}),
|
||||
},
|
||||
},
|
||||
description: "Error of why you were not logged in.",
|
||||
},
|
||||
},
|
||||
}),
|
||||
async (c: any) => {
|
||||
const cookieHeader = c.req.header("Cookie");
|
||||
if (!cookieHeader) return c.json({ error: "Unauthorized" }, 401);
|
||||
|
||||
if (authHeader?.includes("Basic")) {
|
||||
return c.json(
|
||||
{ message: "You are a Basic user! Please login to get a token" },
|
||||
401
|
||||
);
|
||||
}
|
||||
const res = await axios.get(`${process.env.LST_BASE_URL}/api/user/me`, {
|
||||
headers: { Cookie: cookieHeader },
|
||||
withCredentials: true,
|
||||
});
|
||||
|
||||
if (!authHeader) {
|
||||
return c.json({ message: "Unauthorized" }, 401);
|
||||
}
|
||||
if (res.status === 401) return c.json({ error: "Unauthorized" }, 401);
|
||||
|
||||
const token = authHeader?.split("Bearer ")[1] || "";
|
||||
const user = res.data.user;
|
||||
|
||||
try {
|
||||
const payload = await verify(token, process.env.JWT_SECRET!);
|
||||
// ── record session heartbeat ───────────────────────────────────────────
|
||||
activeSessions[user.id] = {
|
||||
lastSeen: Date.now(),
|
||||
expiresAt: Date.now() + SESSION_TIMEOUT_MS,
|
||||
};
|
||||
|
||||
// If it's valid, return a new token
|
||||
const newToken = sign({ user: payload.user }, secret, {
|
||||
expiresIn: expiresIn * 60,
|
||||
});
|
||||
// clean up stale sessions in the background
|
||||
for (const [key, sess] of Object.entries(activeSessions)) {
|
||||
if (Date.now() > sess.expiresAt) delete activeSessions[key];
|
||||
}
|
||||
|
||||
return c.json({ data: { token: newToken, user: payload.user } }, 200);
|
||||
} catch (error) {
|
||||
return c.json({ message: "Unauthorized" }, 401);
|
||||
}
|
||||
}
|
||||
const setCookie =
|
||||
res.headers &&
|
||||
((res.headers["set-cookie"] || res.headers["Set-Cookie"]) as
|
||||
| string[]
|
||||
| undefined);
|
||||
|
||||
if (setCookie) c.header("Set-Cookie", setCookie);
|
||||
|
||||
return c.json(
|
||||
{ data: { token: res.data.token, user: res.data.user } },
|
||||
200,
|
||||
);
|
||||
|
||||
// const authHeader = c.req.header("Authorization");
|
||||
|
||||
// if (authHeader?.includes("Basic")) {
|
||||
// return c.json(
|
||||
// { message: "You are a Basic user! Please login to get a token" },
|
||||
// 401
|
||||
// );
|
||||
// }
|
||||
|
||||
// if (!authHeader) {
|
||||
// return c.json({ message: "Unauthorized" }, 401);
|
||||
// }
|
||||
|
||||
// const token = authHeader?.split("Bearer ")[1] || "";
|
||||
|
||||
// try {
|
||||
// const payload = await verify(token, process.env.JWT_SECRET!);
|
||||
|
||||
// // If it's valid, return a new token
|
||||
// const newToken = sign({ user: payload.user }, secret, {
|
||||
// expiresIn: expiresIn * 60,
|
||||
// });
|
||||
|
||||
// return c.json({ data: { token: newToken, user: payload.user } }, 200);
|
||||
// } catch (error) {
|
||||
// return c.json({ message: "Unauthorized" }, 401);
|
||||
// }
|
||||
},
|
||||
);
|
||||
|
||||
// const token = authHeader?.split("Bearer ")[1] || "";
|
||||
|
||||
@@ -1,59 +1,72 @@
|
||||
import { z, createRoute, OpenAPIHono } from "@hono/zod-openapi";
|
||||
import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi";
|
||||
import axios from "axios";
|
||||
import jwt from "jsonwebtoken";
|
||||
import type { CustomJwtPayload } from "../../../../types/jwtToken.js";
|
||||
import { authMiddleware } from "../../middleware/authMiddleware.js";
|
||||
import { roleCheck } from "../../controllers/userRoles/getUserAccess.js";
|
||||
import { authMiddleware } from "../../middleware/authMiddleware.js";
|
||||
|
||||
const { verify } = jwt;
|
||||
const app = new OpenAPIHono();
|
||||
|
||||
const responseSchema = z.object({
|
||||
message: z.string().optional().openapi({ example: "User Created" }),
|
||||
message: z.string().optional().openapi({ example: "User Created" }),
|
||||
});
|
||||
|
||||
app.openapi(
|
||||
createRoute({
|
||||
tags: ["auth:user"],
|
||||
summary: "returns the users access",
|
||||
method: "get",
|
||||
path: "/getuseraccess",
|
||||
middleware: [authMiddleware],
|
||||
responses: {
|
||||
200: {
|
||||
content: { "application/json": { schema: responseSchema } },
|
||||
description: "Retrieve the user",
|
||||
},
|
||||
},
|
||||
}),
|
||||
async (c) => {
|
||||
// apit hit
|
||||
//apiHit(c, { endpoint: "api/auth/getUserRoles" });
|
||||
const authHeader = c.req.header("Authorization");
|
||||
const token = authHeader?.split("Bearer ")[1] || "";
|
||||
try {
|
||||
const secret = process.env.JWT_SECRET!;
|
||||
if (!secret) {
|
||||
throw new Error("JWT_SECRET is not defined in environment variables");
|
||||
}
|
||||
createRoute({
|
||||
tags: ["auth:user"],
|
||||
summary: "returns the users access",
|
||||
method: "get",
|
||||
path: "/getuseraccess",
|
||||
middleware: [authMiddleware],
|
||||
responses: {
|
||||
200: {
|
||||
content: { "application/json": { schema: responseSchema } },
|
||||
description: "Retrieve the user",
|
||||
},
|
||||
},
|
||||
}),
|
||||
async (c: any) => {
|
||||
// apit hit
|
||||
//apiHit(c, { endpoint: "api/auth/getUserRoles" });
|
||||
const authHeader = c.req.header("Authorization");
|
||||
|
||||
const payload = verify(token, secret) as CustomJwtPayload;
|
||||
const user = c.get("user");
|
||||
|
||||
const canAccess = await roleCheck(payload.user?.user_id);
|
||||
if (!user) {
|
||||
return c.json(
|
||||
{
|
||||
success: true,
|
||||
message: `Unauthorized`,
|
||||
},
|
||||
401,
|
||||
);
|
||||
}
|
||||
try {
|
||||
const cookieHeader = c.req.header("Cookie");
|
||||
if (!cookieHeader) return c.json({ error: "Unauthorized" }, 401);
|
||||
|
||||
return c.json(
|
||||
{
|
||||
sucess: true,
|
||||
message: `User ${payload.user?.username} can access`,
|
||||
data: canAccess,
|
||||
},
|
||||
200
|
||||
);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
const res = await axios.get(
|
||||
`${process.env.LST_BASE_URL}/api/user/roles`,
|
||||
{
|
||||
headers: { Cookie: cookieHeader },
|
||||
},
|
||||
);
|
||||
|
||||
return c.json({ message: "UserRoles coming over" });
|
||||
}
|
||||
return c.json(
|
||||
{
|
||||
success: true,
|
||||
message: `User ${user.username} can access`,
|
||||
data: res.data.data,
|
||||
},
|
||||
200,
|
||||
);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
|
||||
return c.json({ message: "UserRoles coming over" });
|
||||
},
|
||||
);
|
||||
|
||||
export default app;
|
||||
|
||||
@@ -1,154 +1,152 @@
|
||||
import { eq } from "drizzle-orm";
|
||||
import { db } from "../../../../../database/dbclient.js";
|
||||
import { settings } from "../../../../../database/schema/settings.js";
|
||||
import { siloAdjustments } from "../../../../../database/schema/siloAdjustments.js";
|
||||
import { greetingStuff } from "../../../../globalUtils/greetingEmail.js";
|
||||
import { generateOneTimeKey } from "../../../../globalUtils/singleUseKey.js";
|
||||
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
|
||||
import { sendEmail } from "../../../notifications/controller/sendMail.js";
|
||||
import {
|
||||
getSettings,
|
||||
serverSettings,
|
||||
} from "../../../server/controller/settings/getSettings.js";
|
||||
import { query } from "../../../sqlServer/prodSqlServer.js";
|
||||
import { siloQuery } from "../../../sqlServer/querys/silo/siloQuery.js";
|
||||
import { postAdjustment } from "./postAdjustment.js";
|
||||
import { siloAdjustments } from "../../../../../database/schema/siloAdjustments.js";
|
||||
import { greetingStuff } from "../../../../globalUtils/greetingEmail.js";
|
||||
import { sendEmail } from "../../../notifications/controller/sendMail.js";
|
||||
import { settings } from "../../../../../database/schema/settings.js";
|
||||
import { generateOneTimeKey } from "../../../../globalUtils/singleUseKey.js";
|
||||
import { eq } from "drizzle-orm";
|
||||
import {
|
||||
getSettings,
|
||||
serverSettings,
|
||||
} from "../../../server/controller/settings/getSettings.js";
|
||||
|
||||
export const createSiloAdjustment = async (
|
||||
data: any | null,
|
||||
user: any | null
|
||||
data: any | null,
|
||||
user: any | null,
|
||||
) => {
|
||||
/**
|
||||
* Creates a silo adjustment based off warehouse, location, and qty.
|
||||
* qty will come from the hmi, prolink, or silo patrol
|
||||
*/
|
||||
// const { data: set, error: setError } = await tryCatch(
|
||||
// db.select().from(settings)
|
||||
// );
|
||||
/**
|
||||
* Creates a silo adjustment based off warehouse, location, and qty.
|
||||
* qty will come from the hmi, prolink, or silo patrol
|
||||
*/
|
||||
// const { data: set, error: setError } = await tryCatch(
|
||||
// db.select().from(settings)
|
||||
// );
|
||||
|
||||
// const { data: set, error: setError } = await tryCatch(getSettings());
|
||||
// const { data: set, error: setError } = await tryCatch(getSettings());
|
||||
|
||||
// if (setError) {
|
||||
// return {
|
||||
// success: false,
|
||||
// message: `There was an error getting setting data to post to the server.`,
|
||||
// data: setError,
|
||||
// };
|
||||
// }
|
||||
// if (setError) {
|
||||
// return {
|
||||
// success: false,
|
||||
// message: `There was an error getting setting data to post to the server.`,
|
||||
// data: setError,
|
||||
// };
|
||||
// }
|
||||
|
||||
const set = serverSettings.length === 0 ? [] : serverSettings;
|
||||
// getting stock data first so we have it prior to the adjustment
|
||||
const { data: s, error: stockError } = await tryCatch(
|
||||
query(siloQuery, "Silo data Query")
|
||||
);
|
||||
const set = serverSettings.length === 0 ? [] : serverSettings;
|
||||
// getting stock data first so we have it prior to the adjustment
|
||||
const { data: s, error: stockError } = await tryCatch(
|
||||
query(siloQuery, "Silo data Query"),
|
||||
);
|
||||
|
||||
if (stockError) {
|
||||
return {
|
||||
success: false,
|
||||
message: `There was an error getting stock data to post to the server.`,
|
||||
data: stockError,
|
||||
};
|
||||
}
|
||||
const stock: any = s?.data as any;
|
||||
const { data: a, error: errorAdj } = await tryCatch(
|
||||
postAdjustment(data, user.prod)
|
||||
);
|
||||
if (stockError) {
|
||||
return {
|
||||
success: false,
|
||||
message: `There was an error getting stock data to post to the server.`,
|
||||
data: stockError,
|
||||
};
|
||||
}
|
||||
const stock: any = s?.data as any;
|
||||
const { data: a, error: errorAdj } = await tryCatch(postAdjustment(data));
|
||||
|
||||
if (errorAdj) {
|
||||
return {
|
||||
success: false,
|
||||
message: `There was an error doing the silo adjustment.`,
|
||||
data: errorAdj,
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Checking to see the difference, and send email if +/- 5% will change later if needed
|
||||
*/
|
||||
if (errorAdj) {
|
||||
return {
|
||||
success: false,
|
||||
message: `There was an error doing the silo adjustment.`,
|
||||
data: errorAdj,
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Checking to see the difference, and send email if +/- 5% will change later if needed
|
||||
*/
|
||||
|
||||
const sa: any = a;
|
||||
const sa: any = a;
|
||||
|
||||
if (!sa.success) {
|
||||
console.log(`insde error`);
|
||||
return {
|
||||
success: sa.success,
|
||||
message: sa.message,
|
||||
data: sa.data,
|
||||
};
|
||||
}
|
||||
if (!sa.success) {
|
||||
console.log(`inside error`);
|
||||
return {
|
||||
success: sa.success,
|
||||
message: sa.message,
|
||||
data: sa.data,
|
||||
};
|
||||
}
|
||||
|
||||
const stockNummy = stock.filter((s: any) => s.LocationID === data.laneId);
|
||||
const theDiff =
|
||||
((data.quantity - stockNummy[0].Stock_Total) /
|
||||
((data.quantity + stockNummy[0].Stock_Total) / 2)) *
|
||||
100;
|
||||
const stockNummy = stock.filter((s: any) => s.LocationID === data.laneId);
|
||||
const theDiff =
|
||||
((data.quantity - stockNummy[0].Stock_Total) /
|
||||
((data.quantity + stockNummy[0].Stock_Total) / 2)) *
|
||||
100;
|
||||
|
||||
/**
|
||||
* Post the data to our db.
|
||||
*/
|
||||
/**
|
||||
* Post the data to our db.
|
||||
*/
|
||||
|
||||
//console.log(stockNummy);
|
||||
const { data: postAdj, error: postAdjError } = await tryCatch(
|
||||
db
|
||||
.insert(siloAdjustments)
|
||||
.values({
|
||||
warehouseID: data.warehouseId,
|
||||
locationID: data.laneId,
|
||||
currentStockLevel: stockNummy[0].Stock_Total,
|
||||
newLevel: data.quantity,
|
||||
lastDateAdjusted: new Date(stockNummy[0].LastAdjustment),
|
||||
add_user: user.username,
|
||||
})
|
||||
.returning({ id: siloAdjustments.siloAdjust_id })
|
||||
);
|
||||
//console.log(stockNummy);
|
||||
const { data: postAdj, error: postAdjError } = await tryCatch(
|
||||
db
|
||||
.insert(siloAdjustments)
|
||||
.values({
|
||||
warehouseID: data.warehouseId,
|
||||
locationID: data.laneId,
|
||||
currentStockLevel: stockNummy[0].Stock_Total,
|
||||
newLevel: data.quantity,
|
||||
lastDateAdjusted: new Date(stockNummy[0].LastAdjustment),
|
||||
add_user: user.username,
|
||||
})
|
||||
.returning({ id: siloAdjustments.siloAdjust_id }),
|
||||
);
|
||||
|
||||
if (postAdjError) {
|
||||
//console.log(postAdjError);
|
||||
return {
|
||||
success: false,
|
||||
message: `There was an error posting the new adjustment.`,
|
||||
data: postAdjError,
|
||||
};
|
||||
}
|
||||
let adj: any = a;
|
||||
if (Math.abs(theDiff) > 5) {
|
||||
// console.log(`Send for comment due to being: ${theDiff.toFixed(2)}%`);
|
||||
const server = set.filter((n: any) => n.name === "server");
|
||||
if (postAdjError) {
|
||||
//console.log(postAdjError);
|
||||
return {
|
||||
success: false,
|
||||
message: `There was an error posting the new adjustment.`,
|
||||
data: postAdjError,
|
||||
};
|
||||
}
|
||||
let adj: any = a;
|
||||
if (Math.abs(theDiff) > 5) {
|
||||
// console.log(`Send for comment due to being: ${theDiff.toFixed(2)}%`);
|
||||
const server = set.filter((n: any) => n.name === "server");
|
||||
|
||||
const port = set.filter((n: any) => n.name === "serverPort");
|
||||
const key = await generateOneTimeKey();
|
||||
const updateKey = await db
|
||||
.update(siloAdjustments)
|
||||
.set({ commentKey: key })
|
||||
.where(eq(siloAdjustments.siloAdjust_id, postAdj[0].id));
|
||||
const port = set.filter((n: any) => n.name === "serverPort");
|
||||
const key = await generateOneTimeKey();
|
||||
const updateKey = await db
|
||||
.update(siloAdjustments)
|
||||
.set({ commentKey: key })
|
||||
.where(eq(siloAdjustments.siloAdjust_id, postAdj[0].id));
|
||||
|
||||
const emailSetup = {
|
||||
email: user.email,
|
||||
subject: `Alert - Siloadjustment was done with a descrepancy of 5% or greater`,
|
||||
template: "siloAdjustmentComment",
|
||||
context: {
|
||||
greeting: await greetingStuff(),
|
||||
siloName: stockNummy[0].Description,
|
||||
variance: `${theDiff.toFixed(2)}%`,
|
||||
currentLevel: stockNummy[0].Stock_Total,
|
||||
newLevel: data.quantity,
|
||||
variancePer: 5,
|
||||
adjustID: `${postAdj[0].id}&${key}`,
|
||||
server: server[0].value,
|
||||
port: port[0].value,
|
||||
},
|
||||
};
|
||||
const emailSetup = {
|
||||
email: user.email,
|
||||
subject: `Alert - Siloadjustment was done with a descrepancy of 5% or greater`,
|
||||
template: "siloAdjustmentComment",
|
||||
context: {
|
||||
greeting: await greetingStuff(),
|
||||
siloName: stockNummy[0].Description,
|
||||
variance: `${theDiff.toFixed(2)}%`,
|
||||
currentLevel: stockNummy[0].Stock_Total,
|
||||
newLevel: data.quantity,
|
||||
variancePer: 5,
|
||||
adjustID: `${postAdj[0].id}&${key}`,
|
||||
server: server[0].value,
|
||||
port: port[0].value,
|
||||
},
|
||||
};
|
||||
|
||||
//console.log(emailSetup);
|
||||
//console.log(emailSetup);
|
||||
|
||||
await sendEmail(emailSetup);
|
||||
return {
|
||||
success: adj.success,
|
||||
message: `Silo adjustmnet was completed you will also receive and email due to the adjustment having a variation of ${Math.abs(
|
||||
theDiff
|
||||
).toFixed(2)}%`,
|
||||
data: adj.data,
|
||||
};
|
||||
} else {
|
||||
return { success: adj.success, message: adj.message, data: adj.data };
|
||||
}
|
||||
await sendEmail(emailSetup);
|
||||
return {
|
||||
success: adj.success,
|
||||
message: `Silo adjustmnet was completed you will also receive and email due to the adjustment having a variation of ${Math.abs(
|
||||
theDiff,
|
||||
).toFixed(2)}%`,
|
||||
data: adj.data,
|
||||
};
|
||||
} else {
|
||||
return { success: adj.success, message: adj.message, data: adj.data };
|
||||
}
|
||||
};
|
||||
|
||||
@@ -2,99 +2,99 @@ import axios from "axios";
|
||||
import { prodEndpointCreation } from "../../../../globalUtils/createUrl.js";
|
||||
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
|
||||
|
||||
export const postAdjustment = async (data: any, prod: any) => {
|
||||
if (data.warehouseId === undefined) {
|
||||
return {
|
||||
sucess: false,
|
||||
message: `Missing mandatory field: warehouseID`,
|
||||
data: { error: `Missing mandatory field: warehouseID` },
|
||||
};
|
||||
}
|
||||
export const postAdjustment = async (data: any) => {
|
||||
if (data.warehouseId === undefined) {
|
||||
return {
|
||||
sucess: false,
|
||||
message: `Missing mandatory field: warehouseID`,
|
||||
data: { error: `Missing mandatory field: warehouseID` },
|
||||
};
|
||||
}
|
||||
|
||||
if (data.laneId === undefined) {
|
||||
return {
|
||||
sucess: false,
|
||||
message: `Missing mandatory field: locationID`,
|
||||
data: { error: `Missing mandatory field: locationID` },
|
||||
};
|
||||
}
|
||||
if (data.laneId === undefined) {
|
||||
return {
|
||||
sucess: false,
|
||||
message: `Missing mandatory field: locationID`,
|
||||
data: { error: `Missing mandatory field: locationID` },
|
||||
};
|
||||
}
|
||||
|
||||
if (data.quantity == "0") {
|
||||
return {
|
||||
sucess: false,
|
||||
message: `You entered 0 for the quantity to post, quantity needs to be at leave 1`,
|
||||
data: {
|
||||
error: `You entered 0 for the quantity to post, quantity needs to be at leave 1`,
|
||||
},
|
||||
};
|
||||
}
|
||||
if (data.quantity == "0") {
|
||||
return {
|
||||
sucess: false,
|
||||
message: `You entered 0 for the quantity to post, quantity needs to be at leave 1`,
|
||||
data: {
|
||||
error: `You entered 0 for the quantity to post, quantity needs to be at leave 1`,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
const siloAdjustment = {
|
||||
warehouseId: data.warehouseId,
|
||||
laneId: data.laneId,
|
||||
quantity: data.quantity,
|
||||
};
|
||||
const siloAdjustment = {
|
||||
warehouseId: data.warehouseId,
|
||||
laneId: data.laneId,
|
||||
quantity: data.quantity,
|
||||
};
|
||||
|
||||
let url = await prodEndpointCreation(
|
||||
"/public/v1.0/Warehousing/AdjustSiloStockLevel"
|
||||
);
|
||||
let url = await prodEndpointCreation(
|
||||
"/public/v1.0/Warehousing/AdjustSiloStockLevel",
|
||||
);
|
||||
|
||||
const { data: silo, error } = await tryCatch(
|
||||
axios.post(url, siloAdjustment, {
|
||||
headers: {
|
||||
"X-API-Key": process.env.TEC_API_KEY || "",
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
);
|
||||
let e = error as any;
|
||||
if (e) {
|
||||
console.log(e.response);
|
||||
if (e.status === 401) {
|
||||
const data = {
|
||||
success: false,
|
||||
message: `There was error posting the data: ${JSON.stringify(
|
||||
e.response?.data
|
||||
)}`,
|
||||
data: {
|
||||
status: e.response?.status,
|
||||
statusText: e.response?.statusText,
|
||||
data: e.response?.data,
|
||||
},
|
||||
};
|
||||
return data;
|
||||
} else {
|
||||
return {
|
||||
success: false,
|
||||
message: "Error in posting the silo adjustment.",
|
||||
data: {
|
||||
status: e.response?.status,
|
||||
statusText: e.response?.statusText,
|
||||
data: e.response?.data,
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
const { data: silo, error } = await tryCatch(
|
||||
axios.post(url, siloAdjustment, {
|
||||
headers: {
|
||||
"X-API-Key": process.env.TEC_API_KEY || "",
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
}),
|
||||
);
|
||||
let e = error as any;
|
||||
if (e) {
|
||||
console.log(e.response);
|
||||
if (e.status === 401) {
|
||||
const data = {
|
||||
success: false,
|
||||
message: `There was error posting the data: ${JSON.stringify(
|
||||
e.response?.data,
|
||||
)}`,
|
||||
data: {
|
||||
status: e.response?.status,
|
||||
statusText: e.response?.statusText,
|
||||
data: e.response?.data,
|
||||
},
|
||||
};
|
||||
return data;
|
||||
} else {
|
||||
return {
|
||||
success: false,
|
||||
message: "Error in posting the silo adjustment.",
|
||||
data: {
|
||||
status: e.response?.status,
|
||||
statusText: e.response?.statusText,
|
||||
data: e.response?.data,
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
if (silo?.status !== 200) {
|
||||
return {
|
||||
success: false,
|
||||
message: "Error in posting the silo adjustment",
|
||||
data: {
|
||||
status: silo?.status,
|
||||
statusText: silo?.statusText,
|
||||
data: silo?.data,
|
||||
},
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
success: true,
|
||||
message: "Adjustment was completed",
|
||||
data: {
|
||||
status: silo.status,
|
||||
statusText: silo.statusText,
|
||||
data: silo.data,
|
||||
},
|
||||
};
|
||||
}
|
||||
if (silo?.status !== 200) {
|
||||
return {
|
||||
success: false,
|
||||
message: "Error in posting the silo adjustment",
|
||||
data: {
|
||||
status: silo?.status,
|
||||
statusText: silo?.statusText,
|
||||
data: silo?.data,
|
||||
},
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
success: true,
|
||||
message: "Adjustment was completed",
|
||||
data: {
|
||||
status: silo.status,
|
||||
statusText: silo.statusText,
|
||||
data: silo.data,
|
||||
},
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi";
|
||||
import { responses } from "../../../../globalUtils/routeDefs/responses.js";
|
||||
import { ordersIn } from "../../controller/dm/ordersIn/ordersIn.js";
|
||||
import { verify } from "hono/jwt";
|
||||
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
|
||||
import { apiHit } from "../../../../globalUtils/apiHits.js";
|
||||
import { responses } from "../../../../globalUtils/routeDefs/responses.js";
|
||||
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
|
||||
import { authMiddleware } from "../../../auth/middleware/authMiddleware.js";
|
||||
import { ordersIn } from "../../controller/dm/ordersIn/ordersIn.js";
|
||||
|
||||
const app = new OpenAPIHono();
|
||||
|
||||
@@ -15,61 +16,53 @@ const app = new OpenAPIHono();
|
||||
// })
|
||||
// .openapi("User");
|
||||
app.openapi(
|
||||
createRoute({
|
||||
tags: ["logistics"],
|
||||
summary: "Post orders to DM",
|
||||
method: "post",
|
||||
path: "/postbulkorders",
|
||||
// request: {
|
||||
// body: {
|
||||
// content: {
|
||||
// "application/json": { schema: Body },
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
// description:
|
||||
// "Provided a running number and lot number you can consume material.",
|
||||
responses: responses(),
|
||||
}),
|
||||
async (c) => {
|
||||
apiHit(c, { endpoint: "/postbulkorders" });
|
||||
const body = await c.req.parseBody();
|
||||
const authHeader = c.req.header("Authorization");
|
||||
const token = authHeader?.split("Bearer ")[1] || "";
|
||||
//console.log(body); // File | string
|
||||
createRoute({
|
||||
tags: ["logistics"],
|
||||
summary: "Post orders to DM",
|
||||
method: "post",
|
||||
path: "/postbulkorders",
|
||||
middleware: authMiddleware,
|
||||
// request: {
|
||||
// body: {
|
||||
// content: {
|
||||
// "application/json": { schema: Body },
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
// description:
|
||||
// "Provided a running number and lot number you can consume material.",
|
||||
responses: responses(),
|
||||
}),
|
||||
async (c) => {
|
||||
apiHit(c, { endpoint: "/postbulkorders" });
|
||||
const body = await c.req.parseBody();
|
||||
//console.log(body); // File | string
|
||||
|
||||
// if (body["fileType"] === "standard") {
|
||||
// console.log(`doing standard orders in.`);
|
||||
// }
|
||||
const { data: payload, error: pe } = await tryCatch(
|
||||
verify(token, process.env.JWT_SECRET!)
|
||||
);
|
||||
// if (body["fileType"] === "standard") {
|
||||
// console.log(`doing standard orders in.`);
|
||||
// }
|
||||
|
||||
if (pe) {
|
||||
return c.json({ success: false, message: "Unauthorized" }, 401);
|
||||
}
|
||||
const { data: orders, error } = await tryCatch(
|
||||
ordersIn(body, c.get("user")),
|
||||
);
|
||||
|
||||
const { data: orders, error } = await tryCatch(
|
||||
ordersIn(body, payload.user)
|
||||
);
|
||||
if (error) {
|
||||
console.log(error);
|
||||
return c.json(
|
||||
{
|
||||
success: false,
|
||||
message: "Error posting Orders",
|
||||
data: error,
|
||||
},
|
||||
400,
|
||||
);
|
||||
}
|
||||
|
||||
if (error) {
|
||||
console.log(error);
|
||||
return c.json(
|
||||
{
|
||||
success: false,
|
||||
message: "Error posting Orders",
|
||||
data: error,
|
||||
},
|
||||
400
|
||||
);
|
||||
}
|
||||
|
||||
return c.json({
|
||||
success: orders?.success ?? false,
|
||||
message: orders?.message ?? "Error posting forecast",
|
||||
data: orders?.data ?? [],
|
||||
});
|
||||
}
|
||||
return c.json({
|
||||
success: orders?.success ?? false,
|
||||
message: orders?.message ?? "Error posting forecast",
|
||||
data: orders?.data ?? [],
|
||||
});
|
||||
},
|
||||
);
|
||||
export default app;
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi";
|
||||
import { responses } from "../../../../globalUtils/routeDefs/responses.js";
|
||||
import { ordersIn } from "../../controller/dm/ordersIn/ordersIn.js";
|
||||
import { verify } from "hono/jwt";
|
||||
import { forecastIn } from "../../controller/dm/forecast/forecastIn.js";
|
||||
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
|
||||
import { apiHit } from "../../../../globalUtils/apiHits.js";
|
||||
import { responses } from "../../../../globalUtils/routeDefs/responses.js";
|
||||
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
|
||||
import { authMiddleware } from "../../../auth/middleware/authMiddleware.js";
|
||||
import { forecastIn } from "../../controller/dm/forecast/forecastIn.js";
|
||||
import { ordersIn } from "../../controller/dm/ordersIn/ordersIn.js";
|
||||
|
||||
const app = new OpenAPIHono();
|
||||
|
||||
@@ -16,61 +17,54 @@ const app = new OpenAPIHono();
|
||||
// })
|
||||
// .openapi("User");
|
||||
app.openapi(
|
||||
createRoute({
|
||||
tags: ["logistics"],
|
||||
summary: "Post forecast to DM",
|
||||
method: "post",
|
||||
path: "/postforecastin",
|
||||
// request: {
|
||||
// body: {
|
||||
// content: {
|
||||
// "application/json": { schema: Body },
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
// description:
|
||||
// "Provided a running number and lot number you can consume material.",
|
||||
responses: responses(),
|
||||
}),
|
||||
async (c) => {
|
||||
apiHit(c, { endpoint: "/postforecastin" });
|
||||
const body = await c.req.parseBody();
|
||||
const authHeader = c.req.header("Authorization");
|
||||
const token = authHeader?.split("Bearer ")[1] || "";
|
||||
//console.log(body); // File | string
|
||||
createRoute({
|
||||
tags: ["logistics"],
|
||||
summary: "Post forecast to DM",
|
||||
method: "post",
|
||||
path: "/postforecastin",
|
||||
middleware: authMiddleware,
|
||||
// request: {
|
||||
// body: {
|
||||
// content: {
|
||||
// "application/json": { schema: Body },
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
// description:
|
||||
// "Provided a running number and lot number you can consume material.",
|
||||
responses: responses(),
|
||||
}),
|
||||
async (c) => {
|
||||
apiHit(c, { endpoint: "/postforecastin" });
|
||||
const body = await c.req.parseBody();
|
||||
|
||||
// if (body["fileType"] === "standard") {
|
||||
// console.log(`doing standard orders in.`);
|
||||
// }
|
||||
const { data: payload, error: pe } = await tryCatch(
|
||||
verify(token, process.env.JWT_SECRET!)
|
||||
);
|
||||
//console.log(body); // File | string
|
||||
|
||||
if (pe) {
|
||||
return c.json({ success: false, message: "Unauthorized" }, 401);
|
||||
}
|
||||
// if (body["fileType"] === "standard") {
|
||||
// console.log(`doing standard orders in.`);
|
||||
// }
|
||||
|
||||
const { data: orders, error } = await tryCatch(
|
||||
forecastIn(body, payload.user)
|
||||
);
|
||||
const { data: orders, error } = await tryCatch(
|
||||
forecastIn(body, c.get("user")),
|
||||
);
|
||||
|
||||
if (error) {
|
||||
console.log(error);
|
||||
return c.json(
|
||||
{
|
||||
success: false,
|
||||
message: "Error posting forecast",
|
||||
data: error,
|
||||
},
|
||||
400
|
||||
);
|
||||
}
|
||||
if (error) {
|
||||
console.log(error);
|
||||
return c.json(
|
||||
{
|
||||
success: false,
|
||||
message: "Error posting forecast",
|
||||
data: error,
|
||||
},
|
||||
400,
|
||||
);
|
||||
}
|
||||
|
||||
return c.json({
|
||||
success: orders?.success ?? false,
|
||||
message: orders?.message ?? "Error posting forecast",
|
||||
data: orders?.data ?? [],
|
||||
});
|
||||
}
|
||||
return c.json({
|
||||
success: orders?.success ?? false,
|
||||
message: orders?.message ?? "Error posting forecast",
|
||||
data: orders?.data ?? [],
|
||||
});
|
||||
},
|
||||
);
|
||||
export default app;
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi";
|
||||
import { format } from "date-fns";
|
||||
import { responses } from "../../../../globalUtils/routeDefs/responses.js";
|
||||
import { standardTemplate } from "../../controller/dm/ordersIn/createTemplate.js";
|
||||
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
|
||||
import { standardForCastTemplate } from "../../controller/dm/forecast/createTemplate.js";
|
||||
import { apiHit } from "../../../../globalUtils/apiHits.js";
|
||||
import { responses } from "../../../../globalUtils/routeDefs/responses.js";
|
||||
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
|
||||
|
||||
import { standardForCastTemplate } from "../../controller/dm/forecast/createTemplate.js";
|
||||
|
||||
const app = new OpenAPIHono();
|
||||
|
||||
@@ -16,52 +16,52 @@ const app = new OpenAPIHono();
|
||||
// })
|
||||
// .openapi("User");
|
||||
app.openapi(
|
||||
createRoute({
|
||||
tags: ["logistics"],
|
||||
summary: "Gets the standard Forecast Template",
|
||||
method: "get",
|
||||
path: "/bulkforcasttemplate",
|
||||
// request: {
|
||||
// body: {
|
||||
// content: {
|
||||
// "application/json": { schema: Body },
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
// description:
|
||||
// "Provided a running number and lot number you can consume material.",
|
||||
responses: responses(),
|
||||
}),
|
||||
async (c: any) => {
|
||||
apiHit(c, { endpoint: "/bulkforcasttemplate" });
|
||||
const defaultFilename = `bulkForcastTemplate-${format(
|
||||
new Date(Date.now()),
|
||||
"M-d-yyyy"
|
||||
)}.xlsx`;
|
||||
const filename = c.req.query("filename") || defaultFilename;
|
||||
const { data, error } = await tryCatch(standardForCastTemplate());
|
||||
createRoute({
|
||||
tags: ["logistics"],
|
||||
summary: "Gets the standard Forecast Template",
|
||||
method: "get",
|
||||
path: "/bulkforcasttemplate",
|
||||
// request: {
|
||||
// body: {
|
||||
// content: {
|
||||
// "application/json": { schema: Body },
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
// description:
|
||||
// "Provided a running number and lot number you can consume material.",
|
||||
responses: responses(),
|
||||
}),
|
||||
async (c: any) => {
|
||||
apiHit(c, { endpoint: "/bulkforcasttemplate" });
|
||||
const defaultFilename = `bulkForcastTemplate-${format(
|
||||
new Date(Date.now()),
|
||||
"M-d-yyyy",
|
||||
)}.xlsx`;
|
||||
const filename = c.req.query("filename") || defaultFilename;
|
||||
const { data, error } = await tryCatch(standardForCastTemplate());
|
||||
|
||||
if (error) {
|
||||
return c.json({
|
||||
success: false,
|
||||
message: "Error creating template",
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
if (error) {
|
||||
return c.json({
|
||||
success: false,
|
||||
message: "Error creating template",
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
|
||||
return new Response(data, {
|
||||
headers: {
|
||||
"Content-Type":
|
||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||
"Content-Disposition": `attachment; filename="${filename}"`,
|
||||
},
|
||||
});
|
||||
return new Response(data, {
|
||||
headers: {
|
||||
"Content-Type":
|
||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||
"Content-Disposition": `attachment; filename="${filename}"`,
|
||||
},
|
||||
});
|
||||
|
||||
// return c.json({
|
||||
// success: data.success,
|
||||
// message: data.message,
|
||||
// data: data.data,
|
||||
// });
|
||||
}
|
||||
// return c.json({
|
||||
// success: data.success,
|
||||
// message: data.message,
|
||||
// data: data.data,
|
||||
// });
|
||||
},
|
||||
);
|
||||
export default app;
|
||||
|
||||
@@ -1,78 +1,74 @@
|
||||
import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi";
|
||||
import { verify } from "hono/jwt";
|
||||
import { authMiddleware } from "../../../auth/middleware/authMiddleware.js";
|
||||
import { responses } from "../../../../globalUtils/routeDefs/responses.js";
|
||||
import { createSiloAdjustment } from "../../controller/siloAdjustments/createSiloAdjustment.js";
|
||||
import { apiHit } from "../../../../globalUtils/apiHits.js";
|
||||
import { responses } from "../../../../globalUtils/routeDefs/responses.js";
|
||||
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
|
||||
import { authMiddleware } from "../../../auth/middleware/authMiddleware.js";
|
||||
import { createSiloAdjustment } from "../../controller/siloAdjustments/createSiloAdjustment.js";
|
||||
|
||||
const app = new OpenAPIHono();
|
||||
|
||||
const responseSchema = z.object({
|
||||
success: z.boolean().optional().openapi({ example: true }),
|
||||
message: z.string().optional().openapi({ example: "user access" }),
|
||||
success: z.boolean().optional().openapi({ example: true }),
|
||||
message: z.string().optional().openapi({ example: "user access" }),
|
||||
});
|
||||
|
||||
app.openapi(
|
||||
createRoute({
|
||||
tags: ["logistics"],
|
||||
summary: "Creates silo adjustmennt",
|
||||
method: "post",
|
||||
path: "/createsiloadjustment",
|
||||
middleware: authMiddleware,
|
||||
description:
|
||||
"Creates a silo adjustment for the silo if and stores the stock numbers.",
|
||||
responses: responses(),
|
||||
}),
|
||||
async (c) => {
|
||||
const { data, error } = await tryCatch(c.req.json());
|
||||
createRoute({
|
||||
tags: ["logistics"],
|
||||
summary: "Creates silo adjustmennt",
|
||||
method: "post",
|
||||
path: "/createsiloadjustment",
|
||||
middleware: authMiddleware,
|
||||
description:
|
||||
"Creates a silo adjustment for the silo if and stores the stock numbers.",
|
||||
responses: responses(),
|
||||
}),
|
||||
async (c) => {
|
||||
const { data, error } = await tryCatch(c.req.json());
|
||||
|
||||
if (error) {
|
||||
return c.json(
|
||||
{
|
||||
success: false,
|
||||
message: "Missing data please try again",
|
||||
error,
|
||||
},
|
||||
400
|
||||
);
|
||||
}
|
||||
apiHit(c, { endpoint: "/createsiloadjustment", lastBody: data });
|
||||
const authHeader = c.req.header("Authorization");
|
||||
const token = authHeader?.split("Bearer ")[1] || "";
|
||||
if (error) {
|
||||
return c.json(
|
||||
{
|
||||
success: false,
|
||||
message: "Missing data please try again",
|
||||
error,
|
||||
},
|
||||
400,
|
||||
);
|
||||
}
|
||||
apiHit(c, { endpoint: "/createsiloadjustment", lastBody: data });
|
||||
|
||||
try {
|
||||
const payload = await verify(token, process.env.JWT_SECRET!);
|
||||
try {
|
||||
//return apiReturn(c, true, access?.message, access?.data, 200);
|
||||
const createSiloAdj = await createSiloAdjustment(
|
||||
data,
|
||||
payload.user
|
||||
);
|
||||
const user = c.get("user");
|
||||
|
||||
return c.json(
|
||||
{
|
||||
success: createSiloAdj.success,
|
||||
message: createSiloAdj.message,
|
||||
data: createSiloAdj.data,
|
||||
},
|
||||
200
|
||||
);
|
||||
} catch (error) {
|
||||
//console.log(error);
|
||||
//return apiReturn(c, false, "Error in setting the user access", error, 400);
|
||||
return c.json(
|
||||
{
|
||||
success: false,
|
||||
message: "Missing data please try again",
|
||||
error,
|
||||
},
|
||||
400
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
return c.json({ success: false, message: "Unauthorized" }, 401);
|
||||
}
|
||||
}
|
||||
try {
|
||||
try {
|
||||
//return apiReturn(c, true, access?.message, access?.data, 200);
|
||||
const createSiloAdj = await createSiloAdjustment(data, c.get("user"));
|
||||
|
||||
return c.json(
|
||||
{
|
||||
success: createSiloAdj.success,
|
||||
message: createSiloAdj.message,
|
||||
data: createSiloAdj.data,
|
||||
},
|
||||
200,
|
||||
);
|
||||
} catch (error) {
|
||||
//console.log(error);
|
||||
//return apiReturn(c, false, "Error in setting the user access", error, 400);
|
||||
return c.json(
|
||||
{
|
||||
success: false,
|
||||
message: "Missing data please try again",
|
||||
error,
|
||||
},
|
||||
400,
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
return c.json({ success: false, message: "Unauthorized" }, 401);
|
||||
}
|
||||
},
|
||||
);
|
||||
export default app;
|
||||
|
||||
@@ -1,88 +1,85 @@
|
||||
import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi";
|
||||
import { verify } from "hono/jwt";
|
||||
import { authMiddleware } from "../../../auth/middleware/authMiddleware.js";
|
||||
import { apiHit } from "../../../../globalUtils/apiHits.js";
|
||||
import { responses } from "../../../../globalUtils/routeDefs/responses.js";
|
||||
import { authMiddleware } from "../../../auth/middleware/authMiddleware.js";
|
||||
import { createSiloAdjustment } from "../../controller/siloAdjustments/createSiloAdjustment.js";
|
||||
import { postSiloComment } from "../../controller/siloAdjustments/postComment.js";
|
||||
import { apiHit } from "../../../../globalUtils/apiHits.js";
|
||||
|
||||
const app = new OpenAPIHono();
|
||||
|
||||
const ParamsSchema = z.object({
|
||||
adjId: z
|
||||
.string()
|
||||
.min(3)
|
||||
.openapi({
|
||||
param: {
|
||||
name: "adjId",
|
||||
in: "path",
|
||||
},
|
||||
example: "3b555052-a960-4301-8d38-a6f1acb98dbe",
|
||||
}),
|
||||
adjId: z
|
||||
.string()
|
||||
.min(3)
|
||||
.openapi({
|
||||
param: {
|
||||
name: "adjId",
|
||||
in: "path",
|
||||
},
|
||||
example: "3b555052-a960-4301-8d38-a6f1acb98dbe",
|
||||
}),
|
||||
});
|
||||
|
||||
const Body = z.object({
|
||||
comment: z
|
||||
.string()
|
||||
.openapi({ example: "Reason to why i had a badd adjustment." }),
|
||||
comment: z
|
||||
.string()
|
||||
.openapi({ example: "Reason to why i had a badd adjustment." }),
|
||||
});
|
||||
|
||||
app.openapi(
|
||||
createRoute({
|
||||
tags: ["logistics"],
|
||||
summary: "Post a comment to why you had a discrepancy",
|
||||
method: "post",
|
||||
path: "/postcomment/:adjId",
|
||||
middleware: authMiddleware,
|
||||
request: {
|
||||
params: ParamsSchema,
|
||||
body: { content: { "application/json": { schema: Body } } },
|
||||
},
|
||||
// description:
|
||||
// "Creates a silo adjustment for the silo if and stores the stock numbers.",
|
||||
responses: responses(),
|
||||
}),
|
||||
async (c: any) => {
|
||||
apiHit(c, { endpoint: "/postcomment" });
|
||||
const authHeader = c.req.header("Authorization");
|
||||
const token = authHeader?.split("Bearer ")[1] || "";
|
||||
const { adjId } = c.req.valid("param");
|
||||
createRoute({
|
||||
tags: ["logistics"],
|
||||
summary: "Post a comment to why you had a discrepancy",
|
||||
method: "post",
|
||||
path: "/postcomment/:adjId",
|
||||
middleware: authMiddleware,
|
||||
request: {
|
||||
params: ParamsSchema,
|
||||
body: { content: { "application/json": { schema: Body } } },
|
||||
},
|
||||
// description:
|
||||
// "Creates a silo adjustment for the silo if and stores the stock numbers.",
|
||||
responses: responses(),
|
||||
}),
|
||||
async (c: any) => {
|
||||
apiHit(c, { endpoint: "/postcomment" });
|
||||
const { adjId } = c.req.valid("param");
|
||||
|
||||
try {
|
||||
const payload = await verify(token, process.env.JWT_SECRET!);
|
||||
try {
|
||||
//return apiReturn(c, true, access?.message, access?.data, 200);
|
||||
const data = await c.req.json();
|
||||
try {
|
||||
try {
|
||||
//return apiReturn(c, true, access?.message, access?.data, 200);
|
||||
const data = await c.req.json();
|
||||
|
||||
const addComment = await postSiloComment(
|
||||
adjId,
|
||||
data.comment,
|
||||
data.key,
|
||||
payload.user
|
||||
);
|
||||
const addComment = await postSiloComment(
|
||||
adjId,
|
||||
data.comment,
|
||||
data.key,
|
||||
c.get("user"),
|
||||
);
|
||||
|
||||
console.log(addComment);
|
||||
return c.json(
|
||||
{
|
||||
success: addComment.success,
|
||||
message: addComment.message,
|
||||
data: addComment.data,
|
||||
},
|
||||
200
|
||||
);
|
||||
} catch (error) {
|
||||
return c.json(
|
||||
{
|
||||
success: false,
|
||||
message: "Missing data please try again",
|
||||
error,
|
||||
},
|
||||
400
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
return c.json({ success: false, message: "Unauthorized" }, 401);
|
||||
}
|
||||
}
|
||||
console.log(addComment);
|
||||
return c.json(
|
||||
{
|
||||
success: addComment.success,
|
||||
message: addComment.message,
|
||||
data: addComment.data,
|
||||
},
|
||||
200,
|
||||
);
|
||||
} catch (error) {
|
||||
return c.json(
|
||||
{
|
||||
success: false,
|
||||
message: "Missing data please try again",
|
||||
error,
|
||||
},
|
||||
400,
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
return c.json({ success: false, message: "Unauthorized" }, 401);
|
||||
}
|
||||
},
|
||||
);
|
||||
export default app;
|
||||
|
||||
@@ -1,31 +1,33 @@
|
||||
// an external way to creating logs
|
||||
import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi";
|
||||
import { responses } from "../../../globalUtils/routeDefs/responses.js";
|
||||
import { getAllJobs } from "../utils/processNotifications.js";
|
||||
import { apiHit } from "../../../globalUtils/apiHits.js";
|
||||
import { responses } from "../../../globalUtils/routeDefs/responses.js";
|
||||
import { authMiddleware } from "../../auth/middleware/authMiddleware.js";
|
||||
import hasCorrectRole from "../../auth/middleware/roleCheck.js";
|
||||
import { getAllJobs } from "../utils/processNotifications.js";
|
||||
|
||||
const app = new OpenAPIHono({ strict: false });
|
||||
|
||||
app.openapi(
|
||||
createRoute({
|
||||
tags: ["server"],
|
||||
summary: "Returns current active notifications.",
|
||||
method: "get",
|
||||
path: "/activenotifications",
|
||||
//middleware: authMiddleware,
|
||||
responses: responses(),
|
||||
}),
|
||||
async (c) => {
|
||||
apiHit(c, { endpoint: "/activenotifications" });
|
||||
const jobs = getAllJobs();
|
||||
return c.json({
|
||||
success: true,
|
||||
message:
|
||||
jobs.length === 0
|
||||
? "There are no active Notifications Currently."
|
||||
: "Current Active notifications",
|
||||
data: jobs,
|
||||
});
|
||||
}
|
||||
createRoute({
|
||||
tags: ["server"],
|
||||
summary: "Returns current active notifications.",
|
||||
method: "get",
|
||||
path: "/activenotifications",
|
||||
middleware: [authMiddleware, hasCorrectRole(["systemAdmin"], "admin")],
|
||||
responses: responses(),
|
||||
}),
|
||||
async (c) => {
|
||||
apiHit(c, { endpoint: "/activenotifications" });
|
||||
const jobs = getAllJobs();
|
||||
return c.json({
|
||||
success: true,
|
||||
message:
|
||||
jobs.length === 0
|
||||
? "There are no active Notifications Currently."
|
||||
: "Current Active notifications",
|
||||
data: jobs,
|
||||
});
|
||||
},
|
||||
);
|
||||
export default app;
|
||||
|
||||
@@ -6,253 +6,254 @@
|
||||
import { db } from "../../../../database/dbclient.js";
|
||||
import { subModules } from "../../../../database/schema/subModules.js";
|
||||
import { createLog } from "../../logger/logger.js";
|
||||
|
||||
// "view", "technician", "supervisor","manager", "admin", "systemAdmin"
|
||||
const newSubModules = [
|
||||
{
|
||||
name: "RFID",
|
||||
moduleName: "prodcution",
|
||||
description: "RFID stuff",
|
||||
link: "/rfid",
|
||||
icon: "Tags",
|
||||
active: true,
|
||||
roles: [
|
||||
"viewer",
|
||||
"technician",
|
||||
"supervisor",
|
||||
"manager",
|
||||
"admin",
|
||||
"systemAdmin",
|
||||
],
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Silo Adjustments",
|
||||
moduleName: "logistics",
|
||||
description: "Do a silo adjustmnet",
|
||||
link: "/siloAdjustments",
|
||||
icon: "Cylinder",
|
||||
active: false,
|
||||
roles: ["technician", "supervisor", "manager", "admin", "systemAdmin"],
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Demand Management",
|
||||
moduleName: "logistics",
|
||||
description: "Bulk order and Forecast imports",
|
||||
link: "/dm",
|
||||
icon: "Truck",
|
||||
roles: ["technician", "supervisor", "manager", "admin", "systemAdmin"],
|
||||
active: false,
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Forecast",
|
||||
moduleName: "logistics",
|
||||
description: "",
|
||||
link: "#",
|
||||
icon: "Truck",
|
||||
roles: ["systemAdmin"],
|
||||
active: false,
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Material Helper",
|
||||
moduleName: "logistics",
|
||||
description: "",
|
||||
link: "/materialHelper/consumption",
|
||||
icon: "Package",
|
||||
roles: [
|
||||
"viewer",
|
||||
"technician",
|
||||
"supervisor",
|
||||
"manager",
|
||||
"admin",
|
||||
"systemAdmin",
|
||||
],
|
||||
active: false,
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Ocme Cyclecount",
|
||||
moduleName: "logistics",
|
||||
description: "",
|
||||
link: "/cyclecount",
|
||||
icon: "Package",
|
||||
roles: ["technician", "supervisor", "manager", "admin", "systemAdmin"],
|
||||
active: false,
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Open Orders",
|
||||
moduleName: "logistics",
|
||||
description: "Open orders",
|
||||
link: "/openOrders",
|
||||
icon: "Truck",
|
||||
roles: [
|
||||
"viewer",
|
||||
"technician",
|
||||
"supervisor",
|
||||
"manager",
|
||||
"admin",
|
||||
"systemAdmin",
|
||||
],
|
||||
active: false,
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Barcodes",
|
||||
moduleName: "logistics",
|
||||
description: "Barcodes, lanes and scanable",
|
||||
link: "/barcodegen",
|
||||
icon: "Barcode",
|
||||
roles: [
|
||||
"viewer",
|
||||
"technician",
|
||||
"supervisor",
|
||||
"manager",
|
||||
"admin",
|
||||
"systemAdmin",
|
||||
],
|
||||
active: true,
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Helper Commands",
|
||||
moduleName: "logistics",
|
||||
description: "Commands to assist when a scanner is not avalible",
|
||||
link: "/helpercommands",
|
||||
icon: "Command",
|
||||
roles: ["technician", "supervisor", "manager", "admin", "systemAdmin"],
|
||||
active: true,
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "RFID",
|
||||
moduleName: "prodcution",
|
||||
description: "RFID stuff",
|
||||
link: "/rfid",
|
||||
icon: "Tags",
|
||||
active: true,
|
||||
roles: [
|
||||
"viewer",
|
||||
"technician",
|
||||
"supervisor",
|
||||
"manager",
|
||||
"admin",
|
||||
"systemAdmin",
|
||||
],
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "siloAdjustments",
|
||||
moduleName: "logistics",
|
||||
description: "Do a silo adjustments",
|
||||
link: "/siloAdjustments",
|
||||
icon: "Cylinder",
|
||||
active: false,
|
||||
roles: ["technician", "supervisor", "manager", "admin", "systemAdmin"],
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "demandManagement",
|
||||
moduleName: "logistics",
|
||||
description: "Bulk order and Forecast imports",
|
||||
link: "/dm",
|
||||
icon: "Truck",
|
||||
roles: ["technician", "supervisor", "manager", "admin", "systemAdmin"],
|
||||
active: false,
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Forecast",
|
||||
moduleName: "logistics",
|
||||
description: "",
|
||||
link: "#",
|
||||
icon: "Truck",
|
||||
roles: ["systemAdmin"],
|
||||
active: false,
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Material Helper",
|
||||
moduleName: "logistics",
|
||||
description: "",
|
||||
link: "/materialHelper/consumption",
|
||||
icon: "Package",
|
||||
roles: [
|
||||
"viewer",
|
||||
"technician",
|
||||
"supervisor",
|
||||
"manager",
|
||||
"admin",
|
||||
"systemAdmin",
|
||||
],
|
||||
active: false,
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Ocme Cyclecount",
|
||||
moduleName: "logistics",
|
||||
description: "",
|
||||
link: "/cyclecount",
|
||||
icon: "Package",
|
||||
roles: ["technician", "supervisor", "manager", "admin", "systemAdmin"],
|
||||
active: false,
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Open Orders",
|
||||
moduleName: "logistics",
|
||||
description: "Open orders",
|
||||
link: "/openOrders",
|
||||
icon: "Truck",
|
||||
roles: [
|
||||
"viewer",
|
||||
"technician",
|
||||
"supervisor",
|
||||
"manager",
|
||||
"admin",
|
||||
"systemAdmin",
|
||||
],
|
||||
active: false,
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Barcodes",
|
||||
moduleName: "logistics",
|
||||
description: "Barcodes, lanes and scanable",
|
||||
link: "/barcodegen",
|
||||
icon: "Barcode",
|
||||
roles: [
|
||||
"viewer",
|
||||
"technician",
|
||||
"supervisor",
|
||||
"manager",
|
||||
"admin",
|
||||
"systemAdmin",
|
||||
],
|
||||
active: true,
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Helper Commands",
|
||||
moduleName: "logistics",
|
||||
description: "Commands to assist when a scanner is not avalible",
|
||||
link: "/helpercommands",
|
||||
icon: "Command",
|
||||
roles: ["technician", "supervisor", "manager", "admin", "systemAdmin"],
|
||||
active: true,
|
||||
subSubModule: [],
|
||||
},
|
||||
|
||||
// admin module
|
||||
{
|
||||
name: "Servers",
|
||||
moduleName: "admin",
|
||||
description: "Do a silo adjustmnet",
|
||||
link: "/servers",
|
||||
icon: "Server",
|
||||
roles: ["tester", "systemAdmin"],
|
||||
isActive: true,
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Admin",
|
||||
moduleName: "admin",
|
||||
description: "Do a silo adjustmnet",
|
||||
link: "#", // when link is # this will mean its a button
|
||||
icon: "ShieldCheck",
|
||||
active: true,
|
||||
roles: ["tester", "admin", "systemAdmin"],
|
||||
subSubModule: [
|
||||
{
|
||||
name: "Settings",
|
||||
link: "/settings",
|
||||
icon: "Settings",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "Modules",
|
||||
link: "/modules",
|
||||
icon: "Settings",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "Sub Modules",
|
||||
link: "/subModules",
|
||||
icon: "Settings",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "Notifcations",
|
||||
link: "notificationMGT",
|
||||
icon: "Webhook",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "Swagger",
|
||||
link: "#",
|
||||
icon: "Webhook",
|
||||
newWindow: true,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "Logs",
|
||||
link: "#",
|
||||
icon: "Logs",
|
||||
newWindow: false,
|
||||
isActive: false,
|
||||
},
|
||||
{
|
||||
name: "Users",
|
||||
link: "/users",
|
||||
icon: "Users",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "Prod Perms",
|
||||
link: "/produsers",
|
||||
icon: "Users",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "UCD",
|
||||
link: "https://ucd.alpla.net:8443/",
|
||||
icon: "Atom",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "Lst Api",
|
||||
link: "/api/docs",
|
||||
icon: "Webhook",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
// admin module
|
||||
{
|
||||
name: "Servers",
|
||||
moduleName: "admin",
|
||||
description: "Do a silo adjustmnet",
|
||||
link: "/servers",
|
||||
icon: "Server",
|
||||
roles: ["tester", "systemAdmin"],
|
||||
isActive: true,
|
||||
subSubModule: [],
|
||||
},
|
||||
{
|
||||
name: "Admin",
|
||||
moduleName: "admin",
|
||||
description: "Do a silo adjustmnet",
|
||||
link: "#", // when link is # this will mean its a button
|
||||
icon: "ShieldCheck",
|
||||
active: true,
|
||||
roles: ["tester", "admin", "systemAdmin"],
|
||||
subSubModule: [
|
||||
{
|
||||
name: "Settings",
|
||||
link: "/settings",
|
||||
icon: "Settings",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "Modules",
|
||||
link: "/modules",
|
||||
icon: "Settings",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "Sub Modules",
|
||||
link: "/subModules",
|
||||
icon: "Settings",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "Notifcations",
|
||||
link: "notificationMGT",
|
||||
icon: "Webhook",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "Swagger",
|
||||
link: "#",
|
||||
icon: "Webhook",
|
||||
newWindow: true,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "Logs",
|
||||
link: "#",
|
||||
icon: "Logs",
|
||||
newWindow: false,
|
||||
isActive: false,
|
||||
},
|
||||
{
|
||||
name: "Users",
|
||||
link: "/users",
|
||||
icon: "Users",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "Prod Perms",
|
||||
link: "/produsers",
|
||||
icon: "Users",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "UCD",
|
||||
link: "https://ucd.alpla.net:8443/",
|
||||
icon: "Atom",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
name: "Lst Api",
|
||||
link: "/api/docs",
|
||||
icon: "Webhook",
|
||||
newWindow: false,
|
||||
isActive: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
export const areSubModulesIn = async () => {
|
||||
try {
|
||||
for (let i = 0; i < newSubModules.length; i++) {
|
||||
const subModuleUpdate = await db
|
||||
.insert(subModules)
|
||||
.values(newSubModules[i])
|
||||
.onConflictDoUpdate({
|
||||
target: subModules.name,
|
||||
set: {
|
||||
name: newSubModules[i].name,
|
||||
moduleName: newSubModules[i].moduleName,
|
||||
description: newSubModules[i].description,
|
||||
roles: newSubModules[i].roles,
|
||||
link: newSubModules[i].link,
|
||||
subSubModule: newSubModules[i].subSubModule,
|
||||
icon: newSubModules[i].icon,
|
||||
},
|
||||
}) // this will only update the ones that are new :D
|
||||
.returning({ name: subModules.name });
|
||||
}
|
||||
createLog(
|
||||
"info",
|
||||
"lst",
|
||||
"server",
|
||||
"SubModules were just added due to missing them on server startup"
|
||||
);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
createLog(
|
||||
"error",
|
||||
"lst",
|
||||
"server",
|
||||
"There was an error adding new subModules to the db"
|
||||
);
|
||||
}
|
||||
try {
|
||||
for (let i = 0; i < newSubModules.length; i++) {
|
||||
const subModuleUpdate = await db
|
||||
.insert(subModules)
|
||||
.values(newSubModules[i])
|
||||
.onConflictDoUpdate({
|
||||
target: subModules.name,
|
||||
set: {
|
||||
name: newSubModules[i].name,
|
||||
moduleName: newSubModules[i].moduleName,
|
||||
description: newSubModules[i].description,
|
||||
roles: newSubModules[i].roles,
|
||||
link: newSubModules[i].link,
|
||||
subSubModule: newSubModules[i].subSubModule,
|
||||
icon: newSubModules[i].icon,
|
||||
},
|
||||
}) // this will only update the ones that are new :D
|
||||
.returning({ name: subModules.name });
|
||||
}
|
||||
createLog(
|
||||
"info",
|
||||
"lst",
|
||||
"server",
|
||||
"SubModules were just added due to missing them on server startup",
|
||||
);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
createLog(
|
||||
"error",
|
||||
"lst",
|
||||
"server",
|
||||
"There was an error adding new subModules to the db",
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user