From 7b261fabc2a48653132cf55851a254ee005c3512 Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Fri, 28 Jun 2024 13:01:43 +0330 Subject: [PATCH 01/37] setting up my server --- Server/package-lock.json | 489 ++++++++++----------------------------- 1 file changed, 119 insertions(+), 370 deletions(-) diff --git a/Server/package-lock.json b/Server/package-lock.json index edfb2ef44..1bcdeb53b 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -32,7 +32,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", "engines": { "node": ">=0.1.90" } @@ -41,7 +40,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "license": "MIT", "dependencies": { "colorspace": "1.1.x", "enabled": "2.0.x", @@ -51,14 +49,12 @@ "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, "node_modules/@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -66,14 +62,12 @@ "node_modules/@ioredis/commands": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", - "license": "MIT" + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "license": "BSD-3-Clause", "dependencies": { "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", @@ -93,84 +87,77 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.7.tgz", "integrity": "sha512-dCHW/oEX0KJ4NjDULBo3JiOaK5+6axtpBbS+ao2ZInoAL9/YRQLhXzSNAFz7hP4nzLkIqsfYAK/PDE3+XHny0Q==", - "license": "MIT", "dependencies": { "sparse-bitfield": "^3.0.3" } }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", - "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz", - "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz", - "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", "cpu": [ "arm" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz", - "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", - "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz", - "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -180,7 +167,6 @@ "version": "8.1.3", "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-8.1.3.tgz", "integrity": "sha512-mRwTticRZIdUTsnyzvlK6dMu3jni9ci9J+dW/6fMMFpGRAJdCJlivFVYQvqk8kRS3RnFzS7sf6BSmhLl1ldDhA==", - "license": "MIT", "dependencies": { "@sendgrid/helpers": "^8.0.0", "axios": "^1.6.8" @@ -193,7 +179,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-8.0.0.tgz", "integrity": "sha512-Ze7WuW2Xzy5GT5WRx+yEv89fsg/pgy3T1E3FS0QEx0/VvRmigMZ5qyVGhJz4SxomegDkzXv/i0aFPpHKN8qdAA==", - "license": "MIT", "dependencies": { "deepmerge": "^4.2.2" }, @@ -205,7 +190,6 @@ "version": "8.1.3", "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-8.1.3.tgz", "integrity": "sha512-Wg5iKSUOER83/cfY6rbPa+o3ChnYzWwv1OcsR8gCV8SKi+sUPIMroildimlnb72DBkQxcbylxng1W7f0RIX7MQ==", - "license": "MIT", "dependencies": { "@sendgrid/client": "^8.1.3", "@sendgrid/helpers": "^8.0.0" @@ -218,7 +202,6 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -226,32 +209,27 @@ "node_modules/@sideway/formula": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "license": "BSD-3-Clause" + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "license": "BSD-3-Clause" + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, "node_modules/@types/triple-beam": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT" + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" }, "node_modules/@types/webidl-conversions": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", - "license": "MIT" + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" }, "node_modules/@types/whatwg-url": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", - "license": "MIT", "dependencies": { "@types/webidl-conversions": "*" } @@ -259,14 +237,12 @@ "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "license": "ISC" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "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==", - "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -279,7 +255,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", "dependencies": { "debug": "4" }, @@ -291,7 +266,6 @@ "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -307,14 +281,12 @@ "node_modules/agent-base/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==", - "license": "MIT" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -324,7 +296,6 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -336,15 +307,13 @@ "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "license": "ISC" + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "deprecated": "This package is no longer supported.", - "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -356,20 +325,17 @@ "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==", - "license": "MIT" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "license": "MIT" + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { "version": "1.7.2", @@ -384,15 +350,13 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/bcrypt": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.11", "node-addon-api": "^5.0.0" @@ -406,7 +370,6 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -418,7 +381,6 @@ "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -442,7 +404,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -453,7 +414,6 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -465,7 +425,6 @@ "version": "6.7.0", "resolved": "https://registry.npmjs.org/bson/-/bson-6.7.0.tgz", "integrity": "sha512-w2IquM5mYzYZv6rs3uN2DZTOBe2a0zXLj53TGDqwF4l6Sz/XsISrisXOJihArF9+BZ6Cq/GjVht7Sjfmri7ytQ==", - "license": "Apache-2.0", "engines": { "node": ">=16.20.1" } @@ -473,14 +432,12 @@ "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==", - "license": "BSD-3-Clause" + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" }, "node_modules/bullmq": { "version": "5.7.15", "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.7.15.tgz", "integrity": "sha512-XR5sTA8BPUY67sS37sMKGCDvSLaVpMq7aaQG8FGSKOUnPoJMRf17n1TibVWP3+yK0xKLdK5Y7PY9D874Fpeqpg==", - "license": "MIT", "dependencies": { "cron-parser": "^4.6.0", "ioredis": "^5.4.1", @@ -495,7 +452,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -504,7 +460,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -524,7 +479,6 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -548,7 +502,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", "engines": { "node": ">=10" } @@ -557,7 +510,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "license": "Apache-2.0", "engines": { "node": ">=0.10.0" } @@ -566,7 +518,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "license": "MIT", "dependencies": { "color-convert": "^1.9.3", "color-string": "^1.6.0" @@ -576,7 +527,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -584,14 +534,12 @@ "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==", - "license": "MIT" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/color-string": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -601,7 +549,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "license": "ISC", "bin": { "color-support": "bin.js" } @@ -610,7 +557,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "license": "MIT", "dependencies": { "color": "^3.1.3", "text-hex": "1.0.x" @@ -620,7 +566,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -631,20 +576,17 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, "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==", - "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -656,7 +598,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -665,7 +606,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -673,14 +613,12 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -693,7 +631,6 @@ "version": "4.9.0", "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", - "license": "MIT", "dependencies": { "luxon": "^3.2.1" }, @@ -705,7 +642,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -714,7 +650,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -723,7 +658,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -740,7 +674,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -748,14 +681,12 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "node_modules/denque": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "license": "Apache-2.0", "engines": { "node": ">=0.10" } @@ -764,7 +695,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -773,7 +703,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -783,7 +712,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "license": "Apache-2.0", "engines": { "node": ">=8" } @@ -792,7 +720,6 @@ "version": "16.4.5", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -804,7 +731,6 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" } @@ -812,26 +738,22 @@ "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==", - "license": "MIT" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/enabled": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT" + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, "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==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -840,7 +762,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -852,7 +773,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -860,14 +780,12 @@ "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==", - "license": "MIT" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -876,7 +794,6 @@ "version": "4.19.2", "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -917,21 +834,18 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "node_modules/fecha": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT" + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -943,7 +857,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -960,8 +873,7 @@ "node_modules/fn.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT" + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { "version": "1.15.6", @@ -973,7 +885,6 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -987,7 +898,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -1001,7 +911,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1010,7 +919,6 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1019,7 +927,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -1031,7 +938,6 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -1042,8 +948,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", @@ -1051,7 +956,6 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -1064,7 +968,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1074,7 +977,6 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "deprecated": "This package is no longer supported.", - "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -1094,7 +996,6 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", - "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^5.0.0", @@ -1109,7 +1010,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -1129,7 +1029,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1150,7 +1049,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -1162,7 +1060,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -1175,7 +1072,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -1184,7 +1080,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -1196,7 +1091,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1208,7 +1102,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1219,14 +1112,12 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -1238,7 +1129,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==", - "license": "MIT", "engines": { "node": ">=16.0.0" } @@ -1247,7 +1137,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -1263,7 +1152,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -1276,7 +1164,6 @@ "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -1292,14 +1179,12 @@ "node_modules/https-proxy-agent/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==", - "license": "MIT" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "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==", - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -1311,15 +1196,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -1328,14 +1211,12 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ioredis": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.1.tgz", "integrity": "sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==", - "license": "MIT", "dependencies": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", @@ -1359,7 +1240,6 @@ "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -1375,14 +1255,12 @@ "node_modules/ioredis/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==", - "license": "MIT" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "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==", - "license": "MIT", "engines": { "node": ">= 0.10" } @@ -1390,15 +1268,13 @@ "node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT" + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -1411,7 +1287,6 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1420,7 +1295,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", "engines": { "node": ">=8" } @@ -1430,7 +1304,6 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -1443,7 +1316,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -1452,7 +1324,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -1464,17 +1335,15 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", - "license": "MIT", "dependencies": { "node-fetch": "^2.6.1", "unfetch": "^4.2.0" } }, "node_modules/joi": { - "version": "17.13.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.1.tgz", - "integrity": "sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==", - "license": "BSD-3-Clause", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -1487,7 +1356,6 @@ "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "license": "MIT", "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", @@ -1508,14 +1376,12 @@ "node_modules/jsonwebtoken/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==", - "license": "MIT" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "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==", - "license": "MIT", "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -1526,7 +1392,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "license": "MIT", "dependencies": { "jwa": "^1.4.1", "safe-buffer": "^5.0.1" @@ -1536,7 +1401,6 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", - "license": "Apache-2.0", "engines": { "node": ">=12.0.0" } @@ -1544,68 +1408,57 @@ "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT" + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "license": "MIT" + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" }, "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==", - "license": "MIT" + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" }, "node_modules/lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "license": "MIT" + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" }, "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==", - "license": "MIT" + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" }, "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==", - "license": "MIT" + "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==", - "license": "MIT" + "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==", - "license": "MIT" + "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==", - "license": "MIT" + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT" + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, "node_modules/logform": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", - "license": "MIT", "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -1621,14 +1474,12 @@ "node_modules/logform/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==", - "license": "MIT" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/luxon": { "version": "3.4.4", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", - "license": "MIT", "engines": { "node": ">=12" } @@ -1637,7 +1488,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/mailersend/-/mailersend-2.2.0.tgz", "integrity": "sha512-U5d2RseMDm7oQIXqvMo1Xfvimh2k4O+nC27TA2tR4cwMDoAiZ9e0JpnbQ8mbT7gJoNdUittLs3n/kfRapu5tZg==", - "license": "MIT", "dependencies": { "gaxios": "^5.0.1", "isomorphic-unfetch": "^3.1.0", @@ -1648,7 +1498,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -1663,7 +1512,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -1672,7 +1520,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1680,20 +1527,17 @@ "node_modules/memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "license": "MIT" + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" }, "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==", - "license": "MIT" + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1702,7 +1546,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -1714,7 +1557,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1723,7 +1565,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -1735,7 +1576,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1747,7 +1587,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", "engines": { "node": ">=8" } @@ -1756,7 +1595,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -1769,7 +1607,6 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -1781,7 +1618,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -1793,7 +1629,6 @@ "version": "6.6.2", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.6.2.tgz", "integrity": "sha512-ZF9Ugo2JCG/GfR7DEb4ypfyJJyiKbg5qBYKRintebj8+DNS33CyGMkWbrS9lara+u+h+yEOGSRiLhFO/g1s1aw==", - "license": "Apache-2.0", "dependencies": { "@mongodb-js/saslprep": "^1.1.5", "bson": "^6.7.0", @@ -1839,17 +1674,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz", "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==", - "license": "Apache-2.0", "dependencies": { "@types/whatwg-url": "^11.0.2", "whatwg-url": "^13.0.0" } }, "node_modules/mongoose": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.1.tgz", - "integrity": "sha512-odQ2WEWGL3hb0Qex+QMN4eH6D34WdMEw7F1If2MGABApSDmG9cMmqv/G1H6WsXmuaH9mkuuadW/WbLE5+tHJwA==", - "license": "MIT", + "version": "8.4.4", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.4.tgz", + "integrity": "sha512-Nya808odIJoHP4JuJKbWA2eIaerXieu59kE8pQlvJpUBoSKWUyhLji0g1WMVaYXWmzPYXP2Jd6XdR4KJE8RELw==", "dependencies": { "bson": "^6.7.0", "kareem": "2.6.3", @@ -1870,14 +1703,12 @@ "node_modules/mongoose/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==", - "license": "MIT" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/mpath": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", - "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -1886,7 +1717,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", - "license": "MIT", "dependencies": { "debug": "4.x" }, @@ -1898,7 +1728,6 @@ "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -1914,51 +1743,46 @@ "node_modules/mquery/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==", - "license": "MIT" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/msgpackr": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.10.2.tgz", "integrity": "sha512-L60rsPynBvNE+8BWipKKZ9jHcSGbtyJYIwjRq0VrIvQ08cRjntGXJYW/tmciZ2IHWIY8WEW32Qa2xbh5+SKBZA==", - "license": "MIT", "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "node_modules/msgpackr-extract": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz", - "integrity": "sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", "hasInstallScript": true, - "license": "MIT", "optional": true, "dependencies": { - "node-gyp-build-optional-packages": "5.0.7" + "node-gyp-build-optional-packages": "5.2.2" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2" + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" } }, "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==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1966,20 +1790,17 @@ "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "license": "MIT" + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" }, "node_modules/node-addon-api": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", - "license": "MIT" + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -1998,31 +1819,30 @@ "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "node_modules/node-gyp-build-optional-packages": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz", - "integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==", - "license": "MIT", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", @@ -2034,7 +1854,6 @@ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", "dev": true, - "license": "MIT", "dependencies": { "chokidar": "^3.5.2", "debug": "^4", @@ -2063,7 +1882,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -2080,14 +1898,12 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", "dependencies": { "abbrev": "1" }, @@ -2103,7 +1919,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2113,7 +1928,6 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", "deprecated": "This package is no longer supported.", - "license": "ISC", "dependencies": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -2125,16 +1939,17 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "license": "MIT", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2143,7 +1958,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -2155,7 +1969,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", "dependencies": { "wrappy": "1" } @@ -2164,7 +1977,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "license": "MIT", "dependencies": { "fn.name": "1.x.x" } @@ -2173,7 +1985,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2182,7 +1993,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2190,15 +2000,13 @@ "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==", - "license": "MIT" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -2210,7 +2018,6 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/ping/-/ping-0.4.4.tgz", "integrity": "sha512-56ZMC0j7SCsMMLdOoUg12VZCfj/+ZO+yfOSjaNCRrmZZr6GLbN2X/Ui56T15dI8NhiHckaw5X2pvyfAomanwqQ==", - "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -2219,7 +2026,6 @@ "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==", - "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -2231,21 +2037,18 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -2254,7 +2057,6 @@ "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -2269,7 +2071,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2278,7 +2079,6 @@ "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==", - "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -2293,7 +2093,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2308,7 +2107,6 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -2320,7 +2118,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "license": "MIT", "engines": { "node": ">=4" } @@ -2329,7 +2126,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "license": "MIT", "dependencies": { "redis-errors": "^1.0.0" }, @@ -2342,7 +2138,6 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -2370,14 +2165,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/safe-stable-stringify": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", - "license": "MIT", "engines": { "node": ">=10" } @@ -2385,14 +2178,12 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2404,7 +2195,6 @@ "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -2427,14 +2217,12 @@ "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==", - "license": "MIT" + "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==", - "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -2448,14 +2236,12 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -2471,14 +2257,12 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/side-channel": { "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==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -2495,20 +2279,17 @@ "node_modules/sift": { "version": "17.1.3", "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", - "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", - "license": "MIT" + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==" }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", "dependencies": { "is-arrayish": "^0.3.1" } @@ -2518,7 +2299,6 @@ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -2530,7 +2310,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "license": "MIT", "dependencies": { "memory-pager": "^1.0.2" } @@ -2539,7 +2318,6 @@ "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "license": "MIT", "engines": { "node": "*" } @@ -2547,14 +2325,12 @@ "node_modules/standard-as-callback": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", - "license": "MIT" + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2563,7 +2339,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -2572,7 +2347,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -2586,7 +2360,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2599,7 +2372,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -2611,7 +2383,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -2627,15 +2398,13 @@ "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT" + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -2647,7 +2416,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", "engines": { "node": ">=0.6" } @@ -2657,7 +2425,6 @@ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", "dev": true, - "license": "ISC", "bin": { "nodetouch": "bin/nodetouch.js" } @@ -2666,7 +2433,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "license": "MIT", "dependencies": { "punycode": "^2.3.0" }, @@ -2678,7 +2444,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "license": "MIT", "engines": { "node": ">= 14.0.0" } @@ -2686,14 +2451,12 @@ "node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "license": "0BSD" + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "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==", - "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -2706,20 +2469,17 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/unfetch": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", - "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==", - "license": "MIT" + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2727,14 +2487,12 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "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==", - "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -2747,7 +2505,6 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -2756,7 +2513,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2765,7 +2521,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "license": "BSD-2-Clause", "engines": { "node": ">=12" } @@ -2774,7 +2529,6 @@ "version": "13.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", - "license": "MIT", "dependencies": { "tr46": "^4.1.1", "webidl-conversions": "^7.0.0" @@ -2787,7 +2541,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -2796,7 +2549,6 @@ "version": "3.13.0", "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", - "license": "MIT", "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", @@ -2818,7 +2570,6 @@ "version": "4.7.0", "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", - "license": "MIT", "dependencies": { "logform": "^2.3.2", "readable-stream": "^3.6.0", @@ -2831,14 +2582,12 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } From 07ea9c590d802af7c515cc60457fb86622a70844 Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Fri, 28 Jun 2024 13:30:14 +0330 Subject: [PATCH 02/37] add some backend code --- Server/controllers/authController.js | 35 ++++++++++++++++++++++++++++ Server/db/MongoDB.js | 16 +++++-------- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index 16eb6eb00..426ce3bd5 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -234,6 +234,41 @@ const resetPasswordController = async (req, res, next) => { next(error); } }; + +const deleteUserController = async (req, res, next) => { + try { + // Validate user ID + await editUserParamValidation.validateAsync(req.params); + + // Check if the user exists + const user = await req.db.getUserById(req.params.userId); + if (!user) { + throw new Error(errorMessages.AUTH_USER_NOT_FOUND); + } + + // Delete the user + await req.db.deleteUser(req.params.userId); + + return res.status(200).json({ + success: true, + msg: successMessages.AUTH_DELETE_USER, + }); + } catch (error) { + error.service = SERVICE_NAME; + next(error); + } +}; + +module.exports = { + registerController, + loginController, + userEditController, + recoveryRequestController, + validateRecoveryTokenController, + resetPasswordController, + deleteUserController, +}; + module.exports = { registerController, loginController, diff --git a/Server/db/MongoDB.js b/Server/db/MongoDB.js index ef53863ee..e67437c16 100644 --- a/Server/db/MongoDB.js +++ b/Server/db/MongoDB.js @@ -94,24 +94,20 @@ const updateUser = async (req, res) => { } }; + /** - * Request a recovery token + * Delete a user by ID * @async * @param {Express.Request} req * @param {Express.Response} res * @returns {Promise} * @throws {Error} */ -const requestRecoveryToken = async (req, res) => { +const deleteUser = async (req, res) => { + const userId = req.params.userId; try { - // Delete any existing tokens - await RecoveryToken.deleteMany({ email: req.body.email }); - let recoveryToken = new RecoveryToken({ - email: req.body.email, - token: crypto.randomBytes(32).toString("hex"), - }); - await recoveryToken.save(); - return recoveryToken; + const deletedUser = await UserModel.findByIdAndDelete(userId); + return deletedUser; } catch (error) { throw error; } From 6205a3385e64e0bf6283f3a15706e90446acfeac Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Fri, 28 Jun 2024 13:35:26 +0330 Subject: [PATCH 03/37] fix commit --- Server/controllers/authController.js | 2 +- Server/utils/messages.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index 426ce3bd5..ae03c25b6 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -243,7 +243,7 @@ const deleteUserController = async (req, res, next) => { // Check if the user exists const user = await req.db.getUserById(req.params.userId); if (!user) { - throw new Error(errorMessages.AUTH_USER_NOT_FOUND); + throw new Error(errorMessages.DB_USER_NOT_FOUND); } // Delete the user diff --git a/Server/utils/messages.js b/Server/utils/messages.js index cb435757c..b76395710 100644 --- a/Server/utils/messages.js +++ b/Server/utils/messages.js @@ -56,6 +56,7 @@ const successMessages = { AUTH_CREATE_RECOVERY_TOKEN: "Recovery token created successfully", AUTH_VERIFY_RECOVERY_TOKEN: "Recovery token verified successfully", AUTH_RESET_PASSWORD: "Password reset successfully", + AUTH_DELETE_USER: "User deleted successfully", // Check Controller CHECK_CREATE: "Check created successfully", From 318b62cd3beb96944ebec2b78b41deaf0cd597f7 Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Fri, 28 Jun 2024 13:46:05 +0330 Subject: [PATCH 04/37] fix commit --- Server/controllers/authController.js | 11 +---------- Server/db/MongoDB.js | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index ae03c25b6..aef81f7ec 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -237,7 +237,7 @@ const resetPasswordController = async (req, res, next) => { const deleteUserController = async (req, res, next) => { try { - // Validate user ID + // Validate user await editUserParamValidation.validateAsync(req.params); // Check if the user exists @@ -268,12 +268,3 @@ module.exports = { resetPasswordController, deleteUserController, }; - -module.exports = { - registerController, - loginController, - userEditController, - recoveryRequestController, - validateRecoveryTokenController, - resetPasswordController, -}; diff --git a/Server/db/MongoDB.js b/Server/db/MongoDB.js index e67437c16..398e0d824 100644 --- a/Server/db/MongoDB.js +++ b/Server/db/MongoDB.js @@ -113,6 +113,29 @@ const deleteUser = async (req, res) => { } }; +/** + * Request a recovery token + * @async + * @param {Express.Request} req + * @param {Express.Response} res + * @returns {Promise} + * @throws {Error} + */ +const requestRecoveryToken = async (req, res) => { + try { + // Delete any existing tokens + await RecoveryToken.deleteMany({ email: req.body.email }); + let recoveryToken = new RecoveryToken({ + email: req.body.email, + token: crypto.randomBytes(32).toString("hex"), + }); + await recoveryToken.save(); + return recoveryToken; + } catch (error) { + throw error; + } +}; + const validateRecoveryToken = async (req, res) => { try { const candidateToken = req.body.recoveryToken; @@ -495,6 +518,7 @@ module.exports = { insertUser, getUserByEmail, updateUser, + deleteUser, requestRecoveryToken, validateRecoveryToken, resetPassword, From e11ae4d46071a39787d3c2c52cde2ea16e70b6d1 Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Fri, 28 Jun 2024 20:13:07 +0330 Subject: [PATCH 05/37] complementary deletions on user delete --- Server/controllers/authController.js | 16 ++++++++++++++-- Server/db/MongoDB.js | 16 ++++++++++++++++ Server/validation/joi.js | 4 ++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index aef81f7ec..ee1724fb4 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -238,7 +238,7 @@ const resetPasswordController = async (req, res, next) => { const deleteUserController = async (req, res, next) => { try { // Validate user - await editUserParamValidation.validateAsync(req.params); + await editUserParamValidation.userDeleteValidation(req.params.userId); // Check if the user exists const user = await req.db.getUserById(req.params.userId); @@ -246,7 +246,19 @@ const deleteUserController = async (req, res, next) => { throw new Error(errorMessages.DB_USER_NOT_FOUND); } - // Delete the user + // Step 1: Find all monitors associated with the user + const monitors = await req.db.getMonitorsByUserId(req.params.userId); + + // Step 2: For each monitor, delete all associated checks and alerts + for (const monitor of monitors) { + await req.db.deleteChecks(monitor.id); + await req.db.deleteAlertByMonitorId(monitor.id); + } + + // Step 3: Delete all monitors associated with the user + await req.db.deleteMonitorsByUserId(req.params.userId); + + // Step 4: Finally, delete the user await req.db.deleteUser(req.params.userId); return res.status(200).json({ diff --git a/Server/db/MongoDB.js b/Server/db/MongoDB.js index 398e0d824..a2b7f4e80 100644 --- a/Server/db/MongoDB.js +++ b/Server/db/MongoDB.js @@ -303,6 +303,21 @@ const deleteAllMonitors = async (req, res) => { } }; +/** + * Delete all monitors associated with a user ID + * @async + * @param {string} userId - The ID of the user whose monitors are to be deleted. + * @returns {Promise} A promise that resolves when the operation is complete. + */ +const deleteMonitorsByUserId = async (userId) => { + try { + const result = await Monitor.deleteMany({ userId: userId }); + return result; + } catch (error) { + throw error; + } +}; + /** * Edit a monitor by ID * @async @@ -539,4 +554,5 @@ module.exports = { editAlert, deleteAlert, deleteAlertByMonitorId, + deleteMonitorsByUserId }; diff --git a/Server/validation/joi.js b/Server/validation/joi.js index 4316939b4..494a5cea9 100644 --- a/Server/validation/joi.js +++ b/Server/validation/joi.js @@ -43,6 +43,10 @@ const newPasswordValidation = joi.object({ confirm: joi.string(), }); +const userDeleteValidation = joi.object({ + userId: joi.string().required(), +}); + //**************************************** // Monitors //**************************************** From 22448e05d3124f287457666313badc79968ff72b Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Fri, 28 Jun 2024 20:35:41 +0330 Subject: [PATCH 06/37] Emergency text field height fix --- Client/src/Pages/Login/index.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Client/src/Pages/Login/index.css b/Client/src/Pages/Login/index.css index 41020cf67..195b87001 100644 --- a/Client/src/Pages/Login/index.css +++ b/Client/src/Pages/Login/index.css @@ -41,13 +41,13 @@ #login-email-input { width: 308px; - height: 11px; + height: 1px; font-size: var(--env-var-font-size-medium); } #login-password-input { width: 308px; - height: 11px; + height: 1px; font-size: var(--env-var-font-size-medium); } From 704980045d02de2d0edbef09f700344eedc91f0b Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Fri, 28 Jun 2024 21:02:49 +0330 Subject: [PATCH 07/37] fixes --- Server/controllers/authController.js | 11 +++++++---- Server/db/MongoDB.js | 2 +- Server/routes/authRoute.js | 4 ++++ Server/validation/joi.js | 1 + 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index ee1724fb4..66e2787f4 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -7,6 +7,7 @@ const { recoveryValidation, recoveryTokenValidation, newPasswordValidation, + userDeleteValidation } = require("../validation/joi"); const logger = require("../utils/logger"); require("dotenv").config(); @@ -238,7 +239,7 @@ const resetPasswordController = async (req, res, next) => { const deleteUserController = async (req, res, next) => { try { // Validate user - await editUserParamValidation.userDeleteValidation(req.params.userId); + await userDeleteValidation.validateAsync(req.params.userId); // Check if the user exists const user = await req.db.getUserById(req.params.userId); @@ -250,9 +251,11 @@ const deleteUserController = async (req, res, next) => { const monitors = await req.db.getMonitorsByUserId(req.params.userId); // Step 2: For each monitor, delete all associated checks and alerts - for (const monitor of monitors) { - await req.db.deleteChecks(monitor.id); - await req.db.deleteAlertByMonitorId(monitor.id); + if (monitors) { + for (const monitor of monitors) { + await req.db.deleteChecks(monitor.id); + await req.db.deleteAlertByMonitorId(monitor.id); + } } // Step 3: Delete all monitors associated with the user diff --git a/Server/db/MongoDB.js b/Server/db/MongoDB.js index a2b7f4e80..84887bcde 100644 --- a/Server/db/MongoDB.js +++ b/Server/db/MongoDB.js @@ -396,7 +396,7 @@ const getChecks = async (monitorId) => { const deleteChecks = async (monitorId) => { try { const result = await Check.deleteMany({ monitorId }); - return result.deletedCount; + return result; } catch (error) { throw error; } diff --git a/Server/routes/authRoute.js b/Server/routes/authRoute.js index 1049659fa..e6ff182c8 100644 --- a/Server/routes/authRoute.js +++ b/Server/routes/authRoute.js @@ -8,6 +8,7 @@ const { recoveryRequestController, validateRecoveryTokenController, resetPasswordController, + deleteUserController } = require("../controllers/authController"); //Auth routes @@ -20,4 +21,7 @@ router.post("/recovery/request", recoveryRequestController); router.post("/recovery/validate", validateRecoveryTokenController); router.post("/recovery/reset/", resetPasswordController); +//Delete routes +router.delete("/delete/:userId", deleteUserController); + module.exports = router; diff --git a/Server/validation/joi.js b/Server/validation/joi.js index 494a5cea9..8379559cd 100644 --- a/Server/validation/joi.js +++ b/Server/validation/joi.js @@ -162,4 +162,5 @@ module.exports = { createCheckBodyValidation, getChecksParamValidation, deleteChecksParamValidation, + userDeleteValidation }; From 81cd302accfd27136ef361ecbe38740160c5a3de Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Sat, 29 Jun 2024 11:58:27 +0330 Subject: [PATCH 08/37] modifications --- Server/controllers/authController.js | 42 +++++++++++++++++++--------- Server/db/MongoDB.js | 9 +++++- Server/routes/authRoute.js | 4 +-- 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index 66e2787f4..198d3d382 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -236,6 +236,15 @@ const resetPasswordController = async (req, res, next) => { } }; +/** + * Deletes a user and all associated monitors, checks, and alerts. + * + * @param {Object} req - The request object. + * @param {Object} res - The response object. + * @param {Function} next - The next middleware function. + * @returns {Object} The response object with success status and message. + * @throws {Error} If user validation fails or user is not found in the database. + */ const deleteUserController = async (req, res, next) => { try { // Validate user @@ -247,22 +256,29 @@ const deleteUserController = async (req, res, next) => { throw new Error(errorMessages.DB_USER_NOT_FOUND); } - // Step 1: Find all monitors associated with the user + // 1. Find all the monitors associated with the user id const monitors = await req.db.getMonitorsByUserId(req.params.userId); - - // Step 2: For each monitor, delete all associated checks and alerts - if (monitors) { - for (const monitor of monitors) { - await req.db.deleteChecks(monitor.id); - await req.db.deleteAlertByMonitorId(monitor.id); - } + + // 2. Delete jobs associated with each monitor + for (const monitor of monitors) { + await req.jobQueue.deleteJob(monitor); } - - // Step 3: Delete all monitors associated with the user + + // 3. Delete all checks associated with each monitor + for (const monitor of monitors) { + await req.db.deleteChecks(monitor._id); + } + + // 4. Delete all alerts associated with each monitor + for (const monitor of monitors) { + await req.db.deleteAlertByMonitorId(monitor._id); + } + + // 5. Delete each monitor await req.db.deleteMonitorsByUserId(req.params.userId); - - // Step 4: Finally, delete the user - await req.db.deleteUser(req.params.userId); + + // 6. Delete the user by id + await req.db.deleteUserById(req.params.userId); return res.status(200).json({ success: true, diff --git a/Server/db/MongoDB.js b/Server/db/MongoDB.js index 84887bcde..c69edbe92 100644 --- a/Server/db/MongoDB.js +++ b/Server/db/MongoDB.js @@ -396,7 +396,7 @@ const getChecks = async (monitorId) => { const deleteChecks = async (monitorId) => { try { const result = await Check.deleteMany({ monitorId }); - return result; + return result.deletedCount; } catch (error) { throw error; } @@ -519,6 +519,13 @@ const deleteAlert = async (alertId) => { } }; +/** + * Deletes alerts by monitor ID. + * + * @param {string} monitorId - The ID of the monitor. + * @returns {Promise} A promise that resolves to the result of the delete operation. + * @throws {Error} If an error occurs while deleting the alerts. + */ const deleteAlertByMonitorId = async (monitorId) => { try { const result = await Alert.deleteMany({ monitorId }); diff --git a/Server/routes/authRoute.js b/Server/routes/authRoute.js index e6ff182c8..e383d4457 100644 --- a/Server/routes/authRoute.js +++ b/Server/routes/authRoute.js @@ -15,13 +15,11 @@ const { router.post("/register", registerController); router.post("/login", loginController); router.post("/user/:userId", verifyJWT, userEditController); +router.delete("/delete/:userId", deleteUserController); //Recovery routes router.post("/recovery/request", recoveryRequestController); router.post("/recovery/validate", validateRecoveryTokenController); router.post("/recovery/reset/", resetPasswordController); -//Delete routes -router.delete("/delete/:userId", deleteUserController); - module.exports = router; From 423faf3b08f66b2199d2b35c0cecdebb87971ffb Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Sat, 29 Jun 2024 20:16:20 +0330 Subject: [PATCH 09/37] fix --- Client/src/Pages/Login/index.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Client/src/Pages/Login/index.css b/Client/src/Pages/Login/index.css index 195b87001..41020cf67 100644 --- a/Client/src/Pages/Login/index.css +++ b/Client/src/Pages/Login/index.css @@ -41,13 +41,13 @@ #login-email-input { width: 308px; - height: 1px; + height: 11px; font-size: var(--env-var-font-size-medium); } #login-password-input { width: 308px; - height: 1px; + height: 11px; font-size: var(--env-var-font-size-medium); } From c8cdcd88a61698d102bddf218e7aa88e11fedf3b Mon Sep 17 00:00:00 2001 From: terryjung0244 Date: Mon, 1 Jul 2024 22:30:57 -0400 Subject: [PATCH 10/37] Issue 225: Add basic structure for Incidents Component --- Client/src/Pages/Incidents/index.css | 13 +++++++++++++ Client/src/Pages/Incidents/index.jsx | 21 +++++++++++++++------ Client/src/Pages/Status/index.jsx | 10 ++++------ 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/Client/src/Pages/Incidents/index.css b/Client/src/Pages/Incidents/index.css index e69de29bb..9886428f3 100644 --- a/Client/src/Pages/Incidents/index.css +++ b/Client/src/Pages/Incidents/index.css @@ -0,0 +1,13 @@ +.maintenance-checklist-card { + max-width: 314; + margin: auto; + padding: 2; + box-shadow: 3; +} + +.maintenance-checklist-box { + height: 100; + background-color: grey; + border-radius: 1px; + margin-bottom: 2px; +} diff --git a/Client/src/Pages/Incidents/index.jsx b/Client/src/Pages/Incidents/index.jsx index e1aa44740..a6f305498 100644 --- a/Client/src/Pages/Incidents/index.jsx +++ b/Client/src/Pages/Incidents/index.jsx @@ -1,9 +1,18 @@ -import React from 'react' +import React from "react"; +import { Card, CardContent, Box, Typography, Button } from "@mui/material"; const Incidents = () => { - return ( -
Incidents
- ) -} + return ( + + + + Create a maintenance window to + + + + + + ); +}; -export default Incidents \ No newline at end of file +export default Incidents; diff --git a/Client/src/Pages/Status/index.jsx b/Client/src/Pages/Status/index.jsx index 33729f7e1..f0cf82b60 100644 --- a/Client/src/Pages/Status/index.jsx +++ b/Client/src/Pages/Status/index.jsx @@ -1,9 +1,7 @@ -import React from 'react' +import React from "react"; const Status = () => { - return ( -
Status
- ) -} + return
Status
; +}; -export default Status \ No newline at end of file +export default Status; From af0ec810c94702cfbf16d79cbaf759d13550c658 Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Tue, 2 Jul 2024 12:16:33 +0330 Subject: [PATCH 11/37] delete functionality working --- Server/controllers/authController.js | 12 ++++++------ Server/routes/authRoute.js | 2 +- Server/validation/joi.js | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index 198d3d382..635983a68 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -7,7 +7,7 @@ const { recoveryValidation, recoveryTokenValidation, newPasswordValidation, - userDeleteValidation + deleteUserParamValidation } = require("../validation/joi"); const logger = require("../utils/logger"); require("dotenv").config(); @@ -248,16 +248,16 @@ const resetPasswordController = async (req, res, next) => { const deleteUserController = async (req, res, next) => { try { // Validate user - await userDeleteValidation.validateAsync(req.params.userId); + await deleteUserParamValidation.validateAsync(req.body); // Check if the user exists - const user = await req.db.getUserById(req.params.userId); + const user = await req.db.getUserByEmail(req); if (!user) { throw new Error(errorMessages.DB_USER_NOT_FOUND); } // 1. Find all the monitors associated with the user id - const monitors = await req.db.getMonitorsByUserId(req.params.userId); + const monitors = await req.db.getMonitorsByUserId(req); // 2. Delete jobs associated with each monitor for (const monitor of monitors) { @@ -275,10 +275,10 @@ const deleteUserController = async (req, res, next) => { } // 5. Delete each monitor - await req.db.deleteMonitorsByUserId(req.params.userId); + await req.db.deleteMonitorsByUserId(user._id); // 6. Delete the user by id - await req.db.deleteUserById(req.params.userId); + await req.db.deleteUser(req); return res.status(200).json({ success: true, diff --git a/Server/routes/authRoute.js b/Server/routes/authRoute.js index e383d4457..3e3057082 100644 --- a/Server/routes/authRoute.js +++ b/Server/routes/authRoute.js @@ -15,7 +15,7 @@ const { router.post("/register", registerController); router.post("/login", loginController); router.post("/user/:userId", verifyJWT, userEditController); -router.delete("/delete/:userId", deleteUserController); +router.delete("/user/:userId", deleteUserController); //Recovery routes router.post("/recovery/request", recoveryRequestController); diff --git a/Server/validation/joi.js b/Server/validation/joi.js index 8379559cd..0aaa20928 100644 --- a/Server/validation/joi.js +++ b/Server/validation/joi.js @@ -43,8 +43,8 @@ const newPasswordValidation = joi.object({ confirm: joi.string(), }); -const userDeleteValidation = joi.object({ - userId: joi.string().required(), +const deleteUserParamValidation = joi.object({ + email: joi.string().email().required(), }); //**************************************** @@ -162,5 +162,5 @@ module.exports = { createCheckBodyValidation, getChecksParamValidation, deleteChecksParamValidation, - userDeleteValidation + deleteUserParamValidation }; From 5cd7e362e959fd51d229e4e6c1bce0cb49641cd7 Mon Sep 17 00:00:00 2001 From: terryjung0244 Date: Tue, 2 Jul 2024 13:41:59 -0400 Subject: [PATCH 12/37] Define an array of maintenance item and Map maintenance items array to ListItem components with icons --- Client/src/Pages/Incidents/index.jsx | 38 ++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/Client/src/Pages/Incidents/index.jsx b/Client/src/Pages/Incidents/index.jsx index a6f305498..70659aabc 100644 --- a/Client/src/Pages/Incidents/index.jsx +++ b/Client/src/Pages/Incidents/index.jsx @@ -1,15 +1,49 @@ import React from "react"; -import { Card, CardContent, Box, Typography, Button } from "@mui/material"; +import "./index.css"; +import { + Card, + CardContent, + Box, + Typography, + Button, + List, + ListItem, + ListItemIcon, + ListItemText, +} from "@mui/material"; +import CheckCircleOutlineIcon from "@mui/icons-material/CheckCircleOutline"; const Incidents = () => { + const maintenanceItems = [ + "Mark your maintenance periods", + "Eliminate any misunderstandings", + "Stop sending alerts in maintenance windows", + ]; + return ( Create a maintenance window to + + {maintenanceItems.map((item, index) => { + + + + + + ; + })} + - + ); From 7d27a72f628394b4b1f484471714a7c9f3bbb545 Mon Sep 17 00:00:00 2001 From: terryjung0244 Date: Tue, 2 Jul 2024 21:44:03 -0400 Subject: [PATCH 13/37] Issue 225: update maintenance checklist component structure --- Client/src/Pages/Incidents/index.css | 38 +++++++++++++---- Client/src/Pages/Incidents/index.jsx | 64 +++++++++++----------------- 2 files changed, 54 insertions(+), 48 deletions(-) diff --git a/Client/src/Pages/Incidents/index.css b/Client/src/Pages/Incidents/index.css index 9886428f3..77ec42814 100644 --- a/Client/src/Pages/Incidents/index.css +++ b/Client/src/Pages/Incidents/index.css @@ -1,13 +1,33 @@ -.maintenance-checklist-card { - max-width: 314; +.maintenance-checklist-main { + max-width: 350px; + min-height: 390px; margin: auto; - padding: 2; - box-shadow: 3; + padding: 5px; } -.maintenance-checklist-box { - height: 100; - background-color: grey; - border-radius: 1px; - margin-bottom: 2px; +.maintenance-image { + width: 280px; + height: 150px; + background-color: whitesmoke; + border-radius: 10px; +} + +.maintenance-title { + font-size: 20px; + font-weight: bold; + margin-top: 40px; + margin-bottom: 30px; +} + +.checklist-item { + display: flex; + margin-bottom: 10px; +} + +.checklist-item-text { + margin-left: 10px; +} + +.maintenance-checklist-main .maintenance-checklist-button { + margin-top: 30px; } diff --git a/Client/src/Pages/Incidents/index.jsx b/Client/src/Pages/Incidents/index.jsx index 70659aabc..888584ee5 100644 --- a/Client/src/Pages/Incidents/index.jsx +++ b/Client/src/Pages/Incidents/index.jsx @@ -1,51 +1,37 @@ import React from "react"; import "./index.css"; -import { - Card, - CardContent, - Box, - Typography, - Button, - List, - ListItem, - ListItemIcon, - ListItemText, -} from "@mui/material"; +import { Button } from "@mui/material"; import CheckCircleOutlineIcon from "@mui/icons-material/CheckCircleOutline"; const Incidents = () => { const maintenanceItems = [ - "Mark your maintenance periods", - "Eliminate any misunderstandings", - "Stop sending alerts in maintenance windows", + { id: 1, text: "Mark your maintenance periods" }, + { id: 2, text: "Eliminate any misunderstandings" }, + { id: 3, text: "Stop sending alerts in maintenance windows" }, ]; return ( - - - - Create a maintenance window to - - {maintenanceItems.map((item, index) => { - - - - - - ; - })} - - - - - - +
+
+
Create a maintenance window to
+
+ {maintenanceItems.map((item) => ( +
+ +
{item.text}
+
+ ))} +
+ + +
); }; From 41094171f4e6f4887836a9088a57f4960237d357 Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Wed, 3 Jul 2024 08:51:53 +0330 Subject: [PATCH 14/37] error handling and protection --- Server/db/MongoDB.js | 3 +++ Server/routes/authRoute.js | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Server/db/MongoDB.js b/Server/db/MongoDB.js index c69edbe92..54ff2cabe 100644 --- a/Server/db/MongoDB.js +++ b/Server/db/MongoDB.js @@ -107,6 +107,9 @@ const deleteUser = async (req, res) => { const userId = req.params.userId; try { const deletedUser = await UserModel.findByIdAndDelete(userId); + if (!deletedUser) { + throw new Error(errorMessages.DB_USER_NOT_FOUND); + } return deletedUser; } catch (error) { throw error; diff --git a/Server/routes/authRoute.js b/Server/routes/authRoute.js index 3e3057082..3c11a6cf3 100644 --- a/Server/routes/authRoute.js +++ b/Server/routes/authRoute.js @@ -15,7 +15,7 @@ const { router.post("/register", registerController); router.post("/login", loginController); router.post("/user/:userId", verifyJWT, userEditController); -router.delete("/user/:userId", deleteUserController); +router.delete("/user/:userId", verifyJWT, deleteUserController); //Recovery routes router.post("/recovery/request", recoveryRequestController); From a6ccb4d9edb72c184cd03ad8644af625840dcc0c Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Thu, 4 Jul 2024 11:39:18 +0330 Subject: [PATCH 15/37] verifyOwnership added on the route --- Server/routes/authRoute.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Server/routes/authRoute.js b/Server/routes/authRoute.js index 7f33381a1..e47a52cf7 100644 --- a/Server/routes/authRoute.js +++ b/Server/routes/authRoute.js @@ -1,7 +1,9 @@ const router = require("express").Router(); const { verifyJWT } = require("../middleware/verifyJWT"); +const { verifyOwnership } = require("../middleware/verifyOwnership"); const multer = require("multer"); const upload = multer(); +const User = require("../models/user"); const { registerController, @@ -24,7 +26,7 @@ router.post( userEditController ); router.get("/users/admin", checkAdminController); -router.delete("/user/:userId", verifyJWT, deleteUserController); +router.delete("/user/:userId", verifyJWT, verifyOwnership(User, "userId") , deleteUserController); //Recovery routes router.post("/recovery/request", recoveryRequestController); From 17337d69b5bebd6770e6d52a93ca68b1aa143da9 Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Thu, 4 Jul 2024 11:52:46 +0330 Subject: [PATCH 16/37] small error handling --- Server/controllers/authController.js | 60 +++++++++++++++++----------- Server/routes/authRoute.js | 2 +- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index 9ce55959d..cfdd996c9 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -286,31 +286,43 @@ const deleteUserController = async (req, res, next) => { // 1. Find all the monitors associated with the user id const monitors = await req.db.getMonitorsByUserId(req); - // 2. Delete jobs associated with each monitor - for (const monitor of monitors) { - await req.jobQueue.deleteJob(monitor); - } - - // 3. Delete all checks associated with each monitor - for (const monitor of monitors) { - await req.db.deleteChecks(monitor._id); - } - - // 4. Delete all alerts associated with each monitor - for (const monitor of monitors) { - await req.db.deleteAlertByMonitorId(monitor._id); - } - - // 5. Delete each monitor - await req.db.deleteMonitorsByUserId(user._id); - - // 6. Delete the user by id - await req.db.deleteUser(req); + if (monitors) { + // 2. Delete jobs associated with each monitor + for (const monitor of monitors) { + await req.jobQueue.deleteJob(monitor); + } + + // 3. Delete all checks associated with each monitor + for (const monitor of monitors) { + await req.db.deleteChecks(monitor._id); + } + + // 4. Delete all alerts associated with each monitor + for (const monitor of monitors) { + await req.db.deleteAlertByMonitorId(monitor._id); + } + + // 5. Delete each monitor + await req.db.deleteMonitorsByUserId(user._id); + + // 6. Delete the user by id + await req.db.deleteUser(req); + + + return res.status(200).json({ + success: true, + msg: successMessages.AUTH_DELETE_USER, + }); + + } else { + + return res.status(404).json({ + success: false, + msg: errorMessages.MONITOR_GET_BY_USER_ID, + }); + + } - return res.status(200).json({ - success: true, - msg: successMessages.AUTH_DELETE_USER, - }); } catch (error) { error.service = SERVICE_NAME; next(error); diff --git a/Server/routes/authRoute.js b/Server/routes/authRoute.js index e47a52cf7..13cc0f743 100644 --- a/Server/routes/authRoute.js +++ b/Server/routes/authRoute.js @@ -26,7 +26,7 @@ router.post( userEditController ); router.get("/users/admin", checkAdminController); -router.delete("/user/:userId", verifyJWT, verifyOwnership(User, "userId") , deleteUserController); +router.delete("/user/:userId", /* verifyJWT, verifyOwnership(User, "userId") ,*/ deleteUserController); //Recovery routes router.post("/recovery/request", recoveryRequestController); From 4f8031a944a4099a2cd09e9158aadc33dc536b72 Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Fri, 5 Jul 2024 10:19:58 +0330 Subject: [PATCH 17/37] Leveraging JWT for Authenticated Access --- Server/controllers/authController.js | 23 +++++++++++++++++++---- Server/routes/authRoute.js | 2 +- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index cfdd996c9..530ba2319 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -274,17 +274,32 @@ const resetPasswordController = async (req, res, next) => { */ const deleteUserController = async (req, res, next) => { try { + const token = req.headers.authorization.split(' ')[1]; + const decodedToken = jwt.decode(token) + const { _id, email } = decodedToken; + + console.log("USERID: ", _id, " Email: ", email) + + const decodedTokenCastedAsRequest = { + params: { + userId: _id + }, + body: { + email + } + } + // Validate user - await deleteUserParamValidation.validateAsync(req.body); + await deleteUserParamValidation.validateAsync(decodedTokenCastedAsRequest.body); // Check if the user exists - const user = await req.db.getUserByEmail(req); + const user = await req.db.getUserByEmail(decodedTokenCastedAsRequest); if (!user) { throw new Error(errorMessages.DB_USER_NOT_FOUND); } // 1. Find all the monitors associated with the user id - const monitors = await req.db.getMonitorsByUserId(req); + const monitors = await req.db.getMonitorsByUserId(decodedTokenCastedAsRequest); if (monitors) { // 2. Delete jobs associated with each monitor @@ -306,7 +321,7 @@ const deleteUserController = async (req, res, next) => { await req.db.deleteMonitorsByUserId(user._id); // 6. Delete the user by id - await req.db.deleteUser(req); + await req.db.deleteUser(decodedTokenCastedAsRequest); return res.status(200).json({ diff --git a/Server/routes/authRoute.js b/Server/routes/authRoute.js index 13cc0f743..e47a52cf7 100644 --- a/Server/routes/authRoute.js +++ b/Server/routes/authRoute.js @@ -26,7 +26,7 @@ router.post( userEditController ); router.get("/users/admin", checkAdminController); -router.delete("/user/:userId", /* verifyJWT, verifyOwnership(User, "userId") ,*/ deleteUserController); +router.delete("/user/:userId", verifyJWT, verifyOwnership(User, "userId") , deleteUserController); //Recovery routes router.post("/recovery/request", recoveryRequestController); From 60e18daa159a90110cf7c032459ea47d6f8ceb82 Mon Sep 17 00:00:00 2001 From: terryjung0244 Date: Fri, 5 Jul 2024 12:22:36 -0400 Subject: [PATCH 18/37] Fixed as requested: 1. Added maintenance window frame image. 2. Updated font color and size. --- Client/src/Pages/Incidents/index.css | 5 ++++- Client/src/Pages/Incidents/index.jsx | 3 ++- Client/src/assets/Images/maintenance_window_frame.svg | 9 +++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 Client/src/assets/Images/maintenance_window_frame.svg diff --git a/Client/src/Pages/Incidents/index.css b/Client/src/Pages/Incidents/index.css index 77ec42814..f26a48767 100644 --- a/Client/src/Pages/Incidents/index.css +++ b/Client/src/Pages/Incidents/index.css @@ -13,13 +13,16 @@ } .maintenance-title { - font-size: 20px; + color: var(--env-var-color-2); + font-size: 16px; font-weight: bold; margin-top: 40px; margin-bottom: 30px; } .checklist-item { + font-size: 13px; + color: var(--env-var-color-2); display: flex; margin-bottom: 10px; } diff --git a/Client/src/Pages/Incidents/index.jsx b/Client/src/Pages/Incidents/index.jsx index 888584ee5..705ead72b 100644 --- a/Client/src/Pages/Incidents/index.jsx +++ b/Client/src/Pages/Incidents/index.jsx @@ -1,5 +1,6 @@ import React from "react"; import "./index.css"; +import WindowFrame from "./../../assets/Images/maintenance_window_frame.svg"; import { Button } from "@mui/material"; import CheckCircleOutlineIcon from "@mui/icons-material/CheckCircleOutline"; @@ -12,7 +13,7 @@ const Incidents = () => { return (
-
+ WindowFrame
Create a maintenance window to
{maintenanceItems.map((item) => ( diff --git a/Client/src/assets/Images/maintenance_window_frame.svg b/Client/src/assets/Images/maintenance_window_frame.svg new file mode 100644 index 000000000..51fd317fe --- /dev/null +++ b/Client/src/assets/Images/maintenance_window_frame.svg @@ -0,0 +1,9 @@ + + + + + + + + + From 7b04fcb9fed197c0b5a3663a9e027dc2cf08f054 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 5 Jul 2024 13:30:09 -0700 Subject: [PATCH 19/37] Initial refactor --- Client/src/Components/MonitorTable/index.css | 49 +++++++ Client/src/Components/MonitorTable/index.jsx | 129 +++++++++++++++++++ Client/src/Pages/Monitors/index.jsx | 2 + Client/src/Pages/Monitors/monitors.css | 25 ---- Client/src/Pages/TestUpload/index.jsx | 17 +++ Server/db/MongoDB.js | 4 +- 6 files changed, 199 insertions(+), 27 deletions(-) create mode 100644 Client/src/Components/MonitorTable/index.css create mode 100644 Client/src/Components/MonitorTable/index.jsx create mode 100644 Client/src/Pages/TestUpload/index.jsx diff --git a/Client/src/Components/MonitorTable/index.css b/Client/src/Components/MonitorTable/index.css new file mode 100644 index 000000000..23b463f87 --- /dev/null +++ b/Client/src/Components/MonitorTable/index.css @@ -0,0 +1,49 @@ +.host-row { + display: flex; + align-items: center; +} + +.host-open-icon { + width: var(--env-var-img-width-2); + height: var(--env-var-img-width-2); + margin-right: 8px; +} + +.host-name { + width: 100px; + font-size: var(--env-var-font-size-medium); + font-weight: bold; + margin-right: var(--env-var-spacing-1); + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.host-percentage { + font-size: var(--env-var-font-size-medium); +} + +.host-status { + display: flex; + align-items: center; + height: 100%; +} + +.host-status-details { + display: flex; + align-items: center; + border: 1px solid var(--env-var-color-4); + border-radius: var(--env-var-radius-2); + padding: calc(var(--env-var-spacing-1) / 2); +} + +.host-status-text { + font-size: var(--env-var-font-size-medium); + line-height: var(--env-var-font-size-medium); +} +.host-status-dot { + width: 6px; + height: 6px; + border-radius: 50%; + margin-right: calc(var(--env-var-spacing-1) / 2); +} diff --git a/Client/src/Components/MonitorTable/index.jsx b/Client/src/Components/MonitorTable/index.jsx new file mode 100644 index 000000000..4b7b3ab87 --- /dev/null +++ b/Client/src/Components/MonitorTable/index.jsx @@ -0,0 +1,129 @@ +import "./index.css"; +import PropTypes from "prop-types"; +import { DataGrid } from "@mui/x-data-grid"; +import OpenIt from "../../assets/Images/Icon-open-in-tab-gray.png"; +import ResponseTimeChart from "../Charts/ResponseTimeChart"; + +const Host = ({ params }) => { + return ( +
+ + OpenIt + +
{params.value.title}
+
+ {params.value.precentage}% +
+
+ ); +}; + +const Status = ({ params }) => { + console.log(params.value.status); + return ( +
+
+
+ {params.value.status} +
+
+ ); +}; + +const cols = [ + { + field: "host", + headerName: "Host", + renderCell: (params) => { + return ; + }, + flex: 1, + }, + { + field: "status", + headerName: "Status", + renderCell: (params) => { + return ; + }, + }, + { + field: "response", + headerName: "Response", + renderCell: (params) => { + return ; + }, + flex: 1, + }, + { + field: "actions", + headerName: "Actions", + }, +]; + +let rows = []; + +const MonitorTable = ({ monitors = [] }) => { + rows = monitors.map((monitor) => { + return { + id: monitor._id, + host: { + title: monitor.name, + url: monitor.url, + precentage: 100, + percentageColor: + monitor.status === true + ? "var(--env-var-color-17)" + : "var(--env-var-color-19)", + }, + status: { + status: monitor.status === true ? "Up" : "Down", + backgroundColor: + monitor.status === true + ? "var(--env-var-color-20)" + : "var(--env-var-color-21)", + statusDotColor: + monitor.status === true + ? "var(--env-var-color-17)" + : "var(--env-var-color-19)", + }, + response: { + checks: monitor.checks, + }, + }; + }); + + return ( +
+

Monitor Table

+ +
+ ); +}; + +MonitorTable.propTypes = { + monitors: PropTypes.arrayOf(PropTypes.object).isRequired, +}; + +Status.propTypes = { params: PropTypes.object.isRequired }; +Host.propTypes = { params: PropTypes.object.isRequired }; + +export default MonitorTable; diff --git a/Client/src/Pages/Monitors/index.jsx b/Client/src/Pages/Monitors/index.jsx index 4c6d18606..7adfc13cd 100644 --- a/Client/src/Pages/Monitors/index.jsx +++ b/Client/src/Pages/Monitors/index.jsx @@ -9,6 +9,7 @@ import ServerStatus from "../../Components/Charts/Servers/ServerStatus"; import SearchTextField from "../../Components/TextFields/Search/SearchTextField"; import HostsTable from "../../Components/HostsTable"; import Pagination from "../../Components/Pagination"; +import MonitorTable from "../../Components/MonitorTable"; const Monitors = () => { const navigate = useNavigate(); @@ -28,6 +29,7 @@ const Monitors = () => { return (
+
Hello, {authState.user.firstname} diff --git a/Client/src/Pages/Monitors/monitors.css b/Client/src/Pages/Monitors/monitors.css index c2ed8532f..3a442aa42 100644 --- a/Client/src/Pages/Monitors/monitors.css +++ b/Client/src/Pages/Monitors/monitors.css @@ -66,24 +66,6 @@ font-size: var(--env-var-font-size-medium); } -.host-list-item { - display: flex; - align-items: center; - cursor: pointer; -} - -.host-list-item-open { - width: var(--env-var-img-width-2); - height: var(--env-var-img-width-2); - margin-right: 8px; -} - -.host-list-item-name { - font-size: var(--env-var-font-size-medium); - font-weight: bold; - margin-right: var(--env-var-spacing-1); -} - .host-list-item-precentage { font-size: var(--env-var-font-size-medium); } @@ -101,13 +83,6 @@ padding: calc(var(--env-var-spacing-1) / 2); } -.host-status-box-circle { - width: 6px; - height: 6px; - border-radius: 50%; - margin-right: calc(var(--env-var-spacing-1) / 2); -} - .host-actions { margin: auto; cursor: pointer; diff --git a/Client/src/Pages/TestUpload/index.jsx b/Client/src/Pages/TestUpload/index.jsx new file mode 100644 index 000000000..809aa44f7 --- /dev/null +++ b/Client/src/Pages/TestUpload/index.jsx @@ -0,0 +1,17 @@ +import { useState } from "react"; + +const TestUpload = () => { + const [file, setFile] = useState(); + function handleChange(e) { + setFile(URL.createObjectURL(e.target.files[0])); + } + + return ( +
+ + +
+ ); +}; + +export default TestUpload; diff --git a/Server/db/MongoDB.js b/Server/db/MongoDB.js index 83668a512..1d16a14d3 100644 --- a/Server/db/MongoDB.js +++ b/Server/db/MongoDB.js @@ -68,8 +68,8 @@ const getUserByEmail = async (req, res) => { try { // Need the password to be able to compare, removed .select() // We can strip the hash before returing the user - const user = await UserModel.findOne( - { email: req.body.email }.select("-profileImage") + const user = await UserModel.findOne({ email: req.body.email }).select( + "-profileImage" ); if (user) { return user; From 4e1f0095a71116b87aa041541b1d913b5f2a6e2f Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 5 Jul 2024 14:38:16 -0700 Subject: [PATCH 20/37] Removed animation from chart --- .../Charts/ResponseTimeChart/index.jsx | 2 +- Client/src/Components/MonitorTable/index.jsx | 90 +++++++++---------- Client/src/Pages/Monitors/index.jsx | 11 +-- 3 files changed, 48 insertions(+), 55 deletions(-) diff --git a/Client/src/Components/Charts/ResponseTimeChart/index.jsx b/Client/src/Components/Charts/ResponseTimeChart/index.jsx index 2121169b6..0518ebee8 100644 --- a/Client/src/Components/Charts/ResponseTimeChart/index.jsx +++ b/Client/src/Components/Charts/ResponseTimeChart/index.jsx @@ -54,7 +54,7 @@ const ResponseTimeChart = ({ checks = [] }) => {
- + {normalizedChecks.map((check, index) => ( { return (
@@ -22,7 +22,6 @@ const Host = ({ params }) => { }; const Status = ({ params }) => { - console.log(params.value.status); return (
{ - rows = monitors.map((monitor) => { - return { - id: monitor._id, - host: { - title: monitor.name, - url: monitor.url, - precentage: 100, - percentageColor: - monitor.status === true - ? "var(--env-var-color-17)" - : "var(--env-var-color-19)", - }, - status: { - status: monitor.status === true ? "Up" : "Down", - backgroundColor: - monitor.status === true - ? "var(--env-var-color-20)" - : "var(--env-var-color-21)", - statusDotColor: - monitor.status === true - ? "var(--env-var-color-17)" - : "var(--env-var-color-19)", - }, - response: { - checks: monitor.checks, - }, - }; - }); + const [rows, setRows] = useState([]); + useEffect(() => { + const mappedRows = monitors.map((monitor) => { + return { + id: monitor._id, + host: { + title: monitor.name, + url: monitor.url, + precentage: 100, + percentageColor: + monitor.status === true + ? "var(--env-var-color-17)" + : "var(--env-var-color-19)", + }, + status: { + status: monitor.status === true ? "Up" : "Down", + backgroundColor: + monitor.status === true + ? "var(--env-var-color-20)" + : "var(--env-var-color-21)", + statusDotColor: + monitor.status === true + ? "var(--env-var-color-17)" + : "var(--env-var-color-19)", + }, + response: { + checks: monitor.checks, + }, + }; + }); + setRows(mappedRows); + }, [monitors]); return ( -
-

Monitor Table

- -
+ ); }; diff --git a/Client/src/Pages/Monitors/index.jsx b/Client/src/Pages/Monitors/index.jsx index 7adfc13cd..a895ae47a 100644 --- a/Client/src/Pages/Monitors/index.jsx +++ b/Client/src/Pages/Monitors/index.jsx @@ -7,8 +7,6 @@ import { useNavigate } from "react-router-dom"; import Button from "../../Components/Button"; import ServerStatus from "../../Components/Charts/Servers/ServerStatus"; import SearchTextField from "../../Components/TextFields/Search/SearchTextField"; -import HostsTable from "../../Components/HostsTable"; -import Pagination from "../../Components/Pagination"; import MonitorTable from "../../Components/MonitorTable"; const Monitors = () => { @@ -26,10 +24,8 @@ const Monitors = () => { }, 0); const down = monitorState.monitors.length - up; - return (
-
Hello, {authState.user.firstname} @@ -62,10 +58,9 @@ const Monitors = () => {
-
- -
- +
+ +
); From 30c9c1d0a3a068ff79af2811a01b765d1f63d1f5 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 5 Jul 2024 14:41:27 -0700 Subject: [PATCH 21/37] Removed test upload component --- Client/src/Pages/TestUpload/index.jsx | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 Client/src/Pages/TestUpload/index.jsx diff --git a/Client/src/Pages/TestUpload/index.jsx b/Client/src/Pages/TestUpload/index.jsx deleted file mode 100644 index 809aa44f7..000000000 --- a/Client/src/Pages/TestUpload/index.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import { useState } from "react"; - -const TestUpload = () => { - const [file, setFile] = useState(); - function handleChange(e) { - setFile(URL.createObjectURL(e.target.files[0])); - } - - return ( -
- - -
- ); -}; - -export default TestUpload; From 30a0cdd11c610e9cedfd4ea4f361120f6b2d9a0c Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Sat, 6 Jul 2024 08:48:58 +0330 Subject: [PATCH 22/37] replace decode with verify --- Server/controllers/authController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index 530ba2319..2c9582dfe 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -275,7 +275,7 @@ const resetPasswordController = async (req, res, next) => { const deleteUserController = async (req, res, next) => { try { const token = req.headers.authorization.split(' ')[1]; - const decodedToken = jwt.decode(token) + const decodedToken = jwt.verify(token) const { _id, email } = decodedToken; console.log("USERID: ", _id, " Email: ", email) From e7fb6a9e60fbc5b8735fd4c57d22dc9da1a58b2d Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Sat, 6 Jul 2024 09:03:09 +0330 Subject: [PATCH 23/37] small changes --- Server/controllers/authController.js | 2 +- Server/routes/authRoute.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index 2c9582dfe..530ba2319 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -275,7 +275,7 @@ const resetPasswordController = async (req, res, next) => { const deleteUserController = async (req, res, next) => { try { const token = req.headers.authorization.split(' ')[1]; - const decodedToken = jwt.verify(token) + const decodedToken = jwt.decode(token) const { _id, email } = decodedToken; console.log("USERID: ", _id, " Email: ", email) diff --git a/Server/routes/authRoute.js b/Server/routes/authRoute.js index e47a52cf7..fdf04230c 100644 --- a/Server/routes/authRoute.js +++ b/Server/routes/authRoute.js @@ -26,7 +26,7 @@ router.post( userEditController ); router.get("/users/admin", checkAdminController); -router.delete("/user/:userId", verifyJWT, verifyOwnership(User, "userId") , deleteUserController); +router.delete("/user", verifyJWT, verifyOwnership(User, "userId") , deleteUserController); //Recovery routes router.post("/recovery/request", recoveryRequestController); From 59f8acff1cd78c9e9c67eed98f895d1cb0195676 Mon Sep 17 00:00:00 2001 From: Daniel Cojocea Date: Sat, 6 Jul 2024 14:33:36 -0400 Subject: [PATCH 24/37] Refactored Alert component --- Client/src/Components/Alert/index.css | 9 +++++ Client/src/Components/Alert/index.jsx | 40 +++++++++++++++++++ .../TabPanels/Account/PasswordPanel.jsx | 19 +++------ Client/src/Pages/Account/index.css | 6 +-- Client/src/Pages/Demo/Demo.jsx | 29 +++++++++++++- Client/src/Utils/Theme.js | 24 +++++++++-- 6 files changed, 106 insertions(+), 21 deletions(-) create mode 100644 Client/src/Components/Alert/index.css create mode 100644 Client/src/Components/Alert/index.jsx diff --git a/Client/src/Components/Alert/index.css b/Client/src/Components/Alert/index.css new file mode 100644 index 000000000..9f0c397e3 --- /dev/null +++ b/Client/src/Components/Alert/index.css @@ -0,0 +1,9 @@ +.alert { + margin: 0; + width: fit-content; + padding: var(--env-var-spacing-1-plus); + font-size: var(--env-var-font-size-medium); +} +.alert .MuiStack-root { + max-width: 85%; +} diff --git a/Client/src/Components/Alert/index.jsx b/Client/src/Components/Alert/index.jsx new file mode 100644 index 000000000..5cf8b7ddb --- /dev/null +++ b/Client/src/Components/Alert/index.jsx @@ -0,0 +1,40 @@ +import { useTheme } from "@emotion/react"; +import { Box, Stack } from "@mui/material"; +import InfoOutlinedIcon from "@mui/icons-material/InfoOutlined"; +import ErrorOutlineOutlinedIcon from "@mui/icons-material/ErrorOutlineOutlined"; +import WarningAmberOutlinedIcon from "@mui/icons-material/WarningAmberOutlined"; +import "./index.css"; + +const icons = { + info: , + error: , + warning: , +}; + +const Alert = ({ variant, title, body }) => { + const theme = useTheme(); + const { bg, border, color } = theme.alert[variant]; + const icon = icons[variant]; + + return ( + + {icon && {icon}} + + {title && {title}} + {body && {body}} + + + ); +}; + +export default Alert; diff --git a/Client/src/Components/TabPanels/Account/PasswordPanel.jsx b/Client/src/Components/TabPanels/Account/PasswordPanel.jsx index 1e04ecaea..ebd0743e8 100644 --- a/Client/src/Components/TabPanels/Account/PasswordPanel.jsx +++ b/Client/src/Components/TabPanels/Account/PasswordPanel.jsx @@ -1,14 +1,11 @@ import TabPanel from "@mui/lab/TabPanel"; import React, { useState } from "react"; -// import AnnouncementsDualButtonWithIcon from "../../Announcements/AnnouncementsDualButtonWithIcon/AnnouncementsDualButtonWithIcon"; -import AnnouncementsDualButtonWithIcon from "../../Toast/AnnouncementsDualButtonWithIcon/AnnouncementsDualButtonWithIcon"; import { useTheme } from "@emotion/react"; import { Box, Divider, Stack, Typography } from "@mui/material"; -import InfoOutlinedIcon from "@mui/icons-material/InfoOutlined"; -import WarningAmberOutlinedIcon from "@mui/icons-material/WarningAmberOutlined"; import ButtonSpinner from "../../ButtonSpinner"; import PasswordTextField from "../../TextFields/Password/PasswordTextField"; import { editPasswordValidation } from "../../../Validation/validation"; +import Alert from "../../Alert"; /** * PasswordPanel component manages the form for editing password. @@ -96,13 +93,9 @@ const PasswordPanel = () => { spellCheck="false" >
- - } - subject="SSO login" +
@@ -181,8 +174,8 @@ const PasswordPanel = () => {
- } + diff --git a/Client/src/Pages/Account/index.css b/Client/src/Pages/Account/index.css index 212292d9b..0c537a30b 100644 --- a/Client/src/Pages/Account/index.css +++ b/Client/src/Pages/Account/index.css @@ -42,9 +42,9 @@ justify-content: space-between; align-items: flex-start; } -.edit-profile-form__wrapper .MuiStack-root:not(.row-stack), -.edit-password-form__wrapper .MuiStack-root:not(.row-stack), -.edit-organization-form__wrapper .MuiStack-root:not(.row-stack) { +.edit-profile-form__wrapper>.MuiStack-root:not(.row-stack), +.edit-password-form__wrapper>.MuiStack-root:not(.row-stack), +.edit-organization-form__wrapper>.MuiStack-root:not(.row-stack) { flex-direction: column; gap: 8px; margin-right: 10px; diff --git a/Client/src/Pages/Demo/Demo.jsx b/Client/src/Pages/Demo/Demo.jsx index 552c65ad2..42e30b6d2 100644 --- a/Client/src/Pages/Demo/Demo.jsx +++ b/Client/src/Pages/Demo/Demo.jsx @@ -15,6 +15,7 @@ import { Tabs, Typography, Stack, + Box, } from "@mui/material"; import { ColoredLabel, StatusLabel } from "../../Components/Label/"; import Avatar from "../../Components/Avatar/"; @@ -29,7 +30,7 @@ import AddIcon from "@mui/icons-material/Add"; import Divider from "@mui/material/Divider"; import UploadIcon from "@mui/icons-material/Upload"; import SendIcon from "@mui/icons-material/Send"; -import ImageIcon from '@mui/icons-material/Image'; +import ImageIcon from "@mui/icons-material/Image"; // Redux import { useSelector } from "react-redux"; @@ -38,6 +39,7 @@ import { getMonitors } from "../../Features/Monitors/monitorsSlice"; import { getMonitorsByUserId } from "../../Features/Monitors/monitorsSlice"; import ImageField from "../../Components/TextFields/Image"; import ProgressUpload from "../../Components/ProgressBars"; +import Alert from "../../Components/Alert"; const cols = [ { @@ -423,7 +425,30 @@ const Demo = () => { - } label="image.jpg" size="2 MB"/> + } label="image.jpg" size="2 MB" /> + + + + + + + + + + + +
diff --git a/Client/src/Utils/Theme.js b/Client/src/Utils/Theme.js index c9f20126f..e4ab491a3 100644 --- a/Client/src/Utils/Theme.js +++ b/Client/src/Utils/Theme.js @@ -88,14 +88,32 @@ const theme = createTheme({ }, content: { pX: "80px", - pY: "40px" + pY: "40px", }, gap: { small: "8px", medium: "12px", + ml: "16px", large: "24px", - xl: "40px" - } + xl: "40px", + }, + alert: { + info: { + color: secondaryMain, + bg: otherColorsWhite, + border: "#d0d5dd", + }, + error: { + color: "#d92d20", + bg: "#fffaef", + border: "#f04438", + }, + warning: { + color: "#f79009", + bg: "#fffaef", + border: "#fecf60" + }, + }, }); export default theme; From bf62404247459765a4f3ee94e2482b5459b0f2a5 Mon Sep 17 00:00:00 2001 From: Daniel Cojocea Date: Sat, 6 Jul 2024 14:36:27 -0400 Subject: [PATCH 25/37] Removed redundant css --- Client/src/Pages/Account/index.css | 30 +++--------------------------- 1 file changed, 3 insertions(+), 27 deletions(-) diff --git a/Client/src/Pages/Account/index.css b/Client/src/Pages/Account/index.css index 0c537a30b..d85ada5a7 100644 --- a/Client/src/Pages/Account/index.css +++ b/Client/src/Pages/Account/index.css @@ -28,8 +28,7 @@ margin: 50px 0; } .account .MuiDivider-root, -.account .MuiOutlinedInput-root fieldset, -.account .announcement-tile { +.account .MuiOutlinedInput-root fieldset { border-color: var(--env-var-color-29); } .account [class$="-form"] { @@ -74,36 +73,13 @@ #input-team-member { padding: 10px; } -.edit-password-form__wrapper > .announcement-tile { - width: 100%; -} -.edit-password-form__wrapper - > .announcement-tile - .announcement-content-subject { - margin-bottom: 2px; -} #edit-new-password + div > button > svg, #edit-confirm-password + div > button > svg, #edit-current-password + div > button > svg { color: var(--env-var-color-29); } -.edit-password-form__wrapper .announcement-tile { - margin: 0; -} -.edit-password-form__wrapper .announcement-tile .announcement-close { - margin-left: auto; -} -.MuiBox-root > .announcement-tile { - border-color: var(--env-var-color-27); - background-color: var(--lighter-env-var-color-27); -} -.MuiBox-root > .announcement-tile .announcement-content-body { - color: var(--env-var-color-28); -} -.MuiBox-root > .announcement-tile .announcement-close svg, -.edit-password-form__wrapper > .announcement-tile .announcement-close svg { - display: none; -} + + #org-name-flex-container .Mui-disabled { color: var(--env-var-color-2) !important; } From 49f8958418ef93352dc511ee4e5daa486de9d36d Mon Sep 17 00:00:00 2001 From: Daniel Cojocea Date: Sat, 6 Jul 2024 14:44:04 -0400 Subject: [PATCH 26/37] Added proptypes and jsdocs, and color fix --- Client/src/Components/Alert/index.jsx | 20 ++++++++++++++++++++ Client/src/Utils/Theme.js | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Client/src/Components/Alert/index.jsx b/Client/src/Components/Alert/index.jsx index 5cf8b7ddb..bf2531bba 100644 --- a/Client/src/Components/Alert/index.jsx +++ b/Client/src/Components/Alert/index.jsx @@ -1,3 +1,4 @@ +import PropTypes from "prop-types"; import { useTheme } from "@emotion/react"; import { Box, Stack } from "@mui/material"; import InfoOutlinedIcon from "@mui/icons-material/InfoOutlined"; @@ -5,12 +6,25 @@ import ErrorOutlineOutlinedIcon from "@mui/icons-material/ErrorOutlineOutlined"; import WarningAmberOutlinedIcon from "@mui/icons-material/WarningAmberOutlined"; import "./index.css"; +/** + * Icons mapping for different alert variants. + * @type {Object} + */ + const icons = { info: , error: , warning: , }; +/** + * @param {Object} props + * @param {'info' | 'error' | 'warning'} props.variant - The type of alert. + * @param {string} [props.title] - The title of the alert. + * @param {string} [props.body] - The body text of the alert. + * @returns {JSX.Element} + */ + const Alert = ({ variant, title, body }) => { const theme = useTheme(); const { bg, border, color } = theme.alert[variant]; @@ -37,4 +51,10 @@ const Alert = ({ variant, title, body }) => { ); }; +Alert.propTypes = { + variant: PropTypes.oneOf(["info", "error", "warning"]).isRequired, + title: PropTypes.string, + body: PropTypes.string, +}; + export default Alert; diff --git a/Client/src/Utils/Theme.js b/Client/src/Utils/Theme.js index e4ab491a3..60273cd95 100644 --- a/Client/src/Utils/Theme.js +++ b/Client/src/Utils/Theme.js @@ -105,7 +105,7 @@ const theme = createTheme({ }, error: { color: "#d92d20", - bg: "#fffaef", + bg: "hsla(0, 100%, 52%, 0.03)", border: "#f04438", }, warning: { From 6a7a9197896903a476d6e8f40f5fc3809c6a8211 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Sat, 6 Jul 2024 21:59:41 -0700 Subject: [PATCH 27/37] Use react table instead of data grid for performance --- Client/src/Components/MonitorTable/index.jsx | 182 ++++++++++--------- 1 file changed, 101 insertions(+), 81 deletions(-) diff --git a/Client/src/Components/MonitorTable/index.jsx b/Client/src/Components/MonitorTable/index.jsx index 5e032f875..c84313b52 100644 --- a/Client/src/Components/MonitorTable/index.jsx +++ b/Client/src/Components/MonitorTable/index.jsx @@ -3,117 +3,137 @@ import PropTypes from "prop-types"; import { DataGrid } from "@mui/x-data-grid"; import OpenIt from "../../assets/Images/Icon-open-in-tab-gray.png"; import ResponseTimeChart from "../Charts/ResponseTimeChart"; -import { useState, useEffect } from "react"; +import { + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Paper, +} from "@mui/material"; + +/** + * Host component. + * This subcomponent receives a params object and displays the host details. + * + * @component + * @param {Object} params - An object containing the following properties: + * @param {string} params.url - The URL of the host. + * @param {string} params.title - The name of the host. + * @param {string} params.percentageColor - The color of the percentage text. + * @param {number} params.precentage - The percentage to display. + * @returns {React.ElementType} Returns a div element with the host details. + */ const Host = ({ params }) => { return (
- + OpenIt -
{params.value.title}
+
{params.title}
- {params.value.precentage}% + {params.precentage}%
); }; +/** + * Status component. + * This subcomponent receives a params object and displays the status details of a monitor. + * + * @component + * @param {Object} params - An object containing the following properties: + * @param {string} params.backgroundColor - The background color of the status box. + * @param {string} params.statusDotColor - The color of the status dot. + * @param {string} params.status - The status text to display. + * @returns {React.ElementType} Returns a div element with the host status. + */ const Status = ({ params }) => { return (
- {params.value.status} + {params.status}
); }; -const cols = [ - { - field: "host", - headerName: "Host", - renderCell: (params) => { - return ; - }, - flex: 1, - }, - { - field: "status", - headerName: "Status", - renderCell: (params) => { - return ; - }, - }, - { - field: "response", - headerName: "Response", - renderCell: (params) => { - return ; - }, - flex: 1, - }, - { - field: "actions", - headerName: "Actions", - }, -]; - +/** + * MonitorTable component. + * Takes an array of monitor objects and displays them in a table. + * Each row in the table represents a monitor and includes the host, status, response time, and action. + * + * @component + * @param {Object[]} monitors - An array of monitor objects. Each object should have the following properties: + * @param {string} monitors[].url - The URL of the monitor. + * @param {string} monitors[].name - The name of the monitor. + * @param {boolean} monitors[].status - The status of the monitor. True if the monitor is up, false otherwise. + * @param {Object[]} monitors[].checks - An array of check objects for the response time chart. + * @returns {React.Component} Returns a table with the monitor data. + */ const MonitorTable = ({ monitors = [] }) => { - const [rows, setRows] = useState([]); - useEffect(() => { - const mappedRows = monitors.map((monitor) => { - return { - id: monitor._id, - host: { - title: monitor.name, - url: monitor.url, - precentage: 100, - percentageColor: - monitor.status === true - ? "var(--env-var-color-17)" - : "var(--env-var-color-19)", - }, - status: { - status: monitor.status === true ? "Up" : "Down", - backgroundColor: - monitor.status === true - ? "var(--env-var-color-20)" - : "var(--env-var-color-21)", - statusDotColor: - monitor.status === true - ? "var(--env-var-color-17)" - : "var(--env-var-color-19)", - }, - response: { - checks: monitor.checks, - }, - }; - }); - setRows(mappedRows); - }, [monitors]); + const mappedRows = monitors.map((monitor) => { + const params = { + url: monitor.url, + title: monitor.name, + precentage: 100, + percentageColor: + monitor.status === true + ? "var(--env-var-color-17)" + : "var(--env-var-color-19)", + status: monitor.status === true ? "up" : "down", + backgroundColor: + monitor.status === true + ? "var(--env-var-color-20)" + : "var(--env-var-color-21)", + statusDotColor: + monitor.status === true + ? "var(--env-var-color-17)" + : "var(--env-var-color-19)", + }; + + return ( + + + + + + + + + + + TODO Add Actions + + ); + }); return ( - + + + + + Host + Status + Response Time + Action + + + {mappedRows} +
+
); }; From d88ac3c5c454c45585770d2031a8954ee9b3a077 Mon Sep 17 00:00:00 2001 From: Alexander Holliday Date: Sat, 6 Jul 2024 22:18:23 -0700 Subject: [PATCH 28/37] Update authRoute.js Added userID param back to delete route, needed for middleware functionality --- Server/routes/authRoute.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/routes/authRoute.js b/Server/routes/authRoute.js index fdf04230c..e47a52cf7 100644 --- a/Server/routes/authRoute.js +++ b/Server/routes/authRoute.js @@ -26,7 +26,7 @@ router.post( userEditController ); router.get("/users/admin", checkAdminController); -router.delete("/user", verifyJWT, verifyOwnership(User, "userId") , deleteUserController); +router.delete("/user/:userId", verifyJWT, verifyOwnership(User, "userId") , deleteUserController); //Recovery routes router.post("/recovery/request", recoveryRequestController); From ad26d1ba1954086477912def7da552ee00a1a03a Mon Sep 17 00:00:00 2001 From: Alexander Holliday Date: Sat, 6 Jul 2024 22:19:02 -0700 Subject: [PATCH 29/37] Update authController.js Removed log statement --- Server/controllers/authController.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index 530ba2319..757d8f78b 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -278,8 +278,6 @@ const deleteUserController = async (req, res, next) => { const decodedToken = jwt.decode(token) const { _id, email } = decodedToken; - console.log("USERID: ", _id, " Email: ", email) - const decodedTokenCastedAsRequest = { params: { userId: _id From 5c9b111707505533556ff600b037c1903276eb70 Mon Sep 17 00:00:00 2001 From: MuhammadKhalilzadeh Date: Sun, 7 Jul 2024 08:59:36 +0330 Subject: [PATCH 30/37] textfield login page height fixed --- Client/src/Pages/Login/index.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Client/src/Pages/Login/index.css b/Client/src/Pages/Login/index.css index 41020cf67..195b87001 100644 --- a/Client/src/Pages/Login/index.css +++ b/Client/src/Pages/Login/index.css @@ -41,13 +41,13 @@ #login-email-input { width: 308px; - height: 11px; + height: 1px; font-size: var(--env-var-font-size-medium); } #login-password-input { width: 308px; - height: 11px; + height: 1px; font-size: var(--env-var-font-size-medium); } From 0555157200827295be8005eb136ffb1a7dfc1556 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Sat, 6 Jul 2024 23:07:04 -0700 Subject: [PATCH 31/37] Added animations back, added pagination --- .../Charts/ResponseTimeChart/index.jsx | 2 +- Client/src/Components/MonitorTable/index.jsx | 98 ++++++++++++------- 2 files changed, 64 insertions(+), 36 deletions(-) diff --git a/Client/src/Components/Charts/ResponseTimeChart/index.jsx b/Client/src/Components/Charts/ResponseTimeChart/index.jsx index 0518ebee8..2121169b6 100644 --- a/Client/src/Components/Charts/ResponseTimeChart/index.jsx +++ b/Client/src/Components/Charts/ResponseTimeChart/index.jsx @@ -54,7 +54,7 @@ const ResponseTimeChart = ({ checks = [] }) => {
- + {normalizedChecks.map((check, index) => ( { * @returns {React.Component} Returns a table with the monitor data. */ const MonitorTable = ({ monitors = [] }) => { - const mappedRows = monitors.map((monitor) => { - const params = { - url: monitor.url, - title: monitor.name, - precentage: 100, - percentageColor: - monitor.status === true - ? "var(--env-var-color-17)" - : "var(--env-var-color-19)", - status: monitor.status === true ? "up" : "down", - backgroundColor: - monitor.status === true - ? "var(--env-var-color-20)" - : "var(--env-var-color-21)", - statusDotColor: - monitor.status === true - ? "var(--env-var-color-17)" - : "var(--env-var-color-19)", - }; + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(5); - return ( - - - - - - - - - - - TODO Add Actions - - ); - }); + const handleChangePage = (event, newPage) => { + setPage(newPage); + }; + + const handleChangeRowsPerPage = (event) => { + setRowsPerPage(parseInt(event.target.value, 10)); + setPage(0); + }; + + const mappedRows = monitors + .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage) + .map((monitor) => { + const params = { + url: monitor.url, + title: monitor.name, + precentage: 100, + percentageColor: + monitor.status === true + ? "var(--env-var-color-17)" + : "var(--env-var-color-19)", + status: monitor.status === true ? "up" : "down", + backgroundColor: + monitor.status === true + ? "var(--env-var-color-20)" + : "var(--env-var-color-21)", + statusDotColor: + monitor.status === true + ? "var(--env-var-color-17)" + : "var(--env-var-color-19)", + }; + + return ( + + + + + + + + + + + TODO Add Actions + + ); + }); return ( @@ -132,6 +148,18 @@ const MonitorTable = ({ monitors = [] }) => { {mappedRows} + + + + + ); From 89c0ccac566be064978d7bc14d2c7b6d535afe1e Mon Sep 17 00:00:00 2001 From: Daniel Cojocea Date: Sun, 7 Jul 2024 18:25:03 -0400 Subject: [PATCH 32/37] Added navigation button --- Client/src/Pages/CreateNewMonitor/index.css | 1 + Client/src/Pages/CreateNewMonitor/index.jsx | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Client/src/Pages/CreateNewMonitor/index.css b/Client/src/Pages/CreateNewMonitor/index.css index 26b41fb83..4702127f5 100644 --- a/Client/src/Pages/CreateNewMonitor/index.css +++ b/Client/src/Pages/CreateNewMonitor/index.css @@ -10,6 +10,7 @@ font-size: var(--env-var-font-size-large); } .create-monitor-form p.MuiTypography-root, +.create-monitor-form button.MuiButtonBase-root, #monitor-frequencies { font-size: var(--env-var-font-size-medium); } diff --git a/Client/src/Pages/CreateNewMonitor/index.jsx b/Client/src/Pages/CreateNewMonitor/index.jsx index dd94f907a..805aa6426 100644 --- a/Client/src/Pages/CreateNewMonitor/index.jsx +++ b/Client/src/Pages/CreateNewMonitor/index.jsx @@ -11,6 +11,7 @@ import { createMonitorValidation } from "../../Validation/validation"; import { createMonitor } from "../../Features/Monitors/monitorsSlice"; import { useNavigate } from "react-router-dom"; import { useTheme } from "@emotion/react"; +import WestRoundedIcon from "@mui/icons-material/WestRounded"; const CreateNewMonitor = () => { const MS_PER_MINUTE = 60000; @@ -133,6 +134,20 @@ const CreateNewMonitor = () => { padding: `${theme.content.pY} ${theme.content.pX}`, }} > + -
- ); + return
Incidents
; }; export default Incidents; diff --git a/Client/src/Pages/Maintenance/index.css b/Client/src/Pages/Maintenance/index.css new file mode 100644 index 000000000..f26a48767 --- /dev/null +++ b/Client/src/Pages/Maintenance/index.css @@ -0,0 +1,36 @@ +.maintenance-checklist-main { + max-width: 350px; + min-height: 390px; + margin: auto; + padding: 5px; +} + +.maintenance-image { + width: 280px; + height: 150px; + background-color: whitesmoke; + border-radius: 10px; +} + +.maintenance-title { + color: var(--env-var-color-2); + font-size: 16px; + font-weight: bold; + margin-top: 40px; + margin-bottom: 30px; +} + +.checklist-item { + font-size: 13px; + color: var(--env-var-color-2); + display: flex; + margin-bottom: 10px; +} + +.checklist-item-text { + margin-left: 10px; +} + +.maintenance-checklist-main .maintenance-checklist-button { + margin-top: 30px; +} diff --git a/Client/src/Pages/Maintenance/index.jsx b/Client/src/Pages/Maintenance/index.jsx new file mode 100644 index 000000000..4cf77b025 --- /dev/null +++ b/Client/src/Pages/Maintenance/index.jsx @@ -0,0 +1,39 @@ +import React from "react"; +import "./index.css"; +import WindowFrame from "./../../assets/Images/maintenance_window_frame.svg"; +import { Button } from "@mui/material"; +import CheckCircleOutlineIcon from "@mui/icons-material/CheckCircleOutline"; + +const Maintenance = () => { + const maintenanceItems = [ + { id: 1, text: "Mark your maintenance periods" }, + { id: 2, text: "Eliminate any misunderstandings" }, + { id: 3, text: "Stop sending alerts in maintenance windows" }, + ]; + + return ( +
+ WindowFrame +
Create a maintenance window to
+
+ {maintenanceItems.map((item) => ( +
+ +
{item.text}
+
+ ))} +
+ + +
+ ); +}; + +export default Maintenance; diff --git a/Client/src/Utils/PathMap.js b/Client/src/Utils/PathMap.js index 2a86c17f7..a14aafe63 100644 --- a/Client/src/Utils/PathMap.js +++ b/Client/src/Utils/PathMap.js @@ -1,9 +1,10 @@ const pathMap = { - "/monitors": "Monitors", - "/incidents": "Incidents", - "/status" : "Status Pages", - "/integrations": "Integrations", - "/settings" : "Settings" -} + "/monitors": "Monitors", + "/incidents": "Incidents", + "/status": "Status Pages", + "/integrations": "Integrations", + "/maintenance": "maintenance", + "/settings": "Settings", +}; -export default pathMap; \ No newline at end of file +export default pathMap; From 31c16e8d3d89f93b93c5d7844f844e5cfd198ece Mon Sep 17 00:00:00 2001 From: terryjung0244 Date: Sun, 7 Jul 2024 22:18:57 -0400 Subject: [PATCH 35/37] 1.Added Icon-maintenance-gray.png to assets/images. 2.Imported and used MaintenanceIcon in DashboardMenuButton for the maintenance page button. --- Client/src/Components/DashboardMenu/index.jsx | 3 ++- .../src/assets/Images/Icon-maintenance-gray.png | Bin 0 -> 744 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Client/src/assets/Images/Icon-maintenance-gray.png diff --git a/Client/src/Components/DashboardMenu/index.jsx b/Client/src/Components/DashboardMenu/index.jsx index 0730ea643..a88274c5d 100644 --- a/Client/src/Components/DashboardMenu/index.jsx +++ b/Client/src/Components/DashboardMenu/index.jsx @@ -5,6 +5,7 @@ import Monitors from "../../assets/Images/Icon-monitor-gray.png"; import Incidents from "../../assets/Images/Icon-warning-gray.png"; import SensorsIcon from "../../assets/Images/Icon-signal-gray.png"; import AllInclusiveIcon from "../../assets/Images/Icon-link-gray.png"; +import MaintenanceIcon from "../../assets/Images/Icon-maintenance-gray.png"; import SettingsIcon from "../../assets/Images/Icon-setting-gray.png"; import React, { useState, useEffect } from "react"; import { useNavigate, useLocation } from "react-router-dom"; @@ -63,7 +64,7 @@ function DashboardMenu() { () => handleClick(pathMap["/integrations"], "/integrations") )} {DashboardMenuButton( - AllInclusiveIcon, + MaintenanceIcon, "Maintenance", "/maintenance", activeButton === "/maintenance", diff --git a/Client/src/assets/Images/Icon-maintenance-gray.png b/Client/src/assets/Images/Icon-maintenance-gray.png new file mode 100644 index 0000000000000000000000000000000000000000..c2c203d762cb335da8ada629280951221090729b GIT binary patch literal 744 zcmVP)f-wFA^a*ZY zz;?8pyRtze%a$N_#@^M{>g?IwbI&sEh$nj3B&K`HP%|cSB*#QE!xU7^{Nk-Qh_-#p zdC8uB**2tHL)2cSA|?|_#}GHrG?P9BXb#8T@w5;aEIlNj3s_9XU(({t_Xe}{n2vt! z)F^HbrQ3z!#A^(nx)5B5HoAFT70zXOJSVG5T0 zv3GJb4JSV{lj^&z`>n6xWth%ig_o1P)&nqPz1MowxC%dgl)PFkU-rxu&~xu(kjJb- zW*-yp=e>JpzhMt6)m@y=A7K2A&_vrn%fy_12{;Z}xfZjBgRrO1ai4Aw$$7*+R@Igr zP}dyW<;~4~mZts=v6qd6HAl+CP1$1z-W19zA;L~iyUy-02Kr}5 zQOPi5F3_MD>ffH};rpTq1UM2VR1lC9ibma*Lcp&h6Lj^d-XuT`;LTLbBz5j|wA&~G z_r0S?s%t#~Gn@2#Q5c%0m{hf9XtKmpm1^P-rF1M4pgG9qudRO&E#Q3W4V(!Nfgy5-V;hIoxQol;f1@79FAgr6fZ5UKS$t%nSw3H||d1)6xx zc=X~!LN*m^+syOVywKRX?^L(0n6*vboIUYZbR+Q(g;LL6K?3-L>R2+1cRS+WkmF%` zOzzcWO@zz{*HC+vnu5_R`GB1S%oa^RtYrBcK9dW)4toW`q@Y&F$gC8Dl4Ugo>Ll;3 aTgPukNgD_r569mC0000 Date: Mon, 8 Jul 2024 10:26:56 -0700 Subject: [PATCH 36/37] Generate avatar image on register or update if an image is included --- Server/controllers/authController.js | 38 +- Server/db/MongoDB.js | 15 +- Server/models/user.js | 3 + Server/package-lock.json | 532 +++++++++++++++++++++++++++ Server/package.json | 1 + Server/utils/imageProcessing.js | 27 ++ 6 files changed, 594 insertions(+), 22 deletions(-) create mode 100644 Server/utils/imageProcessing.js diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index 757d8f78b..b64b7f764 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -7,7 +7,7 @@ const { recoveryValidation, recoveryTokenValidation, newPasswordValidation, - deleteUserParamValidation + deleteUserParamValidation, } = require("../validation/joi"); const logger = require("../utils/logger"); require("dotenv").config(); @@ -59,6 +59,7 @@ const registerController = async (req, res, next) => { const userForToken = { ...newUser._doc }; delete userForToken.profileImage; + delete userForToken.avatarImage; const token = issueToken(userForToken); @@ -274,21 +275,23 @@ const resetPasswordController = async (req, res, next) => { */ const deleteUserController = async (req, res, next) => { try { - const token = req.headers.authorization.split(' ')[1]; - const decodedToken = jwt.decode(token) + const token = req.headers.authorization.split(" ")[1]; + const decodedToken = jwt.decode(token); const { _id, email } = decodedToken; const decodedTokenCastedAsRequest = { params: { - userId: _id + userId: _id, }, body: { - email - } - } + email, + }, + }; // Validate user - await deleteUserParamValidation.validateAsync(decodedTokenCastedAsRequest.body); + await deleteUserParamValidation.validateAsync( + decodedTokenCastedAsRequest.body + ); // Check if the user exists const user = await req.db.getUserByEmail(decodedTokenCastedAsRequest); @@ -297,45 +300,42 @@ const deleteUserController = async (req, res, next) => { } // 1. Find all the monitors associated with the user id - const monitors = await req.db.getMonitorsByUserId(decodedTokenCastedAsRequest); - + const monitors = await req.db.getMonitorsByUserId( + decodedTokenCastedAsRequest + ); + if (monitors) { // 2. Delete jobs associated with each monitor for (const monitor of monitors) { await req.jobQueue.deleteJob(monitor); } - + // 3. Delete all checks associated with each monitor for (const monitor of monitors) { await req.db.deleteChecks(monitor._id); } - + // 4. Delete all alerts associated with each monitor for (const monitor of monitors) { await req.db.deleteAlertByMonitorId(monitor._id); } - + // 5. Delete each monitor await req.db.deleteMonitorsByUserId(user._id); - + // 6. Delete the user by id await req.db.deleteUser(decodedTokenCastedAsRequest); - return res.status(200).json({ success: true, msg: successMessages.AUTH_DELETE_USER, }); - } else { - return res.status(404).json({ success: false, msg: errorMessages.MONITOR_GET_BY_USER_ID, }); - } - } catch (error) { error.service = SERVICE_NAME; next(error); diff --git a/Server/db/MongoDB.js b/Server/db/MongoDB.js index 738708696..1f46b63a6 100644 --- a/Server/db/MongoDB.js +++ b/Server/db/MongoDB.js @@ -8,6 +8,7 @@ const crypto = require("crypto"); const DUPLICATE_KEY_CODE = 11000; // MongoDB error code for duplicate key const { errorMessages, successMessages } = require("../utils/messages"); const { error } = require("console"); +const { GenerateAvatarImage } = require("../utils/imageProcessing"); const connect = async () => { try { await mongoose.connect(process.env.DB_CONNECTION_STRING); @@ -33,12 +34,16 @@ const connect = async () => { const insertUser = async (req, res) => { try { const userData = { ...req.body }; - console.log(req.file); if (req.file) { + // 1. Save the full size image userData.profileImage = { data: req.file.buffer, contentType: req.file.mimetype, }; + + // 2. Get the avatar sized image + const avatar = await GenerateAvatarImage(req.file); + userData.avatarImage = avatar; } const newUser = new UserModel(userData); await newUser.save(); @@ -96,10 +101,15 @@ const updateUser = async (req, res) => { try { const candidateUser = { ...req.body }; if (req.file) { + // 1. Save the full size image candidateUser.profileImage = { data: req.file.buffer, contentType: req.file.mimetype, }; + + // 2. Get the avaatar sized image + const avatar = await GenerateAvatarImage(req.file); + candidateUser.avatarImage = avatar; } const updatedUser = await UserModel.findByIdAndUpdate( @@ -115,7 +125,6 @@ const updateUser = async (req, res) => { } }; - /** * Delete a user by ID * @async @@ -600,5 +609,5 @@ module.exports = { editAlert, deleteAlert, deleteAlertByMonitorId, - deleteMonitorsByUserId + deleteMonitorsByUserId, }; diff --git a/Server/models/user.js b/Server/models/user.js index 3ad3daad7..1a8135e33 100644 --- a/Server/models/user.js +++ b/Server/models/user.js @@ -20,6 +20,9 @@ const UserSchema = mongoose.Schema( type: String, required: true, }, + avatarImage: { + type: String, + }, profileImage: { data: Buffer, contentType: String, diff --git a/Server/package-lock.json b/Server/package-lock.json index ad6637c18..bf83f62ca 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -23,6 +23,7 @@ "mongoose": "^8.3.3", "multer": "1.4.5-lts.1", "ping": "0.4.4", + "sharp": "0.33.4", "winston": "^3.13.0" }, "devDependencies": { @@ -47,6 +48,16 @@ "kuler": "^2.0.0" } }, + "node_modules/@emnapi/runtime": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", + "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -60,6 +71,456 @@ "@hapi/hoek": "^9.0.0" } }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", + "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz", + "integrity": "sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz", + "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=11", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz", + "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=10.13", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz", + "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz", + "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz", + "integrity": "sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz", + "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz", + "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz", + "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz", + "integrity": "sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz", + "integrity": "sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz", + "integrity": "sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.31", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz", + "integrity": "sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz", + "integrity": "sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz", + "integrity": "sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz", + "integrity": "sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.1.1" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz", + "integrity": "sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz", + "integrity": "sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@ioredis/commands": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", @@ -2385,6 +2846,77 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/sharp": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.4.tgz", + "integrity": "sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.0" + }, + "engines": { + "libvips": ">=8.15.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.4", + "@img/sharp-darwin-x64": "0.33.4", + "@img/sharp-libvips-darwin-arm64": "1.0.2", + "@img/sharp-libvips-darwin-x64": "1.0.2", + "@img/sharp-libvips-linux-arm": "1.0.2", + "@img/sharp-libvips-linux-arm64": "1.0.2", + "@img/sharp-libvips-linux-s390x": "1.0.2", + "@img/sharp-libvips-linux-x64": "1.0.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", + "@img/sharp-libvips-linuxmusl-x64": "1.0.2", + "@img/sharp-linux-arm": "0.33.4", + "@img/sharp-linux-arm64": "0.33.4", + "@img/sharp-linux-s390x": "0.33.4", + "@img/sharp-linux-x64": "0.33.4", + "@img/sharp-linuxmusl-arm64": "0.33.4", + "@img/sharp-linuxmusl-x64": "0.33.4", + "@img/sharp-wasm32": "0.33.4", + "@img/sharp-win32-ia32": "0.33.4", + "@img/sharp-win32-x64": "0.33.4" + } + }, + "node_modules/sharp/node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/sharp/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/sharp/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", diff --git a/Server/package.json b/Server/package.json index 2133afd4d..778a89acf 100644 --- a/Server/package.json +++ b/Server/package.json @@ -25,6 +25,7 @@ "mongoose": "^8.3.3", "multer": "1.4.5-lts.1", "ping": "0.4.4", + "sharp": "0.33.4", "winston": "^3.13.0" }, "devDependencies": { diff --git a/Server/utils/imageProcessing.js b/Server/utils/imageProcessing.js new file mode 100644 index 000000000..59793004f --- /dev/null +++ b/Server/utils/imageProcessing.js @@ -0,0 +1,27 @@ +const sharp = require("sharp"); +/** + * Generates a 64 * 64 pixel image from a given image + * @param {} file + */ +const GenerateAvatarImage = async (file) => { + try { + // Resize to target 64 * 64 + let resizedImageBuffer = await sharp(file.buffer) + .resize({ + width: 64, + height: 64, + fit: "cover", + }) + .toBuffer(); + + //Get b64 string + const base64Image = resizedImageBuffer.toString("base64"); + return base64Image; + } catch (error) { + throw error; + } +}; + +module.exports = { + GenerateAvatarImage, +}; From 475f7c69aed7779c10f7aba6c61b24868a64c6f6 Mon Sep 17 00:00:00 2001 From: Daniel Cojocea Date: Mon, 8 Jul 2024 13:42:45 -0400 Subject: [PATCH 37/37] Styling changes --- .../Charts/Servers/serverStatus.css | 2 +- Client/src/Components/MonitorTable/index.css | 69 +++++++++++++++---- Client/src/Components/MonitorTable/index.jsx | 20 ++++-- Client/src/Pages/Monitors/index.css | 3 +- Client/src/Pages/Monitors/index.jsx | 11 ++- Client/src/Pages/Monitors/monitors.css | 15 ++-- Client/src/assets/icons/open-in-new-page.svg | 3 + 7 files changed, 97 insertions(+), 26 deletions(-) create mode 100644 Client/src/assets/icons/open-in-new-page.svg diff --git a/Client/src/Components/Charts/Servers/serverStatus.css b/Client/src/Components/Charts/Servers/serverStatus.css index 541019107..97a4fec3f 100644 --- a/Client/src/Components/Charts/Servers/serverStatus.css +++ b/Client/src/Components/Charts/Servers/serverStatus.css @@ -12,7 +12,7 @@ } .server-status-tile { - min-width: 310px; + min-width: 250px; width: calc(100% - 310px); padding: var(--spacing-general-1); border: 1px solid var(--color-border-0); diff --git a/Client/src/Components/MonitorTable/index.css b/Client/src/Components/MonitorTable/index.css index 23b463f87..f2d24252e 100644 --- a/Client/src/Components/MonitorTable/index.css +++ b/Client/src/Components/MonitorTable/index.css @@ -3,30 +3,32 @@ align-items: center; } -.host-open-icon { +.host-row a { width: var(--env-var-img-width-2); height: var(--env-var-img-width-2); - margin-right: 8px; + color: var(--env-var-color-5); + margin-right: 10px; + margin-bottom: 2px; +} +.host-row a svg { + width: var(--env-var-font-size-large); + height: var(--env-var-font-size-large); +} +.host-row .host-percentage { + font-size: var(--env-var-font-size-small); } .host-name { - width: 100px; - font-size: var(--env-var-font-size-medium); - font-weight: bold; - margin-right: var(--env-var-spacing-1); + width: fit-content; + margin-right: 10px; + font-weight: 700; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } -.host-percentage { - font-size: var(--env-var-font-size-medium); -} - .host-status { - display: flex; - align-items: center; - height: 100%; + width: fit-content; } .host-status-details { @@ -47,3 +49,44 @@ border-radius: 50%; margin-right: calc(var(--env-var-spacing-1) / 2); } + +.monitors .MuiPaper-root:has(table.MuiTable-root) { + box-shadow: none; + border: solid 1px var(--env-var-color-16); + border-radius: var(--env-var-radius-1); +} +.monitors .MuiTableFooter-root .MuiTableCell-root { + border: none; +} +.monitors .MuiTableHead-root, +.monitors .MuiTableRow-root:hover { + background-color: var(--env-var-color-13); +} +.monitors .MuiTableHead-root .MuiTableCell-root, +.monitors .MuiTableBody-root .MuiTableCell-root { + font-size: var(--env-var-font-size-medium); +} +.monitors .MuiTableHead-root .MuiTableCell-root { + padding: var(--env-var-spacing-1) var(--env-var-spacing-2); + font-weight: 500; + color: var(--env-var-color-2); +} +.monitors .MuiTableHead-root span { + position: relative; + display: inline-block; + height: 14px; + width: 20px; + overflow: hidden; + margin-bottom: -3px; + margin-left: 2px; +} +.monitors .MuiTableHead-root span svg { + position: absolute; + width: 20px; + height: 20px; + bottom: 0; +} +.monitors .MuiTableBody-root .MuiTableCell-root { + color: var(--env-var-color-5); + padding: 6px var(--env-var-spacing-2); +} diff --git a/Client/src/Components/MonitorTable/index.jsx b/Client/src/Components/MonitorTable/index.jsx index 763a66c95..db1d90630 100644 --- a/Client/src/Components/MonitorTable/index.jsx +++ b/Client/src/Components/MonitorTable/index.jsx @@ -14,6 +14,8 @@ import { TablePagination, Paper, } from "@mui/material"; +import SouthRoundedIcon from "@mui/icons-material/SouthRounded"; +import OpenInNewPage from "../../assets/icons/open-in-new-page.svg?react" /** * Host component. @@ -31,7 +33,7 @@ const Host = ({ params }) => { return (
- OpenIt +
{params.title}
{ className="host-status-dot" style={{ backgroundColor: params.statusDotColor }} /> - {params.status} + + {params.status} +
); @@ -142,9 +149,14 @@ const MonitorTable = ({ monitors = [] }) => { Host - Status + + Status + + + + Response Time - Action + Actions {mappedRows} diff --git a/Client/src/Pages/Monitors/index.css b/Client/src/Pages/Monitors/index.css index 987bbd7cd..a21a3e125 100644 --- a/Client/src/Pages/Monitors/index.css +++ b/Client/src/Pages/Monitors/index.css @@ -1,7 +1,6 @@ .monitors, .new-monitor { width: 70vw; - padding: 4vw; } .monitors { @@ -9,13 +8,13 @@ } .monitors-bar { - margin-top: calc(2 * var(--env-var-spacing-2)); display: flex; justify-content: space-between; align-items: center; } .monitors-bar-title { + color: var(--env-var-color-1); font-size: 24px; font-weight: 700; } diff --git a/Client/src/Pages/Monitors/index.jsx b/Client/src/Pages/Monitors/index.jsx index a895ae47a..241ca4b10 100644 --- a/Client/src/Pages/Monitors/index.jsx +++ b/Client/src/Pages/Monitors/index.jsx @@ -8,8 +8,10 @@ import Button from "../../Components/Button"; import ServerStatus from "../../Components/Charts/Servers/ServerStatus"; import SearchTextField from "../../Components/TextFields/Search/SearchTextField"; import MonitorTable from "../../Components/MonitorTable"; +import { useTheme } from "@emotion/react"; const Monitors = () => { + const theme = useTheme(); const navigate = useNavigate(); const monitorState = useSelector((state) => state.monitors); const authState = useSelector((state) => state.auth); @@ -25,7 +27,12 @@ const Monitors = () => { const down = monitorState.monitors.length - up; return ( -
+
Hello, {authState.user.firstname} @@ -36,7 +43,7 @@ const Monitors = () => { onClick={() => { navigate("/monitors/create"); }} - sx={{ padding: "10px 20px", fontSize: "13px" }} + sx={{ padding: "6px 25px", fontSize: "13px" }} />
diff --git a/Client/src/Pages/Monitors/monitors.css b/Client/src/Pages/Monitors/monitors.css index 3a442aa42..05ae79709 100644 --- a/Client/src/Pages/Monitors/monitors.css +++ b/Client/src/Pages/Monitors/monitors.css @@ -7,6 +7,7 @@ .current-monitors-title-holder { display: flex; + align-items: center; } .current-monitors-bar { @@ -18,16 +19,22 @@ font-size: 1rem; font-weight: bold; margin-right: var(--env-var-spacing-1); + color: var(--env-var-color-1); } .current-monitors-counter { - width: var(--env-var-spacing-2); - height: var(--env-var-spacing-2); + display: inline-flex; + justify-content: center; + align-items: center; + padding: 2px; + min-width: 22px; + min-height: 22px; background-color: var(--env-var-color-15); border: 1px solid var(--env-var-color-6); border-radius: 50%; - text-align: center; - align-items: center; + font-size: var(--env-var-font-size-medium); + font-weight: 500; + color: var(--env-var-color-5); } .monitors-v-gaping { diff --git a/Client/src/assets/icons/open-in-new-page.svg b/Client/src/assets/icons/open-in-new-page.svg new file mode 100644 index 000000000..2bcb21c43 --- /dev/null +++ b/Client/src/assets/icons/open-in-new-page.svg @@ -0,0 +1,3 @@ + + +