From 7e9c78755ef92ff079d0f5bccf42c38019fa70b5 Mon Sep 17 00:00:00 2001 From: tukuna30 Date: Wed, 5 Jun 2024 15:12:11 +0530 Subject: [PATCH] feat(add server manage session): misc fixes --- .env.development | 2 +- .eslintrc.cjs | 1 + .firebaserc | 5 + .vscode/settings.json | 2 +- README.md | 12 +- README.zh-CN.md | 124 --- firebase.json | 12 + index.html | 2 +- package-lock.json | 703 +++++++++++++++++- package.json | 13 +- src/App.tsx | 2 +- src/_mock/assets.js | 2 + src/_mock/handlers/_user.js | 2 +- src/api/apiClient.ts | 9 +- src/api/services/userService.ts | 10 +- src/assets/images/skillrazr.jpg | Bin 0 -> 27965 bytes src/layouts/_common/notice.tsx | 2 +- src/layouts/dashboard/nav.tsx | 2 +- src/pages/dashboard/workbench/banner-card.tsx | 4 +- src/pages/sys/login/Login.tsx | 12 +- src/pages/sys/login/LoginForm.tsx | 36 +- src/pages/sys/login/RegisterForm.tsx | 9 +- src/pages/sys/others/calendar/index.tsx | 2 +- src/router/components/auth-guard.tsx | 9 +- src/server.ts | 142 ++++ src/store/userStore.ts | 6 +- tsconfig.json | 4 + types/entity.ts | 1 + 28 files changed, 915 insertions(+), 215 deletions(-) create mode 100644 .firebaserc delete mode 100644 README.zh-CN.md create mode 100644 firebase.json create mode 100644 src/assets/images/skillrazr.jpg create mode 100644 src/server.ts diff --git a/.env.development b/.env.development index 37f0871ec..8e0d86f9f 100644 --- a/.env.development +++ b/.env.development @@ -1,2 +1,2 @@ -VITE_APP_BASE_API=/api +VITE_APP_BASE_API=http://localhost:5000 VITE_APP_HOMEPAGE=/dashboard/workbench diff --git a/.eslintrc.cjs b/.eslintrc.cjs index d5ef0743a..fbcaedb27 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -60,6 +60,7 @@ module.exports = { 'no-param-reassign': 'off', 'space-before-function-paren': 'off', 'class-methods-use-this': 'off', + 'consistent-return': 'off', 'jsx-a11y/click-events-have-key-events': 'off', 'jsx-a11y/interactive-supports-focus': 'off', diff --git a/.firebaserc b/.firebaserc new file mode 100644 index 000000000..65d5d8286 --- /dev/null +++ b/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "skillrazr-admin" + } +} diff --git a/.vscode/settings.json b/.vscode/settings.json index b18b0f3dd..e81a5fcd6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -23,5 +23,5 @@ "i18n-ally.keystyle": "flat", "i18n-ally.sortKeys": true, "i18n-ally.sourceLanguage": "en_US", - "i18n-ally.displayLanguage": "zh_CN", + "i18n-ally.displayLanguage": "en_US", } diff --git a/README.md b/README.md index 8912ec31f..403967b4b 100644 --- a/README.md +++ b/README.md @@ -2,20 +2,12 @@

-

Slash Admin

+

SkillRazr Admin App

- Slash Admin is a modern admin dashboard template built with React 18, Vite, Ant Design, and TypeScript. It is designed to help developers quickly create powerful admin management systems. + SkillRazr Admin is a modern admin dashboard template built with React 18, Vite, Ant Design, and TypeScript. It is designed to help developers quickly create powerful admin management systems.

-**English** | [中文](./README.zh-CN.md) - -## Sponsor -
- - -
- ## Preview + https://admin.slashspaces.com/ diff --git a/README.zh-CN.md b/README.zh-CN.md deleted file mode 100644 index 707b4c0d6..000000000 --- a/README.zh-CN.md +++ /dev/null @@ -1,124 +0,0 @@ -
-
-
- -

Slash Admin

- - Slash Admin 是一款现代化的后台管理模板,基于 React 18、Vite、Ant Design 和 TypeScript 构建。它旨在帮助开发人员快速搭建功能强大的后台管理系统。 - - -
- -**中文** | [English](./README.md) - -## 赞助 -
- - -
- - -## 预览 -+ https://admin.slashspaces.com/ - -|![login.png](https://d3george.github.io/github-static/slash-admin/login.jpeg)|![login_dark.png](https://d3george.github.io/github-static/slash-admin/login_dark.jpeg) -| ----------------------------------------------------------------- | ------------------------------------------------------------------- | -|![analysis.png](https://d3george.github.io/github-static/slash-admin/analysis.png)|![workbench.png](https://d3george.github.io/github-static/slash-admin/workbench.png) -## 特性 - -- 使用 React 18 hooks 进行构建。 -- 基于 Vite 进行快速开发和热模块替换。 -- 集成 Ant Design,提供丰富的 UI 组件和设计模式。 -- 使用 TypeScript 编写,提供类型安全性和更好的开发体验。 -- 响应式设计,适应各种屏幕尺寸和设备。 -- 灵活的路由配置,支持多级嵌套路由。 -- 集成权限管理,根据用户角色控制页面访问权限。 -- 集成国际化支持,轻松切换多语言。 -- 集成常见的后台管理功能,如用户管理、角色管理、权限管理等。 -- 可定制的主题和样式,以满足您的品牌需求。 -- 基于 MSW 和 Faker.js 的Mock方案 -- 使用 Zustand 进行状态管理 -- 使用 React-Query 进行数据获取 - -## 文档 -[文档地址](https://docs-admin.slashspaces.com/) - -## 快速开始 - -### 获取项目代码 - -```bash -git clone https://github.com/d3george/slash-admin.git -``` - -### 安装依赖 - -在项目根目录下运行以下命令安装项目依赖: - -```bash -pnpm install -``` - -### 启动开发服务器 - -运行以下命令以启动开发服务器: - -```bash -pnpm dev -``` - -访问 [http://localhost:3001](http://localhost:3001) 查看您的应用程序。 - -### 构建生产版本 - -运行以下命令以构建生产版本: - -```bash -pnpm build -``` - -构建后的文件将位于 `dist` 目录中。 - -## 容器化部署 - -### 构建镜像并运行容器 -#### 构建镜像 -在终端中进入项目根目录,并执行以下命令来构建 Docker 镜像: -``` -docker build -t your-image-name . -``` -确保将 `your-image-name` 替换为你自己的镜像名称 - -#### 运行容器 -使用以下命令在 Docker 容器中运行你的应用: -``` -docker run -p 3001:80 your-image-name -``` -这将在容器的端口 `80` (暴露在`Dockerfile`中) 上运行你的应用,并将其映射到你主机的端口 `3001` 上。 - -现在,你可以通过访问 http://localhost:3001 来查看部署的应用。 - - -### 使用docker-compose.yaml -在终端中进入项目根目录,并执行以下命令来启动 Docker Compose: -``` -docker-compose up -d -``` -Docker Compose 根据`docker-compose.yaml`定义的配置构建镜像并在后台运行容器. - -容器运行成功后,同样可以通过访问 http://localhost:3001来查看部署的应用。 - -参考[.commitlint.config.js](./commitlint.config.js) - -- `feat` 新功能 -- `fix` 修复bug -- `docs` 文档注释 -- `style` 代码格式(不影响代码运行的变动) -- `refactor` 重构 -- `perf` 性能优化 -- `revert` 回滚commit -- `test` 测试相关 -- `chore` 构建过程或辅助工具的变动 -- `ci` 修改CI配置、脚本 -- `types` 类型定义文件修改 -- `wip` 开发中 diff --git a/firebase.json b/firebase.json new file mode 100644 index 000000000..6564edd5c --- /dev/null +++ b/firebase.json @@ -0,0 +1,12 @@ +{ + "hosting": { + "public": "dist", + "ignore": ["firebase.json", "**/.*", "**/node_modules/**"], + "rewrites": [ + { + "source": "**", + "destination": "/index.html" + } + ] + } +} diff --git a/index.html b/index.html index aca743b1f..7188c0e8b 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ - Slash Admin + SkillRazr Admin diff --git a/package-lock.json b/package-lock.json index a52879782..a38c47d5b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,13 +27,18 @@ "apexcharts": "^3.43.0", "autosuggest-highlight": "^3.3.4", "axios": "^1.5.1", + "bcryptjs": "^2.4.3", + "body-parser": "^1.20.2", "classnames": "^2.3.2", "color": "^4.2.3", + "cors": "^2.8.5", "dayjs": "^1.11.10", + "express": "^4.19.2", "framer-motion": "^10.16.4", "highlight.js": "^11.9.0", "i18next": "^23.5.1", "i18next-browser-languagedetector": "^7.1.0", + "jsonwebtoken": "^9.0.2", "nprogress": "^0.2.0", "numeral": "^2.0.6", "ramda": "^0.29.1", @@ -65,7 +70,12 @@ "@commitlint/config-conventional": "^17.7.0", "@faker-js/faker": "^8.1.0", "@types/autosuggest-highlight": "^3.2.0", + "@types/bcryptjs": "^2.4.6", + "@types/body-parser": "^1.19.5", "@types/color": "^3.0.4", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/jsonwebtoken": "^9.0.6", "@types/nprogress": "^0.2.1", "@types/numeral": "^2.0.3", "@types/ramda": "^0.29.6", @@ -2568,6 +2578,22 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/bcryptjs": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", + "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, "node_modules/@types/color": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.6.tgz", @@ -2592,12 +2618,30 @@ "integrity": "sha512-hulKeREDdLFesGQjl96+4aoJSHY5b2GRjagzzcqCfIrWhe5vkCqIvrLbqzBaI1q94Vg8DNJZZqTR5ocdWmWclg==", "dev": true }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", "dev": true }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -2612,6 +2656,30 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.2.tgz", + "integrity": "sha512-dPSEQElyVJ97BuGduAqQjpBocZWAs0GR94z+ptL7JXQJeJdHw2WBG3EWdFrK36b8Q6j8P4cXOMhgUoi0IIfIsg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "node_modules/@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -2645,6 +2713,12 @@ "hoist-non-react-statics": "^3.3.0" } }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, "node_modules/@types/js-cookie": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz", @@ -2662,6 +2736,15 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", + "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/lodash": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.1.tgz", @@ -2683,6 +2766,12 @@ "@types/unist": "^2" } }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", @@ -2751,6 +2840,12 @@ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "dev": true + }, "node_modules/@types/quill": { "version": "1.3.10", "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", @@ -2768,6 +2863,12 @@ "types-ramda": "^0.29.10" } }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, "node_modules/@types/react": { "version": "18.3.2", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.2.tgz", @@ -2833,6 +2934,27 @@ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, "node_modules/@types/statuses": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", @@ -3246,6 +3368,18 @@ "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==" }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", @@ -3500,6 +3634,11 @@ "node": ">=0.10.0" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "node_modules/array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", @@ -3924,6 +4063,11 @@ "node": ">=0.10.0" } }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -3951,6 +4095,42 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -4010,12 +4190,25 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "devOptional": true }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -4646,6 +4839,25 @@ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", "dev": true }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/conventional-changelog-angular": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz", @@ -4702,6 +4914,11 @@ "node": ">= 0.6" } }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "node_modules/copy-anything": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", @@ -4737,7 +4954,6 @@ "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, "dependencies": { "object-assign": "^4", "vary": "^1" @@ -5253,6 +5469,14 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -5261,6 +5485,15 @@ "node": ">=6" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -5389,6 +5622,19 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "node_modules/electron-to-chromium": { "version": "1.4.763", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.763.tgz", @@ -5409,6 +5655,14 @@ "node": ">= 4" } }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", @@ -5631,6 +5885,11 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -6239,7 +6498,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -6364,6 +6622,73 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -6554,6 +6879,36 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -6681,6 +7036,14 @@ "node": ">=0.4.x" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -6729,6 +7092,14 @@ } } }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", @@ -7507,6 +7878,21 @@ "readable-stream": "^3.1.1" } }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -7566,6 +7952,17 @@ "@babel/runtime": "^7.23.2" } }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -7662,8 +8059,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", @@ -7707,6 +8103,14 @@ "loose-envify": "^1.0.0" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-accessor-descriptor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", @@ -8584,6 +8988,27 @@ "node": "*" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -8599,6 +9024,25 @@ "node": ">=4.0" } }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -8969,17 +9413,41 @@ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, "node_modules/lodash.isfunction": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", "dev": true }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" }, "node_modules/lodash.kebabcase": { "version": "4.1.1", @@ -8999,6 +9467,11 @@ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", "dev": true }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "node_modules/lodash.snakecase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", @@ -9563,6 +10036,14 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", @@ -9605,6 +10086,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, "node_modules/merge-options": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", @@ -9632,6 +10118,14 @@ "node": ">= 8" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromark": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", @@ -10180,6 +10674,17 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -10462,6 +10967,14 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -10627,7 +11140,6 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10795,6 +11307,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -10960,6 +11483,14 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -11903,6 +12434,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -11925,6 +12468,20 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/query-string": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", @@ -12017,6 +12574,28 @@ "url": "https://opencollective.com/ramda" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/rc-cascader": { "version": "3.25.0", "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.25.0.tgz", @@ -13642,7 +14221,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -13684,6 +14262,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/sass": { "version": "1.77.1", "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.1.tgz", @@ -13732,7 +14315,6 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -13747,7 +14329,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -13758,8 +14339,62 @@ "node_modules/semver/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } }, "node_modules/server-only": { "version": "0.0.1", @@ -13861,6 +14496,11 @@ "node": ">=0.10.0" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -13891,7 +14531,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -14372,7 +15011,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, "engines": { "node": ">= 0.8" } @@ -16978,6 +17616,14 @@ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/traverse": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.9.tgz", @@ -17208,6 +17854,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", @@ -17573,6 +18231,14 @@ "node": ">= 10.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -17712,6 +18378,14 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uvu": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", @@ -17757,7 +18431,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, "engines": { "node": ">= 0.8" } diff --git a/package.json b/package.json index b2c118f2c..0de1b3394 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "build": "tsc && vite build", "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview", - "prepare": "husky install" + "prepare": "husky install", + "startServer": "npx ts-node src/server.ts" }, "dependencies": { "@ant-design/cssinjs": "^1.17.2", @@ -31,13 +32,18 @@ "apexcharts": "^3.43.0", "autosuggest-highlight": "^3.3.4", "axios": "^1.5.1", + "bcryptjs": "^2.4.3", + "body-parser": "^1.20.2", "classnames": "^2.3.2", "color": "^4.2.3", + "cors": "^2.8.5", "dayjs": "^1.11.10", + "express": "^4.19.2", "framer-motion": "^10.16.4", "highlight.js": "^11.9.0", "i18next": "^23.5.1", "i18next-browser-languagedetector": "^7.1.0", + "jsonwebtoken": "^9.0.2", "nprogress": "^0.2.0", "numeral": "^2.0.6", "ramda": "^0.29.1", @@ -69,7 +75,12 @@ "@commitlint/config-conventional": "^17.7.0", "@faker-js/faker": "^8.1.0", "@types/autosuggest-highlight": "^3.2.0", + "@types/bcryptjs": "^2.4.6", + "@types/body-parser": "^1.19.5", "@types/color": "^3.0.4", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/jsonwebtoken": "^9.0.6", "@types/nprogress": "^0.2.1", "@types/numeral": "^2.0.3", "@types/ramda": "^0.29.6", diff --git a/src/App.tsx b/src/App.tsx index 66a4609f0..be5fa947b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -13,7 +13,7 @@ function App() { - Slash Admin + SkillRazr Admin diff --git a/src/_mock/assets.js b/src/_mock/assets.js index 68de9a390..4e6e34baa 100644 --- a/src/_mock/assets.js +++ b/src/_mock/assets.js @@ -531,3 +531,5 @@ export const TEST_USER = { permissions: TEST_ROLE.permission, }; export const USER_LIST = [DEFAULT_USER, TEST_USER]; +export const adminPermissions = ADMIN_ROLE.permission; +export const testPermmissions = TEST_ROLE.permission; diff --git a/src/_mock/handlers/_user.js b/src/_mock/handlers/_user.js index 6ce6ab4e6..cd2c4ce16 100644 --- a/src/_mock/handlers/_user.js +++ b/src/_mock/handlers/_user.js @@ -5,9 +5,9 @@ import { UserApi } from '@/api/services/userService'; import { USER_LIST } from '../assets'; +// mock server - this is not used as Node server is used const signIn = http.post(`/api${UserApi.SignIn}`, async ({ request }) => { const { username, password } = await request.json(); - const user = USER_LIST.find((item) => item.username === username); if (!user || user.password !== password) { diff --git a/src/api/apiClient.ts b/src/api/apiClient.ts index f31946f9b..d53edf216 100644 --- a/src/api/apiClient.ts +++ b/src/api/apiClient.ts @@ -7,14 +7,13 @@ import { t } from '@/locales/i18n'; import { Result } from '#/api'; import { ResultEnum } from '#/enum'; -// 创建 axios 实例 +console.log('api base url', import.meta.env.VITE_APP_BASE_API); const axiosInstance = axios.create({ baseURL: import.meta.env.VITE_APP_BASE_API, timeout: 50000, headers: { 'Content-Type': 'application/json;charset=utf-8' }, }); -// 请求拦截 axiosInstance.interceptors.request.use( (config) => { // 在请求被发送之前做些什么 @@ -30,11 +29,14 @@ axiosInstance.interceptors.request.use( // 响应拦截 axiosInstance.interceptors.response.use( (res: AxiosResponse) => { + console.log('axios resp1', res); + if (!res.data) throw new Error(t('sys.api.apiRequestFailed')); const { status, data, message } = res.data; - // 业务请求成功 + const hasSuccess = data && Reflect.has(res.data, 'status') && status === ResultEnum.SUCCESS; + if (hasSuccess) { return data; } @@ -50,7 +52,6 @@ axiosInstance.interceptors.response.use( } catch (error) { throw new Error(error as unknown as string); } - // 对响应错误做点什么 if (isEmpty(errMsg)) { // checkStatus // errMsg = checkStatus(response.data.status); diff --git a/src/api/services/userService.ts b/src/api/services/userService.ts index 59a037b08..dc74d5070 100644 --- a/src/api/services/userService.ts +++ b/src/api/services/userService.ts @@ -13,11 +13,11 @@ export interface SignUpReq extends SignInReq { export type SignInRes = UserToken & { user: UserInfo }; export enum UserApi { - SignIn = '/auth/signin', - SignUp = '/auth/signup', - Logout = '/auth/logout', - Refresh = '/auth/refresh', - User = '/user', + SignIn = 'signin', + SignUp = 'signup', + Logout = 'logout', + Refresh = 'refresh', + User = 'user', } const signin = (data: SignInReq) => apiClient.post({ url: UserApi.SignIn, data }); diff --git a/src/assets/images/skillrazr.jpg b/src/assets/images/skillrazr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..839c8331450b70c41aabd71decd944227f7853ff GIT binary patch literal 27965 zcmeFYc|4SV+c!Q^DOsWv!pI&W${I7N7!o3keUcEe6td1t$i7S{LQGkb#Dwh3*q2mx zvhVvgV;#(l=j{7j-|y9ZJ@<1z*L6R?-ygr%@A`P1=lL<``q_@-eY}t3IQV%m4mx>D zLrVihM+X9F0)L=`36Pt*w}TxBq@x282Z2DxK!@p$g6M%79q16SWB*$nxPeaW@4tsS zfDZq04G07Qjvx^ITe`nr`S#GCXAgni(*IQlp7HCA$In0X@NiR>mUeNMvVP!t-&V@T z)mhrx+D%$U>XI}_1?uf)ZR2F?!GGV@-oZsxV6BoM!0+%tRRAuhb4kbThV4TKP2VTB zcYSpYZG4?PY;*?=ATWTyj?n#4e&MKJh3*jj;Uh;GjvZ$_0bEdg5_E`;p8n8b`XfgU1L%wn z37iKVW;?=uUPkTcDSc}Ofybw117hDD6TDtf%VE$-6uNx>N#JqDGiN!uxP?VT#V&|n zk&{ zNPL}?oSu=H^*;MU&d0){FU2LLW#tuh^$m?p%`L58ySjUN`}%(l3{Ff=P0!5E%`YsH z);Bh{ws*+8d%xNR0LTB?EMWhiwu=pD*P+9Q=?^pfY8TxhuU`#kJACB4%u#kVeFp2t zrvzjJj-9?9`>vq&xZq_2BFFtFos4IMu1pA%el_inmi==L3;b`j?5~FXyVmw{#LmED15()z+dG6cnIB*qeqV)JI;FS7^@)X zX->g^xg3lD_?!P=5X3|eAbK`>HV_oFzZW6)_R#;$hQCR|HnQ?8K*W1IMxb}r#{-{g zc7F|&p_a3`DtZ@P{g{R19)rs)gWAGGahmk%)z5$(r9`C z`aSrx{+-81PU~O$S2yrM$NvLuKS~Zi00}nX4nPQL%Fao?cm_o=V-)lVP${j(&-UBj^JDvk%B zt@Q)Y5Bx4J055=UA>|%``r8gb%A1#75F~1XX`qx*oU7_64)IeQQM`lI(c^ z5|EEQ09mzKW<53}ClPls`y;L-?G0=7(}p~B>ZkAgwOLt{yc)niAxveODUWuVmpiBO z&#htir`fjT7Pd$Spl0clXb1AUE8gZZ4xKB4rAZ=O1f2|`Tz5#Q>P;k+=^mu~_1&n% zO0W-w@O^;CwI0oS0IJiPIw2uy+0iiSKbj&q$1o6cmV~Ryom+dB2Huy7_ncHpoU25O z2p)iLPwh7#%`s$VBt1M5du8S4>eNMa-{aMnh)O*@EMk2ZSictbjsMju1|M|)^P`3r zBiBw~$S{hzWRFCoGfd(5JSTQkn!45A5wUMoMVK55fldezqq=HR@;^bl1ey&P#t@A@ z%}R|G z*}Gregg-_`P8t(&5qX}X&Yv&)!1>b5iCPCBuMmpFnysxZQ#SwlvE0V)nbf{-3sX#` zi?8R5PmJW?+Hq63Z)RfYW$jUnV(HKR+Wvze!8`rONm9+k+R)xfK0#f@kM?4hL+28>aiJPs3l2j124=-HOW*RjMq_1v(@4 zulf7?T>e{~;h^WApAa!s++uH818D+edm5V_hs8o?lzEH)Jaj1~KHvaEr-Z1(za^_p zx{@{h1v#pk6}X>Dj`e&13!)^Nd$^m)6BC#fR~C`dM=9CeDei1Nbz^?CT}4Q}+{6Ls zxQgBZ=-6DObekoh{w(!)Fh@ z)K~X`O{@LhDg?d%O+Z0R!2t!4Nb}tJ?$1m*MT12nXn4eK|GNNk(jJr!UEO;CVqL@( zpne-?#BV|&BDM1u$07uVq`c zN_&hS8e21?iJQV!pB{FP>IiQ@)X7MmUR-}? zAjkMo8Kiiqn#cUka|glA)k`=YK9&$8n3D(a&7a6mL}uzn5vKL8TegWi9B!R$>v^f7A|P+=Mi99m&aV&mJrN&X+~p zXc!~DA{!4Gyquk2h=)==bdLkKFeyw~R{IAKp$$`7q;vC$(qVGKjOFtph{^*Hk_qD; zu}3RxxI3K!i*4|6?UCuu=2)$^ncwqI3s64|SK0vf|5J|tzdl2DgQj-E{M%BbnQ8{u zSigK@*hvw8wjU5rj@WZCwFwkWvpW`+m4vy*Ae2nmA?cP%hpXK1$`%G&`;qRT?_ZiHhl)I-#rw^>@;xGJU+3FA9O|(z+hK?`GrX%im_DI& z{nq2B4=IaP#RTGLxp3|&-rnbArmHH>^{j0I_)TJd_1W+$Rr|cgXD)(AdeA3gI8jW@ z{#&G_`lF+?u}0(8uvJjt6X;wz<|XzcpmOPQAcx3r)O_40%oBE9plDa@+K1hK(jC@u zr|wVHdBXZGn7+$DVG3U_%o_F+m=QC=>%MzneL#@UVB`MMl>b3WjLH3uwyi=KChg}b zM`$~63iKnS@jv1PGz(!`qYJt;An_$%9D51^mI07z9_<3^5wHk@p8W|@)^Sl*=V|rC zM}3|016%al9?h27iBO#?lmPxA*?MA)tVyx8cNTC79Hyqb>J+TgZA%7_`*lc_4bVZn z1h=8&Ymc6F($F{8r1o`iu&;fMD=RYcMj44|DO?)+;K2c?U6I_fSK_|OvDmz0DBX+A zwZORK%gv~KYx{O#HfB$@*zYnRhUR0AL*7w%JeDTKP zW(PRk0SIz#INmCR<$Zq2A}Y34k-UE^$Co& z%n9)m%}!n*1EX)scjwpahu4g;L8rX|t*|t607^w}{DY8~zlRb*VQLU-p6L3$jAg`c zrqtQraYGL2^27#sr($d}akef(?1SPTMqy#`cVlK&SViwDYUY#9dA>{*hMu$|j{O1t zz9fc$E9MB+>nOke4dDY&{^KbS)trGwZ`Kv6(xV3#tEqC4P2+krijRbo!7?Am$U!EI zP(M#Jl)5DpO%oxgeX*1pyV>RJ5vd=xl5WzBXAoV~6T$0}!4qpM2oCu?S(i{99m?hg z_&oG{8TA^jKmvE}YO9(Dq%G$0SEGe-hm|8U9C%rWmk*AwKJ zZquk2pUc>BI~guKC`;9)O~&Kt<-tX7q)aDP#`g-1= zjFb*b4l3W6d-trL`e}VD>s?@4JW0mI_zR}9Cnsbbc2Q0**#Q$zx1nD4n0E>~UJ*A= z6y_|43Zq*Vm;NKJ#J{Q}FN{ap39xy(ukqYtr66DSCp%g}$?y-O+UUm<1NO;wQmfM! z>{Ng7^uG&I~tJQ`r~ z<_y@d^Xad7T!%kNPWlC9D7JoH=UhV0?5ij)6hdTGlM2V8kzOQ*1~4(&`__(u#*mDj zICyVC6oko^B*Pmar#i+O(gX`T;fiH183aG5wP9=3aM}##MD?-RM2$07-kD#{OOGhr zbrRi0i2{~80|10W$6G{RJ#9y!x@eW=tE~HT42wFxsj`Y)oPA=?46kuqn+MHb01%hE zRx38mrof=_zW9CnsuVO4qV~&Vv;I@n{})Gw|E7`8Dnf1sP%MB~tCx>g%;}1FG#g;o zJ5UIP3B(nOJV}OF8YzhrMkaKF1*TNxq3*PWT8hN#tdXsFJwH(mFjcr5&Lp1=$9-wz zGI%KPa`#ab=Mj})Auo&Z{fJFs+-zi);Fc~+1MF;Y-Ya;oY4Q9f+P&AeXf1c;dh_jK zzm@9`0uOW9#|D0&=y=1zX(|gP!Fg4ZuG^(NKHY~3Xea6wrb_V6y`EHib2etaRTFqFwo z*+hhsQaSdx>?fd14vS~nZWl-LHfUoTrbJ3IN=n1%PCLF{_(Er*@?_yuT~706_s*r2 zy{}^#Q2B?ruF!}J8bWu*^po4liQ56b$Evzl-nUzl1kp0ro23dw`1sW*-cJcDOSCY` zQtp{jucwz!q+GB%4$o+6G(jG##g%MHKTo6Yc{y8SUQQF^iU)^0rM;Tjn_C9>fRM!c z#Qkc4a!%;ZU<`rCW)3^6Yo^NTexk|LMR54zur#GjukHX8-bnVFf=7ONYO;04@)ljw zKpDEWrk%RUjO3UAhvT_OPlx<`bcz97mgw`D6T7XaK~dV~Ae9g%oYD2Cs95taeos(K zeENhD>sQd!d%3cgJcLbk)p$;-D^29|z%k=iS3_i%o3O?8gOV#^%QS7+deH_Xn7lv9 z3cXWA?2&v`ih$gK;wfTK^;Q5Q8)2V8z+L5z-nC1P^b>US5I3apm~X;h>W}qE;F^Lr^0-H+XzYwWCLDEGRqi45 zGK~ZE0~v!`9=4)2A;>2HYOy@M+(gBFd?@Y=uhqBs4z5_eMRgD3{-=rIvu3yBr9WP> z-i=5+Qwo#2t!jp72(rpaZ&X(y4%Y1`NEI}5CwSRBd;3I7^zG>#k7%a2lOHpL(m?d( zxEQ<`^esH)@(YNBp) zoVVyWt#tBE;$FVT{+Ze%p=%Go%Q^F`IeX8X7WJ6P3iYF>f?7NCUhza-`M#k!X1qjZ zVs%^;!%5}&^o-f8-yRBk>=Wsjna4U~?!Qkt0D;mYB;M@Sq(_JWwLi8)#UrU%)XG7` z&G>r$dZ7p|%^ik_-IV47&=IrmLcJ6|Zq4Rz+o7|zyx$(I*Hh!;=k;#wMMU(yGQH~+ zzHIB$Br28D9-5E}hf%$TDLwo_LA4yKgkv-zNTfSBL@o!~VfW~UAb3lv`8~RkItTF_1$J9i835lEF!)^F}`PIQ<1Zr zJOE8#zXRa#j$80Q!HNIx88z_>*&%}>X%l^l9kxj=AXWptLjhSxHc5_2h#0_yP=%BG zuSYH3Wl;z!xht}5wi_i?L*rIPM7!vy$(eIMg8Fdnvvr5 z@fm5M{SbJvOyDBA#w3I)(c!T+umewIFzR_1)N?)hJiwBc7>x!)nq7-qWT|HboJy+> zK*s(Dpo`rWN(o*LJX>}`*l#_aTQi|Gh~q=g`uoqqb%tFG5iLx#;_e}e0NKwq%Hdth z>UzuA`(@NCX)c{d?nYDo6=^RF64Md6u=gB1$XkCSmn* zHZ8EOY{X_98ob((D&Vu6xe`B{J;`$J0K}JT^3_$tQy+MF?o2KhtXG6^bZp%F@ECiQ zt$VuO+mW#=9TuQZ?cY+|TgG-ikFdBmbJRDUj{o|(E^DO4NWWEx2+AL7B(SPzjn8g) zaz0PUoNy7?eX&PBqSu4GY!My2@*@Sw^6tTqNNMbY=z=%0Z-Ro>EHBLzk0XswEau1O zCVm(+TS#~PF&4fJuZM=7!JjO&yiUEDoVl=3FnyDiC{6q3N0sPZEPmNFY+A3fFw-jJ z_zgQE^Z--Sn@ki{xS$}o+YgS+i^PeO!>#o83fF(JT@!z2yZ+9mvc0mrrFfVvkoCI6 z1R@-D>Hzc{*04T!t?Ww~pC_TPUW``skoy^s57P}kimJnAsRD{CD+rRKvB?)>X z8lNTy$^Yc7N}{Tij?YoM0UmgDKQh-`Q>Sq_=d?|357u=NdYZ!U-qyA!<5eiJhTDQB z&PXe69HAhIRW~EAUM&w>tv!jJze#(wuCC2=$^x2r=t}hb+xR`hPrP#F-(i8Wi;i0s zS&J*X!n;___Wc{~kW>GQZ^pUylcPpyg=kDTM$}k>ipL36FeFJm*J`X_vz$ow}BB%bsFK`micq zYznaOAnDo5h?L&kOs8agfQPh)Q<7vB?=8M#o7SD71&59A)~ZvONTe!;>snR9u(Jb; z1P#KeO{<9A15nKY=$x~hDCRcle%_}!#!`ufN9aLt4RQ}DF;>e&f1yQ{*{ArzSC%f= ztWu0=c#Yw<$?Jj5Wh!`URuVA8(;of<4Mq2#64Oono>b9#Uq45)h9xHLns#I8h<;D} zyu>ty*Wawq-{8ULZf#SCIl=qbQBCNOH9$moJYGs3eRbS$$Y%bDf6%FfH2t#{K$pxee#@?NFt`Ukks*B$j^c z?H^1y0737j}$ zQa{dM+4JksmLJ)+{9+X%MuDGD>?!O8lxB1G z*D?maY|+v3TRTu@3M1)g=9ww0q$_01RfaWTN&sW|UYx4LsQ*=BbL}YikYwK5vQ+d; zag&gL%s5-IUd1z~js%fZxra1{`LcYmHre@o9`RYHOatw;q1EzrL@14iOlT;Jt80w| zB%Yz=}sWxNeB5Nnrn)5 z*3j&IRq6iNf=y^QlJd>4dAn^`R>m3 zOFYx-;ofa-8auj$WtCXuKJR?J)rX&TjQ;@S02`(6MV~x^j8yly+n{^y@`CIS!KU#C z<@VpfGrqV)*Vx@`t0`jTBOX~z(iC$ffaTGzLqO=h&nNe3xx2oMdj?g$Uq+Ok6p?s_F6JiQw++c% zNA|<0o`9w*RC)W`G^77VuSOYy$9qSUsDnxJ@LwutSat59d|yRZ-~oHq5!(O_Glm@h z{PT6nom9PeR_h_ZJuyn_xR>B$w4NcM&o!&3Sjo(1_G;45t{>e`7Et~$HCweMNx(Pv4p{+?uvy(GSNOtL-y!S0vT5j?PIZ=CgLl^yeCBf>wa{JTW9%0;* zUh}y>ed9am7QOQhKu5j7CM4iEuncc2y{@tp0v2Fh9DRlgO5WG58)fUPI-ecMEOPM_ zM%H*{TCfs4t<1QZXLTj+8txlgLInIW1m+*arLcwn2!DQKbz74=$@P;%=C#yQ}Y5!oNFKwU<6jk07zu9s13U z#`?P}q@4AfH@>+xSz^)4#K-)?Vaw6mZmKUmML+KdRQOd^`kgR!bs2^+i9L9#dgwzd z^p!vF6oJ#yyWJ|@ApU|2R=5gA76kWJVB6ku^oC}v2&g$Vs1bw7RVn(IvpN5nG2*TWtPJ(Xk=J z>y<+zJzsx8s@x+;&8?=hd_tvG>v8O$L%%RztyjKn21!V{ALa@5dA(()3UCH0@ONSP zIZ`I8sQ8AYP1y9})dXRxl85D49pZM%nO9ji1p?1MV=(ZG^NSzu%R3E^ z8ria+=zjB2>xawAYF&g_=Cyy&-~X-I^AFFUo4}s)=kY|I_t(0gRNmds9?<)45xo}F z-jTe^O}LfHZuoHe&exj2V=eq!hv9W&?EdFOgQ~7?6La=CnjVzcP)8TAMk>flfL0F5 z^;{mXh1~>R|^3T*`{-b)GHn3JJfdca&e2A%#Tj z4|A=O&Qr^Cn41g6+p6;Fjow{`&Gg~7h_p)UNgWYp8y)9P-STEnmqldlct1oOBUGO7 zZ8u-CmG1=GRGQ04g2sQn1i_inQNM#3dP-{uDU$tr^6kCGw@X+HB6UH{Ua| zet#&3`?_*K+A}}8nr+-&vc$xdewFKP@Gt!)F-PF?cS%(5lk#w8ZxxZxzwcvb6S!0l$_;wv{lf<* zO(1tqwGD^42z+7qA|t(loZHGTvliE~*yjN=%qoUyWWBuG58so(IvP8#7G*jFDMwGA zsX@1!azK+fh&nq_{_va!2uCjidWwiKzyWpFIu9EV{J9_yzmn9NKJ38V~h$;k&XgkrH?n z|Fe0+W)I%(PG)HAOZKnG+X@;ozh0R-C&9w=`*tGC)jkS-}=` zIKGpi=6r(0?;%BRzL1y?Kx??Kfb*It*9Cvxo0>#sb~MN`FwCxSh8hCsRFEG~@brJW zovLi65=uPQj^(GY)i1I?hpvi#8~dP7?l0uAcel-K+nV z>-E<;5|)j^(c!O_*Y+u|r|IcB1fm6>@f^AkFtHj22K> z{Ul;&sHeCb;S>2_;1Q7>nqcSynkU!Fw5eziZ`AOq7kW>;6IjG|%H>4!iRm z4nq$f(1opuF|I0iYWRC}oznZ($hKbU)P-3^3|AEJcgAu{2NK8K1WHR zw`9435IapcL-F_5|A>CzfJ;^WPUa_F3<^8|skIxM*G zme#aq2Oysc)`so(6wT7W?xu?1tdGYggX0uCeZ?~!-?F~tSm~Y#+SZ>(ttD2;vu8ee z10h9^jh1eB5jHVdsACST_TwIv^vr%Lai^BE+rWFwen;HECk#cOU3p8`XvNGfI}vc~ zMOD+3_B!{E`R^fBGn6h0Z{V-^MgBiKd#=hfGrw{o?}nCjSv&o6Kn^gyqj1tA(q8SE zB2xNEpWxjMSWlsQkY~wTm!!1>x6(kLhMhY7q~JRv&{nW9g`VJqIbms{)LK$5jC|F@ zgSyvW0slT$)C$okyy_CPtA)_)=My&jgo&JtaOBGJ&R?J|Kzo4K&p{sk`iMW>O?Wx- zbPQhU;t2Pk0736H`jXS~$6eg^vyN$N>q*5#@wY>_ke3tm>eo>ErEd|ouf z|Ay^kH2auY0rX+QS_c{?+ zW`CJ!{}*+7hK5o8A|gKgah?@6j$;>ISw3Ni)C1J!i5}@==ASUz6Yw8u~c2 z=v@VlPJPsub?e9a8^jpELEjj~vkjlXgbq5iiwObN69svPH>@3`12gn8BO;CHc^4ZNnXQ%QTLe%e?x0uXF}#3mb8mB)PTa%wHp z)X#KHk4mPD#SWTs!xkIjx8$}DK#h409tiqT>jL5NGapp_+p7;iF-LKsPJJ~^oll_F z;}21sa%g4Np|vIQic1Ld(XxA1pA9y91%qFops!oV-+%Y#+V3CNOn!q=7Zo?dUD+ zjm7LTin_n;r0a2~H1=wF--aV}q7O1&5BuhNKy@?9aCWau`Y;zuq3&OcqC~txye$kY zR-E`~P8+L)Q>$nea>h-P&I^2}Jv)vh4ZAVl)`OP5H7~Idq}zkrO!|#U!1wvfIyG&hJ{V8tX=r@0W{@PZx(|H``U63QHfkePRydoJoL@ zp@NHM;(5_4`C0ZH)cEl8sfWX+-WhWp&4bhJ4yR8JKPU!3PynEk|K*7KzwYq{Mjl|) za3NoAWd6iUul0N!-{7(2qGhM=PjBP2`it9GSsX4eamTNO9BHM`<@;K`s5K6+<>T*{ z19L3JJN75}nFHE))v}Z6?g$1l>J`6++Wo*v8>UZRly@RW@14nfFv59~)SM)o?qv&?wbi}q=?eP&h zgBjRRet~f7QV>N8rBWal_8Pex6m^)iyRxFE61}} zOS+1Uz>lYcG5a;L2cUT%5)z=E+p{Cr=q$b-HS5xx1@H9L@5y{3uFvG0aU;$O{sGJtpOnsy!i`hAT_W<-RVlM_SNWS{v0Ax?z{%$hiVyt2ib7m<=GAs+u)0EBy zgR!DRBFQ?Hf@W9j%`zSC!kq{F+fyJ))C^E(iy=(bTx;t z>Kqf;XQfD!zu8H2zejWDIC6W2m}5Pb{s6nXvaN8@mUos!VHmfRMsR+_%i{+P1s41E9DVxg-m+fKMZ2rj4#v6SKuB%r#xIqsasD^1lI~xr>)06@ ztX}^Z73U3N^z`o}MNVq?k1@;}po_d@!9Vz6G}T?-zArfyaWk;ISGJz+JlE?xckylI zb^gYreeY63T6_1K1CZT7!SR?l!u11?Zre(`?=p&!e0ca9UZyvLI{YB=ruEKiw+GGX zn+TL2;|4B-MqftC$At&zKz@dly?Bhhd6zm%Wq>5@2ab-O&}8o$IQ;nLJGRsJK#Cy7 z)doYuspYq*pa!2;7mFAR{g1|sZY*P$r0`amJ%H0abcW6(O}P7<8F7mi_j=6TRmdSN zB}uoN%ws%qy1S_2O16IY8%LPO+79@nH@J@P0-yZnr~y5CGmFf4l`tbC{eVYtGA*1u z8-w_<^oYS?d!zTAtM)!4x4SaM4FfUaB>{kDVrc)vitv97q$JH*l8$#unp4l-w!1Ok zwdoFMJ3#qv;R=>!^v?Nnk%acBKQbmryx*&*^Q5{axMk;rcz+%~55p(w^rSx&eZJ!1l0i{h_T}E(&FRy< zip^=}NSM2m#wB;9)Dj8b&DezA?pgLs;VhPvH%cD09gYE1XHCp=KDFE}60B|w+&aO0 z$8=0d*}0oeObKG{!A=Lr6JLy*#EPLu?BUoKU+ei})ELTeeAQ=ljptD^*ayY3-(W?) zwM%Em+Il_rn*s7HV59aAE%{pzJ^lgpZE>Jo_m{&e;>F*BhAH8cWPA!P3?e;Nyo14o zJSmw}g#Q#jgeFZo6)~LaA=s>xNi*fz-Ev(9f^779CMl|!TDYYI-zztRJjI(dmoq8N zL@v3#bIz{JSyfLH7TFc=2#C#dXn-h3{Lw^dowI3|6+X#cTp7KF`Af-V|vGwjc8 z?)Cq$Vkf@Op5nE>(gwOF>d_VZD*9@{&L;17^@(=oB`cZU;E>lLrWR`nFsS$;AA8qz zJr}1{@NsWFZ6Ycz*($kQbT;AcP9|y^uswdlvo63``2Y$F8`)@G=6Za~Lb}?_oY1@b z6hSogtKVZuok$ho1#9bku2aTVee*5io5pTL45mk{r#O#bV-0h}<2}W%mgZWkpEkJs zpVAlWmh+O;$_P?wR&_-fui{_~x|} zm3%eq3~KT5RyqeDX8O124&}KGJyM>vhC4h$)t^r%y6MK?M2-@SKv7!jfdh7A{k3`U zCQCV`oAMC+g*9~J2i6nw5gm=_{fNFWMEhii-I$<(XZ^M~CZA&YRL)&JQWmm0rm8Ja zh}oYBr%IG{0hueJ@bizhH0k*wFUZIvFHN|U4R1wFRVe08m+dibJ=Buc=pT*g0y@)^ z>G?@tHf>YB|Ap8z^2^P2I_Fhc6>A-GzI>#G@vWCoKbB0G#Dr7{@eO3|Th23_ysieI zZ|4f>MP%*_>sj)C1D`BbISOxC@uu08@21nd-VUamB4cUj)|H04iA3qt{ru!-BvO81 z2Z=n3u*BRVhmzu)^&fOriG63z`P%Bd^c`vmp+%O*hZFgPBO)o6_ps9AT_ey{r{{FAx%e zuWnVbVPshsERUk9!bQCc9|JyWJ*30Dbclo8`DJ3V89u;_U zftQhM6t`qDilCK$FJ^I6+cd<$P^^9+gc;>FGE|+~Qxb=qw|qf09PiHycr`hRs;x08 z73XkkU;fhHPCG|}ERmgZOG?L6C5RTQodXRN;#7`1N~ZJfBD-w2#`ve? z)&Epxfy&9P$;|=g!XQ+!{Zbq2Yj_s#OYHC#0>~uf2%iG~PV3{3lQDLW{5^B)G!!hZ z5O#Lv02fW}n&U3(R8!m|iqX*z8PoV@5B91M7l2Tfr~OYEjZ-VJ$eN$QdSG$A6?N)j z`+9lCK4k3JRy9mll+UxG1-g=A1FRg}$E9&XsPdw>Uz7aV4f&s@lpMW%S>|#`%?mW+ zepiC5eCmE|6B({|$*4j{y4r!J_6KJiV1$!eS(X&WS3c&sB&fOUdqh7DEnZ|LOln6c zy9Q5nPCU~3&{|AbdgELt??c9&wSTNs@G$+=<#^Hd=cm z&HV$^{5AN{xU};C!{eJf~1XHjt|oRBP?_GN#?=Me zytqEt%Ad1%8zy7IfSWZo{24;|&A}Y|S+dl8&zlXPcojZK8z9VQTd%+3_s$rr6 ziNGBiL+fZFF85*H!ldYtwlhc;M1#pPv$S<+Y6d>%@{Baueg#bnlpl*f00p0?Vyo0J ziFb-c=Yh~I1YF+?>5}cuB~(wjq&86hfFJl6CTloHoeO+emM+%^>2xDP;8&6t`8 z`|xhs39`aFvUe7(sPs;?mBz$=CUiMx5tfSr!9U+PEZ=$Y%zQyp5aS0B$QPu@A?e=R zc*|FkZ9}Q_?0r&Bch-K{Q*#2GX8bE53rOJo1AqUY$ODv*H|`-x75s_mB@omFM;? zr0*^QsgidW5Cd~w16vp!qRmn$E>ofoLg%o?5Q39q;M~{w(Ys^P!$f-!vEw`4P}v*1 zuA(oe(p8D^z)!yb1n3X{&cEDQfC8w>o?;D2K@g)7<>#&D^dP=;JvbP6ryUyXTYMfA z1;Fp;!w)iJzOhJo-@YkxWhatAVNGkE%|c>{iOr9_u`o;VJw5X40e)kKPq8ud7z1Sm zg6dK&P28IiaeVRn2a|WS@0Is$1T!D`$Y5vjV>hhqZIC|iN1Bn=5^5^2C(1l0od(|s zTAhWhzNYYjp*0#FS#xIxw)EER7nnJK{P0jbWVn{GcG4XBMK;Q(!o zx^9nX^_`}(imse_kKVL{nyt@-d`SI-(nbVtC|{o5mfX#QZ!P-S`a6;8jTLBeP8^T2 zqAr}d>SA4mrFheC=8qXs-%bs-raL?@wJ-B$Z3KKs5x6wDXyY}DUMV@h6})F#A~J(s zw8Ix}b>?}7ltadfqF!i$$!+b%`x9S3b@f`Uj#TA8B`{tw>Z3fi<;n0c&KxcScszd` z4Pp!sm9Gi*l_&en@-ypSYQDQmBiXr955v2Q+oN7Bnip)maf%Whf&c2Mg$quFlc#`c+o>e;gcg0TIIL7@Mh^&e2$c% z@2;+qxlH~CeJfnL2|Lc zo0G2$ogR~`59>t!oLb+KyM0KPL8!kUde z|1#rxYV5v-IR0Gd`WB<#rlqaa+SYz0U+zRS3z+%gnPeeOfx%0k>d9}`zmp3@NAc;^%G_NDnLAW$ZNH*6Z- z29Y5P<~nq#t_2giCBsEqMcLnOa!u4wsL@D!b>~}OatI#V>z~#*653K&CHWSBgo6Be z%5Y^-)#ukkV>g7@afY$CK2unjjd5L9bFW_gNy+_blLW042m!}_2Y^DI;Dipq{S`hc z<;!ltK=+uvEqJ;KQ8v{s_8Ym=hC0{D*q*+r}%LoVEeKehZVWAA{h^g)| zm6PhI7el6lrrC)OjMwpD?_diEY}&;yPTf=bMIzv`{5Df6o*ef)Si#fwJg^Kgf=`W z0#R*0<8Q>k(^pI(2my?-J6P&ZPW#vKZjbBAm&)T?67?nL9uC5x%O6^stNpWlNNbG- zR#y_v^cARK6BLZyF;AJwq1Pl9otGWoqU49Q{(jwRl(cTx2wH@OWgMr zS38s}kQ}Aq5Qy53c0na>Vc3NjVO2K4!1Jl(bU^ z^k2|!AGr(j9(fQQQTRfQ;V@fAkY#+`-MAefYmTdS;He1DPuItr4kO6+&4N86b^m>0 z#^lS2A|Nk_t+ir_v$V{m(1r}eW%_mOthFQF=CV9b_}ty0g;sgG*bMqQK?fNS$m_2~vlUz3FeasC_AfWLlz9u@=roWQ zf6FpJFWU2_U!4)sJ2=v});H9db1>mwoY!Q=d^5H+4aW@S7#kT_lKT3aNE zpYqI(-xw-iNPB;oBD$&C?7J^oKPu2wrT<wJ0`5lCdF{*w{|gzAp`;h*!cT8-E2#5D)#ofjs{FIel<_(4d5($7#S`C3Wv@i9 z#CQ0y1PxYW$D5yx_pPQh3>LbUe0gzE=JTW$s8w`8aS!{BVI(4&(aV0V%+Uk|Zu41m zDMrqSc5hlHRR6$CNY~9iZ=A%jtA}#>nS1f73c2|K;h;~K77&`9>fT$9%5k%?R$5|!UMo?{LhR~xTKXiP|x>|GU^p0yAjEr+pcv8KG-Dkyhr3NbkgR*GkM=u&T+*Z z-g9GVTfNa)=uyF?vZ)I%d)yhdorM=VX_#qWDv-Zux_jv##5|qxdQ+QzsgpL@rYv|b zGlENR+#8nwxj+$*R12!_$_bo;{Qi0R~`;!`|pV;VN#)l=|z@Q z60)002-Of7OJ)*6itJ;XDe6_W2}Q}0b+U}fmYwV(Su@tb*k>#=mW(ko&eQLA-gAEE zy{>az=UnIf^*ql%&mYfyKi}{7{%omw#X!)(KPWdz%J= z(A*DRx1)bD85l1A6kTbGmpIP;qfx6$*?{W z@=cdgbI9cJ22N<3DV;zf6RbOon-1YO0?$)w#^!zA{zRI#G8)3ml|Q**-aI;(;kbT1 z3xKb54J@b&e{La;k==5ZggoP_9zgs=Ym}FH_c#iYqY%AnN&*i{mc$B!Wncc9vw<2~ zjDt72gK%x|83-JARxQwU|DD{?8cb5gHuldD<6LBcF$UH@=?xLYu1RlONoH-4HE<02 z$wo<)K^@To+*YxY$LzTl&FKNgg=KWE`|4w`^}yE3B?-G5uT8lrRZ#R3qx&H4AVSQ` zk4trzAOfVbVS&zYSNB_XdPHc?#%{Nkd}bB&%|9S7#c*0fi-h!7s==>Tw^g}svD{x} z1PhH9wSyUcg?k)aOtZcackSW!leX|v<5I7~B#dqsD#vR_b8XF+{j!)__!5B?FAzPe z(w6Tzvdu29NNdmiXNf~1+C7DE5fPbG=DA(UHvg2Lkf9Ibi(aML3PJsX&Dgg9Uy?@V z?bYsH`4cjPMwAZiMw$|UEaRm(cPo$miU~r=#fNtLJ1A^GKV<3=!q?j)+w#}pbGoQd zQOdgJfz0?otK*h6RebrHfH6y$Auuh$1L3E8cNyI92veRHA{x&1kXi_x5FX}5ze$nP zo0JcaRRdSz8c}hWB9v!SeIL%N{QRKMvKP^@$105nbe+tCPkJ+(08NJmv*WMw_TRbK zUOzPio$Bwq3>INpQTfx3{k)ZfZ9|uO48Li=p0aMX8-Vc8hP_`(e)|i97QyCr_Ksg3 ziz9r33`#x^5N3e$mJ+qPqpLk~j&yro1Q6{#jwvHEqf>-7$YH$`mOGT41 zU!8J;&c0g==IY&*R3tQ$juB+GA+FPD(%9(i&l-fa(b1LD?9knGeIyqt?Ja4szln*< z&E?^DVwMEALD^w}j4eD2-)-=~iXY4EeE{!HjcBV2xOUJPuQ2!+_OylM3|<2R2>HGR zVks`10$tTfp@iiG*qs~OK>&ZC(RTVh^Sc2NI>FPP$1-EiuUzW}W{J}~r@_>t1ag(| zFd_3QhhDtiLShKlz#H&U~9#j@g9EhY;!^zO-m5ZmM4tkH2%` zV(eG%S6g!YsBmD62&E-A--x`a)D&9*b2&rcdY83r(Kj|gN7X6LDJ&$DU8<`50rIJ| zMm!!W6CacSPZSkg>rvSfJT{%5U+6{e7&&)8ZDl(&erbW;3V%kev0!)6i0@Uz&z1xN zBBRGwt}x=P+na(ik!JMjJ0lN0M7X)VM+6eV%VGO=6IQH6k}i(e8w7H;ysqxRPTVpG zx>!acVfrcg$WCF`E5xPN9c@$+#8^K63+&0{h(6lGN1Rsp57PZ-ExnKIlZyPt*f(s zkY!A}1hc1oQtW&=SjB{zpjKBkT~uWQX8j=RGFXaV51utu{-%2~$nrw^L+m&z{WaD7 zZSjftk|i+Plv&SiU4dE-s(n~eJ9qm*THr04F?_E-hdEAZ z+4>&~)4@oQ=C)Duup35!2V{w!tLdv1`DyG_gMc@%c4hQ>0M;dln^Z zIc`MU9`Gy+Uh;mfA{Z{CKj~t;;4c6hAUBbJklll{*&IvU=S2Cuxp6EgcBXQB zU;Q(B4s{hG>bA!*YWr~i;7Zc$%KXO#hi&%K)=b9C%n4~^YUW#$>i84a8@c_sVdb~H z@P|~k#cL$~?D>2fd&j*j$z=lNmY)3@D)3#w$Aco{E$`%~$&Y<~WmUiwA2rtk|sT;;nV05IZQ;fv*b*oTiaH z`QS??H8~3PV1%-sGqa<82Epk|sw?N&tEe8D_dkPSiPVAFUo2P$<7hKPvi#8X z){4k;^+UYOiim@9q*?{$CBjE=ESpa#Fig8-a(tZtVMs!3>8p`>4hj{)5*lfTyWF9p z-Wm*Tr5bFvX)9Si;vs^28|`Fh}`e(>u(j>_>BhNSLSe2Q8q2-bT( zCb9JK>9VYkUX7CZK^L~UBUz&PVu^2aDI#q>cPe7%rGI?0ywLNhM}N(Ju-H2`esK3Y zHkzj4ly^U=41+G;-r8X;EF6~+k3E3D+{>1yk6q~P0T4eTohwM`v*U_h* zyjC{>i70}%>376JiAI~eYoH=%f32qtU4JI^RIwf8iyjE2Bu`gD&71UYblm0_-0l@-j;gLo zT95Z0$F3Bbc4sC{ng#$PO!F!=)3$XG^K;ZJhGxFqFlAG8YjkLS-F$yGR5c4}=w7w+48Q;>=&0F8r;-^H!@L5h&4X3Hc~gR zvog2%_#Yq;pcgSZTYTl@P3?R@x8eAdw@Ot&aq$%p2}BcZgYdcrXOzDot6-)o8gJ}& zpzfk;YL*b%NIa<`vepd$c%Bv6*Dx2&9gQ(W*G}Hz+$_pR+VteaZ3TMr%@pH|+v9cT zu;Ufzr1zUH(WrCCfTqTkbMFw7N|KgFa~ABeb>3blmg1b!G5SD@q*B$!R^WzMN;{vI zSg0sre0G-^dSSR;3eBSFy}Y5&4#BaJ{ehEyS7u>)Nc<2Ezt!1 zNmgHbp046gos-n<%T%XRBXX(!%^;ssJ3XHes~87*g8hWoP-|82=V5xvMsz-`j-R&% zJWpn6E4BANlroGGe<*Cp!Eu~J@F}0)F<2Vv$?tQA@J4zYGy>sftmBYrwA*sBXa+$t z2YfgjfaQs-xz*G6=J~!0fjs3o<^xF=b#LG=79^3RUuJFC6C5{g*O$}vY2aOt2_0pe z@rOm&_7Qbvxq$?z;1jc5_X=K>UQV5*KU}7a>Y!=oD?L+NrRI88vI>DKigVJ7{YiMD9lr#)YYCt!M#26-?U2 zD0q1WvlB!=5^v2hPwE8SuP5P^>9}bS-K17^-AAQK6fp`Wm|O%=01NjA`6e=;qjI)`;WxIKlKtUxp*GM%j0w ziWJ&@Vs5KS1R@}d%Z~T-z|57dS2&L1R&Y3}!?xF6w`rY`H-m6m^ce)o&EUTLcB*^? zXtn={^!%U3A0EgJJM{89>_EvM8_SaOuTgZtk?4KeOR(T0S6U5s0h{nb+RN`1uMM9E~;YxQeBa=M499=sZl1pO`6VRpfqc>r$({554|J z&;}0HA~s*S3((d@pS`(btwA3bA)NMVNkBr24G^j7k0iYg4#an{P5R9BILB9jx@qTxX+_nfvfT*@Vuugfz%01%&rNX0}fa3Evx2_#U@utZSyF-gZ*0Q%_V|v38 zpb&lP>B%rZPlW(eM?G7j#nQw{Ru0QZuX(k)g$9b)oIJX8dy$dv8EM`K4z%`l{w>kf zf!*Z$ky4AnPA~rgx@etS7YUKSfp|rgjKV$C0}p2WEX(7!Xz~W#*ACMT(~zp4r^2E) zC&kLQAgK`ztvMoo}BOG+ap+R(wWjp#&F}E8At!Ubu^H z+FA{Z_RSgGY->Dzqy^f2G6=jFOfZKl-qcp1Ru8%udgoYOik|?3L+(?hUB&WfJgIHVx% z87d=k$juH>4&Ja2#s#N4BEfC`l4^ZJ?8$>(k|HGWbpUy9N&C3RVdh?n@4@gPvA3zQ z#gaIzIyCWm&qN&P4y5;&+BPgg#~>G(WfBGJPxtkH(urEXKrYl40!~8WFcGPU(f~WK zKuay;Y&E_-8*gG4sMoWp?wT1ntEcf7O!52rcMI&_C*c2wXF)_O@#uh#Lw0@Ar=kNp znQuZDCyT*@0m4+mD;@QGB+N3w_-EFb)Ow*F1^)oRxdt-k8}!|iXfDsoFvs0uun%8# z%qzgw+K9k6QSK$c!H1V>bTK8ft|I`VG(2^lqm z_j4FWpU+C(wP=Lv0f>}aeRu7LvJ;6T9mM)_aIj6fH%T({^ z?QtYCLH%duL+qyQ)ms_YlC3f;Awdef#F*U+Y(Rj1n2Kq4I*Is@V(7r#2Irs$^fL#LHrFaJq1O?b}at%=7kh;+-G=ASk;x6ItI*@*>fEbw^9 zX_69%3_t!er*G@p$k~uEJxbnUXK?r)#}LIH+`J}EL@L6LI%k)pyr_I0045@SB~{=} zwkM7uaSv6bo<)#Stb9!EPF%LXm~anZjbZ%WdA)?{m`YqWXNX!-qvGnzj*+eL2{ zEDl&fyV15Po3Wki1hcY8M(35YD)PR5vxkGkN)Zqy=g-yE&0v<4|2g3|FZ*0RC;3|j zJNwWHy~3oQ5i%*z=8d~tUrA&Ky9Pz3WC0cENmee2e?hS5f0fYuKkTo+EZgWlfA-#I*6R8jmJ+D>GUuy`2xm`c* zjHf=a(`VeuPOim2qmhIWIK3k##o8?7vW1EA1Ne6MamBV2?gYiC^?X#--GaXF=L zk4`tJz}@|*pr-gLclUzID{P65W@_ic7T!=}7!swwIj$r=m2b37dx8$y9cp;CuIAw? zDLxc(Go%_7<1wHq?FIJZEl|G<>A>d$h2t6gP}yr^e}eiu_6hMbz`^Yqlmf@+F4=lu z9-ZARK(1sUredx}GgAEY7Lwo3+)t{EebgNLnHnC;CwO~x6EP2@7F#4zdBbo_p{&qn zcW-*B1SWLyaH(JB-94j)lB)|)HHY8Lp51xBb6)PK#Zjv}6zxviFTffZ|M<^^`rpTU O{(TYtug{>pk$(g2O>5c! literal 0 HcmV?d00001 diff --git a/src/layouts/_common/notice.tsx b/src/layouts/_common/notice.tsx index fdc646d50..50ff9b2f6 100644 --- a/src/layouts/_common/notice.tsx +++ b/src/layouts/_common/notice.tsx @@ -128,7 +128,7 @@ function NoticeTab() {
{faker.person.fullName()} mentioned you in - Slash Admin + SkillRazr Admin
1 days ago
diff --git a/src/layouts/dashboard/nav.tsx b/src/layouts/dashboard/nav.tsx index 91416ff2e..260a6e368 100644 --- a/src/layouts/dashboard/nav.tsx +++ b/src/layouts/dashboard/nav.tsx @@ -131,7 +131,7 @@ export default function Nav(props: Props) { {themeLayout !== ThemeLayout.Mini && ( - Slash Admin + SkillRazr Admin )} diff --git a/src/pages/dashboard/workbench/banner-card.tsx b/src/pages/dashboard/workbench/banner-card.tsx index fe8c64c71..b0a4379d9 100644 --- a/src/pages/dashboard/workbench/banner-card.tsx +++ b/src/pages/dashboard/workbench/banner-card.tsx @@ -33,8 +33,8 @@ export default function BannerCard() { style={{ color: themeToken.colorPrimaryTextActive }} className="mx-auto mb-6 mt-4 max-w-sm text-sm opacity-80 md:mx-0" > - Welcome to join the Discord channel to discuss everything about Slash Admin, or you can - visite my blog: + Welcome to join the Discord channel to discuss everything about SkillRazr Admin, or you + can visite my blog:
new Date(expiresIn!).getTime(); + + if (accessToken && !isTokenExpired) { return ; } @@ -40,7 +40,9 @@ function Login() { background: bg, }} > -
Slash Admin
+
+ SkillRazr Admin +
{t('sys.login.signInSecondTitle')} diff --git a/src/pages/sys/login/LoginForm.tsx b/src/pages/sys/login/LoginForm.tsx index 914f9e49e..adff29ffe 100644 --- a/src/pages/sys/login/LoginForm.tsx +++ b/src/pages/sys/login/LoginForm.tsx @@ -1,12 +1,11 @@ -import { Alert, Button, Checkbox, Col, Divider, Form, Input, Row } from 'antd'; +import { Button, Checkbox, Col, Divider, Form, Input, Row } from 'antd'; import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { AiFillGithub, AiFillGoogleCircle, AiFillWechat } from 'react-icons/ai'; -import { DEFAULT_USER, TEST_USER } from '@/_mock/assets'; +import { DEFAULT_USER } from '@/_mock/assets'; import { SignInReq } from '@/api/services/userService'; import { useSignIn } from '@/store/userStore'; -import ProTag from '@/theme/antd/components/tag'; import { useThemeToken } from '@/theme/hooks'; import { LoginStateEnum, useLoginStateContext } from './providers/LoginStateProvider'; @@ -42,37 +41,6 @@ function LoginForm() { }} onFinish={handleFinish} > -
- -
- Admin {t('sys.login.userName')}: - - {DEFAULT_USER.username} - -
- -
- Test {t('sys.login.userName')}: - - {TEST_USER.username} - -
- -
- {t('sys.login.password')}: - - {DEFAULT_USER.password} - -
-
- } - showIcon - /> -
- { console.log('Received values of form: ', values); - await signUpMutation.mutateAsync(values); - backToLogin(); + try { + const resp = await signUpMutation.mutateAsync(values); + console.log('resp signup from server', resp); + backToLogin(); + } catch (e) { + console.log('e', e); + } }; return ( diff --git a/src/pages/sys/others/calendar/index.tsx b/src/pages/sys/others/calendar/index.tsx index b02d00460..d3a892974 100644 --- a/src/pages/sys/others/calendar/index.tsx +++ b/src/pages/sys/others/calendar/index.tsx @@ -28,7 +28,7 @@ const DefaultEventInitValue = { color: '', }; export default function Calendar() { - const [events, setEvents] = useState([]); + const [events] = useState([]); const fullCalendarRef = useRef(null); const [view, setView] = useState('dayGridMonth'); const [date, setDate] = useState(new Date()); diff --git a/src/router/components/auth-guard.tsx b/src/router/components/auth-guard.tsx index 2c0b88a36..0c8e56c43 100644 --- a/src/router/components/auth-guard.tsx +++ b/src/router/components/auth-guard.tsx @@ -11,13 +11,16 @@ type Props = { }; export default function AuthGuard({ children }: Props) { const router = useRouter(); - const { accessToken } = useUserToken(); + const { accessToken, expiresIn } = useUserToken(); + console.log('accessToken', accessToken, expiresIn); + const isTokenExpired = Date.now() > new Date(expiresIn!).getTime(); + console.log('token expired', isTokenExpired); const check = useCallback(() => { - if (!accessToken) { + if (!accessToken || isTokenExpired) { router.replace('/login'); } - }, [router, accessToken]); + }, [router, accessToken, isTokenExpired]); useEffect(() => { check(); diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 000000000..ce1d4eacf --- /dev/null +++ b/src/server.ts @@ -0,0 +1,142 @@ +import bcrypt from 'bcryptjs'; +import bodyParser from 'body-parser'; +import cors from 'cors'; +import express, { Request, Response } from 'express'; +import jwt from 'jsonwebtoken'; + +import { adminPermissions } from './_mock/assets'; + +const app = express(); +const PORT = 5000; + +// Secret key for JWT +const JWT_SECRET = 'skillrazr_admin_app_1234$2893'; + +// Middleware +app.use(bodyParser.json()); +app.use(cors()); + +// Mock user data (replace this with your database in a real app) +interface User { + username: string; + password: string; + permissions: any; +} +const users: User[] = []; + +console.log('users in the server', users); +console.log('hello'); +// +// Signup endpoint +app.post('/signup', async (req: Request, res: Response): Promise => { + const { username, password } = req.body; + + console.log('signup, userName', 'password', username, password); + + // Check if the user already exists + const userExists = users.find((user) => user.username === username); + if (userExists) { + return res.status(400).json({ message: 'User already exists' }); + } + + // Hash the password + const hashedPassword = await bcrypt.hash(password, 10); + + // Save the new user + users.push({ username, password: hashedPassword, permissions: adminPermissions }); + + console.log('hashed password', hashedPassword, 'users database', users); + + return res.status(201).json({ message: 'User created successfully', status: 0, data: [] }); +}); + +// Signin endpoint +app.post('/signin', async (req: Request, res: Response) => { + const { username, password } = req.body; + + const now = Date.now(); + const expiresIn = new Date(now + 1 * 60 * 1000).toISOString(); + + console.log('sign in, userName', 'password', username, password, expiresIn); + + // Find the user + const user = users.find((user) => user.username === username); + + console.log('user found ', user); + if (!user) { + return res.status(400).json({ message: 'Invalid credentials' }); + } + + // Check the password + const isMatch = await bcrypt.compare(password, user.password); + if (!isMatch) { + return res.status(400).json({ message: 'Invalid credentials' }); + } + + // Generate a JWT token + const token = jwt.sign({ username: user.username }, JWT_SECRET, { expiresIn: '1h' }); + + res.json({ status: 0, data: { user, accessToken: token, expiresIn } }); +}); + +// Protected route example +app.get('/protected', (req: Request, res: Response) => { + const token = req.headers.authorization; + if (!token) { + return res.status(401).json({ message: 'You are not authorized to access this' }); + } + + jwt.verify(token, JWT_SECRET, (err, decoded) => { + if (err) { + return res.status(401).json({ message: 'Invalid token' }); + } + + res.json({ message: 'Protected route accessed', user: decoded, status: 0 }); + }); +}); + +// const tokenCheck = (req, res, next) => { +// const token = req.headers['authorization']; +// if (!token) { +// return res.status(401).json({ message: 'You are not authorized to access this'}); +// } else { +// // do token checks using jwt +// jwt.verify(token, JWT_SECRET, (err, decoded) => { +// if (err) { +// return res.status(401).json({ message: 'Invalid token' }); +// } + +// next() +// }); +// } +// } + +// app.get('/getExerciseMarks', [tokenCheck], (req: Request, res: Response) => { +// const {userName} = req; + +// // make a db call to get exercise scroes for this userName + +// const token = req.headers['authorization']; +// if (!token) { +// return res.status(401).json({ message: 'You are not authorized to access this' }); +// } +// // get exerciseScore from exerciseDb + +// }); + +// app.get('/getQuizScores', [tokenCheck], (req: Request, res: Response) => { +// const token = req.headers['authorization']; +// if (!token) { +// return res.status(401).json({ message: 'You are not authorized to access this' }); +// } + +// // get quizScore from exerciseDb +// }); + +app.get('/', (req: Request, res: Response) => { + res.send('Hello World!'); +}); + +app.listen(PORT, () => { + console.log(`Server running on port ${PORT}`); +}); diff --git a/src/store/userStore.ts b/src/store/userStore.ts index a7704a916..207d2a839 100644 --- a/src/store/userStore.ts +++ b/src/store/userStore.ts @@ -60,8 +60,10 @@ export const useSignIn = () => { const signIn = async (data: SignInReq) => { try { const res = await signInMutation.mutateAsync(data); - const { user, accessToken, refreshToken } = res; - setUserToken({ accessToken, refreshToken }); + console.log('res from login api', res); + + const { user, accessToken, refreshToken, expiresIn } = res; + setUserToken({ accessToken, refreshToken, expiresIn }); setUserInfo(user); navigatge(HOMEPAGE, { replace: true }); diff --git a/tsconfig.json b/tsconfig.json index 463b4122c..6f50da188 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -40,6 +40,10 @@ "#/*": ["types/*"] } }, + "ts-node": { + "esm": true, + "experimentalSpecifierResolution": "node" + }, "include": ["src", "test", "types/**/*.ts", "**.ts", "*.json", "**.*js"], "exclude": ["node_modules", "dist"], "references": [{ "path": "./tsconfig.node.json" }] diff --git a/types/entity.ts b/types/entity.ts index 724e8e834..bfc1b8cc5 100644 --- a/types/entity.ts +++ b/types/entity.ts @@ -3,6 +3,7 @@ import { BasicStatus, PermissionType } from './enum'; export interface UserToken { accessToken?: string; refreshToken?: string; + expiresIn?: string } export interface UserInfo {