diff --git a/ExpressAPI/.env.vault b/ExpressAPI/.env.vault index 7e45ae4669f2d45eb5ff0b09d06bfda38a329afb..c7d5592eefc4cfc377a11f6e7473fa2021dec809 100644 --- a/ExpressAPI/.env.vault +++ b/ExpressAPI/.env.vault @@ -4,8 +4,8 @@ #/--------------------------------------------------/ # development -DOTENV_VAULT_DEVELOPMENT="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" +DOTENV_VAULT_DEVELOPMENT="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" # production -DOTENV_VAULT_PRODUCTION="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" +DOTENV_VAULT_PRODUCTION="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" diff --git a/ExpressAPI/package-lock.json b/ExpressAPI/package-lock.json index 8f963c7eac7601ac218372bff36cd4a480d1dc0e..820606b932de494ee9fa913b08af03bbe352ebfa 100644 --- a/ExpressAPI/package-lock.json +++ b/ExpressAPI/package-lock.json @@ -1,18 +1,17 @@ { "name": "dojo_backend_api", - "version": "2.2.0", + "version": "3.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "dojo_backend_api", - "version": "2.2.0", + "version": "3.0.0", "license": "AGPLv3", "dependencies": { "@prisma/client": "^5.1.1", "ajv": "^8.12.0", "axios": "^1.4.0", - "bcryptjs": "^2.4.3", "compression": "^1.7.4", "cors": "^2.8.5", "dotenv": "^16.3.1", @@ -36,7 +35,6 @@ "winston": "^3.8.2" }, "devDependencies": { - "@types/bcryptjs": "^2.4.2", "@types/compression": "^1.7.2", "@types/cors": "^2.8.13", "@types/express": "^4.17.17", @@ -58,9 +56,9 @@ } }, "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "engines": { "node": ">=0.1.90" } @@ -530,21 +528,21 @@ "dev": true }, "node_modules/@oclif/screen": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-3.0.7.tgz", - "integrity": "sha512-jQBPHcMh5rcIPKdqA6xlzioLOmkaVnjg2MVyjMzBKV8hDhLWNSiZqx7NAWXpP70v2LFvGdVoV8BSbK9iID3eHg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-3.0.8.tgz", + "integrity": "sha512-yx6KAqlt3TAHBduS2fMQtJDL2ufIHnDRArrJEOoTTuizxqmjLT+psGYOHpmMl3gvQpFJ11Hs76guUUktzAF9Bg==", "dev": true, "engines": { "node": ">=12.0.0" } }, "node_modules/@prisma/client": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.3.1.tgz", - "integrity": "sha512-ArOKjHwdFZIe1cGU56oIfy7wRuTn0FfZjGuU/AjgEBOQh+4rDkB6nF+AGHP8KaVpkBIiHGPQh3IpwQ3xDMdO0Q==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.4.2.tgz", + "integrity": "sha512-2xsPaz4EaMKj1WS9iW6MlPhmbqtBsXAOeVttSePp8vTFTtvzh2hZbDgswwBdSCgPzmmwF+tLB259QzggvCmJqA==", "hasInstallScript": true, "dependencies": { - "@prisma/engines-version": "5.3.1-2.61e140623197a131c2a6189271ffee05a7aa9a59" + "@prisma/engines-version": "5.4.1-2.ac9d7041ed77bcc8a8dbd2ab6616b39013829574" }, "engines": { "node": ">=16.13" @@ -559,16 +557,16 @@ } }, "node_modules/@prisma/engines": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.3.1.tgz", - "integrity": "sha512-6QkILNyfeeN67BNEPEtkgh3Xo2tm6D7V+UhrkBbRHqKw9CTaz/vvTP/ROwYSP/3JT2MtIutZm/EnhxUiuOPVDA==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.4.2.tgz", + "integrity": "sha512-fqeucJ3LH0e1eyFdT0zRx+oETLancu5+n4lhiYECyEz6H2RDskPJHJYHkVc0LhkU4Uv7fuEnppKU3nVKNzMh8g==", "devOptional": true, "hasInstallScript": true }, "node_modules/@prisma/engines-version": { - "version": "5.3.1-2.61e140623197a131c2a6189271ffee05a7aa9a59", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.3.1-2.61e140623197a131c2a6189271ffee05a7aa9a59.tgz", - "integrity": "sha512-y5qbUi3ql2Xg7XraqcXEdMHh0MocBfnBzDn5GbV1xk23S3Mq8MGs+VjacTNiBh3dtEdUERCrUUG7Z3QaJ+h79w==" + "version": "5.4.1-2.ac9d7041ed77bcc8a8dbd2ab6616b39013829574", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.4.1-2.ac9d7041ed77bcc8a8dbd2ab6616b39013829574.tgz", + "integrity": "sha512-wvupDL4AA1vf4TQNANg7kR7y98ITqPsk6aacfBxZKtrJKRIsWjURHkZCGcQliHdqCiW/hGreO6d6ZuSv9MhdAA==" }, "node_modules/@tsconfig/node10": { "version": "1.0.9", @@ -594,16 +592,10 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, - "node_modules/@types/bcryptjs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.4.tgz", - "integrity": "sha512-9wlJI7k5gRyJEC4yrV7DubzNQFTPiykYxUA6lBtsk5NlOfW9oWLJ1HdIA4YtE+6C3i3mTpDQQEosJ2rVZfBWnw==", - "dev": true - }, "node_modules/@types/body-parser": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.3.tgz", - "integrity": "sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==", + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", + "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", "dev": true, "dependencies": { "@types/connect": "*", @@ -611,45 +603,45 @@ } }, "node_modules/@types/cli-progress": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.3.tgz", - "integrity": "sha512-/+C9xAdVtc+g5yHHkGBThgAA8rYpi5B+2ve3wLtybYj0JHEBs57ivR4x/zGfSsplRnV+psE91Nfin1soNKqz5Q==", + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.4.tgz", + "integrity": "sha512-yufTxeeNCZuEIxx2uebK8lpSAsJM4lvzakm/VxzYhDtqhXCzwH9jpn7nPCxzrROuEbLATqhFq4MIPoG0tlrsvw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/compression": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.7.3.tgz", - "integrity": "sha512-rKquEGjebqizyHNMOpaE/4FdYR5VQiWFeesqYfvJU0seSEyB4625UGhNOO/qIkH10S3wftiV7oefc8WdLZ/gCQ==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-sdFVnQJRkQBX83ydsLCBm4A39p45y0QkxdAR689yOtAFNbbS9Acrp86RZWJj6BHRXyZH9tX4t1dU7XDiGdY3nA==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/connect": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", - "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", + "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/cors": { - "version": "2.8.14", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", - "integrity": "sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==", + "version": "2.8.15", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.15.tgz", + "integrity": "sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/express": { - "version": "4.17.18", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.18.tgz", - "integrity": "sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", + "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -659,9 +651,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.37", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz", - "integrity": "sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==", + "version": "4.17.38", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.38.tgz", + "integrity": "sha512-hXOtc0tuDHZPFwwhuBJXPbjemWtXnJjbvuuyNH2Y5Z6in+iXc63c4eXYDc7GGGqHy+iwYqAJMdaItqdnbcBKmg==", "dev": true, "dependencies": { "@types/node": "*", @@ -671,78 +663,81 @@ } }, "node_modules/@types/http-errors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.2.tgz", - "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", + "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", "dev": true }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-b0jGiOgHtZ2jqdPgPnP6WLCXZk1T8p06A/vPGzUvxpFGgKMbjXJDjC5m52ErqBnIuWZFgGoIJyRdeG5AyreJjA==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.4.tgz", + "integrity": "sha512-8UYapdmR0QlxgvJmyE8lP7guxD0UGVMfknsdtCFZh4ovShdBl3iOI4zdvqBHrB/IS+xUj3PSx73Qkey1fhWz+g==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/mime": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.3.tgz", - "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", + "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", "dev": true }, "node_modules/@types/morgan": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.6.tgz", - "integrity": "sha512-xfKogz5WcKww2DAiVT9zxMgrqQt+Shq8tDVeLT+otoj6dJnkRkyJxMF51mHtUc3JCPKGk5x1EBU0buuGpfftlQ==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.7.tgz", + "integrity": "sha512-4sJFBUBrIZkP5EvMm1L6VCXp3SQe8dnXqlVpe1jsmTjS1JQVmSjnpMNs8DosQd6omBi/K7BSKJ6z/Mc3ki0K9g==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/multer": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.8.tgz", - "integrity": "sha512-VMZOW6mnmMMhA5m3fsCdXBwFwC+a+27/8gctNMuQC4f7UtWcF79KAFGoIfKZ4iqrElgWIa3j5vhMJDp0iikQ1g==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.9.tgz", + "integrity": "sha512-9NSvPJ2E8bNTc8XtJq1Cimx2Wrn2Ah48F15B2Du/hM8a8CHLhVbJMlF3ZCqhvMdht7Sa+YdP0aKP7N4fxDcrrg==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/node": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.2.tgz", - "integrity": "sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==", - "dev": true + "version": "20.8.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", + "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.25.1" + } }, "node_modules/@types/parse-link-header": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/parse-link-header/-/parse-link-header-2.0.1.tgz", - "integrity": "sha512-BrKNSrRTqn3UkMXvdVtr/znJch0PMBpEvEP8oBkxDx7eEGntuFLI+WpA5HGsNHK4SlqyhaMa+Ks0ViwyixQB5w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-link-header/-/parse-link-header-2.0.2.tgz", + "integrity": "sha512-RKU5SIF0oyM2ZI0ubw66FkM/0RJUv/r84I7vJcXkcICcfeOpd1WXfpcqkFJPaWli5z3YdxMsfWojyU5uofT6sA==", "dev": true }, "node_modules/@types/qs": { - "version": "6.9.8", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", - "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", + "version": "6.9.9", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", + "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", "dev": true }, "node_modules/@types/range-parser": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.5.tgz", - "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", + "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", "dev": true }, "node_modules/@types/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", "dev": true }, "node_modules/@types/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.2.tgz", - "integrity": "sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==", + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", + "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", "dev": true, "dependencies": { "@types/mime": "^1", @@ -750,9 +745,9 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.3.tgz", - "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", + "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", "dev": true, "dependencies": { "@types/http-errors": "*", @@ -770,14 +765,14 @@ } }, "node_modules/@types/triple-beam": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.3.tgz", - "integrity": "sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g==" + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.4.tgz", + "integrity": "sha512-HlJjF3wxV4R2VQkFpKe0YqJLilYNgtRtsqqZtby7RkVsSs+i+vbyzjtUwpFEdUCKcrGzCiEJE7F/0mKjh0sunA==" }, "node_modules/@types/uuid": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.4.tgz", - "integrity": "sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA==", + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.6.tgz", + "integrity": "sha512-BT2Krtx4xaO6iwzwMFUYvWBWkV2pr37zD68Vmp1CDV196MzczBRxuEpD6Pr395HAgebC/co7hOphs53r8V7jew==", "dev": true }, "node_modules/abbrev": { @@ -1006,11 +1001,6 @@ "node": ">= 0.8" } }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" - }, "node_modules/bignumber.js": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", @@ -2117,9 +2107,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/genversion": { "version": "3.1.1", @@ -2875,16 +2868,19 @@ } }, "node_modules/logform": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", - "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", "dependencies": { - "@colors/colors": "1.5.0", + "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", "fecha": "^4.2.0", "ms": "^2.1.1", "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" } }, "node_modules/logform/node_modules/ms": { @@ -3128,9 +3124,9 @@ } }, "node_modules/node": { - "version": "20.7.0", - "resolved": "https://registry.npmjs.org/node/-/node-20.7.0.tgz", - "integrity": "sha512-GiKqtgSALW8+W7Zi9T2AI9aME8hJg+1EESH6O7Xmk4k1gJfBKOolpy9gdg8vCyR8dMeJlp5GQZOYnvxsu8v5TA==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/node/-/node-20.8.1.tgz", + "integrity": "sha512-gG+nhijBgjTNjgPB4BxKaBKnFS49bngOuxw1/jVh4vlscg/6K+00n+2Q4LEnklTZJXFUQM+AqyGdfvh9h1JknA==", "hasInstallScript": true, "dependencies": { "node-bin-setup": "^1.0.0" @@ -3236,9 +3232,9 @@ } }, "node_modules/npm": { - "version": "9.8.1", - "resolved": "https://registry.npmjs.org/npm/-/npm-9.8.1.tgz", - "integrity": "sha512-AfDvThQzsIXhYgk9zhbk5R+lh811lKkLAeQMMhSypf1BM7zUafeIIBzMzespeuVEJ0+LvY36oRQYf7IKLzU3rw==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-9.9.0.tgz", + "integrity": "sha512-wkd7sjz4KmdmddYQcd0aTP73P1cEuPlekeulz4jTDeMVx/Zo5XZ5KQ1z3eUzV3Q/WZpEO0NJXTrD5FNFe6fhCA==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -3283,6 +3279,7 @@ "ms", "node-gyp", "nopt", + "normalize-package-data", "npm-audit-report", "npm-install-checks", "npm-package-arg", @@ -3299,6 +3296,7 @@ "read", "semver", "sigstore", + "spdx-expression-parse", "ssri", "supports-color", "tar", @@ -3312,8 +3310,8 @@ "dev": true, "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^6.3.0", - "@npmcli/config": "^6.2.1", + "@npmcli/arborist": "^6.5.0", + "@npmcli/config": "^6.4.0", "@npmcli/fs": "^3.1.0", "@npmcli/map-workspaces": "^3.0.4", "@npmcli/package-json": "^4.0.1", @@ -3337,12 +3335,12 @@ "is-cidr": "^4.0.2", "json-parse-even-better-errors": "^3.0.0", "libnpmaccess": "^7.0.2", - "libnpmdiff": "^5.0.19", - "libnpmexec": "^6.0.3", - "libnpmfund": "^4.0.19", + "libnpmdiff": "^5.0.20", + "libnpmexec": "^6.0.4", + "libnpmfund": "^4.2.1", "libnpmhook": "^9.0.3", "libnpmorg": "^5.0.4", - "libnpmpack": "^5.0.19", + "libnpmpack": "^5.0.20", "libnpmpublish": "^7.5.0", "libnpmsearch": "^6.0.2", "libnpmteam": "^5.0.3", @@ -3354,10 +3352,11 @@ "ms": "^2.1.2", "node-gyp": "^9.4.0", "nopt": "^7.2.0", + "normalize-package-data": "^5.0.0", "npm-audit-report": "^5.0.0", - "npm-install-checks": "^6.1.1", + "npm-install-checks": "^6.2.0", "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", + "npm-pick-manifest": "^8.0.2", "npm-profile": "^7.0.1", "npm-registry-fetch": "^14.0.5", "npm-user-validate": "^2.0.0", @@ -3369,7 +3368,8 @@ "qrcode-terminal": "^0.12.0", "read": "^2.1.0", "semver": "^7.5.4", - "sigstore": "^1.7.0", + "sigstore": "^1.9.0", + "spdx-expression-parse": "^3.0.1", "ssri": "^10.0.4", "supports-color": "^9.4.0", "tar": "^6.1.15", @@ -3472,7 +3472,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "6.3.0", + "version": "6.5.0", "dev": true, "inBundle": true, "license": "ISC", @@ -3495,7 +3495,7 @@ "json-stringify-nice": "^1.1.4", "minimatch": "^9.0.0", "nopt": "^7.0.0", - "npm-install-checks": "^6.0.0", + "npm-install-checks": "^6.2.0", "npm-package-arg": "^10.1.0", "npm-pick-manifest": "^8.0.1", "npm-registry-fetch": "^14.0.3", @@ -3519,7 +3519,7 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "6.2.1", + "version": "6.4.0", "dev": true, "inBundle": true, "license": "ISC", @@ -3712,22 +3712,48 @@ "node": ">=14" } }, + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.1.0", + "version": "0.2.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "1.0.0", "dev": true, "inBundle": true, "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "1.0.2", + "version": "1.0.3", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.1.0", + "@sigstore/protobuf-specs": "^0.2.0", "tuf-js": "^1.1.7" }, "engines": { @@ -4716,12 +4742,12 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "5.0.19", + "version": "5.0.20", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^6.3.0", + "@npmcli/arborist": "^6.5.0", "@npmcli/disparity-colors": "^3.0.0", "@npmcli/installed-package-contents": "^2.0.2", "binary-extensions": "^2.2.0", @@ -4736,12 +4762,12 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "6.0.3", + "version": "6.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^6.3.0", + "@npmcli/arborist": "^6.5.0", "@npmcli/run-script": "^6.0.0", "ci-info": "^3.7.1", "npm-package-arg": "^10.1.0", @@ -4758,12 +4784,12 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "4.0.19", + "version": "4.2.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^6.3.0" + "@npmcli/arborist": "^6.5.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -4796,12 +4822,12 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "5.0.19", + "version": "5.0.20", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^6.3.0", + "@npmcli/arborist": "^6.5.0", "@npmcli/run-script": "^6.0.0", "npm-package-arg": "^10.1.0", "pacote": "^15.0.8" @@ -5347,7 +5373,7 @@ } }, "node_modules/npm/node_modules/npm-install-checks": { - "version": "6.1.1", + "version": "6.2.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -5395,7 +5421,7 @@ } }, "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "8.0.1", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -5889,13 +5915,15 @@ } }, "node_modules/npm/node_modules/sigstore": { - "version": "1.7.0", + "version": "1.9.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.1.0", - "@sigstore/tuf": "^1.0.1", + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", "make-fetch-happen": "^11.0.1" }, "bin": { @@ -6360,9 +6388,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", + "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6562,13 +6590,13 @@ } }, "node_modules/prisma": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.3.1.tgz", - "integrity": "sha512-Wp2msQIlMPHe+5k5Od6xnsI/WNG7UJGgFUJgqv/ygc7kOECZapcSz/iU4NIEzISs3H1W9sFLjAPbg/gOqqtB7A==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.4.2.tgz", + "integrity": "sha512-GDMZwZy7mysB2oXU+angQqJ90iaPFdD0rHaZNkn+dio5NRkGLmMqmXs31//tg/qXT3iB0cTQwnGGQNuirhSTZg==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@prisma/engines": "5.3.1" + "@prisma/engines": "5.4.2" }, "bin": { "prisma": "build/index.js" @@ -6747,9 +6775,9 @@ } }, "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -7376,6 +7404,12 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "node_modules/undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "dev": true + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -7485,11 +7519,11 @@ } }, "node_modules/winston": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", - "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", + "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", "dependencies": { - "@colors/colors": "1.5.0", + "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", @@ -7506,16 +7540,16 @@ } }, "node_modules/winston-transport": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", - "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz", + "integrity": "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==", "dependencies": { "logform": "^2.3.2", "readable-stream": "^3.6.0", "triple-beam": "^1.3.0" }, "engines": { - "node": ">= 6.4.0" + "node": ">= 12.0.0" } }, "node_modules/winston-transport/node_modules/readable-stream": { diff --git a/ExpressAPI/package.json b/ExpressAPI/package.json index b6bd791f1ffb54d54b9e3fb1a6300d259f9f615e..ea2f9c786f6ce4702db6f53ed8b9031f116f203b 100644 --- a/ExpressAPI/package.json +++ b/ExpressAPI/package.json @@ -24,7 +24,6 @@ "@prisma/client" : "^5.1.1", "ajv" : "^8.12.0", "axios" : "^1.4.0", - "bcryptjs" : "^2.4.3", "compression" : "^1.7.4", "cors" : "^2.8.5", "dotenv" : "^16.3.1", @@ -48,7 +47,6 @@ "winston" : "^3.8.2" }, "devDependencies": { - "@types/bcryptjs" : "^2.4.2", "@types/compression" : "^1.7.2", "@types/cors" : "^2.8.13", "@types/express" : "^4.17.17", diff --git a/ExpressAPI/prisma/migrations/20231019130319_user_login_gitlab_migration/migration.sql b/ExpressAPI/prisma/migrations/20231019130319_user_login_gitlab_migration/migration.sql new file mode 100644 index 0000000000000000000000000000000000000000..55d6884fff7db5497d31d0d2b9c2c5c4a8b087f2 --- /dev/null +++ b/ExpressAPI/prisma/migrations/20231019130319_user_login_gitlab_migration/migration.sql @@ -0,0 +1,20 @@ +/* + Warnings: + + - You are about to drop the column `firstname` on the `User` table. All the data in the column will be lost. + - You are about to drop the column `lastname` on the `User` table. All the data in the column will be lost. + - You are about to drop the column `password` on the `User` table. All the data in the column will be lost. + - A unique constraint covering the columns `[gitlabUsername]` on the table `User` will be added. If there are existing duplicate values, this will fail. + - Added the required column `gitlabUsername` to the `User` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE `User` DROP COLUMN `firstname`, + DROP COLUMN `lastname`, + DROP COLUMN `password`, + ADD COLUMN `gitlabLastInfo` JSON NOT NULL, + ADD COLUMN `gitlabUsername` VARCHAR(191) NOT NULL, + ADD COLUMN `name` VARCHAR(191) NULL; + +-- CreateIndex +CREATE UNIQUE INDEX `User_gitlabUsername_key` ON `User`(`gitlabUsername`); diff --git a/ExpressAPI/prisma/migrations/20231019131336_add_user_roles/migration.sql b/ExpressAPI/prisma/migrations/20231019131336_add_user_roles/migration.sql new file mode 100644 index 0000000000000000000000000000000000000000..bb6981f18bd28efc0ed6e750544a3fc594205bd4 --- /dev/null +++ b/ExpressAPI/prisma/migrations/20231019131336_add_user_roles/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - You are about to alter the column `role` on the `User` table. The data in that column could be lost. The data in that column will be cast from `VarChar(191)` to `Enum(EnumId(0))`. + +*/ +-- AlterTable +ALTER TABLE `User` MODIFY `role` ENUM('STUDENT', 'TEACHING_STAFF', 'ADMIN') NULL DEFAULT 'STUDENT'; diff --git a/ExpressAPI/prisma/migrations/20231019133101_user_move_gitlab_id_to_user_id/migration.sql b/ExpressAPI/prisma/migrations/20231019133101_user_move_gitlab_id_to_user_id/migration.sql new file mode 100644 index 0000000000000000000000000000000000000000..384000e267b9d1d4973b90b8d7a2d2f197748910 --- /dev/null +++ b/ExpressAPI/prisma/migrations/20231019133101_user_move_gitlab_id_to_user_id/migration.sql @@ -0,0 +1,12 @@ +/* + Warnings: + + - You are about to drop the column `gitlabId` on the `User` table. All the data in the column will be lost. + +*/ +-- DropIndex +DROP INDEX `User_gitlabId_key` ON `User`; + +-- AlterTable +ALTER TABLE `User` DROP COLUMN `gitlabId`, + MODIFY `id` INTEGER NOT NULL; diff --git a/ExpressAPI/prisma/migrations/20231019141626_user_store_refresh_token/migration.sql b/ExpressAPI/prisma/migrations/20231019141626_user_store_refresh_token/migration.sql new file mode 100644 index 0000000000000000000000000000000000000000..86d1c29b4175daca6a1c5bcf506987a61154a955 --- /dev/null +++ b/ExpressAPI/prisma/migrations/20231019141626_user_store_refresh_token/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE `User` ADD COLUMN `gitlabLastRefreshToken` VARCHAR(191) NULL; diff --git a/ExpressAPI/prisma/migrations/20231020204832_user_remove_refresh_token/migration.sql b/ExpressAPI/prisma/migrations/20231020204832_user_remove_refresh_token/migration.sql new file mode 100644 index 0000000000000000000000000000000000000000..46fda322d4927352cf931a964ead45bba72d2045 --- /dev/null +++ b/ExpressAPI/prisma/migrations/20231020204832_user_remove_refresh_token/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - You are about to drop the column `gitlabLastRefreshToken` on the `User` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE `User` DROP COLUMN `gitlabLastRefreshToken`; diff --git a/ExpressAPI/prisma/schema.prisma b/ExpressAPI/prisma/schema.prisma index df6640eb8f98e4e2c1802ac29ac7c194f3800b28..a68226e0868e475d54557f330fa35699e2f34bf7 100644 --- a/ExpressAPI/prisma/schema.prisma +++ b/ExpressAPI/prisma/schema.prisma @@ -7,15 +7,20 @@ datasource db { url = env("DATABASE_URL") } +enum UserRole { + STUDENT + TEACHING_STAFF + ADMIN +} + model User { - id Int @id @default(autoincrement()) - firstname String - lastname String? - mail String? @unique - password String? - gitlabId Int @unique - role String? - deleted Boolean @default(false) + id Int @id /// The user's id is the same as their gitlab id + name String? + mail String? @unique + role UserRole? @default(STUDENT) + gitlabUsername String @unique + gitlabLastInfo Json @default("{}") @db.Json + deleted Boolean @default(false) assignments Assignment[] exercises Exercise[] diff --git a/ExpressAPI/prisma/seed.ts b/ExpressAPI/prisma/seed.ts index 603712461e4588d80a27b4b282f32922ae0e230b..ec4b605c97444027c3ce74f6cde381da9b6d7f1e 100644 --- a/ExpressAPI/prisma/seed.ts +++ b/ExpressAPI/prisma/seed.ts @@ -1,25 +1,20 @@ -require('dotenv').config(); // ATTENTION : This line MUST be the first of this file -require('../src/shared/helpers/TypeScriptExtensions'); // ATTENTION : This line MUST be the second of this file +require('../src/InitialImports'); // ATTENTION : These lines MUST be the first of this file -import Config from '../src/config/Config'; -import logger from '../src/shared/logging/WinstonLogger'; -import * as bcrypt from 'bcryptjs'; -import db from '../src/helpers/DatabaseHelper'; +import { UserRole } from '@prisma/client'; +import logger from '../src/shared/logging/WinstonLogger'; +import db from '../src/helpers/DatabaseHelper'; async function main() { await db.user.upsert({ - where : { gitlabId: 142 }, + where : { id: 142 }, update: {}, create: { - id : 1, - firstname: 'Michaƫl', - lastname : 'Minelli', - mail : 'michael@minelli.me', - password : bcrypt.hashSync('123456', Config.userPasswordSaltRounds), - gitlabId : 142, - role : 'colsci', - deleted : false + id : 142, + gitlabUsername: 'michael.minelli', + gitlabLastInfo: {}, + role : UserRole.ADMIN, + deleted : false } }); } diff --git a/ExpressAPI/src/InitialImports.ts b/ExpressAPI/src/InitialImports.ts new file mode 100644 index 0000000000000000000000000000000000000000..1ba7814dd1acfaf666c7878f6fb0446b82b7b4c4 --- /dev/null +++ b/ExpressAPI/src/InitialImports.ts @@ -0,0 +1,13 @@ +import path from 'node:path'; + + +if ( process.env.NODE_ENV && process.env.NODE_ENV === 'production' ) { + const myEnv = require('dotenv').config(); + require('dotenv-expand').expand(myEnv); +} else { + require('dotenv').config({ path: path.join(__dirname, '../.env.keys') }); + const myEnv = require('dotenv').config({ DOTENV_KEY: process.env.DOTENV_KEY_DEVELOPMENT }); + require('dotenv-expand').expand(myEnv); +} + +require('./shared/helpers/TypeScriptExtensions'); // ATTENTION : This line MUST be after the dotenv.config() calls diff --git a/ExpressAPI/src/app.ts b/ExpressAPI/src/app.ts index bfbc0494636c237af8dae3185fc2670eb0c51b67..9317f3869137d6789fd35a2dc18fb7c313d48f2b 100644 --- a/ExpressAPI/src/app.ts +++ b/ExpressAPI/src/app.ts @@ -1,17 +1,4 @@ -// Read from the .env file -// ATTENTION : This lines MUST be the first of this file (except for the path import) -const path = require('node:path'); - -if ( process.env.NODE_ENV && process.env.NODE_ENV === 'production' ) { - const myEnv = require('dotenv').config(); - require('dotenv-expand').expand(myEnv); -} else { - require('dotenv').config({ path: path.join(__dirname, '../.env.keys') }); - const myEnv = require('dotenv').config({ DOTENV_KEY: process.env.DOTENV_KEY_DEVELOPMENT }); - require('dotenv-expand').expand(myEnv); -} - -require('./shared/helpers/TypeScriptExtensions'); // ATTENTION : This line MUST be after the dotenv.config() calls +require('./InitialImports'); // ATTENTION : These lines MUST be the first of this file import WorkerRole from './process/WorkerRole'; import ClusterManager from './process/ClusterManager'; diff --git a/ExpressAPI/src/config/Config.ts b/ExpressAPI/src/config/Config.ts index 574f9b2ea0e987c896a5075d4ac6dac7f7dbac55..369959d7aee3655af4733916a95f5060df10002a 100644 --- a/ExpressAPI/src/config/Config.ts +++ b/ExpressAPI/src/config/Config.ts @@ -19,8 +19,12 @@ class Config { secret: string; expiresIn: number; }; - public readonly permissions: { - teachingStaff: Array<string>; + public readonly login: { + gitlab: { + client: { + secret: string + } + } }; public readonly gitlab: { @@ -35,9 +39,6 @@ class Config { maxSameName: number; resultsFolder: string, pipelineResultsFolder: string; default: { description: string; visibility: string; }; }; - public readonly userPasswordLength: number; - public readonly userPasswordSaltRounds: number; - constructor() { this.api = { port: Number(process.env.API_PORT || 30992) @@ -50,8 +51,12 @@ class Config { expiresIn: Number(process.env.SESSION_TIMEOUT || 0) }; - this.permissions = { - teachingStaff: JSON5.parse(process.env.ROLES_WITH_TEACHING_STAFF_PERMISSIONS || '[]') + this.login = { + gitlab: { + client: { + secret: process.env.LOGIN_GITLAB_CLIENT_SECRET || '' + } + } }; this.gitlab = { @@ -97,9 +102,6 @@ class Config { visibility : process.env.EXERCISE_DEFAULT_VISIBILITY || GitlabVisibility.PRIVATE } }; - - this.userPasswordLength = Number(process.env.USER_PASSWORD_LENGTH || 0); - this.userPasswordSaltRounds = Number(process.env.USER_PASSWORD_SALT_ROUNDS || 10); } public getResultsFolder(exercise: Exercise): string { diff --git a/ExpressAPI/src/controllers/Session.ts b/ExpressAPI/src/controllers/Session.ts index 77549d8630df98d91b1d4b1e5ef5a7851f91621e..49e044eab67d18a2108e54ef54c1d4e59b6896bb 100644 --- a/ExpressAPI/src/controllers/Session.ts +++ b/ExpressAPI/src/controllers/Session.ts @@ -16,7 +16,6 @@ class Session { } set profile(newProfile: User) { - delete newProfile.password; this._profile = newProfile; } diff --git a/ExpressAPI/src/helpers/Prisma/Extensions/UserResultExtension.ts b/ExpressAPI/src/helpers/Prisma/Extensions/UserResultExtension.ts index 9315569e912f7acb2ef0084bf926e90c0d56d9a0..9ece43dcc31b2dd9fde697a33948f6d72fc15247 100644 --- a/ExpressAPI/src/helpers/Prisma/Extensions/UserResultExtension.ts +++ b/ExpressAPI/src/helpers/Prisma/Extensions/UserResultExtension.ts @@ -1,8 +1,7 @@ -import { Prisma } from '@prisma/client'; -import Config from '../../../config/Config'; -import LazyVal from '../../../shared/helpers/LazyVal'; -import GitlabUser from '../../../shared/types/Gitlab/GitlabUser'; -import GitlabManager from '../../../managers/GitlabManager'; +import { Prisma, UserRole } from '@prisma/client'; +import LazyVal from '../../../shared/helpers/LazyVal'; +import GitlabUser from '../../../shared/types/Gitlab/GitlabUser'; +import GitlabManager from '../../../managers/GitlabManager'; export default Prisma.defineExtension(client => { @@ -14,16 +13,21 @@ export default Prisma.defineExtension(client => { role: true }, compute(user) { - return Config.permissions.teachingStaff.includes(user.role!); + return user.role == UserRole.TEACHING_STAFF || user.role == UserRole.ADMIN; } }, - gitlabProfile : { + isAdmin : { needs: { - gitlabId: true + role: true }, + compute(user) { + return user.role == UserRole.ADMIN; + } + }, + gitlabProfile : { compute(user) { return new LazyVal<GitlabUser | undefined>(() => { - return GitlabManager.getUserById(user.gitlabId); + return GitlabManager.getUserById(user.id); }); } } diff --git a/ExpressAPI/src/managers/GitlabManager.ts b/ExpressAPI/src/managers/GitlabManager.ts index fca3977ce07f14eada038511f9106ccf539fba0a..2a89593c1e362bdd7e12106fe101be9b0c1f86c1 100644 --- a/ExpressAPI/src/managers/GitlabManager.ts +++ b/ExpressAPI/src/managers/GitlabManager.ts @@ -12,6 +12,7 @@ import GitlabFile from '../shared/types/Gitlab/GitlabFile'; import express from 'express'; import GitlabRoute from '../shared/types/Gitlab/GitlabRoute'; import SharedConfig from '../shared/config/SharedConfig'; +import GitlabProfile from '../shared/types/Gitlab/GitlabProfile'; class GitlabManager { @@ -19,6 +20,20 @@ class GitlabManager { return `${ SharedConfig.gitlab.apiURL }${ route }`; } + public async getUserProfile(token: string): Promise<GitlabProfile | undefined> { + try { + return (await axios.get<GitlabProfile>(this.getApiUrl(GitlabRoute.PROFILE_GET), { + headers: { + DojoOverrideAuthorization: true, + DojoAuthorizationHeader : 'Authorization', + DojoAuthorizationValue : `Bearer ${ token }` + } + })).data; + } catch ( e ) { } + + return undefined; + } + public async getUserById(id: number): Promise<GitlabUser | undefined> { try { const params: any = {}; @@ -142,7 +157,7 @@ class GitlabManager { }; members.forEach(member => { if ( member.access_level >= GitlabAccessLevel.REPORTER ) { - if ( member.id === req.session.profile.gitlabId ) { + if ( member.id === req.session.profile.id ) { isUsersAtLeastReporter.user = true; } else if ( member.id === Config.gitlab.account.id ) { isUsersAtLeastReporter.dojo = true; diff --git a/ExpressAPI/src/managers/HttpManager.ts b/ExpressAPI/src/managers/HttpManager.ts index 6d04c68f0b0536bfa9bead9a6e78978bf5946c9b..075e72717a56923fe0d962b72ac14d11fad0d9e8 100644 --- a/ExpressAPI/src/managers/HttpManager.ts +++ b/ExpressAPI/src/managers/HttpManager.ts @@ -18,7 +18,17 @@ class HttpManager { } if ( config.url && config.url.indexOf(SharedConfig.gitlab.apiURL) !== -1 ) { - config.headers['PRIVATE-TOKEN'] = Config.gitlab.account.token; + if ( !config.headers.DojoOverrideAuthorization ) { + config.headers['PRIVATE-TOKEN'] = Config.gitlab.account.token; + } + } + + if ( config.headers.DojoOverrideAuthorization && 'DojoAuthorizationHeader' in config.headers && 'DojoAuthorizationValue' in config.headers ) { + config.headers[config.headers.DojoAuthorizationHeader] = config.headers.DojoAuthorizationValue; + + delete config.headers.DojoOverrideAuthorization; + delete config.headers.DojoAuthorizationHeader; + delete config.headers.DojoAuthorizationValue; } return config; diff --git a/ExpressAPI/src/managers/UserManager.ts b/ExpressAPI/src/managers/UserManager.ts index 615cbcb37cb5c5b6ec06731c50a1acd391260956..b69705e1e6b5c65c29efe2a0590b27b7a51c48b2 100644 --- a/ExpressAPI/src/managers/UserManager.ts +++ b/ExpressAPI/src/managers/UserManager.ts @@ -1,7 +1,8 @@ -import GitlabUser from '../shared/types/Gitlab/GitlabUser'; -import { Prisma } from '@prisma/client'; -import db from '../helpers/DatabaseHelper'; -import { User } from '../types/DatabaseTypes'; +import GitlabUser from '../shared/types/Gitlab/GitlabUser'; +import { Prisma } from '@prisma/client'; +import db from '../helpers/DatabaseHelper'; +import GitlabProfile from '../shared/types/Gitlab/GitlabProfile'; +import { User } from '../types/DatabaseTypes'; class UserManager { @@ -23,23 +24,36 @@ class UserManager { }) as unknown as User ?? undefined; } - async getByGitlabId(gitlabId: number, returnIdIfUndefined: boolean = true, include: Prisma.UserInclude | undefined = undefined): Promise<User | number | undefined> { - return await db.user.findUnique({ - where : { - gitlabId: gitlabId - }, - include: include - }) as unknown as User ?? (returnIdIfUndefined ? gitlabId : undefined); + async getUpdateFromGitlabProfile(gitlabProfile: GitlabProfile, refreshToken: string): Promise<User> { + await db.user.upsert({ + where : { + id: gitlabProfile.id + }, + update: { + mail : gitlabProfile.email, + gitlabLastInfo: gitlabProfile + }, + create: { + id : gitlabProfile.id, + name : gitlabProfile.name, + mail : gitlabProfile.email, + gitlabUsername: gitlabProfile.username, + gitlabLastInfo: gitlabProfile, + deleted : false + } + }); + + return (await this.getById(gitlabProfile.id))!; } async getFromGitlabUser(gitlabUser: GitlabUser, createIfNotExist: boolean = false, include: Prisma.UserInclude | undefined = undefined): Promise<User | number | undefined> { - let user = await this.getByGitlabId(gitlabUser.id, true, include); + let user = await this.getById(gitlabUser.id, include) ?? gitlabUser.id; if ( typeof user === 'number' && createIfNotExist ) { user = (await db.user.create({ data: { - firstname: gitlabUser.name, - gitlabId : gitlabUser.id + id : gitlabUser.id, + gitlabUsername: gitlabUser.name } })).id; } diff --git a/ExpressAPI/src/routes/AssignmentRoutes.ts b/ExpressAPI/src/routes/AssignmentRoutes.ts index 0e8926263d792b77a20c60ca36b1c64134a5f3d5..709342bae618ff290480160efb852976eab2f63a 100644 --- a/ExpressAPI/src/routes/AssignmentRoutes.ts +++ b/ExpressAPI/src/routes/AssignmentRoutes.ts @@ -136,11 +136,11 @@ class AssignmentRoutes implements RoutesManager { connectOrCreate: [ ...params.members.map(gitlabUser => { return { create: { - gitlabId : gitlabUser.id, - firstname: gitlabUser.name + id : gitlabUser.id, + gitlabUsername: gitlabUser.name }, where : { - gitlabId: gitlabUser.id + id: gitlabUser.id } }; }) ] diff --git a/ExpressAPI/src/routes/ExerciseRoutes.ts b/ExpressAPI/src/routes/ExerciseRoutes.ts index e773d8c2f08c1484a830a28edb962e4031d9de73..8eab4ee47e9b6f8fcaa4605f77ed800dc72605ba 100644 --- a/ExpressAPI/src/routes/ExerciseRoutes.ts +++ b/ExpressAPI/src/routes/ExerciseRoutes.ts @@ -135,7 +135,7 @@ class ExerciseRoutes implements RoutesManager { } try { - await Promise.all([ ...new Set([ ...assignment.staff.map(user => user.gitlabId), ...params.members.map(member => member.id) ]) ].map(async (memberId: number): Promise<GitlabMember | false> => { + await Promise.all([ ...new Set([ ...assignment.staff.map(user => user.id), ...params.members.map(member => member.id) ]) ].map(async (memberId: number): Promise<GitlabMember | false> => { try { return await GitlabManager.addRepositoryMember(repository.id, memberId, GitlabAccessLevel.DEVELOPER); } catch ( e ) { @@ -158,11 +158,11 @@ class ExerciseRoutes implements RoutesManager { connectOrCreate: [ ...params.members.map(gitlabUser => { return { create: { - gitlabId : gitlabUser.id, - firstname: gitlabUser.name + id : gitlabUser.id, + gitlabUsername: gitlabUser.name }, where : { - gitlabId: gitlabUser.id + id: gitlabUser.id } }; }) ] diff --git a/ExpressAPI/src/routes/SessionRoutes.ts b/ExpressAPI/src/routes/SessionRoutes.ts index eb329d88b7ccfe6f026a755a7f213bee0ddf1cb7..0479205b47fa69630d954e3c6e08aa703f716043 100644 --- a/ExpressAPI/src/routes/SessionRoutes.ts +++ b/ExpressAPI/src/routes/SessionRoutes.ts @@ -2,21 +2,30 @@ import { Express } from 'express-serve-static-core'; import express from 'express'; import * as ExpressValidator from 'express-validator'; import { StatusCodes } from 'http-status-codes'; -import * as bcrypt from 'bcryptjs'; import RoutesManager from '../express/RoutesManager'; import ParamsValidatorMiddleware from '../middlewares/ParamsValidatorMiddleware'; -import UserManager from '../managers/UserManager'; import SecurityMiddleware from '../middlewares/SecurityMiddleware'; -import { User } from '../types/DatabaseTypes'; +import GitlabManager from '../managers/GitlabManager'; +import UserManager from '../managers/UserManager'; +import DojoStatusCode from '../shared/types/Dojo/DojoStatusCode'; +import SharedGitlabManager from '../shared/managers/SharedGitlabManager'; +import Config from '../config/Config'; class SessionRoutes implements RoutesManager { private readonly loginValidator: ExpressValidator.Schema = { - user : { + accessToken : { trim : true, notEmpty: true }, - password: { + refreshToken: { + trim : true, + notEmpty: true + } + }; + + private readonly refreshTokensValidator: ExpressValidator.Schema = { + refreshToken: { trim : true, notEmpty: true } @@ -24,26 +33,43 @@ class SessionRoutes implements RoutesManager { registerOnBackend(backend: Express) { backend.post('/login', ParamsValidatorMiddleware.validate(this.loginValidator), this.login); + backend.post('/refresh_tokens', ParamsValidatorMiddleware.validate(this.refreshTokensValidator), this.refreshTokens); backend.get('/test_session', SecurityMiddleware.check(true), (req: express.Request, res: express.Response) => req.session.sendResponse(res, StatusCodes.OK)); } private async login(req: express.Request, res: express.Response) { - const params: { - user: string, password: string - } = req.body; + try { + const params: { + accessToken: string, refreshToken: string + } = req.body; - const user: User | undefined = await UserManager.getByMail(params.user); + const gitlabUser = await GitlabManager.getUserProfile(params.accessToken); - if ( user ) { - if ( bcrypt.compareSync(params.password, user.password ?? '') ) { - req.session.profile = user; + if ( gitlabUser ) { + req.session.profile = await UserManager.getUpdateFromGitlabProfile(gitlabUser, params.refreshToken); req.session.sendResponse(res, StatusCodes.OK); return; + } else { + req.session.sendResponse(res, StatusCodes.NOT_FOUND); } + } catch ( error ) { + req.session.sendResponse(res, StatusCodes.INTERNAL_SERVER_ERROR, {}, 'Unknown error while logging in', DojoStatusCode.LOGIN_FAILED); } + } + + private async refreshTokens(req: express.Request, res: express.Response) { + try { + const params: { + refreshToken: string + } = req.body; - req.session.sendResponse(res, StatusCodes.NOT_FOUND); + const gitlabTokens = await SharedGitlabManager.getTokens(params.refreshToken, true, Config.login.gitlab.client.secret); + + req.session.sendResponse(res, StatusCodes.OK, gitlabTokens); + } catch ( error ) { + req.session.sendResponse(res, StatusCodes.INTERNAL_SERVER_ERROR, {}, 'Unknown error while refresh tokens', DojoStatusCode.REFRESH_TOKENS_FAILED); + } } } diff --git a/ExpressAPI/src/shared b/ExpressAPI/src/shared index efe1bf313f57d1826faf935c183d37a0835f8c2d..6607858180da1c27f87f5f078e45091d45fe8caf 160000 --- a/ExpressAPI/src/shared +++ b/ExpressAPI/src/shared @@ -1 +1 @@ -Subproject commit efe1bf313f57d1826faf935c183d37a0835f8c2d +Subproject commit 6607858180da1c27f87f5f078e45091d45fe8caf diff --git a/ExpressAPI/src/types/DatabaseTypes.ts b/ExpressAPI/src/types/DatabaseTypes.ts index bdb25f8c14088d4dcc8524f309a52d5380556a1c..632b05be5eda9eebf30a8c392e5a4020292dd10d 100644 --- a/ExpressAPI/src/types/DatabaseTypes.ts +++ b/ExpressAPI/src/types/DatabaseTypes.ts @@ -26,9 +26,9 @@ const resultBase = Prisma.validator<Prisma.ResultDefaultArgs>()({ }); -export type User = Omit<Prisma.UserGetPayload<typeof userBase>, 'password'> & { - password?: string +export type User = Prisma.UserGetPayload<typeof userBase> & { isTeachingStaff: boolean + isAdmin: boolean gitlabProfile: LazyVal<GitlabUser> } export type Assignment = Prisma.AssignmentGetPayload<typeof assignmentBase>