From ab4439a53119fb02dd047597b2464f378c3b502a Mon Sep 17 00:00:00 2001 From: root Date: Sun, 9 Apr 2023 19:40:49 +0400 Subject: [PATCH] init --- .gitignore | 38 +- README.md | 2 - SUBD-back/.env | 6 + .../Controllers/pickUpPointController.js | 513 ++++++ SUBD-back/Controllers/projectController.js | 328 ++++ .../project_technologyController.js | 199 ++ SUBD-back/Controllers/roleController.js | 178 ++ .../Controllers/role_projectController.js | 199 ++ SUBD-back/Controllers/techAspectController.js | 173 ++ .../techSpecificationController.js | 173 ++ SUBD-back/Controllers/technologyController.js | 180 ++ SUBD-back/Controllers/usersController.js | 234 +++ .../worker_technologyController.js | 254 +++ SUBD-back/Error/ApiError.js | 20 + .../MiddleWare/ErrorHandlingMiddleware.js | 8 + SUBD-back/Routes/car.js | 10 + SUBD-back/Routes/client.js | 10 + SUBD-back/Routes/driver.js | 10 + SUBD-back/Routes/index.js | 15 + SUBD-back/Routes/order.js | 10 + SUBD-back/Routes/pickUpPoint.js | 10 + SUBD-back/db.js | 11 + SUBD-back/index.js | 21 + SUBD-back/package.json | 23 + SUBD-front/.vscode/extensions.json | 3 + SUBD-front/README.md | 29 + SUBD-front/index.html | 13 + SUBD-front/package-lock.json | 1632 +++++++++++++++++ SUBD-front/package.json | 19 + SUBD-front/public/favicon.ico | Bin 0 -> 4286 bytes SUBD-front/src/App.vue | 85 + SUBD-front/src/assets/base.css | 74 + SUBD-front/src/assets/logo.svg | 1 + SUBD-front/src/assets/main.css | 35 + SUBD-front/src/components/HelloWorld.vue | 43 + SUBD-front/src/components/TheWelcome.vue | 86 + SUBD-front/src/components/WelcomeItem.vue | 85 + .../src/components/icons/IconCommunity.vue | 7 + .../components/icons/IconDocumentation.vue | 7 + .../src/components/icons/IconEcosystem.vue | 7 + .../src/components/icons/IconSupport.vue | 7 + .../src/components/icons/IconTooling.vue | 19 + SUBD-front/src/main.js | 11 + SUBD-front/src/router/index.js | 23 + SUBD-front/src/views/AboutView.vue | 15 + SUBD-front/src/views/HomeView.vue | 9 + SUBD-front/vite.config.js | 15 + 47 files changed, 4836 insertions(+), 14 deletions(-) delete mode 100644 README.md create mode 100644 SUBD-back/.env create mode 100644 SUBD-back/Controllers/pickUpPointController.js create mode 100644 SUBD-back/Controllers/projectController.js create mode 100644 SUBD-back/Controllers/project_technologyController.js create mode 100644 SUBD-back/Controllers/roleController.js create mode 100644 SUBD-back/Controllers/role_projectController.js create mode 100644 SUBD-back/Controllers/techAspectController.js create mode 100644 SUBD-back/Controllers/techSpecificationController.js create mode 100644 SUBD-back/Controllers/technologyController.js create mode 100644 SUBD-back/Controllers/usersController.js create mode 100644 SUBD-back/Controllers/worker_technologyController.js create mode 100644 SUBD-back/Error/ApiError.js create mode 100644 SUBD-back/MiddleWare/ErrorHandlingMiddleware.js create mode 100644 SUBD-back/Routes/car.js create mode 100644 SUBD-back/Routes/client.js create mode 100644 SUBD-back/Routes/driver.js create mode 100644 SUBD-back/Routes/index.js create mode 100644 SUBD-back/Routes/order.js create mode 100644 SUBD-back/Routes/pickUpPoint.js create mode 100644 SUBD-back/db.js create mode 100644 SUBD-back/index.js create mode 100644 SUBD-back/package.json create mode 100644 SUBD-front/.vscode/extensions.json create mode 100644 SUBD-front/README.md create mode 100644 SUBD-front/index.html create mode 100644 SUBD-front/package-lock.json create mode 100644 SUBD-front/package.json create mode 100644 SUBD-front/public/favicon.ico create mode 100644 SUBD-front/src/App.vue create mode 100644 SUBD-front/src/assets/base.css create mode 100644 SUBD-front/src/assets/logo.svg create mode 100644 SUBD-front/src/assets/main.css create mode 100644 SUBD-front/src/components/HelloWorld.vue create mode 100644 SUBD-front/src/components/TheWelcome.vue create mode 100644 SUBD-front/src/components/WelcomeItem.vue create mode 100644 SUBD-front/src/components/icons/IconCommunity.vue create mode 100644 SUBD-front/src/components/icons/IconDocumentation.vue create mode 100644 SUBD-front/src/components/icons/IconEcosystem.vue create mode 100644 SUBD-front/src/components/icons/IconSupport.vue create mode 100644 SUBD-front/src/components/icons/IconTooling.vue create mode 100644 SUBD-front/src/main.js create mode 100644 SUBD-front/src/router/index.js create mode 100644 SUBD-front/src/views/AboutView.vue create mode 100644 SUBD-front/src/views/HomeView.vue create mode 100644 SUBD-front/vite.config.js diff --git a/.gitignore b/.gitignore index 8c2b884..38adffa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,28 @@ -# ---> VisualStudioCode +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files .vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json !.vscode/extensions.json -!.vscode/*.code-snippets - -# Local History for Visual Studio Code -.history/ - -# Built Visual Studio Code Extensions -*.vsix - +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/README.md b/README.md deleted file mode 100644 index 038ea98..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# PIbd-22_Kalyshev_SUBD - diff --git a/SUBD-back/.env b/SUBD-back/.env new file mode 100644 index 0000000..73b56f3 --- /dev/null +++ b/SUBD-back/.env @@ -0,0 +1,6 @@ +DB_USER = postgres +DB_PASSWORD = 250303zyzf +DB_HOST = 109.197.199.134 +DATABASE = postgres +DB_PORT = 5432 +PORT = 3000 \ No newline at end of file diff --git a/SUBD-back/Controllers/pickUpPointController.js b/SUBD-back/Controllers/pickUpPointController.js new file mode 100644 index 0000000..d161b52 --- /dev/null +++ b/SUBD-back/Controllers/pickUpPointController.js @@ -0,0 +1,513 @@ +const ApiError = require("../Error/ApiError") +const DB = require("../db.js") +class pickUpPointController { + async update(req, res, next) { + const {changeColumn} = req.query; + const {changeValue} = req.query; + const {id} = req.query; + const {address} = req.query; + if (!id && !address && !changeColumn && !changeValue) { + return next(ApiError.badRequest('need more args')) + } + var updateQuery = `UPDATE \"PickUpPoint\" SET \"${changeColumn}\" = '${changeValue}' `; + var updateCond = [] + if (id || address) { + updateQuery += "WHERE "; + } + var i = 0; + if (ID) { + updateCond.push(ID) + updateQuery += `\"ID\" = $${updateCond.length} `; + i++ + } + if (Name){ + updateCond.push(Name); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"Name\" = $${updateCond.length} `; + i++ + } + if (AllWorkExp){ + updateCond.push(Email); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"Email\" = $${updateCond.length} `; + i++ + } + if (Email){ + updateCond.push(Password); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"Password\" = $${updateCond.length} `; + i++ + } + if (MainTechID){ + updateCond.push(MainTechID); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"MainTechID\" = $${updateCond.length} `; + i++ + } + if (MainRoleID){ + updateCond.push(MainRoleID); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"MainRoleID\" = $${updateCond.length} `; + i++ + } + if (ProjectID){ + updateCond.push(ProjectID); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"ProjectID\" = $${updateCond.length} `; + i++ + } + if (RoleInProjectID){ + updateCond.push(RoleInProjectID); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"RoleInProjectID\" = $${updateCond.length} `; + i++ + } + try { + var result + if (updateCond.length != 0) { + result = await DB.query(updateQuery, updateCond); + } else { + result = await DB.query(updateQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async delete(req, res, next) { + const {ID} = req.query; + const {Name} = req.query; + const {AllWorkExp} = req.query; + const {Email} = req.query; + const {MainTechID} = req.query; + const {MainRoleID} = req.query; + const {ProjectID} = req.query; + const {RoleInProjectID} = req.query; + if (!ID && !Name && !AllWorkExp && !Email && !MainTechID && !MainRoleID && !ProjectID && !RoleInProjectID) { + return next(ApiError.badRequest('need more args')) + } + var deleteQuery = "DELETE FROM public.\"Worker\" WHERE " + var deleteCond = [] + var i = 0 + if (ID) { + deleteCond.push(ID); + deleteQuery += `\"ID\" = $${deleteCond.length} `; + i++ + } + if (Name) { + deleteCond.push(Name); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"Name\" = $${deleteCond.length} `; + i++ + } + if (AllWorkExp) { + deleteCond.push(AllWorkExp); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"AllWorkExp\" = $${selectCond.length} `; + i++ + } + if (Email) { + deleteCond.push(Email); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"Email\" = $${selectCond.length} `; + i++ + } + if (MainTechID) { + deleteCond.push(MainTechID); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"MainTechID\" = $${selectCond.length} `; + i++ + } + if (MainRoleID) { + deleteCond.push(MainRoleID); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"MainRoleID\" = $${selectCond.length} `; + i++ + } + if (ProjectID) { + deleteCond.push(ProjectID); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"ProjectID\" = $${selectCond.length} `; + i++ + } + if (RoleInProjectID) { + deleteCond.push(RoleInProjectID); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"RoleInProjectID\" = $${selectCond.length} `; + i++ + } + deleteQuery += "RETURNING *" + try { + var result + if (deleteCond.length != 0) { + result = await DB.query(deleteQuery, deleteCond); + } else { + result = await DB.query(deleteQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async add(req, res, next) { + const {Name} = req.query; + const {AllWorkExp} = req.query; + const {Email} = req.query; + const {MainTechID} = req.query; + const {MainRoleID} = req.query; + const {ProjectID} = req.query; + const {RoleInProjectID} = req.query; + if (!Name || !AllWorkExp || !Email || !MainTechID || !MainRoleID) { + return next(ApiError.badRequest('need more args')) + } + var selectTechnology = await DB.query("SELECT * FROM public.\"Technology\" WHERE \"ID\" = $1", [MainTechID]); + if (!selectTechnology.rowCount) { + return next(ApiError.badRequest('no MainTechID in Technology')) + } + var selectRole = await DB.query("SELECT * FROM public.\"Role\" WHERE \"ID\" = $1", [MainRoleID]); + if (!selectRole.rowCount) { + return next(ApiError.badRequest('no MainRoleID in Role')) + } + var selectProject; + var selectRoleInProject; + if (ProjectID) { + selectProject = await DB.query("SELECT * FROM public.\"Project\" WHERE \"ID\" = $1", [ProjectID]); + if (!selectProject.rowCount) { + return next(ApiError.badRequest('no ProjectID in Project')) + } + } + if (RoleInProjectID) { + selectRoleInProject = await DB.query("SELECT * FROM public.\"Role\" WHERE \"ID\" = $1", [RoleInProjectID]); + if (!selectRoleInProject.rowCount) { + return next(ApiError.badRequest('no RoleInProjectID in Role')) + } + } + + var insertQuery = "INSERT INTO public.\"Worker\" (\"ID\", \"Name\", \"AllWorkExp\", \"Email\", \"MainTechID\", \"MainRoleID\", \"ProjectID\", \"RoleInProjectID\") Values(nextval('\"ProjectID\"'), $1, $2, $3, $4, $5, $6, $7)" + var insertCond = [Name, AllWorkExp, Email, MainTechID, MainRoleID, ProjectID, RoleInProjectID] + try { + var result + if (insertCond.length != 0) { + result = await DB.query(insertQuery, insertCond); + } else { + result = await DB.query(insertQuery); + } + } catch (error) { + return next(ApiError.badRequest('error')) + } + res.json(result.rows) + } + + async getRoles(req, res, next) { + const {Email} = req.query; + var selectQuery = 'SELECT "Role"."Name" FROM public."Worker", public."Role" WHERE "Worker"."Email" = $1 AND "Role"."ID" = "Worker"."MainRoleID"' + var selectCond = [Email] + try { + var result + if (selectCond.length != 0) { + result = await DB.query(selectQuery, selectCond); + } else { + result = await DB.query(selectQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async get(req, res, next) { + const {Column} = req.query; + const {OperatorID} = req.query; + const {OperatorAllWorkExp} = req.query; + const {OperatorMainTechID} = req.query; + const {OperatorMainRoleID} = req.query; + const {OperatorProjectID} = req.query; + const {OperatorRoleInProjectID} = req.query; + const {ID} = req.query; + const {Name} = req.query; + const {AllWorkExp} = req.query; + const {Email} = req.query; + const {MainTechID} = req.query; + const {MainRoleID} = req.query; + const {ProjectID} = req.query; + const {RoleInProjectID} = req.query; + var selectQuery = "SELECT " + var selectCond = [] + if (Column) { + selectQuery += `\"${Column}\" FROM public.\"Worker\" `; + } else { + selectQuery += "* FROM public.\"Worker\" "; + } + if (ID || Name || AllWorkExp || Email || MainTechID || MainRoleID || ProjectID || RoleInProjectID) { + selectQuery += "WHERE "; + } + var i = 0 + if (ID) { + selectCond.push(ID); + if (!OperatorID) { + selectQuery += `\"ID\" = $${selectCond.length} `; + } else { + switch (OperatorID) { + case ">": + selectQuery += `\"ID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"ID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"ID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"ID\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (Name) { + selectCond.push(Name); + if (i > 0) { + selectQuery += "AND "; + } + selectQuery += `\"Name\" = $${selectCond.length} `; + i++ + } + if (AllWorkExp) { + selectCond.push(AllWorkExp); + if (i > 0) { + selectQuery += "AND "; + } + if (!OperatorAllWorkExp) { + selectQuery += `\"AllWorkExp\" = $${selectCond.length} `; + } else { + switch (OperatorAllWorkExp) { + case ">": + selectQuery += `\"AllWorkExp\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"AllWorkExp\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"AllWorkExp\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"AllWorkExp\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (Email) { + selectCond.push(Email); + if (i > 0) { + selectQuery += "AND "; + } + selectQuery += `\"Email\" = $${selectCond.length} `; + i++ + } + if (MainTechID) { + selectCond.push(MainTechID); + if (i > 0) { + selectQuery += "AND "; + } + if (!OperatorMainTechID) { + selectQuery += `\"MainTechID\" = $${selectCond.length} `; + } else { + switch (OperatorMainTechID) { + case ">": + selectQuery += `\"MainTechID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"MainTechID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"MainTechID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"MainTechID\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (MainRoleID) { + selectCond.push(MainRoleID); + if (i > 0) { + selectQuery += "AND "; + } + if (!OperatorMainRoleID) { + selectQuery += `\"MainRoleID\" = $${selectCond.length} `; + } else { + switch (OperatorMainRoleID) { + case ">": + selectQuery += `\"MainRoleID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"MainRoleID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"MainRoleID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"MainRoleID\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (ProjectID) { + if (i > 0) { + selectQuery += "AND "; + } + if (ProjectID == "null") { + if (!OperatorProjectID) { + selectQuery += `\"ProjectID\" IS NULL `; + console.log(selectQuery) + console.log(selectCond) + } else { + switch (OperatorProjectID) { + case "=": + selectQuery += `\"ProjectID\" IS NULL `; + break; + case "!=": + selectQuery += `\"ProjectID\" IS NOT NULL `; + break; + default: + break; + } + } + } else { + selectCond.push(ProjectID); + if (!OperatorProjectID) { + selectQuery += `\"ProjectID\" = $${selectCond.length} `; + } else { + switch (OperatorProjectID) { + case ">": + selectQuery += `\"ProjectID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"ProjectID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"ProjectID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"ProjectID\" != $${selectCond.length} `; + break; + default: + break; + } + } + } + i++ + } + if (RoleInProjectID) { + if (i > 0) { + selectQuery += "AND "; + } + if (RoleInProjectID == "null") { + if (!OperatorRoleInProjectID) { + selectQuery += `\"RoleInProjectID\" IS NULL `; + console.log(selectQuery) + console.log(selectCond) + } else { + switch (OperatorRoleInProjectID) { + case "=": + selectQuery += `\"RoleInProjectID\" IS NULL `; + break; + case "!=": + selectQuery += `\"RoleInProjectID\" IS NOT NULL `; + break; + default: + break; + } + } + } else { + selectCond.push(RoleInProjectID); + if (!OperatorRoleInProjectID) { + selectQuery += `\"RoleInProjectID\" = $${selectCond.length} `; + } else { + switch (OperatorRoleInProjectID) { + case ">": + selectQuery += `\"RoleInProjectID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"RoleInProjectID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"RoleInProjectID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"RoleInProjectID\" != $${selectCond.length} `; + break; + default: + break; + } + } + } + i++ + } + try { + var result + if (selectCond.length != 0) { + result = await DB.query(selectQuery, selectCond); + } else { + result = await DB.query(selectQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } +} +module.exports = new workerController() \ No newline at end of file diff --git a/SUBD-back/Controllers/projectController.js b/SUBD-back/Controllers/projectController.js new file mode 100644 index 0000000..28cf5c8 --- /dev/null +++ b/SUBD-back/Controllers/projectController.js @@ -0,0 +1,328 @@ +const ApiError = require("../Error/ApiError") +const DB = require("../db.js") +class projectController { + async update(req, res, next) { + const {ID} = req.query; + const {Name} = req.query; + const {BeginDate} = req.query; + const {EndDate} = req.query; + const {TechAspectID} = req.query; + const {TechSpecificationID} = req.query; + if ((!ID && !Name && !BeginDate && !EndDate && !TechAspectID && !TechSpecificationID) || !ChangeColumn || !ChangeValue) { + return next(ApiError.badRequest('need more args')) + } + var updateQuery = `UPDATE \"Role_Project\" SET \"${ChangeColumn}\" = '${ChangeValue}' `; + var updateCond = [] + if (ID || Name || BeginDate || EndDate || TechAspectID || TechSpecificationID) { + updateQuery += "WHERE "; + } + var i = 0; + if (ID) { + updateCond.push(ID) + updateQuery += `\"ID\" = $${updateCond.length} `; + i++ + } + if (Name){ + updateCond.push(Name); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"Name\" = $${updateCond.length} `; + i++ + } + if (BeginDate){ + updateCond.push(BeginDate); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"BeginDate\" = $${updateCond.length} `; + i++ + } + if (EndDate){ + updateCond.push(EndDate); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"EndDate\" = $${updateCond.length} `; + i++ + } + if (TechAspectID){ + updateCond.push(TechAspectID); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"TechAspectID\" = $${updateCond.length} `; + i++ + } + if (TechSpecificationID){ + updateCond.push(TechSpecificationID); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"TechSpecificationID\" = $${updateCond.length} `; + i++ + } + try { + var result + if (updateCond.length != 0) { + result = await DB.query(updateQuery, updateCond); + } else { + result = await DB.query(updateQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async delete(req, res, next) { + const {ID} = req.query; + const {Name} = req.query; + const {BeginDate} = req.query; + const {EndDate} = req.query; + const {TechAspectID} = req.query; + const {TechSpecificationID} = req.query; + if (!ID && !Name && !BeginDate && !EndDate && !TechAspectID && !TechSpecificationID) { + return next(ApiError.badRequest('need more args')) + } + var deleteQuery = "DELETE FROM public.\"Project\" WHERE " + var deleteCond = [] + var i = 0 + if (ID) { + deleteCond.push(ID); + deleteQuery += `\"ID\" = $${deleteCond.length} `; + i++ + } + if (Name) { + deleteCond.push(Name); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"Name\" = $${deleteCond.length} `; + i++ + } + if (BeginDate) { + deleteCond.push(BeginDate); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"BeginDate\" = $${selectCond.length} `; + i++ + } + if (EndDate) { + deleteCond.push(EndDate); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"EndDate\" = $${selectCond.length} `; + i++ + } + if (TechAspectID) { + deleteCond.push(TechAspectID); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"TechAspectID\" = $${selectCond.length} `; + i++ + } + if (TechSpecificationID) { + deleteCond.push(TechSpecificationID); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"TechSpecificationID\" = $${selectCond.length} `; + i++ + } + deleteQuery += "RETURNING *" + try { + var result + if (deleteCond.length != 0) { + result = await DB.query(deleteQuery, deleteCond); + } else { + result = await DB.query(deleteQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async add(req, res, next) { + const {Name} = req.query; + const {BeginDate} = req.query; + const {EndDate} = req.query; + const {TechAspectID} = req.query; + const {TechSpecificationID} = req.query; + if (!Name || !BeginDate || !EndDate || !TechAspectID || !TechSpecificationID) { + return next(ApiError.badRequest('need more args')) + } + var selectTechAspect = await DB.query("SELECT * FROM public.\"TechAspect\" WHERE \"ID\" = $1", [TechAspectID]); + if (!selectTechAspect.rowCount) { + return next(ApiError.badRequest('no TechAspectID in TechAspect')) + } + var selectTechSpecification = await DB.query("SELECT * FROM public.\"TechSpecification\" WHERE \"ID\" = $1", [TechSpecificationID]); + if (!selectTechSpecification.rowCount) { + return next(ApiError.badRequest('no TechSpecificationID in TechSpecification')) + } + var insertQuery = "INSERT INTO public.\"Project\" (\"ID\", \"Name\", \"BeginDate\", \"EndDate\", \"TechAspectID\", \"TechSpecificationID\") Values(nextval('\"ProjectID\"'), $1, $2, $3, $4, $5)" + var insertCond = [Name, BeginDate, EndDate, TechAspectID, TechSpecificationID] + try { + var result + if (insertCond.length != 0) { + result = await DB.query(insertQuery, insertCond); + } else { + result = await DB.query(insertQuery); + } + } catch (error) { + return next(ApiError.badRequest('error')) + } + res.json(result.rows) + } + + async get(req, res, next) { + const {Column} = req.query; + const {OperatorID} = req.query; + const {OperatorBeginDate} = req.query; + const {OperatorEndDate} = req.query; + const {ID} = req.query; + const {Name} = req.query; + const {BeginDate} = req.query; + const {EndDate} = req.query; + const {TechAspectID} = req.query; + const {TechSpecificationID} = req.query; + var selectQuery = "SELECT " + var selectCond = [] + if (Column) { + selectQuery += `\"${Column}\" FROM public.\"Project\" `; + } else { + selectQuery += "* FROM public.\"Project\" "; + } + if (Name || BeginDate || EndDate || TechAspectID || TechSpecificationID || ID) { + selectQuery += "WHERE "; + } + var i = 0 + if (ID) { + selectCond.push(ID); + if (!OperatorID) { + selectQuery += `\"ID\" = $${selectCond.length} `; + } else { + switch (OperatorID) { + case ">": + selectQuery += `\"ID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"ID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"ID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"ID\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (Name) { + selectCond.push(Name); + if (i > 0) { + selectQuery += "AND "; + } + selectQuery += `\"Name\" = $${selectCond.length} `; + i++ + } + if (BeginDate) { + selectCond.push(BeginDate); + if (i > 0) { + selectQuery += "AND "; + } + if (!OperatorBeginDate) { + selectQuery += `\"BeginDate\" = $${selectCond.length} `; + } else { + switch (OperatorBeginDate) { + case ">": + selectQuery += `\"BeginDate\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"BeginDate\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"BeginDate\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"BeginDate\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (EndDate) { + selectCond.push(EndDate); + if (i > 0) { + selectQuery += "AND "; + } + if (!OperatorEndDate) { + selectQuery += `\"EndDate\" = $${selectCond.length} `; + } else { + switch (OperatorBeginDate) { + case ">": + selectQuery += `\"EndDate\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"EndDate\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"EndDate\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"EndDate\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (TechAspectID) { + selectCond.push(TechAspectID); + if (i > 0) { + selectQuery += "AND "; + } + selectQuery += `\"TechAspectID\" = $${selectCond.length} `; + i++ + } + if (TechSpecificationID) { + selectCond.push(TechSpecificationID); + if (i > 0) { + selectQuery += "AND "; + } + selectQuery += `\"TechSpecificationID\" = $${selectCond.length} `; + i++ + } + try { + var result + if (selectCond.length != 0) { + result = await DB.query(selectQuery, selectCond); + } else { + result = await DB.query(selectQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } +} +module.exports = new projectController() \ No newline at end of file diff --git a/SUBD-back/Controllers/project_technologyController.js b/SUBD-back/Controllers/project_technologyController.js new file mode 100644 index 0000000..c00b095 --- /dev/null +++ b/SUBD-back/Controllers/project_technologyController.js @@ -0,0 +1,199 @@ +const ApiError = require("../Error/ApiError") +const DB = require("../db.js"); +class roleController { + async update(req, res, next) { + const {ChangeColumn} = req.query; + const {ChangeValue} = req.query; + const {ProjectID} = req.query; + const {TechnologyID} = req.query; + if ((!TechnologyID && !ProjectID) || !ChangeColumn || !ChangeValue) { + return next(ApiError.badRequest('need more args')) + } + var updateQuery = `UPDATE \"Role_Project\" SET \"${ChangeColumn}\" = '${ChangeValue}' `; + var updateCond = [] + if (TechnologyID || ProjectID) { + updateQuery += "WHERE "; + } + var i = 0; + if (TechnologyID) { + updateCond.push(TechnologyID) + updateQuery += `\"TechnologyID\" = $${updateCond.length} `; + i++ + } + if (ProjectID){ + updateCond.push(ProjectID); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"ProjectID\" = $${updateCond.length} `; + i++ + } + try { + var result + if (updateCond.length != 0) { + result = await DB.query(updateQuery, updateCond); + } else { + result = await DB.query(updateQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async delete(req, res, next) { + const {ProjectID} = req.query; + const {TechnologyID} = req.query; + if (!ProjectID && !TechnologyID) { + return next(ApiError.badRequest('need more args')) + } + var deleteQuery = "DELETE FROM public.\"Project_Technology\" WHERE " + var deleteCond = [] + var i = 0 + if (ProjectID) { + deleteCond.push(ProjectID); + deleteQuery += `\"ProjectID\" = $${deleteCond.length} `; + i++ + } + if (TechnologyID) { + deleteCond.push(TechnologyID); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"TechnologyID\" = $${deleteCond.length} `; + i++ + } + deleteQuery += "RETURNING *" + try { + var result + if (deleteCond.length != 0) { + result = await DB.query(deleteQuery, deleteCond); + } else { + result = await DB.query(deleteQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async add(req, res, next) { + const {ProjectID} = req.query; + const {TechnologyID} = req.query; + if (!ProjectID || !TechnologyID) { + return next(ApiError.badRequest('need more args')) + } + var selectProject = await DB.query("SELECT * FROM public.\"Project\" WHERE \"ID\" = $1", [ProjectID]); + if (!selectProject.rowCount) { + return next(ApiError.badRequest('no ProjectID in Project')) + } + var selectTechnology = await DB.query("SELECT * FROM public.\"Technology\" WHERE \"ID\" = $1", [TechnologyID]); + if (!selectTechnology.rowCount) { + return next(ApiError.badRequest('no TechnologyID in Technology')) + } + var insertQuery = "INSERT INTO public.\"Project_Technology\" (\"ProjectID\", \"TechnologyID\") Values($1, $2)" + var insertCond = [ProjectID, TechnologyID] + try { + var result + if (insertCond.length != 0) { + result = await DB.query(insertQuery, insertCond); + } else { + result = await DB.query(insertQuery); + } + } catch (error) { + return next(ApiError.badRequest('error')) + } + res.json(result.rows) + } + + async get(req, res, next) { + const {Column} = req.query; + const {OperatorProjectID} = req.query; + const {OperatorTechnologyID} = req.query; + const {ProjectID} = req.query; + const {TechnologyID} = req.query; + var selectQuery = "SELECT " + var selectCond = [] + if (Column) { + selectQuery += `\"${Column}\" FROM public.\"Project_Technology\" `; + } else { + selectQuery += "* FROM public.\"Project_Technology\" "; + } + if (ProjectID || TechnologyID) { + selectQuery += "WHERE "; + } + var i = 0 + if (ProjectID) { + selectCond.push(ProjectID); + if (!OperatorProjectID) { + selectQuery += `\"ProjectID\" = $${selectCond.length} `; + } else { + switch (OperatorProjectID) { + case ">": + selectQuery += `\"ProjectID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"ProjectID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"ProjectID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"ProjectID\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (TechnologyID) { + selectCond.push(TechnologyID); + if (i > 0) { + selectQuery += "AND "; + } + if (!OperatorTechnologyID) { + selectQuery += `\"TechnologyID\" = $${selectCond.length} `; + } else { + switch (OperatorTechnologyID) { + case ">": + selectQuery += `\"TechnologyID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"TechnologyID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"TechnologyID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"TechnologyID\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + try { + var result + if (selectCond.length != 0) { + result = await DB.query(selectQuery, selectCond); + } else { + result = await DB.query(selectQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } +} +module.exports = new roleController() \ No newline at end of file diff --git a/SUBD-back/Controllers/roleController.js b/SUBD-back/Controllers/roleController.js new file mode 100644 index 0000000..e974b2f --- /dev/null +++ b/SUBD-back/Controllers/roleController.js @@ -0,0 +1,178 @@ +const ApiError = require("../Error/ApiError") +const DB = require("../db.js"); +class roleController { + async update(req, res, next) { + const {ChangeColumn} = req.query; + const {ChangeValue} = req.query; + const {ID} = req.query; + const {Name} = req.query; + if ((!ID && !Name) || !ChangeColumn || !ChangeValue) { + return next(ApiError.badRequest('need more args')) + } + var updateQuery = `UPDATE \"Role\" SET \"${ChangeColumn}\" = '${ChangeValue}' `; + var updateCond = [] + if (ID || Name) { + updateQuery += "WHERE "; + } + var i = 0; + if (ID) { + updateCond.push(ID) + updateQuery += `\"ID\" = $${updateCond.length} `; + i++ + } + if (Name){ + updateCond.push(Name); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"Name\" = $${updateCond.length} `; + i++ + } + try { + var result + if (updateCond.length != 0) { + result = await DB.query(updateQuery, updateCond); + } else { + result = await DB.query(updateQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async delete(req, res, next) { + const {ID} = req.query; + const {Name} = req.query; + if (!ID && !Name) { + return next(ApiError.badRequest('need more args')) + } + var selectRefs1 = await DB.query("SELECT * FROM \"Role_Project\" WHERE \"RoleID\" = $1", [ID]) + var selectRefs2 = await DB.query("SELECT * FROM \"Worker\" WHERE \"MainRoleID\" = $1", [ID]) + var selectRefs3 = await DB.query("SELECT * FROM \"Worker\" WHERE \"RoleInProjectID\" = $1", [ID]) + if (selectRefs1.rowCount) { + return next(ApiError.badRequest('exist Role_Project refs for ID')) + } else if (selectRefs2.rowCount) { + return next(ApiError.badRequest('exist Worker.MainRoleID refs for ID')) + } else if (selectRefs3.rowCount) { + return next(ApiError.badRequest('exist Worker.RoleInProjectID refs for ID')) + } + var deleteQuery = "DELETE FROM public.\"Role\" WHERE " + var deleteCond = [] + var i = 0 + if (ID) { + deleteCond.push(ID); + deleteQuery += `\"ID\" = $${deleteCond.length} `; + i++ + } + if (Name) { + deleteCond.push(Name); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"Name\" = $${deleteCond.length} `; + i++ + } + deleteQuery += "RETURNING *" + try { + var result + if (deleteCond.length != 0) { + result = await DB.query(deleteQuery, deleteCond); + } else { + result = await DB.query(deleteQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + async add(req, res, next) { + const {Name} = req.query; + if (!Name) { + return next(ApiError.badRequest('need more args')) + } + var insertQuery = "INSERT INTO public.\"Role\" (\"ID\", \"Name\") Values(nextval('\"RoleID\"'), $1)" + var insertCond = [Name] + try { + var result + if (insertCond.length != 0) { + result = await DB.query(insertQuery, insertCond); + } else { + result = await DB.query(insertQuery); + } + } catch (error) { + return next(ApiError.badRequest('not unique')) + } + res.json(result.rows) + } + + async get(req, res, next) { + const {Column} = req.query; + const {OperatorID} = req.query; + const {ID} = req.query; + const {Name} = req.query; + var selectQuery = "SELECT " + var selectCond = [] + if (Column) { + selectQuery += `\"${Column}\" FROM public.\"Role\" `; + } else { + selectQuery += "* FROM public.\"Role\" "; + } + if (ID || Name) { + selectQuery += "WHERE "; + } + var i = 0 + if (ID) { + selectCond.push(ID); + if (!OperatorID) { + selectQuery += `\"ID\" = $${selectCond.length} `; + } else { + switch (OperatorID) { + case ">": + selectQuery += `\"ID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"ID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"ID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"ID\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (Name) { + selectCond.push(Name); + if (i > 0) { + selectQuery += "AND "; + } + selectQuery += `\"Name\" = $${selectCond.length} `; + } + try { + var result + if (selectCond.length != 0) { + result = await DB.query(selectQuery, selectCond); + } else { + result = await DB.query(selectQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } +} +module.exports = new roleController() \ No newline at end of file diff --git a/SUBD-back/Controllers/role_projectController.js b/SUBD-back/Controllers/role_projectController.js new file mode 100644 index 0000000..83b16d5 --- /dev/null +++ b/SUBD-back/Controllers/role_projectController.js @@ -0,0 +1,199 @@ +const ApiError = require("../Error/ApiError") +const DB = require("../db.js"); +class roleController { + async update(req, res, next) { + const {ChangeColumn} = req.query; + const {ChangeValue} = req.query; + const {RoleID} = req.query; + const {ProjectID} = req.query; + if ((!RoleID && !ProjectID) || !ChangeColumn || !ChangeValue) { + return next(ApiError.badRequest('need more args')) + } + var updateQuery = `UPDATE \"Role_Project\" SET \"${ChangeColumn}\" = '${ChangeValue}' `; + var updateCond = [] + if (RoleID || ProjectID) { + updateQuery += "WHERE "; + } + var i = 0; + if (RoleID) { + updateCond.push(RoleID) + updateQuery += `\"RoleID\" = $${updateCond.length} `; + i++ + } + if (ProjectID){ + updateCond.push(ProjectID); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"ProjectID\" = $${updateCond.length} `; + i++ + } + try { + var result + if (updateCond.length != 0) { + result = await DB.query(updateQuery, updateCond); + } else { + result = await DB.query(updateQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async delete(req, res, next) { + const {RoleID} = req.query; + const {ProjectID} = req.query; + if (!RoleID && !ProjectID) { + return next(ApiError.badRequest('need more args')) + } + var deleteQuery = "DELETE FROM public.\"Role_Project\" WHERE " + var deleteCond = [] + var i = 0 + if (ProjectID) { + deleteCond.push(ProjectID); + deleteQuery += `\"ProjectID\" = $${deleteCond.length} `; + i++ + } + if (RoleID) { + deleteCond.push(RoleID); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"RoleID\" = $${deleteCond.length} `; + i++ + } + deleteQuery += "RETURNING *" + try { + var result + if (deleteCond.length != 0) { + result = await DB.query(deleteQuery, deleteCond); + } else { + result = await DB.query(deleteQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async add(req, res, next) { + const {RoleID} = req.query; + const {ProjectID} = req.query; + if (!ProjectID || !RoleID) { + return next(ApiError.badRequest('need more args')) + } + var selectRole = await DB.query("SELECT * FROM public.\"Role\" WHERE \"ID\" = $1", [RoleID]); + if (!selectRole.rowCount) { + return next(ApiError.badRequest('no RoleID in Role')) + } + var selectProject = await DB.query("SELECT * FROM public.\"Project\" WHERE \"ID\" = $1", [ProjectID]); + if (!selectProject.rowCount) { + return next(ApiError.badRequest('no ProjectID in Project')) + } + var insertQuery = "INSERT INTO public.\"Role_Project\" (\"RoleID\", \"ProjectID\") Values($1, $2)" + var insertCond = [RoleID, ProjectID] + try { + var result + if (insertCond.length != 0) { + result = await DB.query(insertQuery, insertCond); + } else { + result = await DB.query(insertQuery); + } + } catch (error) { + return next(ApiError.badRequest('error')) + } + res.json(result.rows) + } + + async get(req, res, next) { + const {Column} = req.query; + const {OperatorProjectID} = req.query; + const {OperatorRoleID} = req.query; + const {RoleID} = req.query; + const {ProjectID} = req.query; + var selectQuery = "SELECT " + var selectCond = [] + if (Column) { + selectQuery += `\"${Column}\" FROM public.\"Role_Project\" `; + } else { + selectQuery += "* FROM public.\"Role_Project\" "; + } + if (ProjectID || RoleID) { + selectQuery += "WHERE "; + } + var i = 0 + if (ProjectID) { + selectCond.push(ProjectID); + if (!OperatorProjectID) { + selectQuery += `\"ProjectID\" = $${selectCond.length} `; + } else { + switch (OperatorProjectID) { + case ">": + selectQuery += `\"ProjectID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"ProjectID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"ProjectID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"ProjectID\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (RoleID) { + selectCond.push(RoleID); + if (i > 0) { + selectQuery += "AND "; + } + if (!OperatorRoleID) { + selectQuery += `\"RoleID\" = $${selectCond.length} `; + } else { + switch (OperatorRoleID) { + case ">": + selectQuery += `\"RoleID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"RoleID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"RoleID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"RoleID\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + try { + var result + if (selectCond.length != 0) { + result = await DB.query(selectQuery, selectCond); + } else { + result = await DB.query(selectQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } +} +module.exports = new roleController() \ No newline at end of file diff --git a/SUBD-back/Controllers/techAspectController.js b/SUBD-back/Controllers/techAspectController.js new file mode 100644 index 0000000..775d0e8 --- /dev/null +++ b/SUBD-back/Controllers/techAspectController.js @@ -0,0 +1,173 @@ +const ApiError = require("../Error/ApiError") +const DB = require("../db.js") +class techAspectController { + async update(req, res, next) { + const {ChangeColumn} = req.query; + const {ChangeValue} = req.query; + const {ID} = req.query; + const {Name} = req.query; + if ((!ID && !Name) || !ChangeColumn || !ChangeValue) { + return next(ApiError.badRequest('need more args')) + } + var updateQuery = `UPDATE \"TechAspect\" SET \"${ChangeColumn}\" = '${ChangeValue}' `; + var updateCond = [] + if (ID || Name) { + updateQuery += "WHERE "; + } + var i = 0; + if (ID) { + updateCond.push(ID) + updateQuery += `\"ID\" = $${updateCond.length} `; + i++ + } + if (Name){ + updateCond.push(Name); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"Name\" = $${updateCond.length} `; + i++ + } + try { + var result + if (updateCond.length != 0) { + result = await DB.query(updateQuery, updateCond); + } else { + result = await DB.query(updateQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async delete(req, res, next) { + const {ID} = req.query; + const {Name} = req.query; + if (!ID && !Name) { + return next(ApiError.badRequest('need more args')) + } + var selectRefs = await DB.query("SELECT * FROM \"Project\" WHERE \"TechAspectID\" = $1", [ID]) + if (selectRefs.rowCount) { + return next(ApiError.badRequest('exist Project refs for ID')) + } + var deleteQuery = "DELETE FROM public.\"TechAspect\" WHERE " + var deleteCond = [] + var i = 0 + if (ID) { + deleteCond.push(ID); + deleteQuery += `\"ID\" = $${deleteCond.length} `; + i++ + } + if (Name) { + deleteCond.push(Name); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"Name\" = $${deleteCond.length} `; + i++ + } + deleteQuery += "RETURNING *" + try { + var result + if (deleteCond.length != 0) { + result = await DB.query(deleteQuery, deleteCond); + } else { + result = await DB.query(deleteQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + async add(req, res, next) { + const {Name} = req.query; + if (!Name) { + return next(ApiError.badRequest('need more args')) + } + var insertQuery = "INSERT INTO public.\"TechAspect\" (\"ID\", \"Name\") Values(nextval('\"TechAspectID\"'), $1)" + var insertCond = [Name] + try { + var result + if (insertCond.length != 0) { + result = await DB.query(insertQuery, insertCond); + } else { + result = await DB.query(insertQuery); + } + } catch (error) { + return next(ApiError.badRequest('not unique')) + } + res.json(result.rows) + } + + async get(req, res, next) { + const {Column} = req.query; + const {OperatorID} = req.query; + const {ID} = req.query; + const {Name} = req.query; + var selectQuery = "SELECT " + var selectCond = [] + if (Column) { + selectQuery += `\"${Column}\" FROM public.\"TechAspect\" `; + } else { + selectQuery += "* FROM public.\"TechAspect\" "; + } + if (ID || Name) { + selectQuery += "WHERE "; + } + var i = 0 + if (ID) { + selectCond.push(ID); + if (!OperatorID) { + selectQuery += `\"ID\" = $${selectCond.length} `; + } else { + switch (OperatorID) { + case ">": + selectQuery += `\"ID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"ID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"ID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"ID\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (Name) { + selectCond.push(Name); + if (i > 0) { + selectQuery += "AND "; + } + selectQuery += `\"Name\" = $${selectCond.length} `; + i++ + } + try { + var result + if (selectCond.length != 0) { + result = await DB.query(selectQuery, selectCond); + } else { + result = await DB.query(selectQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } +} +module.exports = new techAspectController() \ No newline at end of file diff --git a/SUBD-back/Controllers/techSpecificationController.js b/SUBD-back/Controllers/techSpecificationController.js new file mode 100644 index 0000000..7aa0d13 --- /dev/null +++ b/SUBD-back/Controllers/techSpecificationController.js @@ -0,0 +1,173 @@ +const ApiError = require("../Error/ApiError") +const DB = require("../db.js") +class techSpecificationController { + async update(req, res, next) { + const {ChangeColumn} = req.query; + const {ChangeValue} = req.query; + const {ID} = req.query; + const {Name} = req.query; + if ((!ID && !Name) || !ChangeColumn || !ChangeValue) { + return next(ApiError.badRequest('need more args')) + } + var updateQuery = `UPDATE \"TechSpecification\" SET \"${ChangeColumn}\" = '${ChangeValue}' `; + var updateCond = [] + if (ID || Name) { + updateQuery += "WHERE "; + } + var i = 0; + if (ID) { + updateCond.push(ID) + updateQuery += `\"ID\" = $${updateCond.length} `; + i++ + } + if (Name){ + updateCond.push(Name); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"Name\" = $${updateCond.length} `; + i++ + } + try { + var result + if (updateCond.length != 0) { + result = await DB.query(updateQuery, updateCond); + } else { + result = await DB.query(updateQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async delete(req, res, next) { + const {ID} = req.query; + const {Name} = req.query; + if (!ID && !Name) { + return next(ApiError.badRequest('need more args')) + } + var selectRefs = await DB.query("SELECT * FROM \"Project\" WHERE \"TechSpecificationID\" = $1", [ID]) + if (selectRefs.rowCount) { + return next(ApiError.badRequest('exist Project refs for ID')) + } + var deleteQuery = "DELETE FROM public.\"TechSpecification\" WHERE " + var deleteCond = [] + var i = 0 + if (ID) { + deleteCond.push(ID); + deleteQuery += `\"ID\" = $${deleteCond.length} `; + i++ + } + if (Name) { + deleteCond.push(Name); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"Name\" = $${deleteCond.length} `; + i++ + } + deleteQuery += "RETURNING *" + try { + var result + if (deleteCond.length != 0) { + result = await DB.query(deleteQuery, deleteCond); + } else { + result = await DB.query(deleteQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + async add(req, res, next) { + const {Name} = req.query; + if (!Name) { + return next(ApiError.badRequest('need more args')) + } + var insertQuery = "INSERT INTO public.\"TechSpecification\" (\"ID\", \"Name\") Values(nextval('\"TechSpecificationID\"'), $1)" + var insertCond = [Name] + try { + var result + if (insertCond.length != 0) { + result = await DB.query(insertQuery, insertCond); + } else { + result = await DB.query(insertQuery); + } + } catch (error) { + return next(ApiError.badRequest('not unique')) + } + res.json(result.rows) + } + + async get(req, res, next) { + const {Column} = req.query; + const {OperatorID} = req.query; + const {ID} = req.query; + const {Name} = req.query; + var selectQuery = "SELECT " + var selectCond = [] + if (Column) { + selectQuery += `\"${Column}\" FROM public.\"TechSpecification\" `; + } else { + selectQuery += "* FROM public.\"TechSpecification\" "; + } + if (ID || Name) { + selectQuery += "WHERE "; + } + var i = 0 + if (ID) { + selectCond.push(ID); + if (!OperatorID) { + selectQuery += `\"ID\" = $${selectCond.length} `; + } else { + switch (OperatorID) { + case ">": + selectQuery += `\"ID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"ID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"ID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"ID\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (Name) { + selectCond.push(Name); + if (i > 0) { + selectQuery += "AND "; + } + selectQuery += `\"Name\" = $${selectCond.length} `; + i++ + } + try { + var result + if (selectCond.length != 0) { + result = await DB.query(selectQuery, selectCond); + } else { + result = await DB.query(selectQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } +} +module.exports = new techSpecificationController() \ No newline at end of file diff --git a/SUBD-back/Controllers/technologyController.js b/SUBD-back/Controllers/technologyController.js new file mode 100644 index 0000000..1d34d1c --- /dev/null +++ b/SUBD-back/Controllers/technologyController.js @@ -0,0 +1,180 @@ +const ApiError = require("../Error/ApiError") +const DB = require("../db.js") +class technologyController { + async update(req, res, next) { + const {ChangeColumn} = req.query; + const {ChangeValue} = req.query; + const {ID} = req.query; + const {Name} = req.query; + if ((!ID && !Name) || !ChangeColumn || !ChangeValue) { + return next(ApiError.badRequest('need more args')) + } + var updateQuery = `UPDATE \"Technology\" SET \"${ChangeColumn}\" = '${ChangeValue}' `; + var updateCond = [] + if (ID || Name) { + updateQuery += "WHERE "; + } + var i = 0; + if (ID) { + updateCond.push(ID) + updateQuery += `\"ID\" = $${updateCond.length} `; + i++ + } + if (Name){ + updateCond.push(Name); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"Name\" = $${updateCond.length} `; + i++ + } + try { + var result + if (updateCond.length != 0) { + result = await DB.query(updateQuery, updateCond); + } else { + result = await DB.query(updateQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async delete(req, res, next) { + const {ID} = req.query; + const {Name} = req.query; + if (!ID && !Name) { + return next(ApiError.badRequest('need more args')) + } + var selectRefs1 = await DB.query("SELECT * FROM \"Project_Technology\" WHERE \"TechnologyID\" = $1", [ID]) + var selectRefs2 = await DB.query("SELECT * FROM \"Worker\" WHERE \"MainTechID\" = $1", [ID]) + var selectRefs3 = await DB.query("SELECT * FROM \"Worker_Technology\" WHERE \"TechnologyID\" = $1", [ID]) + if (selectRefs1.rowCount) { + return next(ApiError.badRequest('exist Project_Technology refs for ID')) + } else if (selectRefs2.rowCount) { + return next(ApiError.badRequest('exist Worker refs for ID')) + } else if (selectRefs3.rowCount) { + return next(ApiError.badRequest('exist Worker_Technology refs for ID')) + } + var deleteQuery = "DELETE FROM public.\"Technology\" WHERE " + var deleteCond = [] + var i = 0 + if (ID) { + deleteCond.push(ID); + deleteQuery += `\"ID\" = $${deleteCond.length} `; + i++ + } + if (Name) { + deleteCond.push(Name); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"Name\" = $${deleteCond.length} `; + i++ + } + deleteQuery += "RETURNING *" + try { + var result + if (deleteCond.length != 0) { + result = await DB.query(deleteQuery, deleteCond); + } else { + result = await DB.query(deleteQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async add(req, res, next) { + const {Name} = req.query; + if (!Name) { + return next(ApiError.badRequest('need more args')) + } + var insertQuery = "INSERT INTO public.\"Technology\" (\"ID\", \"Name\") Values(nextval('\"TechnologyID\"'), $1)" + var insertCond = [Name] + try { + var result + if (insertCond.length != 0) { + result = await DB.query(insertQuery, insertCond); + } else { + result = await DB.query(insertQuery); + } + } catch (error) { + return next(ApiError.badRequest('not unique')) + } + res.json(result.rows) + } + + async get(req, res, next) { + const {Column} = req.query; + const {OperatorID} = req.query; + const {ID} = req.query; + const {Name} = req.query; + var selectQuery = "SELECT " + var selectCond = [] + if (Column) { + selectQuery += `\"${Column}\" FROM public.\"Technology\" `; + } else { + selectQuery += "* FROM public.\"Technology\" "; + } + if (ID || Name) { + selectQuery += "WHERE "; + } + var i = 0 + if (ID) { + selectCond.push(ID); + if (!OperatorID) { + selectQuery += `\"ID\" = $${selectCond.length} `; + } else { + switch (OperatorID) { + case ">": + selectQuery += `\"ID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"ID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"ID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"ID\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (Name) { + selectCond.push(Name); + if (i > 0) { + selectQuery += "AND "; + } + selectQuery += `\"Name\" = $${selectCond.length} `; + i++ + } + try { + var result + if (selectCond.length != 0) { + result = await DB.query(selectQuery, selectCond); + } else { + result = await DB.query(selectQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } +} +module.exports = new technologyController() \ No newline at end of file diff --git a/SUBD-back/Controllers/usersController.js b/SUBD-back/Controllers/usersController.js new file mode 100644 index 0000000..5e06171 --- /dev/null +++ b/SUBD-back/Controllers/usersController.js @@ -0,0 +1,234 @@ +const ApiError = require("../Error/ApiError") +const DB = require("../db.js") +class usersController { + async update(req, res, next) { + const {ChangeColumn} = req.query; + const {ChangeValue} = req.query; + const {ID} = req.query; + const {Name} = req.query; + const {Email} = req.query; + const {Password} = req.query; + if ((!ID && !Name && !Email && !Password) || !ChangeColumn || !ChangeValue) { + return next(ApiError.badRequest('need more args')) + } + var updateQuery = `UPDATE \"Users\" SET \"${ChangeColumn}\" = '${ChangeValue}' `; + var updateCond = [] + if (ID || Name || Email || Password) { + updateQuery += "WHERE "; + } + var i = 0; + if (ID) { + updateCond.push(ID) + updateQuery += `\"ID\" = $${updateCond.length} `; + i++ + } + if (Name){ + updateCond.push(Name); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"Name\" = $${updateCond.length} `; + i++ + } + if (Email){ + updateCond.push(Email); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"Email\" = $${updateCond.length} `; + i++ + } + if (Password){ + updateCond.push(Password); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"Password\" = $${updateCond.length} `; + i++ + } + try { + var result + if (updateCond.length != 0) { + result = await DB.query(updateQuery, updateCond); + } else { + result = await DB.query(updateQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async delete(req, res, next) { + const {ID} = req.query; + const {Name} = req.query; + const {Email} = req.query; + const {Password} = req.query; + if (!ID && !Name && !Email && !Password) { + return next(ApiError.badRequest('need more args')) + } + var deleteQuery = "DELETE FROM public.\"Users\" WHERE " + var deleteCond = [] + var i = 0 + if (ID) { + deleteCond.push(ID); + deleteQuery += `\"ID\" = $${deleteCond.length} `; + i++ + } + if (Name) { + deleteCond.push(Name); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"Name\" = $${deleteCond.length} `; + i++ + } + if (Email) { + deleteCond.push(Email); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"Email\" = $${deleteCond.length} `; + i++ + } + if (Password) { + deleteCond.push(Password); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"Password\" = $${deleteCond.length} `; + i++ + } + deleteQuery += "RETURNING *" + try { + var result + if (deleteCond.length != 0) { + result = await DB.query(deleteQuery, deleteCond); + } else { + result = await DB.query(deleteQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async add(req, res, next) { + const {Name} = req.query; + const {Email} = req.query; + const {Password} = req.query; + if (!Name || !Email || !Password) { + return next(ApiError.badRequest('need more args')) + } + var selectName = await DB.query("SELECT * FROM public.\"Users\" WHERE \"Name\" = $1", [Name]); + var selectEmail = await DB.query("SELECT * FROM public.\"Users\" WHERE \"Email\" = $1", [Email]); + if (selectName.rowCount) { + return next(ApiError.badRequest('not unique Name')) + } + if (selectEmail.rowCount) { + return next(ApiError.badRequest('not unique Email')) + } + var insertQuery = "INSERT INTO public.\"Users\" (\"ID\", \"Name\", \"Email\", \"Password\") Values(nextval('\"UsersID\"'), $1, $2, $3)" + var insertCond = [Name, Email, Password] + try { + var result + if (insertCond.length != 0) { + result = await DB.query(insertQuery, insertCond); + } else { + result = await DB.query(insertQuery); + } + } catch (error) { + return next(ApiError.badRequest('not unique')) + } + res.json(result.rows) + } + + async get(req, res, next) { + const {Column} = req.query; + const {OperatorID} = req.query; + const {ID} = req.query; + const {Name} = req.query; + const {Email} = req.query; + const {Password} = req.query; + var selectQuery = "SELECT " + var selectCond = [] + if (Column) { + selectQuery += `\"${Column}\" FROM public.\"Users\" `; + } else { + selectQuery += "* FROM public.\"Users\" "; + } + if (ID || Name || Password || Email) { + selectQuery += "WHERE "; + } + var i = 0 + if (ID) { + selectCond.push(ID); + if (!OperatorID) { + selectQuery += `\"ID\" = $${selectCond.length} `; + } else { + switch (OperatorID) { + case ">": + selectQuery += `\"ID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"ID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"ID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"ID\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (Name) { + selectCond.push(Name); + if (i > 0) { + selectQuery += "AND "; + } + selectQuery += `\"Name\" = $${selectCond.length} `; + i++ + } + if (Email) { + selectCond.push(Email); + if (i > 0) { + selectQuery += "AND "; + } + selectQuery += `\"Email\" = $${selectCond.length} `; + i++ + } + if (Password) { + selectCond.push(Password); + if (i > 0) { + selectQuery += "AND "; + } + selectQuery += `\"Password\" = $${selectCond.length} `; + i++ + } + try { + var result + if (selectCond.length != 0) { + result = await DB.query(selectQuery, selectCond); + } else { + result = await DB.query(selectQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } +} +module.exports = new usersController() \ No newline at end of file diff --git a/SUBD-back/Controllers/worker_technologyController.js b/SUBD-back/Controllers/worker_technologyController.js new file mode 100644 index 0000000..e208eaf --- /dev/null +++ b/SUBD-back/Controllers/worker_technologyController.js @@ -0,0 +1,254 @@ +const ApiError = require("../Error/ApiError") +const DB = require("../db.js"); +class roleController { + async update(req, res, next) { + const {ChangeColumn} = req.query; + const {ChangeValue} = req.query; + const {WorkerID} = req.query; + const {TechnologyID} = req.query; + const {TimeSpended} = req.query; + if ((!WorkerID && !TechnologyID && !TimeSpended) || !ChangeColumn || !ChangeValue) { + return next(ApiError.badRequest('need more args')) + } + var updateQuery = `UPDATE \"Worker_Technology\" SET \"${ChangeColumn}\" = '${ChangeValue}' `; + var updateCond = [] + if (WorkerID || TechnologyID || TimeSpended) { + updateQuery += "WHERE "; + } + var i = 0; + if (WorkerID) { + updateCond.push(WorkerID) + updateQuery += `\"WorkerID\" = $${updateCond.length} `; + i++ + } + if (TechnologyID){ + updateCond.push(TechnologyID); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"TechnologyID\" = $${updateCond.length} `; + i++ + } + if (TimeSpended){ + updateCond.push(TimeSpended); + if (i > 0) { + updateQuery += "AND "; + } + updateQuery += `\"TimeSpended\" = $${updateCond.length} `; + i++ + } + try { + var result + if (updateCond.length != 0) { + result = await DB.query(updateQuery, updateCond); + } else { + result = await DB.query(updateQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async delete(req, res, next) { + const {WorkerID} = req.query; + const {TechnologyID} = req.query; + const {TimeSpended} = req.query; + if (!WorkerID && !TechnologyID && !TimeSpended) { + return next(ApiError.badRequest('need more args')) + } + var deleteQuery = "DELETE FROM public.\"Worker_Technology\" WHERE " + var deleteCond = [] + var i = 0 + if (WorkerID) { + deleteCond.push(WorkerID); + deleteQuery += `\"WorkerID\" = $${deleteCond.length} `; + i++ + } + if (TechnologyID) { + deleteCond.push(TechnologyID); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"TechnologyID\" = $${deleteCond.length} `; + i++ + } + if (TimeSpended) { + deleteCond.push(TimeSpended); + if (i > 0) { + deleteQuery += "AND "; + } + deleteQuery += `\"TimeSpended\" = $${deleteCond.length} `; + i++ + } + deleteQuery += "RETURNING *" + try { + var result + if (deleteCond.length != 0) { + result = await DB.query(deleteQuery, deleteCond); + } else { + result = await DB.query(deleteQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } + + async add(req, res, next) { + const {WorkerID} = req.query; + const {TechnologyID} = req.query; + const {TimeSpended} = req.query; + if (!TechnologyID || !WorkerID) { + return next(ApiError.badRequest('need more args')) + } + var selectWorker = await DB.query("SELECT * FROM public.\"Worker\" WHERE \"ID\" = $1", [WorkerID]); + if (!selectWorker.rowCount) { + return next(ApiError.badRequest('no WorkerID in Worker')) + } + var selectTechnology = await DB.query("SELECT * FROM public.\"Technology\" WHERE \"ID\" = $1", [TechnologyID]); + if (!selectTechnology.rowCount) { + return next(ApiError.badRequest('no TechnologyID in Technology')) + } + var insertQuery = "INSERT INTO public.\"Worker_Technology\" " + var insertCond + if (!TimeSpended) { + insertQuery += "(\"WorkerID\", \"TechnologyID\") Values($1, $2)" + insertCond = [WorkerID, TechnologyID] + } else { + insertQuery += "(\"WorkerID\", \"TechnologyID\", \"TimeSpended\") Values($1, $2, $3)" + insertCond = [WorkerID, TechnologyID, TimeSpended] + } + //try { + var result + if (insertCond.length != 0) { + result = await DB.query(insertQuery, insertCond); + } else { + result = await DB.query(insertQuery); + } + //} catch (error) { + // return next(ApiError.badRequest('error')) + //} + res.json(result.rows) + } + + async get(req, res, next) { + const {Column} = req.query; + const {OperatorWorkerID} = req.query; + const {OperatorTechnologyID} = req.query; + const {OperatorTimeSpended} = req.query; + const {WorkerID} = req.query; + const {TechnologyID} = req.query; + const {TimeSpended} = req.query; + var selectQuery = "SELECT " + var selectCond = [] + if (Column) { + selectQuery += `\"${Column}\" FROM public.\"Worker_Technology\" `; + } else { + selectQuery += "* FROM public.\"Worker_Technology\" "; + } + if (WorkerID || TechnologyID) { + selectQuery += "WHERE "; + } + var i = 0 + if (WorkerID) { + selectCond.push(WorkerID); + if (!OperatorWorkerID) { + selectQuery += `\"WorkerID\" = $${selectCond.length} `; + } else { + switch (OperatorWorkerID) { + case ">": + selectQuery += `\"WorkerID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"WorkerID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"WorkerID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"WorkerID\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (TimeSpended) { + selectCond.push(TimeSpended); + if (i > 0) { + selectQuery += "AND "; + } + if (!OperatorTimeSpended) { + selectQuery += `\"TimeSpended\" = $${selectCond.length} `; + } else { + switch (OperatorTimeSpended) { + case ">": + selectQuery += `\"TimeSpended\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"TimeSpended\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"TimeSpended\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"TimeSpended\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + if (TechnologyID) { + selectCond.push(TechnologyID); + if (i > 0) { + selectQuery += "AND "; + } + if (!OperatorTechnologyID) { + selectQuery += `\"TechnologyID\" = $${selectCond.length} `; + } else { + switch (OperatorTechnologyID) { + case ">": + selectQuery += `\"TechnologyID\" > $${selectCond.length} `; + break; + case "<": + selectQuery += `\"TechnologyID\" < $${selectCond.length} `; + break; + case "=": + selectQuery += `\"TechnologyID\" = $${selectCond.length} `; + break; + case "!=": + selectQuery += `\"TechnologyID\" != $${selectCond.length} `; + break; + default: + break; + } + } + i++ + } + try { + var result + if (selectCond.length != 0) { + result = await DB.query(selectQuery, selectCond); + } else { + result = await DB.query(selectQuery); + } + } catch (error) { + return next(ApiError.badRequest('not found')) + } + if (!result.rowCount) { + return next(ApiError.badRequest('not found')) + } + res.json(result.rows) + } +} +module.exports = new roleController() \ No newline at end of file diff --git a/SUBD-back/Error/ApiError.js b/SUBD-back/Error/ApiError.js new file mode 100644 index 0000000..e6fc209 --- /dev/null +++ b/SUBD-back/Error/ApiError.js @@ -0,0 +1,20 @@ +class ApiError extends Error { + constructor (status, message) { + super(); + this.status = status + this.message = message + } + + static badRequest(message) { + return new ApiError(404 ,message) + } + + static internal(message) { + return new ApiError(500 ,message) + } + + static forbidden(message) { + return new ApiError(403 ,message) + } +} +module.exports = ApiError \ No newline at end of file diff --git a/SUBD-back/MiddleWare/ErrorHandlingMiddleware.js b/SUBD-back/MiddleWare/ErrorHandlingMiddleware.js new file mode 100644 index 0000000..5196ced --- /dev/null +++ b/SUBD-back/MiddleWare/ErrorHandlingMiddleware.js @@ -0,0 +1,8 @@ +const ApiError = require('../Error/ApiError'); + +module.exports = function(err, req, res, next) { + if (err instanceof ApiError) { + return res.status(err.status).json({message: err.message}) + } + return res.status(500).json({message: "Непредвиденная ошибка"}) +} \ No newline at end of file diff --git a/SUBD-back/Routes/car.js b/SUBD-back/Routes/car.js new file mode 100644 index 0000000..79782a4 --- /dev/null +++ b/SUBD-back/Routes/car.js @@ -0,0 +1,10 @@ +const Router = require('express') +const router = new Router() +const carController = require('../Controllers/carController') + +router.get('/add', carController.add) +router.get('/get', carController.get) +router.get('/delete', carController.delete) +router.get('/update', carController.update) + +module.exports = router \ No newline at end of file diff --git a/SUBD-back/Routes/client.js b/SUBD-back/Routes/client.js new file mode 100644 index 0000000..0f60680 --- /dev/null +++ b/SUBD-back/Routes/client.js @@ -0,0 +1,10 @@ +const Router = require('express') +const router = new Router() +const clientController = require('../Controllers/clientController') + +router.get('/add', clientController.add) +router.get('/get', clientController.get) +router.get('/delete', clientController.delete) +router.get('/update', clientController.update) + +module.exports = router \ No newline at end of file diff --git a/SUBD-back/Routes/driver.js b/SUBD-back/Routes/driver.js new file mode 100644 index 0000000..b70eed1 --- /dev/null +++ b/SUBD-back/Routes/driver.js @@ -0,0 +1,10 @@ +const Router = require('express') +const router = new Router() +const driverController = require('../Controllers/driverController') + +router.get('/add', driverController.add) +router.get('/get', driverController.get) +router.get('/delete', driverController.delete) +router.get('/update', driverController.update) + +module.exports = router \ No newline at end of file diff --git a/SUBD-back/Routes/index.js b/SUBD-back/Routes/index.js new file mode 100644 index 0000000..b67a3e9 --- /dev/null +++ b/SUBD-back/Routes/index.js @@ -0,0 +1,15 @@ +const Router = require('express') +const router = new Router() +const orderRouter = require('./order') +const clientRouter = require('./client') +const carRouter = require('./car') +const driverRouter = require('./driver') +const pickUpPointRouter = require('./pickUpPoint') + +router.use('/Order', orderRouter) +router.use('/Client', clientRouter) +router.use('/Car', carRouter) +router.use('/Driver', driverRouter) +router.use('/PickUpPoint', pickUpPointRouter) + +module.exports = router \ No newline at end of file diff --git a/SUBD-back/Routes/order.js b/SUBD-back/Routes/order.js new file mode 100644 index 0000000..88e2fac --- /dev/null +++ b/SUBD-back/Routes/order.js @@ -0,0 +1,10 @@ +const Router = require('express') +const router = new Router() +const orderController = require('../Controllers/orderController') + +router.get('/add', orderController.add) +router.get('/get', orderController.get) +router.get('/delete', orderController.delete) +router.get('/update', orderController.update) + +module.exports = router \ No newline at end of file diff --git a/SUBD-back/Routes/pickUpPoint.js b/SUBD-back/Routes/pickUpPoint.js new file mode 100644 index 0000000..54d4e05 --- /dev/null +++ b/SUBD-back/Routes/pickUpPoint.js @@ -0,0 +1,10 @@ +const Router = require('express') +const router = new Router() +const pickUpPointController = require('../Controllers/pickUpPointController') + +router.get('/add', pickUpPointController.add) +router.get('/get', pickUpPointController.get) +router.get('/delete', pickUpPointController.delete) +router.get('/update', pickUpPointController.update) + +module.exports = router \ No newline at end of file diff --git a/SUBD-back/db.js b/SUBD-back/db.js new file mode 100644 index 0000000..7466785 --- /dev/null +++ b/SUBD-back/db.js @@ -0,0 +1,11 @@ +require("dotenv").config; + +const pg = require("pg"); +const pool = new pg.Pool({ + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + host: process.env.DB_HOST, + database: process.env.DATABASE, + port: process.env.DB_PORT +}); +module.exports = pool \ No newline at end of file diff --git a/SUBD-back/index.js b/SUBD-back/index.js new file mode 100644 index 0000000..739997f --- /dev/null +++ b/SUBD-back/index.js @@ -0,0 +1,21 @@ +require("dotenv").config; +const express = require("express") +const router = require('./Routes/index.js') +const app = express() +const corse = require('cors') + +const errorHandler = require('./MiddleWare/ErrorHandlingMiddleware') + +app.use(corse()) +app.use(express.json()) +app.use('/api', router) +app.use(errorHandler) + +const start = async () => { + try { + app.listen(process.env.PORT, () => console.log("ok")) + } catch (error) { + console.log(error) + } +} +start() diff --git a/SUBD-back/package.json b/SUBD-back/package.json new file mode 100644 index 0000000..55a2a40 --- /dev/null +++ b/SUBD-back/package.json @@ -0,0 +1,23 @@ +{ + "name": "server", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev" : "nodemon index.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "cors": "2.8.5", + "dotenv": "16.0.3", + "express": "4.18.2", + "pg": "8.10.0", + "pg-hstore": "2.3.4", + "sequelize": "6.30.0" + }, + "devDependencies": { + "nodemon": "2.0.22" + } +} diff --git a/SUBD-front/.vscode/extensions.json b/SUBD-front/.vscode/extensions.json new file mode 100644 index 0000000..c0a6e5a --- /dev/null +++ b/SUBD-front/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] +} diff --git a/SUBD-front/README.md b/SUBD-front/README.md new file mode 100644 index 0000000..e731231 --- /dev/null +++ b/SUBD-front/README.md @@ -0,0 +1,29 @@ +# SUBD-front + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). + +## Customize configuration + +See [Vite Configuration Reference](https://vitejs.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Compile and Minify for Production + +```sh +npm run build +``` diff --git a/SUBD-front/index.html b/SUBD-front/index.html new file mode 100644 index 0000000..99f583a --- /dev/null +++ b/SUBD-front/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite App + + +
+ + + diff --git a/SUBD-front/package-lock.json b/SUBD-front/package-lock.json new file mode 100644 index 0000000..83b6f8a --- /dev/null +++ b/SUBD-front/package-lock.json @@ -0,0 +1,1632 @@ +{ + "name": "subd-front", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "subd-front", + "version": "0.0.0", + "dependencies": { + "vue": "^3.2.47", + "vue-router": "^4.1.6" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.0.0", + "@vitejs/plugin-vue-jsx": "^3.0.0", + "vite": "^4.1.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", + "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", + "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.4", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.4", + "@babel/types": "^7.21.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", + "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.4", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", + "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.21.4", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz", + "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", + "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", + "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", + "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.4", + "@babel/types": "^7.21.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.15.tgz", + "integrity": "sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz", + "integrity": "sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.15.tgz", + "integrity": "sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", + "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz", + "integrity": "sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz", + "integrity": "sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz", + "integrity": "sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz", + "integrity": "sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz", + "integrity": "sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz", + "integrity": "sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz", + "integrity": "sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz", + "integrity": "sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz", + "integrity": "sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz", + "integrity": "sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz", + "integrity": "sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz", + "integrity": "sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz", + "integrity": "sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz", + "integrity": "sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz", + "integrity": "sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz", + "integrity": "sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz", + "integrity": "sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz", + "integrity": "sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.1.0.tgz", + "integrity": "sha512-++9JOAFdcXI3lyer9UKUV4rfoQ3T1RN8yDqoCLar86s0xQct5yblxAE+yWgRnU5/0FOlVCpTZpYSBV/bGWrSrQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.1.tgz", + "integrity": "sha512-+Jb7ggL48FSPS1uhPnJbJwWa9Sr90vQ+d0InW+AhBM22n+cfuYqJZDckBc+W3QSHe1WDvewMZfa4wZOtk5pRgw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.7", + "@babel/plugin-transform-typescript": "^7.20.7", + "@vue/babel-plugin-jsx": "^1.1.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", + "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", + "dev": true + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", + "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "@vue/babel-helper-vue-transform-on": "^1.0.2", + "camelcase": "^6.0.0", + "html-tags": "^3.1.0", + "svg-tags": "^1.0.0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "dependencies": { + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-ssr": "3.2.47", + "@vue/reactivity-transform": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "dependencies": { + "@vue/compiler-dom": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "node_modules/@vue/reactivity": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", + "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", + "dependencies": { + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", + "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", + "dependencies": { + "@vue/reactivity": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", + "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", + "dependencies": { + "@vue/runtime-core": "3.2.47", + "@vue/shared": "3.2.47", + "csstype": "^2.6.8" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", + "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", + "dependencies": { + "@vue/compiler-ssr": "3.2.47", + "@vue/shared": "3.2.47" + }, + "peerDependencies": { + "vue": "3.2.47" + } + }, + "node_modules/@vue/shared": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001476", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001476.tgz", + "integrity": "sha512-JmpktFppVSvyUN4gsLS0bShY2L9ZUslHLE72vgemBkS43JD2fOvKTKs+GtRwuxrtRGnwJFW0ye7kWRRlLJS9vQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.356", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.356.tgz", + "integrity": "sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.15.tgz", + "integrity": "sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.15", + "@esbuild/android-arm64": "0.17.15", + "@esbuild/android-x64": "0.17.15", + "@esbuild/darwin-arm64": "0.17.15", + "@esbuild/darwin-x64": "0.17.15", + "@esbuild/freebsd-arm64": "0.17.15", + "@esbuild/freebsd-x64": "0.17.15", + "@esbuild/linux-arm": "0.17.15", + "@esbuild/linux-arm64": "0.17.15", + "@esbuild/linux-ia32": "0.17.15", + "@esbuild/linux-loong64": "0.17.15", + "@esbuild/linux-mips64el": "0.17.15", + "@esbuild/linux-ppc64": "0.17.15", + "@esbuild/linux-riscv64": "0.17.15", + "@esbuild/linux-s390x": "0.17.15", + "@esbuild/linux-x64": "0.17.15", + "@esbuild/netbsd-x64": "0.17.15", + "@esbuild/openbsd-x64": "0.17.15", + "@esbuild/sunos-x64": "0.17.15", + "@esbuild/win32-arm64": "0.17.15", + "@esbuild/win32-ia32": "0.17.15", + "@esbuild/win32-x64": "0.17.15" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", + "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", + "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==", + "dev": true, + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.21", + "resolve": "^1.22.1", + "rollup": "^3.18.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", + "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", + "dependencies": { + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-sfc": "3.2.47", + "@vue/runtime-dom": "3.2.47", + "@vue/server-renderer": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/vue-router": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", + "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", + "dependencies": { + "@vue/devtools-api": "^6.4.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } +} diff --git a/SUBD-front/package.json b/SUBD-front/package.json new file mode 100644 index 0000000..923e932 --- /dev/null +++ b/SUBD-front/package.json @@ -0,0 +1,19 @@ +{ + "name": "subd-front", + "version": "0.0.0", + "private": true, + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "vue": "^3.2.47", + "vue-router": "^4.1.6" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.0.0", + "@vitejs/plugin-vue-jsx": "^3.0.0", + "vite": "^4.1.4" + } +} diff --git a/SUBD-front/public/favicon.ico b/SUBD-front/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/SUBD-front/src/App.vue b/SUBD-front/src/App.vue new file mode 100644 index 0000000..e864195 --- /dev/null +++ b/SUBD-front/src/App.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/SUBD-front/src/assets/base.css b/SUBD-front/src/assets/base.css new file mode 100644 index 0000000..71dc55a --- /dev/null +++ b/SUBD-front/src/assets/base.css @@ -0,0 +1,74 @@ +/* color palette from */ +:root { + --vt-c-white: #ffffff; + --vt-c-white-soft: #f8f8f8; + --vt-c-white-mute: #f2f2f2; + + --vt-c-black: #181818; + --vt-c-black-soft: #222222; + --vt-c-black-mute: #282828; + + --vt-c-indigo: #2c3e50; + + --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); + --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); + --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); + --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); + + --vt-c-text-light-1: var(--vt-c-indigo); + --vt-c-text-light-2: rgba(60, 60, 60, 0.66); + --vt-c-text-dark-1: var(--vt-c-white); + --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); +} + +/* semantic color variables for this project */ +:root { + --color-background: var(--vt-c-white); + --color-background-soft: var(--vt-c-white-soft); + --color-background-mute: var(--vt-c-white-mute); + + --color-border: var(--vt-c-divider-light-2); + --color-border-hover: var(--vt-c-divider-light-1); + + --color-heading: var(--vt-c-text-light-1); + --color-text: var(--vt-c-text-light-1); + + --section-gap: 160px; +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--vt-c-black); + --color-background-soft: var(--vt-c-black-soft); + --color-background-mute: var(--vt-c-black-mute); + + --color-border: var(--vt-c-divider-dark-2); + --color-border-hover: var(--vt-c-divider-dark-1); + + --color-heading: var(--vt-c-text-dark-1); + --color-text: var(--vt-c-text-dark-2); + } +} + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + position: relative; + font-weight: normal; +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: color 0.5s, background-color 0.5s; + line-height: 1.6; + font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, + Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/SUBD-front/src/assets/logo.svg b/SUBD-front/src/assets/logo.svg new file mode 100644 index 0000000..7565660 --- /dev/null +++ b/SUBD-front/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/SUBD-front/src/assets/main.css b/SUBD-front/src/assets/main.css new file mode 100644 index 0000000..e8667cd --- /dev/null +++ b/SUBD-front/src/assets/main.css @@ -0,0 +1,35 @@ +@import './base.css'; + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + + font-weight: normal; +} + +a, +.green { + text-decoration: none; + color: hsla(160, 100%, 37%, 1); + transition: 0.4s; +} + +@media (hover: hover) { + a:hover { + background-color: hsla(160, 100%, 37%, 0.2); + } +} + +@media (min-width: 1024px) { + body { + display: flex; + place-items: center; + } + + #app { + display: grid; + grid-template-columns: 1fr 1fr; + padding: 0 2rem; + } +} diff --git a/SUBD-front/src/components/HelloWorld.vue b/SUBD-front/src/components/HelloWorld.vue new file mode 100644 index 0000000..0a0988b --- /dev/null +++ b/SUBD-front/src/components/HelloWorld.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/SUBD-front/src/components/TheWelcome.vue b/SUBD-front/src/components/TheWelcome.vue new file mode 100644 index 0000000..5e64625 --- /dev/null +++ b/SUBD-front/src/components/TheWelcome.vue @@ -0,0 +1,86 @@ + + + diff --git a/SUBD-front/src/components/WelcomeItem.vue b/SUBD-front/src/components/WelcomeItem.vue new file mode 100644 index 0000000..a5eca70 --- /dev/null +++ b/SUBD-front/src/components/WelcomeItem.vue @@ -0,0 +1,85 @@ + + + diff --git a/SUBD-front/src/components/icons/IconCommunity.vue b/SUBD-front/src/components/icons/IconCommunity.vue new file mode 100644 index 0000000..2dc8b05 --- /dev/null +++ b/SUBD-front/src/components/icons/IconCommunity.vue @@ -0,0 +1,7 @@ + diff --git a/SUBD-front/src/components/icons/IconDocumentation.vue b/SUBD-front/src/components/icons/IconDocumentation.vue new file mode 100644 index 0000000..6d4791c --- /dev/null +++ b/SUBD-front/src/components/icons/IconDocumentation.vue @@ -0,0 +1,7 @@ + diff --git a/SUBD-front/src/components/icons/IconEcosystem.vue b/SUBD-front/src/components/icons/IconEcosystem.vue new file mode 100644 index 0000000..c3a4f07 --- /dev/null +++ b/SUBD-front/src/components/icons/IconEcosystem.vue @@ -0,0 +1,7 @@ + diff --git a/SUBD-front/src/components/icons/IconSupport.vue b/SUBD-front/src/components/icons/IconSupport.vue new file mode 100644 index 0000000..7452834 --- /dev/null +++ b/SUBD-front/src/components/icons/IconSupport.vue @@ -0,0 +1,7 @@ + diff --git a/SUBD-front/src/components/icons/IconTooling.vue b/SUBD-front/src/components/icons/IconTooling.vue new file mode 100644 index 0000000..660598d --- /dev/null +++ b/SUBD-front/src/components/icons/IconTooling.vue @@ -0,0 +1,19 @@ + + diff --git a/SUBD-front/src/main.js b/SUBD-front/src/main.js new file mode 100644 index 0000000..eedade8 --- /dev/null +++ b/SUBD-front/src/main.js @@ -0,0 +1,11 @@ +import { createApp } from 'vue' +import App from './App.vue' +import router from './router' + +import './assets/main.css' + +const app = createApp(App) + +app.use(router) + +app.mount('#app') diff --git a/SUBD-front/src/router/index.js b/SUBD-front/src/router/index.js new file mode 100644 index 0000000..a49ae50 --- /dev/null +++ b/SUBD-front/src/router/index.js @@ -0,0 +1,23 @@ +import { createRouter, createWebHistory } from 'vue-router' +import HomeView from '../views/HomeView.vue' + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/', + name: 'home', + component: HomeView + }, + { + path: '/about', + name: 'about', + // route level code-splitting + // this generates a separate chunk (About.[hash].js) for this route + // which is lazy-loaded when the route is visited. + component: () => import('../views/AboutView.vue') + } + ] +}) + +export default router diff --git a/SUBD-front/src/views/AboutView.vue b/SUBD-front/src/views/AboutView.vue new file mode 100644 index 0000000..756ad2a --- /dev/null +++ b/SUBD-front/src/views/AboutView.vue @@ -0,0 +1,15 @@ + + + diff --git a/SUBD-front/src/views/HomeView.vue b/SUBD-front/src/views/HomeView.vue new file mode 100644 index 0000000..6bb706f --- /dev/null +++ b/SUBD-front/src/views/HomeView.vue @@ -0,0 +1,9 @@ + + + diff --git a/SUBD-front/vite.config.js b/SUBD-front/vite.config.js new file mode 100644 index 0000000..2fb21e9 --- /dev/null +++ b/SUBD-front/vite.config.js @@ -0,0 +1,15 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), vueJsx()], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + } +})