Compare commits

..

4 Commits

46 changed files with 3169 additions and 76 deletions

View File

@@ -0,0 +1,2 @@
ALTER TABLE "settings" RENAME COLUMN "role" TO "roles";--> statement-breakpoint
ALTER TABLE "modules" DROP COLUMN "roles";

View File

@@ -0,0 +1 @@
ALTER TABLE "modules" ADD COLUMN "roles" jsonb DEFAULT '["view","systemAdmin"]'::jsonb NOT NULL;

View File

@@ -0,0 +1,530 @@
{
"id": "9ee9dfcc-a6a7-4d5a-96ff-1ab1369f53d3",
"prevId": "467c98f1-3785-42b5-80ed-528eac5fcbe4",
"version": "7",
"dialect": "postgresql",
"tables": {
"public.modules": {
"name": "modules",
"schema": "",
"columns": {
"module_id": {
"name": "module_id",
"type": "uuid",
"primaryKey": true,
"notNull": true,
"default": "gen_random_uuid()"
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"active": {
"name": "active",
"type": "boolean",
"primaryKey": false,
"notNull": false,
"default": false
},
"roles": {
"name": "roles",
"type": "text",
"primaryKey": false,
"notNull": true,
"default": "'[\"view\", \"systemAdmin\"]'"
},
"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": {
"module_name": {
"name": "module_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.roles": {
"name": "roles",
"schema": "",
"columns": {
"role_id": {
"name": "role_id",
"type": "uuid",
"primaryKey": true,
"notNull": true,
"default": "gen_random_uuid()"
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"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": {
"role_name": {
"name": "role_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.settings": {
"name": "settings",
"schema": "",
"columns": {
"role_id": {
"name": "role_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
},
"module_id": {
"name": "module_id",
"type": "uuid",
"primaryKey": false,
"notNull": true
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": true,
"default": "'[\"systemAdmin\"]'"
},
"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": {
"settings_module_id_modules_module_id_fk": {
"name": "settings_module_id_modules_module_id_fk",
"tableFrom": "settings",
"tableTo": "modules",
"columnsFrom": [
"module_id"
],
"columnsTo": [
"module_id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.userRoles": {
"name": "userRoles",
"schema": "",
"columns": {
"user_id": {
"name": "user_id",
"type": "uuid",
"primaryKey": false,
"notNull": true
},
"role_id": {
"name": "role_id",
"type": "uuid",
"primaryKey": false,
"notNull": true
},
"module_id": {
"name": "module_id",
"type": "uuid",
"primaryKey": false,
"notNull": true
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": true
},
"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": {
"user_module_unique": {
"name": "user_module_unique",
"columns": [
{
"expression": "user_id",
"isExpression": false,
"asc": true,
"nulls": "last"
},
{
"expression": "module_id",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": true,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {
"userRoles_user_id_users_user_id_fk": {
"name": "userRoles_user_id_users_user_id_fk",
"tableFrom": "userRoles",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"user_id"
],
"onDelete": "no action",
"onUpdate": "no action"
},
"userRoles_role_id_roles_role_id_fk": {
"name": "userRoles_role_id_roles_role_id_fk",
"tableFrom": "userRoles",
"tableTo": "roles",
"columnsFrom": [
"role_id"
],
"columnsTo": [
"role_id"
],
"onDelete": "no action",
"onUpdate": "no action"
},
"userRoles_module_id_modules_module_id_fk": {
"name": "userRoles_module_id_modules_module_id_fk",
"tableFrom": "userRoles",
"tableTo": "modules",
"columnsFrom": [
"module_id"
],
"columnsTo": [
"module_id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.users": {
"name": "users",
"schema": "",
"columns": {
"user_id": {
"name": "user_id",
"type": "uuid",
"primaryKey": true,
"notNull": true,
"default": "gen_random_uuid()"
},
"username": {
"name": "username",
"type": "text",
"primaryKey": false,
"notNull": true
},
"email": {
"name": "email",
"type": "text",
"primaryKey": false,
"notNull": true
},
"password": {
"name": "password",
"type": "text",
"primaryKey": false,
"notNull": true
},
"passwordToken": {
"name": "passwordToken",
"type": "text",
"primaryKey": false,
"notNull": false
},
"passwordTokenExpires": {
"name": "passwordTokenExpires",
"type": "timestamp",
"primaryKey": false,
"notNull": false
},
"active": {
"name": "active",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"default": true
},
"pingcode": {
"name": "pingcode",
"type": "numeric",
"primaryKey": false,
"notNull": false
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": true,
"default": "'user'"
},
"lastLogin": {
"name": "lastLogin",
"type": "timestamp",
"primaryKey": false,
"notNull": false,
"default": "now()"
},
"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": {
"username": {
"name": "username",
"columns": [
{
"expression": "username",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": true,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
}
},
"enums": {},
"schemas": {},
"sequences": {},
"roles": {},
"policies": {},
"views": {},
"_meta": {
"columns": {},
"schemas": {},
"tables": {}
}
}

View File

@@ -0,0 +1,530 @@
{
"id": "2deb69eb-c7cb-4891-96dd-dba9575a90e2",
"prevId": "9ee9dfcc-a6a7-4d5a-96ff-1ab1369f53d3",
"version": "7",
"dialect": "postgresql",
"tables": {
"public.modules": {
"name": "modules",
"schema": "",
"columns": {
"module_id": {
"name": "module_id",
"type": "uuid",
"primaryKey": true,
"notNull": true,
"default": "gen_random_uuid()"
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"active": {
"name": "active",
"type": "boolean",
"primaryKey": false,
"notNull": false,
"default": false
},
"roles": {
"name": "roles",
"type": "text",
"primaryKey": false,
"notNull": true,
"default": "'[\"view\", \"systemAdmin\"]'"
},
"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": {
"module_name": {
"name": "module_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.roles": {
"name": "roles",
"schema": "",
"columns": {
"role_id": {
"name": "role_id",
"type": "uuid",
"primaryKey": true,
"notNull": true,
"default": "gen_random_uuid()"
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"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": {
"role_name": {
"name": "role_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.settings": {
"name": "settings",
"schema": "",
"columns": {
"role_id": {
"name": "role_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
},
"module_id": {
"name": "module_id",
"type": "uuid",
"primaryKey": false,
"notNull": true
},
"role": {
"name": "role",
"type": "json",
"primaryKey": false,
"notNull": true,
"default": "'[\"systemAdmin\"]'::json"
},
"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": {
"settings_module_id_modules_module_id_fk": {
"name": "settings_module_id_modules_module_id_fk",
"tableFrom": "settings",
"tableTo": "modules",
"columnsFrom": [
"module_id"
],
"columnsTo": [
"module_id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.userRoles": {
"name": "userRoles",
"schema": "",
"columns": {
"user_id": {
"name": "user_id",
"type": "uuid",
"primaryKey": false,
"notNull": true
},
"role_id": {
"name": "role_id",
"type": "uuid",
"primaryKey": false,
"notNull": true
},
"module_id": {
"name": "module_id",
"type": "uuid",
"primaryKey": false,
"notNull": true
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": true
},
"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": {
"user_module_unique": {
"name": "user_module_unique",
"columns": [
{
"expression": "user_id",
"isExpression": false,
"asc": true,
"nulls": "last"
},
{
"expression": "module_id",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": true,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {
"userRoles_user_id_users_user_id_fk": {
"name": "userRoles_user_id_users_user_id_fk",
"tableFrom": "userRoles",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"user_id"
],
"onDelete": "no action",
"onUpdate": "no action"
},
"userRoles_role_id_roles_role_id_fk": {
"name": "userRoles_role_id_roles_role_id_fk",
"tableFrom": "userRoles",
"tableTo": "roles",
"columnsFrom": [
"role_id"
],
"columnsTo": [
"role_id"
],
"onDelete": "no action",
"onUpdate": "no action"
},
"userRoles_module_id_modules_module_id_fk": {
"name": "userRoles_module_id_modules_module_id_fk",
"tableFrom": "userRoles",
"tableTo": "modules",
"columnsFrom": [
"module_id"
],
"columnsTo": [
"module_id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.users": {
"name": "users",
"schema": "",
"columns": {
"user_id": {
"name": "user_id",
"type": "uuid",
"primaryKey": true,
"notNull": true,
"default": "gen_random_uuid()"
},
"username": {
"name": "username",
"type": "text",
"primaryKey": false,
"notNull": true
},
"email": {
"name": "email",
"type": "text",
"primaryKey": false,
"notNull": true
},
"password": {
"name": "password",
"type": "text",
"primaryKey": false,
"notNull": true
},
"passwordToken": {
"name": "passwordToken",
"type": "text",
"primaryKey": false,
"notNull": false
},
"passwordTokenExpires": {
"name": "passwordTokenExpires",
"type": "timestamp",
"primaryKey": false,
"notNull": false
},
"active": {
"name": "active",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"default": true
},
"pingcode": {
"name": "pingcode",
"type": "numeric",
"primaryKey": false,
"notNull": false
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": true,
"default": "'user'"
},
"lastLogin": {
"name": "lastLogin",
"type": "timestamp",
"primaryKey": false,
"notNull": false,
"default": "now()"
},
"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": {
"username": {
"name": "username",
"columns": [
{
"expression": "username",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": true,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
}
},
"enums": {},
"schemas": {},
"sequences": {},
"roles": {},
"policies": {},
"views": {},
"_meta": {
"columns": {},
"schemas": {},
"tables": {}
}
}

View File

@@ -0,0 +1,523 @@
{
"id": "080489f8-4a50-42a2-bc8c-650145434287",
"prevId": "2deb69eb-c7cb-4891-96dd-dba9575a90e2",
"version": "7",
"dialect": "postgresql",
"tables": {
"public.modules": {
"name": "modules",
"schema": "",
"columns": {
"module_id": {
"name": "module_id",
"type": "uuid",
"primaryKey": true,
"notNull": true,
"default": "gen_random_uuid()"
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"active": {
"name": "active",
"type": "boolean",
"primaryKey": false,
"notNull": false,
"default": false
},
"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": {
"module_name": {
"name": "module_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.roles": {
"name": "roles",
"schema": "",
"columns": {
"role_id": {
"name": "role_id",
"type": "uuid",
"primaryKey": true,
"notNull": true,
"default": "gen_random_uuid()"
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"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": {
"role_name": {
"name": "role_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.settings": {
"name": "settings",
"schema": "",
"columns": {
"role_id": {
"name": "role_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
},
"module_id": {
"name": "module_id",
"type": "uuid",
"primaryKey": false,
"notNull": 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": {
"settings_module_id_modules_module_id_fk": {
"name": "settings_module_id_modules_module_id_fk",
"tableFrom": "settings",
"tableTo": "modules",
"columnsFrom": [
"module_id"
],
"columnsTo": [
"module_id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.userRoles": {
"name": "userRoles",
"schema": "",
"columns": {
"user_id": {
"name": "user_id",
"type": "uuid",
"primaryKey": false,
"notNull": true
},
"role_id": {
"name": "role_id",
"type": "uuid",
"primaryKey": false,
"notNull": true
},
"module_id": {
"name": "module_id",
"type": "uuid",
"primaryKey": false,
"notNull": true
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": true
},
"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": {
"user_module_unique": {
"name": "user_module_unique",
"columns": [
{
"expression": "user_id",
"isExpression": false,
"asc": true,
"nulls": "last"
},
{
"expression": "module_id",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": true,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {
"userRoles_user_id_users_user_id_fk": {
"name": "userRoles_user_id_users_user_id_fk",
"tableFrom": "userRoles",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"user_id"
],
"onDelete": "no action",
"onUpdate": "no action"
},
"userRoles_role_id_roles_role_id_fk": {
"name": "userRoles_role_id_roles_role_id_fk",
"tableFrom": "userRoles",
"tableTo": "roles",
"columnsFrom": [
"role_id"
],
"columnsTo": [
"role_id"
],
"onDelete": "no action",
"onUpdate": "no action"
},
"userRoles_module_id_modules_module_id_fk": {
"name": "userRoles_module_id_modules_module_id_fk",
"tableFrom": "userRoles",
"tableTo": "modules",
"columnsFrom": [
"module_id"
],
"columnsTo": [
"module_id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.users": {
"name": "users",
"schema": "",
"columns": {
"user_id": {
"name": "user_id",
"type": "uuid",
"primaryKey": true,
"notNull": true,
"default": "gen_random_uuid()"
},
"username": {
"name": "username",
"type": "text",
"primaryKey": false,
"notNull": true
},
"email": {
"name": "email",
"type": "text",
"primaryKey": false,
"notNull": true
},
"password": {
"name": "password",
"type": "text",
"primaryKey": false,
"notNull": true
},
"passwordToken": {
"name": "passwordToken",
"type": "text",
"primaryKey": false,
"notNull": false
},
"passwordTokenExpires": {
"name": "passwordTokenExpires",
"type": "timestamp",
"primaryKey": false,
"notNull": false
},
"active": {
"name": "active",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"default": true
},
"pingcode": {
"name": "pingcode",
"type": "numeric",
"primaryKey": false,
"notNull": false
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": true,
"default": "'user'"
},
"lastLogin": {
"name": "lastLogin",
"type": "timestamp",
"primaryKey": false,
"notNull": false,
"default": "now()"
},
"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": {
"username": {
"name": "username",
"columns": [
{
"expression": "username",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": true,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
}
},
"enums": {},
"schemas": {},
"sequences": {},
"roles": {},
"policies": {},
"views": {},
"_meta": {
"columns": {},
"schemas": {},
"tables": {}
}
}

View File

@@ -0,0 +1,530 @@
{
"id": "4dd70d50-7853-48fc-aa42-4bc26de39dd9",
"prevId": "080489f8-4a50-42a2-bc8c-650145434287",
"version": "7",
"dialect": "postgresql",
"tables": {
"public.modules": {
"name": "modules",
"schema": "",
"columns": {
"module_id": {
"name": "module_id",
"type": "uuid",
"primaryKey": true,
"notNull": true,
"default": "gen_random_uuid()"
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"active": {
"name": "active",
"type": "boolean",
"primaryKey": false,
"notNull": false,
"default": false
},
"roles": {
"name": "roles",
"type": "jsonb",
"primaryKey": false,
"notNull": true,
"default": "'[\"view\",\"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": {
"module_name": {
"name": "module_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.roles": {
"name": "roles",
"schema": "",
"columns": {
"role_id": {
"name": "role_id",
"type": "uuid",
"primaryKey": true,
"notNull": true,
"default": "gen_random_uuid()"
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"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": {
"role_name": {
"name": "role_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.settings": {
"name": "settings",
"schema": "",
"columns": {
"role_id": {
"name": "role_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
},
"module_id": {
"name": "module_id",
"type": "uuid",
"primaryKey": false,
"notNull": 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": {
"settings_module_id_modules_module_id_fk": {
"name": "settings_module_id_modules_module_id_fk",
"tableFrom": "settings",
"tableTo": "modules",
"columnsFrom": [
"module_id"
],
"columnsTo": [
"module_id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.userRoles": {
"name": "userRoles",
"schema": "",
"columns": {
"user_id": {
"name": "user_id",
"type": "uuid",
"primaryKey": false,
"notNull": true
},
"role_id": {
"name": "role_id",
"type": "uuid",
"primaryKey": false,
"notNull": true
},
"module_id": {
"name": "module_id",
"type": "uuid",
"primaryKey": false,
"notNull": true
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": true
},
"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": {
"user_module_unique": {
"name": "user_module_unique",
"columns": [
{
"expression": "user_id",
"isExpression": false,
"asc": true,
"nulls": "last"
},
{
"expression": "module_id",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": true,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {
"userRoles_user_id_users_user_id_fk": {
"name": "userRoles_user_id_users_user_id_fk",
"tableFrom": "userRoles",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"user_id"
],
"onDelete": "no action",
"onUpdate": "no action"
},
"userRoles_role_id_roles_role_id_fk": {
"name": "userRoles_role_id_roles_role_id_fk",
"tableFrom": "userRoles",
"tableTo": "roles",
"columnsFrom": [
"role_id"
],
"columnsTo": [
"role_id"
],
"onDelete": "no action",
"onUpdate": "no action"
},
"userRoles_module_id_modules_module_id_fk": {
"name": "userRoles_module_id_modules_module_id_fk",
"tableFrom": "userRoles",
"tableTo": "modules",
"columnsFrom": [
"module_id"
],
"columnsTo": [
"module_id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.users": {
"name": "users",
"schema": "",
"columns": {
"user_id": {
"name": "user_id",
"type": "uuid",
"primaryKey": true,
"notNull": true,
"default": "gen_random_uuid()"
},
"username": {
"name": "username",
"type": "text",
"primaryKey": false,
"notNull": true
},
"email": {
"name": "email",
"type": "text",
"primaryKey": false,
"notNull": true
},
"password": {
"name": "password",
"type": "text",
"primaryKey": false,
"notNull": true
},
"passwordToken": {
"name": "passwordToken",
"type": "text",
"primaryKey": false,
"notNull": false
},
"passwordTokenExpires": {
"name": "passwordTokenExpires",
"type": "timestamp",
"primaryKey": false,
"notNull": false
},
"active": {
"name": "active",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"default": true
},
"pingcode": {
"name": "pingcode",
"type": "numeric",
"primaryKey": false,
"notNull": false
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": true,
"default": "'user'"
},
"lastLogin": {
"name": "lastLogin",
"type": "timestamp",
"primaryKey": false,
"notNull": false,
"default": "now()"
},
"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": {
"username": {
"name": "username",
"columns": [
{
"expression": "username",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": true,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
}
},
"enums": {},
"schemas": {},
"sequences": {},
"roles": {},
"policies": {},
"views": {},
"_meta": {
"columns": {},
"schemas": {},
"tables": {}
}
}

View File

@@ -8,6 +8,34 @@
"when": 1740534974452, "when": 1740534974452,
"tag": "0000_nebulous_bulldozer", "tag": "0000_nebulous_bulldozer",
"breakpoints": true "breakpoints": true
},
{
"idx": 1,
"version": "7",
"when": 1741089811715,
"tag": "0001_slim_human_fly",
"breakpoints": true
},
{
"idx": 2,
"version": "7",
"when": 1741091479717,
"tag": "0002_wet_kabuki",
"breakpoints": true
},
{
"idx": 3,
"version": "7",
"when": 1741096195655,
"tag": "0003_same_devos",
"breakpoints": true
},
{
"idx": 4,
"version": "7",
"when": 1741096441464,
"tag": "0004_even_rocket_racer",
"breakpoints": true
} }
] ]
} }

View File

@@ -1,4 +1,4 @@
import {text, pgTable, timestamp, boolean, uuid, uniqueIndex} from "drizzle-orm/pg-core"; import {text, pgTable, timestamp, boolean, uuid, uniqueIndex, jsonb} from "drizzle-orm/pg-core";
import {createSelectSchema} from "drizzle-zod"; import {createSelectSchema} from "drizzle-zod";
//import {z} from "zod"; //import {z} from "zod";
@@ -8,7 +8,8 @@ export const modules = pgTable(
module_id: uuid("module_id").defaultRandom().primaryKey(), module_id: uuid("module_id").defaultRandom().primaryKey(),
name: text("name").notNull(), name: text("name").notNull(),
active: boolean("active").default(false), active: boolean("active").default(false),
roles: text("roles").notNull().default(`["view", "systemAdmin"]`), // ["view", "technician", "supervisor","manager", "admin","systemAdmin"] //roles: text("roles").notNull().default(`["view", "systemAdmin"]`), // ["view", "technician", "supervisor","manager", "admin","systemAdmin"]
roles: jsonb("roles").notNull().default(["view", "systemAdmin"]), // ["view", "technician", "supervisor","manager", "admin","systemAdmin"]
add_User: text("add_User").default("LST_System").notNull(), add_User: text("add_User").default("LST_System").notNull(),
add_Date: timestamp("add_Date").defaultNow(), add_Date: timestamp("add_Date").defaultNow(),
upd_user: text("upd_User").default("LST_System").notNull(), upd_user: text("upd_User").default("LST_System").notNull(),

View File

@@ -0,0 +1,33 @@
import {text, pgTable, timestamp, uuid, uniqueIndex, jsonb} from "drizzle-orm/pg-core";
import {createSelectSchema} from "drizzle-zod";
import {z} from "zod";
import {modules} from "./modules.js";
export const settings = pgTable(
"settings",
{
settings_id: uuid("role_id").defaultRandom().primaryKey(),
name: text("name").notNull(),
value: text("value").notNull(),
description: text("description"),
module_id: uuid("module_id")
.notNull()
.references(() => modules.module_id),
roles: jsonb("roles").notNull().default(["systemAdmin"]),
add_User: text("add_User").default("LST_System").notNull(),
add_Date: timestamp("add_Date").defaultNow(),
upd_user: text("upd_User").default("LST_System").notNull(),
upd_date: timestamp("upd_date").defaultNow(),
},
(table) => [
// uniqueIndex('emailUniqueIndex').on(sql`lower(${table.email})`),
uniqueIndex("name").on(table.name),
]
);
// Schema for inserting a user - can be used to validate API requests
// export const insertRolesSchema = createInsertSchema(roles, {
// name: z.string().min(3, {message: "Role name must be more than 3 letters"}),
// });
// Schema for selecting a Expenses - can be used to validate API responses
export const selectRolesSchema = createSelectSchema(settings);

View File

@@ -1,12 +0,0 @@
import { defineConfig } from "drizzle-kit";
import dotenv from "dotenv";
dotenv.config();
const database = process.env.DATABASE_URL || "";
export default defineConfig({
dialect: "postgresql",
schema: "database/schema",
out: "database/migrations",
dbCredentials: {
url: database,
},
});

View File

@@ -6,7 +6,7 @@ dotenv.config();
const database = process.env.DATABASE_URL! || ""; const database = process.env.DATABASE_URL! || "";
export default defineConfig({ export default defineConfig({
dialect: "postgresql", // 'mysql' | 'sqlite' | 'turso' dialect: "postgresql", // 'mysql' | 'sqlite' | 'turso'
schema: "database/schema", schema: "./dist/database/schema",
out: "database/migrations", out: "database/migrations",
dbCredentials: { dbCredentials: {
url: database, url: database,

View File

@@ -21,6 +21,7 @@
"@tailwindcss/vite": "^4.0.9", "@tailwindcss/vite": "^4.0.9",
"@tanstack/react-query": "^5.66.9", "@tanstack/react-query": "^5.66.9",
"@tanstack/react-router": "^1.111.11", "@tanstack/react-router": "^1.111.11",
"@tanstack/react-table": "^8.21.2",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"dotenv": "^16.4.7", "dotenv": "^16.4.7",
@@ -2660,6 +2661,26 @@
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
} }
}, },
"node_modules/@tanstack/react-table": {
"version": "8.21.2",
"resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.2.tgz",
"integrity": "sha512-11tNlEDTdIhMJba2RBH+ecJ9l1zgS2kjmexDPAraulc8jeNA4xocSNeyzextT0XJyASil4XsCYlJmf5jEWAtYg==",
"license": "MIT",
"dependencies": {
"@tanstack/table-core": "8.21.2"
},
"engines": {
"node": ">=12"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
},
"peerDependencies": {
"react": ">=16.8",
"react-dom": ">=16.8"
}
},
"node_modules/@tanstack/router-core": { "node_modules/@tanstack/router-core": {
"version": "1.111.7", "version": "1.111.7",
"resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.111.7.tgz", "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.111.7.tgz",
@@ -2821,6 +2842,19 @@
"url": "https://github.com/sponsors/tannerlinsley" "url": "https://github.com/sponsors/tannerlinsley"
} }
}, },
"node_modules/@tanstack/table-core": {
"version": "8.21.2",
"resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.2.tgz",
"integrity": "sha512-uvXk/U4cBiFMxt+p9/G7yUWI/UbHYbyghLCjlpWZ3mLeIZiUBSKcUnw9UnKkdRz7Z/N4UBuFLWQdJCjUe7HjvA==",
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
}
},
"node_modules/@tanstack/virtual-file-routes": { "node_modules/@tanstack/virtual-file-routes": {
"version": "1.99.0", "version": "1.99.0",
"resolved": "https://registry.npmjs.org/@tanstack/virtual-file-routes/-/virtual-file-routes-1.99.0.tgz", "resolved": "https://registry.npmjs.org/@tanstack/virtual-file-routes/-/virtual-file-routes-1.99.0.tgz",

View File

@@ -24,6 +24,7 @@
"@tailwindcss/vite": "^4.0.9", "@tailwindcss/vite": "^4.0.9",
"@tanstack/react-query": "^5.66.9", "@tanstack/react-query": "^5.66.9",
"@tanstack/react-router": "^1.111.11", "@tanstack/react-router": "^1.111.11",
"@tanstack/react-table": "^8.21.2",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"dotenv": "^16.4.7", "dotenv": "^16.4.7",

View File

@@ -0,0 +1,47 @@
import {LstCard} from "@/components/extendedUI/LstCard";
import {useSessionStore} from "@/lib/store/sessionStore";
import {useModuleStore} from "@/lib/store/useModuleStore";
import {useQuery} from "@tanstack/react-query";
import {useRouter} from "@tanstack/react-router";
import axios from "axios";
export default function SettingsPage() {
const token = localStorage.getItem("auth_token");
const {user} = useSessionStore();
const {modules} = useModuleStore();
const router = useRouter();
const fetchSettings = async () => {
const {data} = await axios.get("/api/server/settings", {headers: {Authorization: `Bearer ${token}`}});
return data.data;
};
const adminModule = modules.filter((n) => n.name === "admin");
const userLevel = user?.roles.filter((r) => r.module_id === adminModule[0].module_id) || [];
if (!adminModule[0].roles.includes(userLevel[0]?.role)) {
router.navigate({to: "/"});
}
const {data, isError, error, isLoading} = useQuery({
queryKey: ["settings"],
queryFn: fetchSettings,
enabled: !!token,
refetchOnWindowFocus: true,
});
if (isLoading) {
return <div>Loading.....</div>;
}
if (isError) {
return <div>{JSON.stringify(error)}</div>;
}
return (
<div>
{data.map((i) => {
return <LstCard key={i.settings_id}>{i.name}</LstCard>;
})}
</div>
);
}

View File

@@ -22,7 +22,7 @@ export function AppSidebar() {
{moduleActive("production") && <ProductionSideBar />} {moduleActive("production") && <ProductionSideBar />}
{moduleActive("logistics") && hasAccess(user, "logistics", modules) && <LogisticsSideBar />} {moduleActive("logistics") && hasAccess(user, "logistics", modules) && <LogisticsSideBar />}
{moduleActive("forklift") && hasAccess(user, "forklift", modules) && <ForkliftSideBar />} {moduleActive("forklift") && hasAccess(user, "forklift", modules) && <ForkliftSideBar />}
{moduleActive("admin") && hasAccess(user, "eom", modules) && <EomSideBar />} {moduleActive("eom") && hasAccess(user, "eom", modules) && <EomSideBar />}
{moduleActive("quality") && hasAccess(user, "quality", modules) && <QualitySideBar />} {moduleActive("quality") && hasAccess(user, "quality", modules) && <QualitySideBar />}
{moduleActive("admin") && hasAccess(user, "admin", modules) && <AdminSideBar />} {moduleActive("admin") && hasAccess(user, "admin", modules) && <AdminSideBar />}
</SidebarContent> </SidebarContent>

View File

@@ -29,7 +29,7 @@ const data = {
items: [ items: [
{ {
title: "Settings", title: "Settings",
url: "#", url: "/settings",
icon: Settings, icon: Settings,
isActive: false, isActive: false,
}, },
@@ -53,9 +53,16 @@ const data = {
}, },
{ {
title: "UCD", title: "UCD",
url: "#", url: "https://ucd.alpla.net:8443/",
icon: Atom, icon: Atom,
isActive: false, isActive: false,
newWindow: true,
},
{
title: "Lst Api",
url: "/api/docs",
icon: Webhook,
isActive: false,
}, },
], ],
}, },
@@ -85,7 +92,7 @@ export function AdminSideBar() {
{item.items.map((item) => ( {item.items.map((item) => (
<SidebarMenuSubItem key={item.title}> <SidebarMenuSubItem key={item.title}>
<SidebarMenuSubButton asChild isActive={item.isActive}> <SidebarMenuSubButton asChild isActive={item.isActive}>
<a href={item.url}> <a href={item.url} target={item.newWindow ? "_blank" : "_self"}>
<item.icon /> <item.icon />
<span>{item.title}</span> <span>{item.title}</span>
</a> </a>

View File

@@ -0,0 +1,5 @@
import {LstCard} from "@/components/extendedUI/LstCard";
export default function LabelLog() {
return <LstCard className="m-2 p-2"> label logs here</LstCard>;
}

View File

@@ -0,0 +1,9 @@
import {LstCard} from "@/components/extendedUI/LstCard";
export default function Lots() {
return (
<LstCard className="m-2 p-2 min-h-2/5">
<h1>Lots</h1>
</LstCard>
);
}

View File

@@ -0,0 +1,5 @@
import {LstCard} from "@/components/extendedUI/LstCard";
export default function OcpLogs() {
return <LstCard className="m-2 p-2">Ocp Logs</LstCard>;
}

View File

@@ -0,0 +1,30 @@
import LabelLog from "./LabelLog";
import Lots from "./Lots";
import OcpLogs from "./OcpLogs";
import PrinterStatus from "./PrinterStatus";
export default function OCPPage() {
return (
<div className="h-dvh w-full overflow-hidden">
<div className="flex flex-wrap gap-2">
<div className="flex flex-col w-4/5 h-dvh">
<div className="">
<Lots />
</div>
<div className="flex flex-row">
<div className="w-1/2">
<LabelLog />
</div>
<div className="w-1/2">
<OcpLogs />
</div>
</div>
</div>
<div className="w-1/6">
<PrinterStatus />
</div>
</div>
</div>
);
}

View File

@@ -0,0 +1,5 @@
import {LstCard} from "@/components/extendedUI/LstCard";
export default function PrinterStatus() {
return <LstCard className="m-2 p-2">Printer Status</LstCard>;
}

View File

@@ -19,6 +19,7 @@ import { Route as IndexImport } from './routes/index'
import { Route as OcpIndexImport } from './routes/ocp/index' import { Route as OcpIndexImport } from './routes/ocp/index'
import { Route as OcpLotsImport } from './routes/ocp/lots' import { Route as OcpLotsImport } from './routes/ocp/lots'
import { Route as AuthProfileImport } from './routes/_auth/profile' import { Route as AuthProfileImport } from './routes/_auth/profile'
import { Route as AdminSettingsImport } from './routes/_admin/settings'
import { Route as AdminModulesImport } from './routes/_admin/modules' import { Route as AdminModulesImport } from './routes/_admin/modules'
// Create/Update Routes // Create/Update Routes
@@ -69,6 +70,12 @@ const AuthProfileRoute = AuthProfileImport.update({
getParentRoute: () => AuthRoute, getParentRoute: () => AuthRoute,
} as any) } as any)
const AdminSettingsRoute = AdminSettingsImport.update({
id: '/settings',
path: '/settings',
getParentRoute: () => AdminRoute,
} as any)
const AdminModulesRoute = AdminModulesImport.update({ const AdminModulesRoute = AdminModulesImport.update({
id: '/modules', id: '/modules',
path: '/modules', path: '/modules',
@@ -121,6 +128,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof AdminModulesImport preLoaderRoute: typeof AdminModulesImport
parentRoute: typeof AdminImport parentRoute: typeof AdminImport
} }
'/_admin/settings': {
id: '/_admin/settings'
path: '/settings'
fullPath: '/settings'
preLoaderRoute: typeof AdminSettingsImport
parentRoute: typeof AdminImport
}
'/_auth/profile': { '/_auth/profile': {
id: '/_auth/profile' id: '/_auth/profile'
path: '/profile' path: '/profile'
@@ -149,10 +163,12 @@ declare module '@tanstack/react-router' {
interface AdminRouteChildren { interface AdminRouteChildren {
AdminModulesRoute: typeof AdminModulesRoute AdminModulesRoute: typeof AdminModulesRoute
AdminSettingsRoute: typeof AdminSettingsRoute
} }
const AdminRouteChildren: AdminRouteChildren = { const AdminRouteChildren: AdminRouteChildren = {
AdminModulesRoute: AdminModulesRoute, AdminModulesRoute: AdminModulesRoute,
AdminSettingsRoute: AdminSettingsRoute,
} }
const AdminRouteWithChildren = AdminRoute._addFileChildren(AdminRouteChildren) const AdminRouteWithChildren = AdminRoute._addFileChildren(AdminRouteChildren)
@@ -173,6 +189,7 @@ export interface FileRoutesByFullPath {
'/about': typeof AboutRoute '/about': typeof AboutRoute
'/login': typeof LoginRoute '/login': typeof LoginRoute
'/modules': typeof AdminModulesRoute '/modules': typeof AdminModulesRoute
'/settings': typeof AdminSettingsRoute
'/profile': typeof AuthProfileRoute '/profile': typeof AuthProfileRoute
'/ocp/lots': typeof OcpLotsRoute '/ocp/lots': typeof OcpLotsRoute
'/ocp': typeof OcpIndexRoute '/ocp': typeof OcpIndexRoute
@@ -184,6 +201,7 @@ export interface FileRoutesByTo {
'/about': typeof AboutRoute '/about': typeof AboutRoute
'/login': typeof LoginRoute '/login': typeof LoginRoute
'/modules': typeof AdminModulesRoute '/modules': typeof AdminModulesRoute
'/settings': typeof AdminSettingsRoute
'/profile': typeof AuthProfileRoute '/profile': typeof AuthProfileRoute
'/ocp/lots': typeof OcpLotsRoute '/ocp/lots': typeof OcpLotsRoute
'/ocp': typeof OcpIndexRoute '/ocp': typeof OcpIndexRoute
@@ -197,6 +215,7 @@ export interface FileRoutesById {
'/about': typeof AboutRoute '/about': typeof AboutRoute
'/login': typeof LoginRoute '/login': typeof LoginRoute
'/_admin/modules': typeof AdminModulesRoute '/_admin/modules': typeof AdminModulesRoute
'/_admin/settings': typeof AdminSettingsRoute
'/_auth/profile': typeof AuthProfileRoute '/_auth/profile': typeof AuthProfileRoute
'/ocp/lots': typeof OcpLotsRoute '/ocp/lots': typeof OcpLotsRoute
'/ocp/': typeof OcpIndexRoute '/ocp/': typeof OcpIndexRoute
@@ -210,6 +229,7 @@ export interface FileRouteTypes {
| '/about' | '/about'
| '/login' | '/login'
| '/modules' | '/modules'
| '/settings'
| '/profile' | '/profile'
| '/ocp/lots' | '/ocp/lots'
| '/ocp' | '/ocp'
@@ -220,6 +240,7 @@ export interface FileRouteTypes {
| '/about' | '/about'
| '/login' | '/login'
| '/modules' | '/modules'
| '/settings'
| '/profile' | '/profile'
| '/ocp/lots' | '/ocp/lots'
| '/ocp' | '/ocp'
@@ -231,6 +252,7 @@ export interface FileRouteTypes {
| '/about' | '/about'
| '/login' | '/login'
| '/_admin/modules' | '/_admin/modules'
| '/_admin/settings'
| '/_auth/profile' | '/_auth/profile'
| '/ocp/lots' | '/ocp/lots'
| '/ocp/' | '/ocp/'
@@ -282,7 +304,8 @@ export const routeTree = rootRoute
"/_admin": { "/_admin": {
"filePath": "_admin.tsx", "filePath": "_admin.tsx",
"children": [ "children": [
"/_admin/modules" "/_admin/modules",
"/_admin/settings"
] ]
}, },
"/_auth": { "/_auth": {
@@ -301,6 +324,10 @@ export const routeTree = rootRoute
"filePath": "_admin/modules.tsx", "filePath": "_admin/modules.tsx",
"parent": "/_admin" "parent": "/_admin"
}, },
"/_admin/settings": {
"filePath": "_admin/settings.tsx",
"parent": "/_admin"
},
"/_auth/profile": { "/_auth/profile": {
"filePath": "_auth/profile.tsx", "filePath": "_auth/profile.tsx",
"parent": "/_auth" "parent": "/_auth"

View File

@@ -0,0 +1,14 @@
import SettingsPage from "@/components/admin/settings/SettingsPage";
import {createFileRoute} from "@tanstack/react-router";
export const Route = createFileRoute("/_admin/settings")({
component: RouteComponent,
});
function RouteComponent() {
return (
<div>
<SettingsPage />
</div>
);
}

View File

@@ -1,21 +1,10 @@
import {createFileRoute, Link} from "@tanstack/react-router"; import OCPPage from "@/components/production/ocp/OcpPage";
import {createFileRoute} from "@tanstack/react-router";
export const Route = createFileRoute("/ocp/")({ export const Route = createFileRoute("/ocp/")({
component: RouteComponent, component: RouteComponent,
}); });
function RouteComponent() { function RouteComponent() {
const lines = ["l", "2", "3"]; return <OCPPage />;
return (
<div>
<h2>Hello "/ocp/something"!</h2>
{lines.map((line) => {
return (
<div key={line}>
<Link to="/ocp">Specific Line</Link>
</div>
);
})}
</div>
);
} }

View File

@@ -18,6 +18,6 @@ import {useModuleStore} from "../lib/store/useModuleStore";
export function moduleActive(moduleName: string): boolean { export function moduleActive(moduleName: string): boolean {
const {modules} = useModuleStore(); const {modules} = useModuleStore();
const module = modules?.find((m: any) => m.name === moduleName); const module = modules?.find((m: any) => m.name === moduleName && m.active === true);
return module ? true : false; return module ? true : false;
} }

115
package-lock.json generated
View File

@@ -23,6 +23,8 @@
"drizzle-orm": "^0.39.3", "drizzle-orm": "^0.39.3",
"drizzle-zod": "^0.7.0", "drizzle-zod": "^0.7.0",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"nodemailer": "^6.10.0",
"nodemailer-express-handlebars": "^7.0.0",
"pg": "^8.13.3", "pg": "^8.13.3",
"pino": "^9.6.0", "pino": "^9.6.0",
"pino-pretty": "^13.0.0", "pino-pretty": "^13.0.0",
@@ -1497,7 +1499,6 @@
"version": "8.0.2", "version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
"dev": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"string-width": "^5.1.2", "string-width": "^5.1.2",
@@ -1515,7 +1516,6 @@
"version": "6.1.0", "version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=12" "node": ">=12"
@@ -1528,7 +1528,6 @@
"version": "6.2.1", "version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=12" "node": ">=12"
@@ -1541,14 +1540,12 @@
"version": "9.2.2", "version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@isaacs/cliui/node_modules/string-width": { "node_modules/@isaacs/cliui/node_modules/string-width": {
"version": "5.1.2", "version": "5.1.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"eastasianwidth": "^0.2.0", "eastasianwidth": "^0.2.0",
@@ -1566,7 +1563,6 @@
"version": "7.1.0", "version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"ansi-regex": "^6.0.1" "ansi-regex": "^6.0.1"
@@ -1582,7 +1578,6 @@
"version": "8.1.0", "version": "8.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"ansi-styles": "^6.1.0", "ansi-styles": "^6.1.0",
@@ -2865,7 +2860,6 @@
"version": "4.3.0", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"color-convert": "^2.0.1" "color-convert": "^2.0.1"
@@ -3339,7 +3333,6 @@
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"color-name": "~1.1.4" "color-name": "~1.1.4"
@@ -3352,7 +3345,6 @@
"version": "1.1.4", "version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/color-support": { "node_modules/color-support": {
@@ -4561,7 +4553,6 @@
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/ecdsa-sig-formatter": { "node_modules/ecdsa-sig-formatter": {
@@ -4796,6 +4787,71 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/express-handlebars": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-8.0.1.tgz",
"integrity": "sha512-mdas0PTbgQnwSyAjcYM7OMaftM8nJ3Kqz6yAyK4iCFvMOGGvh6pv42IHwcE5PBpS6ffYeZRSsgAdYUMG4CSjhQ==",
"license": "BSD-3-Clause",
"peer": true,
"dependencies": {
"glob": "^11.0.0",
"graceful-fs": "^4.2.11",
"handlebars": "^4.7.8"
},
"engines": {
"node": ">=20"
}
},
"node_modules/express-handlebars/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"license": "MIT",
"peer": true,
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/express-handlebars/node_modules/glob": {
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz",
"integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==",
"license": "ISC",
"peer": true,
"dependencies": {
"foreground-child": "^3.1.0",
"jackspeak": "^4.0.1",
"minimatch": "^10.0.0",
"minipass": "^7.1.2",
"package-json-from-dist": "^1.0.0",
"path-scurry": "^2.0.0"
},
"bin": {
"glob": "dist/esm/bin.mjs"
},
"engines": {
"node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/express-handlebars/node_modules/minimatch": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
"integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
"license": "ISC",
"peer": true,
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/extend": { "node_modules/extend": {
"version": "3.0.2", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -4993,7 +5049,6 @@
"version": "3.3.1", "version": "3.3.1",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
"integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
"dev": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"cross-spawn": "^7.0.6", "cross-spawn": "^7.0.6",
@@ -5010,7 +5065,6 @@
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"dev": true,
"license": "ISC", "license": "ISC",
"engines": { "engines": {
"node": ">=14" "node": ">=14"
@@ -5548,14 +5602,12 @@
"version": "4.2.11", "version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"dev": true,
"license": "ISC" "license": "ISC"
}, },
"node_modules/handlebars": { "node_modules/handlebars": {
"version": "4.7.8", "version": "4.7.8",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
"integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"minimist": "^1.2.5", "minimist": "^1.2.5",
@@ -6387,7 +6439,6 @@
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz",
"integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==",
"dev": true,
"license": "BlueOak-1.0.0", "license": "BlueOak-1.0.0",
"dependencies": { "dependencies": {
"@isaacs/cliui": "^8.0.2" "@isaacs/cliui": "^8.0.2"
@@ -8011,7 +8062,6 @@
"version": "7.1.2", "version": "7.1.2",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
"dev": true,
"license": "ISC", "license": "ISC",
"engines": { "engines": {
"node": ">=16 || 14 >=14.17" "node": ">=16 || 14 >=14.17"
@@ -8108,7 +8158,6 @@
"version": "2.6.2", "version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/node-addon-api": { "node_modules/node-addon-api": {
@@ -8137,6 +8186,28 @@
} }
} }
}, },
"node_modules/nodemailer": {
"version": "6.10.0",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.0.tgz",
"integrity": "sha512-SQ3wZCExjeSatLE/HBaXS5vqUOQk6GtBdIIKxiFdmm01mOQZX/POJkO3SUX1wDiYcwUOJwT23scFSC9fY2H8IA==",
"license": "MIT-0",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/nodemailer-express-handlebars": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/nodemailer-express-handlebars/-/nodemailer-express-handlebars-7.0.0.tgz",
"integrity": "sha512-fJ5pj5TaDiXKDShzrOksZDR1iE65W8z40unwM8+wiHT3AhifQsc2/G5uw4DC1LNN4RhqXGkuYuoEkoE+Zk+GHQ==",
"license": "MIT",
"engines": {
"node": ">= 20"
},
"peerDependencies": {
"express-handlebars": ">= 8.0.0",
"nodemailer": ">= 6.0.0"
}
},
"node_modules/nopt": { "node_modules/nopt": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
@@ -8349,7 +8420,6 @@
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
"dev": true,
"license": "BlueOak-1.0.0" "license": "BlueOak-1.0.0"
}, },
"node_modules/packrup": { "node_modules/packrup": {
@@ -8467,7 +8537,6 @@
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
"integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
"dev": true,
"license": "BlueOak-1.0.0", "license": "BlueOak-1.0.0",
"dependencies": { "dependencies": {
"lru-cache": "^11.0.0", "lru-cache": "^11.0.0",
@@ -8484,7 +8553,6 @@
"version": "11.0.2", "version": "11.0.2",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz",
"integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==",
"dev": true,
"license": "ISC", "license": "ISC",
"engines": { "engines": {
"node": "20 || >=22" "node": "20 || >=22"
@@ -9828,7 +9896,6 @@
"version": "4.2.3", "version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"emoji-regex": "^8.0.0", "emoji-regex": "^8.0.0",
@@ -9907,7 +9974,6 @@
"version": "6.0.1", "version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"ansi-regex": "^5.0.1" "ansi-regex": "^5.0.1"
@@ -10680,7 +10746,6 @@
"version": "3.19.3", "version": "3.19.3",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
"integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
"dev": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"optional": true, "optional": true,
"bin": { "bin": {
@@ -11046,7 +11111,6 @@
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
"integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/wrap-ansi": { "node_modules/wrap-ansi": {
@@ -11072,7 +11136,6 @@
"version": "7.0.0", "version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"ansi-styles": "^4.0.0", "ansi-styles": "^4.0.0",

View File

@@ -33,6 +33,8 @@
"drizzle-orm": "^0.39.3", "drizzle-orm": "^0.39.3",
"drizzle-zod": "^0.7.0", "drizzle-zod": "^0.7.0",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"nodemailer": "^6.10.0",
"nodemailer-express-handlebars": "^7.0.0",
"pg": "^8.13.3", "pg": "^8.13.3",
"pino": "^9.6.0", "pino": "^9.6.0",
"pino-pretty": "^13.0.0", "pino-pretty": "^13.0.0",

View File

@@ -7,18 +7,22 @@ import session from "./routes/session.js";
import getAccess from "./routes/userRoles/getUserRoles.js"; import getAccess from "./routes/userRoles/getUserRoles.js";
import setAccess from "./routes/userRoles/setUserRoles.js"; import setAccess from "./routes/userRoles/setUserRoles.js";
import profile from "./routes/user/profileUpdate.js"; import profile from "./routes/user/profileUpdate.js";
import {areRolesIn} from "./utils/roleCheck.js";
const app = new OpenAPIHono(); const app = new OpenAPIHono();
// run the role check
areRolesIn();
app.route("auth/login", login); app.route("auth/login", login);
app.route("auth/register", register); app.route("auth/register", register);
app.route("auth/session", session); app.route("auth/session", session);
// required to login // required to login
/* User area just needs to be logged in to enter here */ /* User area just needs to be logged in to enter here */
app.route("/auth/profileUpdate", profile); app.route("auth/profileUpdate", profile);
/* will need to increase to make sure the person coming here has the correct permissions */ /* will need to increase to make sure the person coming here has the correct permissions */
app.route("/auth/getuseraccess", getAccess); app.route("auth/getuseraccess", getAccess);
app.route("/auth/setuseraccess", setAccess); app.route("auth/setuseraccess", setAccess);
export default app; export default app;

View File

@@ -12,7 +12,15 @@ export const roleCheck = async (user_id: string | undefined) => {
throw Error("Missing user_id"); throw Error("Missing user_id");
} }
// get the user roles by the user_id // get the user roles by the user_id
const roles = await db.select().from(userRoles).where(eq(userRoles.user_id, user_id)); const roles = await db
.select({
user_id: userRoles.user_id,
role_id: userRoles.role_id,
module_id: userRoles.module_id,
role: userRoles.role,
})
.from(userRoles)
.where(eq(userRoles.user_id, user_id));
return roles; return roles;
}; };

View File

@@ -0,0 +1,38 @@
/**
* check if the roles are in and if not add them.
* this will only run on a server start up
*/
import {db} from "../../../../database/dbclient.js";
import {roles} from "../../../../database/schema/roles.js";
import {log} from "../../logger/logger.js";
// "view", "technician", "supervisor","manager", "admin", "systemAdmin"
const newRoles = [
{name: "viewer"},
{name: "technician"},
{name: "supervisor"},
{name: "manager"},
{name: "admin"},
{name: "systemAdmin"},
];
export const areRolesIn = async () => {
// get the roles
try {
const roleCheck = await db.select().from(roles);
if (roleCheck.length !== newRoles.length) {
try {
const newRole = await db
.insert(roles)
.values(newRoles)
.onConflictDoNothing() // this will only update the ones that are new :D
.returning({name: roles.name});
log.info(newRole, "Roles were just added due to missing them on server startup");
} catch (error) {
log.error(error, "There was an error adding new roles to the db");
}
}
} catch (error) {
log.error(error, "There was an error getting or adding new roles");
}
};

View File

@@ -0,0 +1,7 @@
import {log} from "../../logger/logger.js";
export const sendEmail = async () => {
log.info("Preparing to send an email");
// settings
};

View File

@@ -0,0 +1,18 @@
import {eq} from "drizzle-orm";
import {db} from "../../../../../database/dbclient.js";
import {modules} from "../../../../../database/schema/modules.js";
import {log} from "../../../logger/logger.js";
export const addModule = async (data: any, user_id: string) => {
log.info("Module being added");
let module;
try {
module = await db.insert(modules).values(data).returning({name: modules.name});
//.where(sql`${userRole} = ANY(roles)`);
} catch (error) {
log.error(error, "There was an error adding the module");
throw new Error("There was an error adding the module");
}
return module;
};

View File

@@ -0,0 +1,22 @@
import {eq} from "drizzle-orm";
import {db} from "../../../../../database/dbclient.js";
import {modules} from "../../../../../database/schema/modules.js";
import {log} from "../../../logger/logger.js";
export const updateModule = async (data: any, moduleID: string) => {
log.info("Module being updated");
let module;
try {
module = await db
.update(modules)
.set({active: data?.active})
.where(eq(modules.module_id, moduleID))
.returning({name: modules.name});
//.where(sql`${userRole} = ANY(roles)`);
} catch (error) {
log.error(error, "There was an error updating the module");
throw new Error("There was an error updating the module");
}
return module;
};

View File

@@ -0,0 +1,36 @@
import {and, eq} from "drizzle-orm";
import {db} from "../../../../../database/dbclient.js";
import {settings} from "../../../../../database/schema/settings.js";
import {log} from "../../../logger/logger.js";
import {userRoles} from "../../../../../database/schema/userRoles.js";
import {modules} from "../../../../../database/schema/modules.js";
export const addSetting = async (data: any, user_id: string) => {
log.info(user_id, "Adding a new setting");
// make sure the user is a system admin before moving forward
const sysAdmin = await db
.select()
.from(userRoles)
.where(and(eq(userRoles.user_id, user_id), eq(userRoles.role, "systemAdmin")));
if (sysAdmin) {
log.info(`Setting ${data.name} is being added`);
try {
const moduleId = await db.select().from(modules).where(eq(modules.name, data.module));
// filter out the module and add in the module id
delete data.module;
data.module_id = moduleId[0].module_id;
console.log(data);
const createSetting = await db.insert(settings).values(data);
} catch (error) {
log.error(error, "Error adding setting");
throw new Error("Error Adding Setting");
}
} else {
log.info("This user cannot add new roles");
throw new Error("The user trying to add a setting dose not have the correct permissions");
}
};

View File

@@ -0,0 +1,17 @@
import {db} from "../../../../../database/dbclient.js";
import {settings} from "../../../../../database/schema/settings.js";
import {log} from "../../../logger/logger.js";
export const getSettings = async () => {
log.info("Settings are being grabbed");
let serverSettings;
try {
serverSettings = await db.select().from(settings);
//.where(sql`${userRole} = ANY(roles)`);
} catch (error) {
log.error(error, "There was an error getting the settings");
throw new Error("There was an error getting the settings");
}
return serverSettings;
};

View File

@@ -0,0 +1,114 @@
import {z, createRoute, OpenAPIHono} from "@hono/zod-openapi";
import {modules} from "../../../../../database/schema/modules.js";
import {db} from "../../../../../database/dbclient.js";
import {log} from "../../../logger/logger.js";
import type {User} from "../../../../types/users.js";
import {verify} from "hono/jwt";
import {updateModule} from "../../controller/module/updateModule.js";
import {authMiddleware} from "../../../auth/middleware/authMiddleware.js";
import {addModule} from "../../controller/module/addModule.js";
// Define the response schema
const responseSchema = z.object({
message: z.string().optional(),
module_id: z.string().openapi({example: "6c922c6c-7de3-4ec4-acb0-f068abdc"}).optional(),
name: z.string().openapi({example: "Production"}).optional(),
active: z.boolean().openapi({example: true}).optional(),
roles: z.string().openapi({example: `["viewer","technician"]`}).optional(),
});
const app = new OpenAPIHono();
// const ParamsSchema = z.object({
// id: z
// .string()
// .min(3)
// .openapi({
// param: {
// name: "id",
// in: "path",
// },
// example: "1212121",
// }),
// });
const AddModule = z.object({
name: z.string().openapi({example: "production"}),
});
app.openapi(
createRoute({
tags: ["server"],
summary: "Adds a new module",
method: "post",
path: "/modules",
middleware: authMiddleware,
request: {
body: {
content: {
"application/json": {schema: AddModule},
},
},
},
responses: {
200: {
content: {
"application/json": {schema: responseSchema},
},
description: "Response message",
},
400: {
content: {
"application/json": {
schema: z.object({message: z.string().optional().openapi({example: "Internal Server error"})}),
},
},
description: "Internal Server Error",
},
401: {
content: {
"application/json": {
schema: z.object({message: z.string().optional().openapi({example: "Unauthenticated"})}),
},
},
description: "Unauthorized",
},
500: {
content: {
"application/json": {
schema: z.object({message: z.string().optional().openapi({example: "Internal Server error"})}),
},
},
description: "Internal Server Error",
},
},
}),
async (c) => {
//const {id} = c.req.valid("param");
// make sure we have a vaid user being accessed thats really logged in
const authHeader = c.req.header("Authorization");
const token = authHeader?.split("Bearer ")[1] || "";
let user: User;
try {
const payload = await verify(token, process.env.JWT_SECRET!);
user = payload.user as User;
} catch (error) {
log.error(error, "Failed session check, user must be logged out");
return c.json({message: "Unauthorized"}, 401);
}
// now pass all the data over to update the user info
try {
const data = await c?.req.json();
await addModule(data, user.user_id ?? "");
return c.json({success: true, message: "New setting was added"}, 200);
} catch (error) {
return c.json({message: "Please make sure you are not missing your data.", error}, 400);
}
}
);
export default app;

View File

@@ -1,7 +1,7 @@
import {z, createRoute, OpenAPIHono} from "@hono/zod-openapi"; import {z, createRoute, OpenAPIHono} from "@hono/zod-openapi";
import {modules} from "../../../../database/schema/modules.js"; import {modules} from "../../../../../database/schema/modules.js";
import {db} from "../../../../database/dbclient.js"; import {db} from "../../../../../database/dbclient.js";
import {eq} from "drizzle-orm"; import {log} from "../../../logger/logger.js";
// Define the request body schema // Define the request body schema
const requestSchema = z.object({ const requestSchema = z.object({
@@ -27,7 +27,7 @@ app.openapi(
tags: ["server"], tags: ["server"],
summary: "Returns all modules in the server", summary: "Returns all modules in the server",
method: "get", method: "get",
path: "/", path: "/modules",
responses: { responses: {
200: { 200: {
content: { content: {
@@ -41,7 +41,7 @@ app.openapi(
//console.log("system modules"); //console.log("system modules");
let module: any = []; let module: any = [];
try { try {
module = await db.select().from(modules).where(eq(modules.active, true)); module = await db.select().from(modules); // .where(eq(modules.active, true));
} catch (error) { } catch (error) {
console.log(error); console.log(error);
module = []; module = [];
@@ -50,15 +50,16 @@ app.openapi(
// parse the roles // parse the roles
const updateModules = module.map((m: any) => { const updateModules = module.map((m: any) => {
if (m.roles) { if (m.roles) {
return {...m, roles: JSON.parse(m?.roles)}; return {...m, roles: m?.roles};
} }
return m; return m;
}); //JSON.parse(module[0]?.roles); }); //JSON.parse(module[0]?.roles);
// Return response with the received data // Return response with the received data
return c.json({ return c.json({
message: `All active modules`, message: `All active modules`,
data: updateModules, data: module,
}); });
} }
); );

View File

@@ -0,0 +1,110 @@
import {z, createRoute, OpenAPIHono} from "@hono/zod-openapi";
import {modules} from "../../../../../database/schema/modules.js";
import {db} from "../../../../../database/dbclient.js";
import {log} from "../../../logger/logger.js";
import type {User} from "../../../../types/users.js";
import {verify} from "hono/jwt";
import {updateModule} from "../../controller/module/updateModule.js";
import {authMiddleware} from "../../../auth/middleware/authMiddleware.js";
// Define the response schema
const responseSchema = z.object({
message: z.string().optional(),
module_id: z.string().openapi({example: "6c922c6c-7de3-4ec4-acb0-f068abdc"}).optional(),
name: z.string().openapi({example: "Production"}).optional(),
active: z.boolean().openapi({example: true}).optional(),
roles: z.string().openapi({example: `["viewer","technician"]`}).optional(),
});
const app = new OpenAPIHono();
const ParamsSchema = z.object({
id: z
.string()
.min(3)
.openapi({
param: {
name: "id",
in: "path",
},
example: "1212121",
}),
});
app.openapi(
createRoute({
tags: ["server"],
summary: "Updates module",
method: "patch",
path: "/modules/{id}",
middleware: authMiddleware,
request: {
params: ParamsSchema,
},
responses: {
200: {
content: {
"application/json": {schema: responseSchema},
},
description: "Response message",
},
400: {
content: {
"application/json": {
schema: z.object({message: z.string().optional().openapi({example: "Internal Server error"})}),
},
},
description: "Internal Server Error",
},
401: {
content: {
"application/json": {
schema: z.object({message: z.string().optional().openapi({example: "Unauthenticated"})}),
},
},
description: "Unauthorized",
},
500: {
content: {
"application/json": {
schema: z.object({message: z.string().optional().openapi({example: "Internal Server error"})}),
},
},
description: "Internal Server Error",
},
},
}),
async (c) => {
const {id} = c.req.valid("param");
// make sure we have a vaid user being accessed thats really logged in
const authHeader = c.req.header("Authorization");
const token = authHeader?.split("Bearer ")[1] || "";
let user: User;
try {
const payload = await verify(token, process.env.JWT_SECRET!);
user = payload.user as User;
} catch (error) {
log.error(error, "Failed session check, user must be logged out");
return c.json({message: "Unauthorized"}, 401);
}
// now pass all the data over to update the user info
try {
const data = await c?.req.json();
await updateModule(data, id ?? "");
return c.json({success: true, message: "New setting was added"}, 200);
} catch (error) {
return c.json({message: "Please make sure you are not missing your data.", error}, 400);
}
return c.json({
message: `Module has been updated`,
data: id,
});
}
);
export default app;

View File

@@ -0,0 +1,95 @@
import {createRoute, OpenAPIHono, z} from "@hono/zod-openapi";
import {addSetting} from "../../controller/settings/addSetting.js";
import {log} from "../../../logger/logger.js";
import {verify} from "hono/jwt";
import type {User} from "../../../../types/users.js";
import {authMiddleware} from "../../../auth/middleware/authMiddleware.js";
const app = new OpenAPIHono();
const AddSetting = z.object({
name: z.string().openapi({example: "server"}),
value: z.string().openapi({example: "localhost"}),
description: z.string().openapi({example: "The server we are going to connect to"}),
roles: z.string().openapi({example: "admin"}),
module: z.string().openapi({example: "production"}),
});
app.openapi(
createRoute({
tags: ["server"],
summary: "Add Setting",
method: "post",
path: "/settings",
middleware: authMiddleware,
request: {
body: {
content: {
"application/json": {schema: AddSetting},
},
},
},
responses: {
200: {
content: {
"application/json": {
schema: z.object({
success: z.boolean().openapi({example: true}),
message: z.string().openapi({example: "Starter"}),
}),
},
},
description: "Response message",
},
400: {
content: {
"application/json": {
schema: z.object({message: z.string().optional().openapi({example: "Internal Server error"})}),
},
},
description: "Internal Server Error",
},
401: {
content: {
"application/json": {
schema: z.object({message: z.string().optional().openapi({example: "Unauthenticated"})}),
},
},
description: "Unauthorized",
},
500: {
content: {
"application/json": {
schema: z.object({message: z.string().optional().openapi({example: "Internal Server error"})}),
},
},
description: "Internal Server Error",
},
},
}),
async (c) => {
// make sure we have a vaid user being accessed thats really logged in
const authHeader = c.req.header("Authorization");
const token = authHeader?.split("Bearer ")[1] || "";
let user: User;
try {
const payload = await verify(token, process.env.JWT_SECRET!);
user = payload.user as User;
} catch (error) {
log.error(error, "Failed session check, user must be logged out");
return c.json({message: "Unauthorized"}, 401);
}
// now pass all the data over to update the user info
try {
const data = await c?.req.json();
await addSetting(data, user.user_id ?? "");
return c.json({success: true, message: "New setting was added"}, 200);
} catch (error) {
return c.json({message: "Please make sure you are not missing your data.", error}, 400);
}
}
);
export default app;

View File

@@ -0,0 +1,29 @@
import {createRoute, OpenAPIHono, z} from "@hono/zod-openapi";
const app = new OpenAPIHono();
app.openapi(
createRoute({
tags: ["server"],
summary: "Returns all modules in the server",
method: "delete",
path: "/settings",
responses: {
200: {
content: {
"application/json": {
schema: z.object({
success: z.boolean().openapi({example: true}),
message: z.string().openapi({example: "Starter"}),
}),
},
},
description: "Response message",
},
},
}),
async (c) => {
return c.json({success: true, message: "Example"}, 200);
}
);
export default app;

View File

@@ -0,0 +1,85 @@
import {createRoute, OpenAPIHono, z} from "@hono/zod-openapi";
import {log} from "../../../logger/logger.js";
import type {User} from "../../../../types/users.js";
import {verify} from "hono/jwt";
import {getSettings} from "../../controller/settings/getSettings.js";
const app = new OpenAPIHono();
app.openapi(
createRoute({
tags: ["server"],
summary: "Returns all settings based on your permissions",
method: "get",
path: "/settings",
responses: {
200: {
content: {
"application/json": {
schema: z.object({
success: z.boolean().openapi({example: true}),
message: z.string().openapi({example: "Starter"}),
}),
},
},
description: "Response message",
},
400: {
content: {
"application/json": {
schema: z.object({message: z.string().optional().openapi({example: "Internal Server error"})}),
},
},
description: "Internal Server Error",
},
401: {
content: {
"application/json": {
schema: z.object({message: z.string().optional().openapi({example: "Unauthenticated"})}),
},
},
description: "Unauthorized",
},
500: {
content: {
"application/json": {
schema: z.object({message: z.string().optional().openapi({example: "Internal Server error"})}),
},
},
description: "Internal Server Error",
},
},
}),
async (c) => {
// make sure we have a vaid user being accessed thats really logged in
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] || "";
let user: User;
try {
const payload = await verify(token, process.env.JWT_SECRET!);
user = payload.user as User;
} catch (error) {
log.error(error, "Failed session check, user must be logged out");
return c.json({message: "Unauthorized"}, 401);
}
// now pass all the data over to update the user info
try {
const data = await getSettings();
return c.json({success: true, message: "All Current Settings", data}, 200);
} catch (error) {
return c.json({message: "There was an error getting the settings.", error}, 400);
}
}
);
export default app;

View File

@@ -0,0 +1,29 @@
import {createRoute, OpenAPIHono, z} from "@hono/zod-openapi";
const app = new OpenAPIHono();
app.openapi(
createRoute({
tags: ["server"],
summary: "Returns all modules in the server",
method: "post",
path: "/",
responses: {
200: {
content: {
"application/json": {
schema: z.object({
success: z.boolean().openapi({example: true}),
message: z.string().openapi({example: "Starter"}),
}),
},
},
description: "Response message",
},
},
}),
async (c) => {
return c.json({success: true, message: "Example"}, 200);
}
);
export default app;

View File

@@ -1,7 +1,31 @@
import {OpenAPIHono} from "@hono/zod-openapi"; import {OpenAPIHono} from "@hono/zod-openapi";
import {areModulesIn} from "./utils/moduleCheck.js";
import modules from "./route/modules.js"; // routes
import getModules from "./route/modules/getModules.js";
import updateModule from "./route/modules/updateModules.js";
import addModule from "./route/modules/addModule.js";
import addSetting from "./route/settings/addSetting.js";
import getSettings from "./route/settings/getSettings.js";
const app = new OpenAPIHono().route("server/modules", modules); areModulesIn();
const app = new OpenAPIHono();
const routes = [
getModules,
updateModule,
addModule,
// settings
addSetting,
getSettings,
] as const;
// app.route("/server", modules);
const appRoutes = routes.forEach((route) => {
app.route("/server", route);
});
app.all("/server/*", (c) => {
return c.json({success: false, message: "You encountered a route that dose not exist on the server routes"});
});
export default app; export default app;

View File

@@ -0,0 +1,38 @@
/**
* check if the modules are in and if not add them.
* this will only run on a server start up
*/
import {db} from "../../../../database/dbclient.js";
import {modules} from "../../../../database/schema/modules.js";
import {log} from "../../logger/logger.js";
// "view", "technician", "supervisor","manager", "admin", "systemAdmin"
const newModules = [
{name: "production", active: false, roles: ["viewer", "systemAdmin"]},
{name: "logistics", active: false, roles: ["viewer", "systemAdmin"]},
{name: "quality", active: false, roles: ["viewer", "manager", "systemAdmin"]},
{name: "forklift", active: false, roles: ["manager", "admin", "systemAdmin"]},
{name: "eom", active: false, roles: ["manager", "admin", "systemAdmin"]},
{name: "admin", active: false, roles: ["admin", "systemAdmin"]},
];
export const areModulesIn = async () => {
// get the roles
try {
const moduleCheck = await db.select().from(modules);
if (moduleCheck.length !== newModules.length) {
try {
const newRole = await db
.insert(modules)
.values(newModules)
.onConflictDoNothing() // this will only update the ones that are new :D
.returning({name: modules.name});
log.info(newRole, "Roles were just added due to missing them on server startup");
} catch (error) {
log.error(error, "There was an error adding new roles to the db");
}
}
} catch (error) {
log.error(error, "There was an error getting or adding new roles");
}
};

12
server/types/settings.ts Normal file
View File

@@ -0,0 +1,12 @@
export interface Settings {
settings_id?: string | null;
name: string | null;
value: string | null;
description: string | null;
module_id: string | null;
role: string | null;
add_User: string | null;
add_Date: Date;
upd_user: string | null;
upd_date: Date;
}

View File

@@ -10,7 +10,9 @@
"jsx": "react-jsx", "jsx": "react-jsx",
"jsxImportSource": "hono/jsx", "jsxImportSource": "hono/jsx",
"outDir": "./dist", "outDir": "./dist",
"removeComments": true "removeComments": true,
"allowJs": true,
"esModuleInterop": true
}, },
"exclude": ["node_modules", "frontend"] "exclude": ["node_modules", "frontend", "dist"]
} }