diff --git a/lstV2/server/services/auth/controllers/login.ts b/lstV2/server/services/auth/controllers/login.ts index 891eb61..3eb8bca 100644 --- a/lstV2/server/services/auth/controllers/login.ts +++ b/lstV2/server/services/auth/controllers/login.ts @@ -1,22 +1,27 @@ import jwt from "jsonwebtoken"; -import {db} from "../../../../database/dbclient.js"; -import {users} from "../../../../database/schema/users.js"; -import {eq, sql} from "drizzle-orm"; -import {checkPassword} from "../utils/checkPassword.js"; -import {roleCheck} from "./userRoles/getUserAccess.js"; -import {createLog} from "../../logger/logger.js"; -import {differenceInDays} from "date-fns"; +import { db } from "../../../../database/dbclient.js"; +import { users } from "../../../../database/schema/users.js"; +import { eq, sql } from "drizzle-orm"; +import { checkPassword } from "../utils/checkPassword.js"; +import { roleCheck } from "./userRoles/getUserAccess.js"; +import { createLog } from "../../logger/logger.js"; +import { differenceInDays } from "date-fns"; +import { tryCatch } from "../../../globalUtils/tryCatch.js"; +import { settings } from "../../../../database/schema/settings.js"; /** * Authenticate a user and return a JWT. */ -const {sign} = jwt; +const { sign } = jwt; export async function login( username: string, password: string -): Promise<{token: string; user: {user_id: string; username: string}}> { - const user = await db.select().from(users).where(eq(users.username, username)); +): Promise<{ token: string; user: { user_id: string; username: string } }> { + const user = await db + .select() + .from(users) + .where(eq(users.username, username)); //console.log(user); if (user.length === 0) { @@ -47,24 +52,46 @@ export async function login( // update the user last login try { const lastLog = await db - .update(users) - .set({lastLogin: sql`NOW()`}) - .where(eq(users.user_id, user[0].user_id)) - .returning({lastLogin: users.lastLogin}); + .update(users) + .set({ lastLogin: sql`NOW()` }) + .where(eq(users.user_id, user[0].user_id)) + .returning({ lastLogin: users.lastLogin }); createLog( "info", "lst", "auth", - `Its been ${differenceInDays(lastLog[0]?.lastLogin ?? "", new Date(Date.now()))} days since ${ - user[0].username - } has logged in` + `Its been ${differenceInDays( + lastLog[0]?.lastLogin ?? "", + new Date(Date.now()) + )} days since ${user[0].username} has logged in` ); //]); } catch (error) { - createLog("error", "lst", "auth", "There was an error updating the user last login"); + createLog( + "error", + "lst", + "auth", + "There was an error updating the user last login" + ); } - const token = sign({user: userData}, secret, {expiresIn: expiresIn * 60}); + const token = sign({ user: userData }, secret, { + expiresIn: expiresIn * 60, + }); - return {token, user: userData}; + return { token, user: userData }; } + +// export const login = async (username: string, password: string) => { +// // get the settings so we know what server to call. +// const { data, error } = (await tryCatch(db.select().from(settings))) as any; + +// if (error) { +// return { +// success: false, +// message: "Failed to get settings", +// data: error, +// }; +// } + +// }; diff --git a/lstV2/server/services/dataMart/controller/forecastByAvs.ts b/lstV2/server/services/dataMart/controller/forecastByAvs.ts new file mode 100644 index 0000000..3402c85 --- /dev/null +++ b/lstV2/server/services/dataMart/controller/forecastByAvs.ts @@ -0,0 +1,47 @@ +import { tryCatch } from "../../../globalUtils/tryCatch.js"; +import { createLog } from "../../logger/logger.js"; +import { query } from "../../sqlServer/prodSqlServer.js"; +import { forecastByAvs } from "../../sqlServer/querys/dataMart/forecast.js"; + +// type ArticleData = { +// id: string +// } +export const getForecastByAv = async (avs: string) => { + let articles: any = []; + + if (!avs) { + return { + success: false, + message: `Missing av's please send at least one over`, + data: [], + }; + } + + const { data, error } = (await tryCatch( + query(forecastByAvs.replace("[articles]", avs), "ForecastData by av") + )) as any; + + if (error) { + createLog( + "error", + "datamart", + "datamart", + `There was an error getting the forecast info: ${JSON.stringify( + error + )}` + ); + return { + success: false, + messsage: `There was an error getting the forecast info`, + data: error, + }; + } + + articles = data.data; + + return { + success: true, + message: "Forecast Data", + data: articles, + }; +}; diff --git a/lstV2/server/services/dataMart/controller/getDeliveryByDateRangeAndAv.ts b/lstV2/server/services/dataMart/controller/getDeliveryByDateRangeAndAv.ts new file mode 100644 index 0000000..d3f17bc --- /dev/null +++ b/lstV2/server/services/dataMart/controller/getDeliveryByDateRangeAndAv.ts @@ -0,0 +1,84 @@ +import { query } from "../../sqlServer/prodSqlServer.js"; +import { deliveryByDateRangeAndAv } from "../../sqlServer/querys/dataMart/deleveryByDateRange.js"; +import { addDays, format } from "date-fns"; + +export const getDeliveryByDateRangeAndAv = async ( + avs: string, + startDate: string, + endDate: string +) => { + // const { data: plantToken, error: plantError } = await tryCatch( + // db.select().from(settings).where(eq(settings.name, "plantToken")) + // ); + // if (plantError) { + // return { + // success: false, + // message: "Error getting Settings", + // data: plantError, + // }; + // } + let deliverys: any = []; + + let updatedQuery = deliveryByDateRangeAndAv; + + // start days can be sent over + if (startDate) { + updatedQuery = updatedQuery.replaceAll("[startDate]", startDate); + } else { + updatedQuery = updatedQuery.replaceAll("[startDate]", "1990-1-1"); + } + + // end days can be sent over + if (endDate) { + updatedQuery = updatedQuery.replaceAll("[endDate]", endDate); + } else { + const defaultEndDate = format( + addDays(new Date(Date.now()), 5), + "yyyy-M-d" + ); + updatedQuery = updatedQuery.replaceAll("[endDate]", defaultEndDate); + } + + try { + const res: any = await query( + updatedQuery.replace("[articles]", avs), + "Get Delivery by date range" + ); + deliverys = res.data; + //console.log(res.data); + } catch (error) { + console.log(error); + return { + success: false, + message: "All Deliveries within the range.", + data: error, + }; + } + + // if (!data) { + // deliverys = deliverys.splice(1000, 0); + // } + // add plant token in + // const pOrders = deliverys.map((item: any) => { + // // const dateCon = new Date(item.loadingDate).toLocaleString("en-US", { + // // month: "numeric", + // // day: "numeric", + // // year: "numeric", + // // hour: "2-digit", + // // minute: "2-digit", + // // hour12: false, + // // }); + + // //const dateCon = new Date(item.loadingDate).toISOString().replace("T", " ").split(".")[0]; + // const dateCon = new Date(item.loadingDate).toISOString().split("T")[0]; + // //const delDate = new Date(item.deliveryDate).toISOString().replace("T", " ").split(".")[0]; + // const delDate = new Date(item.deliveryDate).toISOString().split("T")[0]; + // return { + // plantToken: plantToken[0].value, + // ...item, + // loadingDate: dateCon, + // deliveryDate: delDate, + // }; + // }); + return { success: true, message: "Current open orders", data: deliverys }; +}; diff --git a/lstV2/server/services/dataMart/dataMartService.ts b/lstV2/server/services/dataMart/dataMartService.ts index ae6d01d..75c227f 100644 --- a/lstV2/server/services/dataMart/dataMartService.ts +++ b/lstV2/server/services/dataMart/dataMartService.ts @@ -13,7 +13,8 @@ import psiArticleData from "./route/getPsiArticleData.js"; import psiPlanningData from "./route/getPsiPlanningData.js"; import psiProductionData from "./route/getPsiProductionData.js"; import psiInventory from "./route/getPsiinventory.js"; - +import getForecastByAv from "./route/getForecastDataByAv.js"; +import getDeliveryByDateRangeAndAv from "./route/getDeliveryDateByRangeAndAv.js"; const app = new OpenAPIHono(); const routes = [ @@ -23,6 +24,8 @@ const routes = [ getCustomerInv, getOpenOrders, getDeliveryByDate, + getDeliveryByDateRangeAndAv, + getForecastByAv, fakeEDI, addressCorrections, fifoIndex, diff --git a/lstV2/server/services/dataMart/route/getDeliveryDateByRangeAndAv.ts b/lstV2/server/services/dataMart/route/getDeliveryDateByRangeAndAv.ts new file mode 100644 index 0000000..49c405c --- /dev/null +++ b/lstV2/server/services/dataMart/route/getDeliveryDateByRangeAndAv.ts @@ -0,0 +1,58 @@ +import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi"; +import { responses } from "../../../globalUtils/routeDefs/responses.js"; +import { tryCatch } from "../../../globalUtils/tryCatch.js"; +import { apiHit } from "../../../globalUtils/apiHits.js"; +import { getDeliveryByDateRangeAndAv } from "../controller/getDeliveryByDateRangeAndAv.js"; + +const app = new OpenAPIHono({ strict: false }); +const Body = z.object({ + includeRunnningNumbers: z.string().openapi({ example: "x" }), +}); +app.openapi( + createRoute({ + tags: ["dataMart"], + summary: "Returns deliverys by daterange.", + method: "get", + path: "/deliverybydaterangeandav", + request: { + body: { + content: { + "application/json": { schema: Body }, + }, + }, + }, + responses: responses(), + }), + async (c) => { + const q: any = c.req.queries(); + + // make sure we have a vaid user being accessed thats really logged in + apiHit(c, { endpoint: "/deliverybydaterangeandav" }); + const { data, error } = await tryCatch( + getDeliveryByDateRangeAndAv( + q["avs"] ? q["avs"][0] : null, + q["startDate"] ? q["startDate"][0] : null, + q["endDate"] ? q["endDate"][0] : null + ) + ); + + if (error) { + console.log(error); + return c.json( + { + success: false, + message: "There was an error getting the deliveries.", + data: error, + }, + 400 + ); + } + + return c.json({ + success: data.success, + message: data.message, + data: data.data, + }); + } +); +export default app; diff --git a/lstV2/server/services/dataMart/route/getForecastDataByAv.ts b/lstV2/server/services/dataMart/route/getForecastDataByAv.ts new file mode 100644 index 0000000..491e491 --- /dev/null +++ b/lstV2/server/services/dataMart/route/getForecastDataByAv.ts @@ -0,0 +1,61 @@ +import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi"; +import { responses } from "../../../globalUtils/routeDefs/responses.js"; +import { tryCatch } from "../../../globalUtils/tryCatch.js"; +import { apiHit } from "../../../globalUtils/apiHits.js"; +import { psiGetPlanningData } from "../controller/psiGetPlanningData.js"; +import { getForecastByAv } from "../controller/forecastByAvs.js"; + +const app = new OpenAPIHono({ strict: false }); +const Body = z.object({ + includeRunnningNumbers: z.string().openapi({ example: "x" }), +}); +app.openapi( + createRoute({ + tags: ["dataMart"], + summary: "Returns the psiarticleData.", + method: "get", + path: "/forecastbyav", + request: { + body: { + content: { + "application/json": { schema: Body }, + }, + }, + }, + responses: responses(), + }), + async (c) => { + const q: any = c.req.queries(); + + // make sure we have a vaid user being accessed thats really logged in + apiHit(c, { endpoint: "/forecastbyav" }); + //console.log(articles["avs"][0]); + const { data, error } = await tryCatch( + getForecastByAv(q["avs"] ? q["avs"][0] : null) + ); + + if (error) { + console.log(error); + return c.json( + { + success: false, + message: "There was an error getting the forecast data.", + data: error, + }, + 400 + ); + } + + //console.log(data); + + return c.json( + { + success: data.success, + message: data.message, + data: data.data, + }, + data.success ? 200 : 400 + ); + } +); +export default app; diff --git a/lstV2/server/services/logger/controller/logCleanup.ts b/lstV2/server/services/logger/controller/logCleanup.ts index 680cb51..f6e3070 100644 --- a/lstV2/server/services/logger/controller/logCleanup.ts +++ b/lstV2/server/services/logger/controller/logCleanup.ts @@ -15,7 +15,7 @@ export const logCleanup = async () => { .delete(logs) .where( and( - lte(logs.created_at, sql`NOW() - INTERVAL '3 days'`), + lte(logs.created_at, sql`NOW() - INTERVAL '300 days'`), //inArray(logs.service, ["server", "tcp", "sqlProd", "globalutils","notify", "logger", "serverupdater"]), eq(logs.level, "info") ) @@ -25,14 +25,14 @@ export const logCleanup = async () => { "info", "lst", "logger", - `${delLogs.length} Server logs were just deleted that were older than 3 days` + `${delLogs.length} Server logs were just deleted that were older than 300 days` ); } catch (error) { createLog( "error", "lst", "logger", - `There was an error deleteing server logs. ${error}` + `There was an error deleting server logs. ${error}` ); } @@ -42,7 +42,7 @@ export const logCleanup = async () => { .delete(logs) .where( and( - lte(logs.created_at, sql`NOW() - INTERVAL '7 days'`), + lte(logs.created_at, sql`NOW() - INTERVAL '700 days'`), //inArray(logs.service, ["server", "tcp", "sqlProd", "globalutils", "notify", "logger", "serverupdater"]), ne(logs.level, "info") ) @@ -52,14 +52,14 @@ export const logCleanup = async () => { "info", "lst", "logger", - `${delLogs.length} Server logs were just deleted that were older than 7 days` + `${delLogs.length} Server logs were just deleted that were older than 700 days` ); } catch (error) { createLog( "error", "lst", "logger", - `There was an error deleteing server logs. ${error}` + `There was an error deleting server logs. ${error}` ); } }; diff --git a/lstV2/server/services/ocp/controller/labeling/manualLabelLog.ts b/lstV2/server/services/ocp/controller/labeling/manualLabelLog.ts index 8e0d776..a4129cc 100644 --- a/lstV2/server/services/ocp/controller/labeling/manualLabelLog.ts +++ b/lstV2/server/services/ocp/controller/labeling/manualLabelLog.ts @@ -42,7 +42,7 @@ export const manualPrint = async (manualPrint: any) => { manualTag( manualPrint.rfidTag, "wrapper1", - parseInt(label.data.SSCC.slice(10, -1)) + parseInt(label?.data.SSCC.slice(10, -1)) ); } return { diff --git a/lstV2/server/services/sqlServer/querys/dataMart/deleveryByDateRange.ts b/lstV2/server/services/sqlServer/querys/dataMart/deleveryByDateRange.ts index 049f3e3..a7a35e6 100644 --- a/lstV2/server/services/sqlServer/querys/dataMart/deleveryByDateRange.ts +++ b/lstV2/server/services/sqlServer/querys/dataMart/deleveryByDateRange.ts @@ -70,3 +70,75 @@ where CONVERT(date, Upd_Date) BETWEEN @StartDate AND @EndDate order by Bol_PrintDate desc `; + +export const deliveryByDateRangeAndAv = ` +use [test1_AlplaPROD2.0_Read] + +SELECT +r.[ArticleHumanReadableId] + ,[ReleaseNumber] + ,h.CustomerOrderNumber + ,x.CustomerLineItemNumber + ,[CustomerReleaseNumber] + ,[ReleaseState] + ,[DeliveryState] + ,ea.JournalNummer + ,[ReleaseConfirmationState] + ,[PlanningState] + ,format(r.[OrderDate], 'yyyy-MM-dd HH:mm') as OrderDate + ,FORMAT(r.[DeliveryDate], 'yyyy-MM-dd HH:mm') as DeliveryDate + ,FORMAT(r.[LoadingDate], 'yyyy-MM-dd HH:mm') as LoadingDate + ,[Quantity] + ,[DeliveredQuantity] + ,r.[AdditionalInformation1] + ,r.[AdditionalInformation2] + ,[TradeUnits] + ,[LoadingUnits] + ,[Trucks] + ,[LoadingToleranceType] + ,[SalesPrice] + ,[Currency] + ,[QuantityUnit] + ,[SalesPriceRemark] + ,r.[Remark] + ,[Irradiated] + ,r.[CreatedByEdi] + ,[DeliveryAddressHumanReadableId] + ,[CustomerArtNo] + ,[TotalPrice] + ,r.[ArticleAlias] + + FROM [order].[Release] (nolock) as r + + left join + [order].LineItem as x on + + r.LineItemId = x.id + + left join + [order].Header as h on + x.HeaderId = h.id + + --bol stuff + left join + AlplaPROD_test1.dbo.V_LadePlanungenLadeAuftragAbruf (nolock) as zz + on zz.AbrufIdAuftragsAbruf = r.ReleaseNumber + + left join +(select * from (SELECT +ROW_NUMBER() OVER (PARTITION BY IdJournal ORDER BY add_date DESC) AS RowNum +,* + FROM [AlplaPROD_test1].[dbo].[T_Lieferungen] (nolock)) x + + where RowNum = 1) as ea on + zz.IdLieferschein = ea.IdJournal + +where +r.ArticleHumanReadableId in ([articles]) +--r.ReleaseNumber = 1452 + +and r.DeliveryDate between '[startDate]' and '[endDate]' + +order by DeliveryDate desc + +`; diff --git a/lstV2/server/services/sqlServer/querys/dataMart/forecast.ts b/lstV2/server/services/sqlServer/querys/dataMart/forecast.ts new file mode 100644 index 0000000..d61268d --- /dev/null +++ b/lstV2/server/services/sqlServer/querys/dataMart/forecast.ts @@ -0,0 +1,17 @@ +export const forecastByAvs = ` +SELECT + [DeliveryAddressHumanReadableId] + ,[DeliveryAddressDescription] + ,[ArticleHumanReadableId] + ,[ArticleDescription] + ,[QuantityType] + ,[CustomerArticleNumber] + ,format([RequirementDate],'yyyy-MM-dd') RequirementDate + ,[Quantity] + ,[TradeUnits] + ,[LoadingUnits] + ,[ArticleAlias] + FROM [test1_AlplaPROD2.0_Read].[forecast].[Forecast] (nolock) + + where ArticleHumanReadableId in ([articles]) +`; diff --git a/lstV2/server/services/sqlServer/querys/ocp/getLabel.ts b/lstV2/server/services/sqlServer/querys/ocp/getLabel.ts new file mode 100644 index 0000000..e28454a --- /dev/null +++ b/lstV2/server/services/sqlServer/querys/ocp/getLabel.ts @@ -0,0 +1,11 @@ +export const getCurrentLabel = ` +SELECT FORMAT(Add_Date,'yyyy-MM-dd HH:mm') as PrintTime + ,[IdMaschine] + ,[LfdNr] + FROM [AlplaPROD_test1].[dbo].[T_EtikettenGedruckt] (nolock) + + where IdMaschine = [macId] + and FORMAT(Add_Date,'yyyy-MM-dd HH:mm') like '[time]' + + order by Add_Date desc +`; diff --git a/migrations/0006_loud_reavers.sql b/migrations/0006_loud_reavers.sql new file mode 100644 index 0000000..e493622 --- /dev/null +++ b/migrations/0006_loud_reavers.sql @@ -0,0 +1,4 @@ +ALTER TABLE "user_role" RENAME TO "user_roles";--> statement-breakpoint +ALTER TABLE "user_roles" DROP CONSTRAINT "user_role_user_id_user_id_fk"; +--> statement-breakpoint +ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action; \ No newline at end of file diff --git a/migrations/meta/0006_snapshot.json b/migrations/meta/0006_snapshot.json new file mode 100644 index 0000000..242d1ae --- /dev/null +++ b/migrations/meta/0006_snapshot.json @@ -0,0 +1,824 @@ +{ + "id": "2e845c85-5248-4082-a69a-77c18e50f044", + "prevId": "639e50c0-757a-4867-a78e-48e8e1a416fc", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.account": { + "name": "account", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "account_user_id_user_id_fk": { + "name": "account_user_id_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.apikey": { + "name": "apikey", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "start": { + "name": "start", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "refill_interval": { + "name": "refill_interval", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "refill_amount": { + "name": "refill_amount", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_refill_at": { + "name": "last_refill_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "rate_limit_enabled": { + "name": "rate_limit_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "rate_limit_time_window": { + "name": "rate_limit_time_window", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 86400000 + }, + "rate_limit_max": { + "name": "rate_limit_max", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 10 + }, + "request_count": { + "name": "request_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "remaining": { + "name": "remaining", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_request": { + "name": "last_request", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "permissions": { + "name": "permissions", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "apikey_user_id_user_id_fk": { + "name": "apikey_user_id_user_id_fk", + "tableFrom": "apikey", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.jwks": { + "name": "jwks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "public_key": { + "name": "public_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "private_key": { + "name": "private_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "impersonated_by": { + "name": "impersonated_by", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_user_id_fk": { + "name": "session_user_id_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_token_unique": { + "name": "session_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email_verified": { + "name": "email_verified", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "banned": { + "name": "banned", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ban_reason": { + "name": "ban_reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ban_expires": { + "name": "ban_expires", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "display_username": { + "name": "display_username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "last_login": { + "name": "last_login", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + }, + "user_username_unique": { + "name": "user_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.verification": { + "name": "verification", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.logs": { + "name": "logs", + "schema": "", + "columns": { + "log_id": { + "name": "log_id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "level": { + "name": "level", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "module": { + "name": "module", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "subModule": { + "name": "subModule", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "message": { + "name": "message", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "stack": { + "name": "stack", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'[]'::jsonb" + }, + "checked": { + "name": "checked", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "hostname": { + "name": "hostname", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.settings": { + "name": "settings", + "schema": "", + "columns": { + "settings_id": { + "name": "settings_id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "moduleName": { + "name": "moduleName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "active": { + "name": "active", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "roles": { + "name": "roles", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[\"systemAdmin\"]'::jsonb" + }, + "add_User": { + "name": "add_User", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'LST_System'" + }, + "add_Date": { + "name": "add_Date", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "upd_User": { + "name": "upd_User", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'LST_System'" + }, + "upd_date": { + "name": "upd_date", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "name": { + "name": "name", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "user_role_id": { + "name": "user_role_id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "module": { + "name": "module", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "unique_user_module": { + "name": "unique_user_module", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "module", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "user_roles_user_id_user_id_fk": { + "name": "user_roles_user_id_user_id_fk", + "tableFrom": "user_roles", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/migrations/meta/_journal.json b/migrations/meta/_journal.json index a1d57c5..8f074e6 100644 --- a/migrations/meta/_journal.json +++ b/migrations/meta/_journal.json @@ -43,6 +43,13 @@ "when": 1758081790572, "tag": "0005_gorgeous_purple_man", "breakpoints": true + }, + { + "idx": 6, + "version": "7", + "when": 1758588364052, + "tag": "0006_loud_reavers", + "breakpoints": true } ] } \ No newline at end of file diff --git a/types/express.d.ts b/types/express.d.ts new file mode 100644 index 0000000..a7e9821 --- /dev/null +++ b/types/express.d.ts @@ -0,0 +1,19 @@ +// types/express/index.d.ts + +import type { UserRoles } from "../app/src/pkg/db/schema/user_roles.ts"; + +declare global { + namespace Express { + interface User { + id: string; + email?: string; + username?: string; + roles: string[]; + rawRoles: UserRoles[]; // keep raw drizzle rows if needed + } + + interface Request { + user?: User; + } + } +}