diff --git a/CHANGELOG.md b/CHANGELOG.md index 526064f4e4030ef5bb57219fa5c6a17096c84f20..e50720ff721a8d8944a84da86489a0e3c3497cb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,8 +17,13 @@ - No modifications / Keep major and minors versions in sync with all parts of the project --> +## 3.2.0 (???) -## 3.1.0 (???) +### π€ Minor change +- **Exercices**: Set names of students in exercise name in alphabetical order + + +## 3.1.0 (2023-12-06) ### π¨ Internal / Developers - **Typescript**: Add linter (ESLint) diff --git a/ExpressAPI/.env.vault b/ExpressAPI/.env.vault index ec218cfc3fc297e20f22276920196b309fa3db9e..5d19782892be2d4b206459481dc142f69aebb60d 100644 --- a/ExpressAPI/.env.vault +++ b/ExpressAPI/.env.vault @@ -4,11 +4,11 @@ #/--------------------------------------------------/ # development -DOTENV_VAULT_DEVELOPMENT="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" +DOTENV_VAULT_DEVELOPMENT="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" # production -DOTENV_VAULT_PRODUCTION="//eidHk8xbcNgl8Bcuu47JqNewiU+CwFGRPJo+Xq71Y/P4TlP9cpEIRH8FPVtZDmC7UnUgvSDjpteDZ+YvndOdLuOt7HiM0cbP1IJiGhS5FyFcJUUqjmV1vGrYwof5X9tKsEe9AsW9q0oUS0eXVPzxmn+AKo6Q8/dGqp/QAnBIsqFUHZZSK9THeJybTZCx0jduBZEwcVqwJMtuEMna0ScBNgUnQ+Oc3cC1xNvdi2k8rhDooVUJK5cLUEnzC6pWCi3Dwr0MJuRKoOXYTx0kvdq8OpR/aowjBmfE0eC2qXlmi1Haeqt0H/A/RF25rdQ0z6nFfmsj7yasxW/Lx3ysNIwsQ4SMBQb0/DhBqtew6KydhUlk4QzwGApQ9maH0JaN1zWUHySbM54qib+BZHqtOOgMXJDuATRpRT6GT4SYM3FfhbZAs9DFYzOiNIOjDFZxVOJbqbLJsnZ2SX7TarDdMW9IOg7bNasYrSmrx+ChLlIOMlxPBqfod4K0fOa7IqqCBqpRaZYv9rKisTgIDEAlkLsgrdlzOYl4rVsb9RyeHoa1IT8ud5V1swKIOhxyIofA742kvGccgK8y/GtpcqwBkEYEZ2/pf56pH3VuC1LBZujgGXQLM3/OmR56YcboFoK3pw3NazqAAdkcgGgX6UAkcKJJBzlX+piUu/wjxRagiI54PLX5RBgi164KI0dM0ucq7Ep9PwJybrk+BJiZOPtNcZprSXlVpS6jomwBYqX02ywdHjzVnBZLby18LsWoM9TOlXwNij14uwewJBwAtAnpjXtCev5nXT1U1orJP5JWQe8THmzQQgeUr1K2IgrWEcAxyZWI5mKQjktqNyuPwh3zrGAkS4vQi0VWqQ/+SH+glXyj6JekLAAQfoVB6P47/VMVXRr6qccv069B/B9jTA3XB0g0zNMnkcd7iM1FQUm6C7QEG/gjcb0C4ZVfB+PfR+vnAdfPDCv86LREa9GcD7A2pTrz2cLaKIyLobRus5e+d/SgdK83n4XNoWuXB1Vt1Epq1DgD3zzqke6gIKHn0OcvwHVu2FZj8TIH2Zg9Nu719eyvm1Jd0HQBKZrTIzXKxuF/RlW7pNHaXJOWXFgE2XEYKieLBX6kvCjUtRj8+H/kYJkMuYTa/oMqhEGZojkuNw5wtzKfLrPIr7e9kIc9UQzsUlxsGw23XqdcpBxvfrDpXcxLJyz3ydVJIR5EOdgRpnTh330cw2eZRamORxjnZLvpQtqa8o9AQ/7cU4MK1hxLEB4luey80NGWco8fwDXChWoWvf1YfkgiL6w0hwgxu+lA4ILOzIYgYFsAprKeAoxabtpHIavhVk17CiRcC75jZMonW5eiIEuu+6vmQwNbnu8OeM8MHuxYuzLwKmldzhqHCUDlS2Qkv6ABVLL1kaIgkQZhyWxo2GnmEbB9lAMgfbm+KjDwh/WG7ApYcfg8+sbAoD6RbXmgCOdDloX3DewjxfWy2W8gRUQOUOG3WewbpYLoVyA/NOSiUi8tz1D3aSWQhQYsZqkvp8iPAbH1lSAB0+eme14bFXd3rOP87AvxoQJHuP7mZ0ySn/bRZT7J6wkT6VN7Iid2cMalm8wJsfXZo6Dg5azSIdbZgXDcnHSfIanQTw2cts1/OrGjqkBC/BfMhcc4QS6e4d8gMdKUFFx9TMc4tkllHvuJM4ZCPRrVQZIB2XjhBcQ5Nbz+ZpjSEZnb3zc724uBN7mBEvy9ByIJc8y3uSvDtkbmukX6jz9VgFxc2qO56nMCXVogyt0ysGBoWbg9mBSMr3sN5EaEB28yxfL/uQA5Kt4k8Ul8HY7cgkf5BUYudBUBO+2qMY29xlj2auundHTqrSpyFzsHTYKHYYcHvwYKE/N5UKC+SgPRC8cmfsZUylTv0WY+OIj2rJO1xJVAA8cJfsSAMLECRLusEdvp/Q5CfbJwEEsfpLT7FqzTJEEsANN3VfFeZ6bTDWeH9GlwSJcIrhzr4LjTTwtVqNXz/APbl6lV4lMiwNdLTxdTl11SFv2Nw2F4iSPgwZdoZuWmv4gID4SQZSPP1eKYbB823heDgLx5LA4bwW9YKLyBP9AACtew0eqQLYGvYQcMbDs38nfAKd3F5C+B4OLpTxZoAgMGAU7ZYnva8Oe58YmfR1a5rdwTLpaRj1KGIF15k+9+CA7MWb6J8VtA4krCjSQqoJZH0KxF9NJR4qez9bZ3wEeCORblaxM7E1nwdNfA55/j3RZcw3I9xhZTGCeUT1ZQz/50Tz9UCLHsNuv4cdKk5n4NRNOPK1yq7LCOmFewZJFAIZJxwHs8IzGc/JmqxTjmuIDUnhlJ2riTA5r5EkQ5mVmhFaI/c4ePoDokG514EJ04R5oUweW+I5IXyC094MDB0SohtgsMH8eOBmmYxRRlcXja+hGmg11SfIKFMvwxOM+U89h5NtzJEIVCNpwOOeKcdareNujClGioNCfwKR+77MOrbsRKb35fJNCUAeaFQAfVMzKWMRn+xtyjtI7uCohymA5lSSn1oBLR5Babl/EzW7chejuwhxV/fqG4KlcFyAgDBDxjpXhIgm680rFTX/dqOaUzHgsUPt2wuBNtqQdvtR7OKfiqzQjG2Ht3l4rtGZvOa5jVfV974grrxGnRtujl9Lso49svQYZYDGPBkouw7jt6L8jFBOXRvY6vfTnfRHtVee+AQ9/khFiiYI/6dUO4qjJQyN0KsF/Y+gpxHWeYvae2FMM9h6cgYSXSM84AkLXacAonIHAewfz5SrN4I/trE9rXEoT1nXvO9Q8DBL9IO9dUFET9vGhn7oYYT3QoKQfxHUMwKy2i7pnORh1pUQCM9aDbIZN+44zGkOzddpy6d4Wck3wSJ1wpXUhJ2jmH0l+ZgxQXy3jrKxYdP4ce8+HpeSC37wldpkrfT26mGTQzUSwYIvdwqIQd3qbZl4aqgWxmuRKKfERZ55FziMDh5pCPnO4BJC94kow2hbtduGUhykOzXHmOoePd1BOVPrM6hbjRLQHsbbGnA2mJyoap+CXsZmFswfJYjfy4SItt1MFdYC8Qcl2GmBK6yF+cnF5G8SvVeG1t+BiS5BI3dz2YX/JZwJFImMus0b+WSqln5XjzGIDlwniCarwApc+22Yv6ZVvcbkmIkBxxrd3rxIOF6aZH0qJ7A8dD5jcSyLV/1Kt0mgG0M5gSOR4OVH8iNbux2eOc8LtlueUarxLXPIsfuxYXwP+ynT5UMEuTb6Zlv1BtlX4EDDcefhBeCveiJ7cNIPoAWMl/jxq36LbkRHDBa6nKk8TvEDTMuvpeg4KXabI8FJUXWs1FVb0BRSlaQnD/f2IxKzYyqsMHdgoxn/QudrYBsp0nyARguI27+XRll5I3QDcWS2Cuo3w+kXLJ38J15f0hwSARpcpqIhKxv5pppWbU2bYuo2BDusmw34ObjlmrDk4oESYnLE9KFLs1MiNEJJ9AY3sE2AbRNYhmDOFijgV25UeoXWsMqxp65tNCPFYZSEdpF0yWNEX2aLcHcK/GrRGZbvmNp2gkDY1hKV8o8N7+Gog7cOHvuBhNFASYYRY5C/uQ==" +DOTENV_VAULT_PRODUCTION="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" # test -DOTENV_VAULT_TEST="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" +DOTENV_VAULT_TEST="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" diff --git a/ExpressAPI/assets/OpenAPI/OpenAPI.yaml b/ExpressAPI/assets/OpenAPI/OpenAPI.yaml index b5e4c6f16618b4e065c177bab57b516dd3e9e150..06c62978c2208dbe211875b1eba9227f3808a4ef 100644 --- a/ExpressAPI/assets/OpenAPI/OpenAPI.yaml +++ b/ExpressAPI/assets/OpenAPI/OpenAPI.yaml @@ -1,7 +1,7 @@ openapi: 3.1.0 info: title: Dojo API - version: 3.1.3 + version: 3.2.0 description: | **Backend API of the Dojo project.** diff --git a/ExpressAPI/package-lock.json b/ExpressAPI/package-lock.json index 6440e5e381d4e192fdcab1f783af7c4868f46c5e..7f4321f0646fcdf72220861400cb3bf2dc221dc2 100644 --- a/ExpressAPI/package-lock.json +++ b/ExpressAPI/package-lock.json @@ -1,12 +1,12 @@ { "name": "dojo_backend_api", - "version": "3.1.0", + "version": "3.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "dojo_backend_api", - "version": "3.1.0", + "version": "3.2.0", "license": "AGPLv3", "dependencies": { "@prisma/client": "^5.6.0", @@ -50,6 +50,7 @@ "@types/uuid": "^9.0.7", "@typescript-eslint/eslint-plugin": "^6.13.2", "@typescript-eslint/parser": "^6.13.2", + "dotenv-cli": "^7.3.0", "dotenv-vault": "^1.25.0", "genversion": "^3.1.1", "nodemon": "^3.0.2", @@ -2298,6 +2299,21 @@ "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, + "node_modules/dotenv-cli": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-7.3.0.tgz", + "integrity": "sha512-314CA4TyK34YEJ6ntBf80eUY+t1XaFLyem1k9P0sX1gn30qThZ5qZr/ZwE318gEnzyYP9yj9HJk6SqwE0upkfw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "dotenv": "^16.3.0", + "dotenv-expand": "^10.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "dotenv": "cli.js" + } + }, "node_modules/dotenv-expand": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", diff --git a/ExpressAPI/package.json b/ExpressAPI/package.json index ad25538f7ae3b48611a3be7270654a8c390011ff..d2e1db43a36aac6028c8580257ede4a577cbb5cb 100644 --- a/ExpressAPI/package.json +++ b/ExpressAPI/package.json @@ -1,24 +1,28 @@ { "name" : "dojo_backend_api", "description" : "Backend API of the Dojo project", - "version" : "3.1.3", + "version" : "3.2.0", "license" : "AGPLv3", "author" : "MichaΓ«l Minelli <dojo@minelli.me>", "main" : "dist/src/app.js", "scripts" : { - "clean" : "rm -R dist/*", - "dotenv:build" : "npx dotenv-vault local build", - "lint" : "npx eslint .", - "genversion" : "npx genversion -s -e src/config/Version.ts", - "build:openapi" : "sed -i -r \"1,20 s/^\\([ ]*version:\\).*$/\\1 $(jq -r .version package.json)/\" assets/OpenAPI/OpenAPI.yaml; npx @redocly/cli build-docs assets/OpenAPI/OpenAPI.yaml --output=assets/OpenAPI/redoc.html", - "build:project" : "npm run genversion; npx prisma generate && npx tsc --project ./ && cp -R assets dist/assets", - "build" : "npm run build:openapi; npm run build:project", - "database:migrate" : "npx prisma migrate deploy", - "database:seed" : "npm run genversion; npx prisma db seed", - "database:deploy" : "npm run database:migrate && npm run database:seed", - "start:dev" : "npm run genversion; npx nodemon src/app.ts", - "start:prod" : "npm run genversion; NODE_ENV=production npx node --max-http-header-size=1048576 dist/src/app.js", - "start:migrate:prod": "npm run genversion; npm run database:deploy && npm run start:prod" + "clean" : "rm -R dist/*", + "dotenv:build" : "npx dotenv-vault local build", + "lint" : "npx eslint .", + "genversion" : "npx genversion -s -e src/config/Version.ts", + "build:openapi" : "sed -i -r \"1,20 s/^\\([ ]*version:\\).*$/\\1 $(jq -r .version package.json)/\" assets/OpenAPI/OpenAPI.yaml; npx @redocly/cli build-docs assets/OpenAPI/OpenAPI.yaml --output=assets/OpenAPI/redoc.html", + "build:project" : "npm run genversion; npx prisma generate && npx tsc --project ./ && cp -R assets dist/assets", + "build" : "npm run build:openapi; npm run build:project", + "database:migrate:create": "npx dotenv -e .env.development -- npx prisma migrate dev", + "database:migrate:dev" : "npx dotenv -e .env.development -- npx prisma migrate deploy", + "database:migrate:prod" : "npx prisma migrate deploy", + "database:seed:dev" : "npm run genversion; npm run build; npx dotenv -e .env.development -- npx prisma db seed", + "database:seed:prod" : "npm run genversion; npm run build; NODE_ENV=production npx prisma db seed", + "database:deploy:dev" : "npm run database:migrate:dev && npm run database:seed:dev", + "database:deploy:prod" : "npm run database:migrate:prod && npm run database:seed:prod", + "start:dev" : "npm run genversion; npx nodemon src/app.ts", + "start:prod" : "npm run genversion; NODE_ENV=production npx node --max-http-header-size=1048576 dist/src/app.js", + "start:migrate:prod" : "npm run genversion; npm run database:deploy:prod && npm run start:prod" }, "prisma" : { "seed": "node dist/prisma/seed" @@ -65,6 +69,7 @@ "@types/uuid" : "^9.0.7", "@typescript-eslint/eslint-plugin": "^6.13.2", "@typescript-eslint/parser" : "^6.13.2", + "dotenv-cli" : "^7.3.0", "dotenv-vault" : "^1.25.0", "genversion" : "^3.1.1", "nodemon" : "^3.0.2", diff --git a/ExpressAPI/prisma/seed.ts b/ExpressAPI/prisma/seed.ts index ec4b605c97444027c3ce74f6cde381da9b6d7f1e..20249cf1ee8d9779400f3483413eb0b10d643205 100644 --- a/ExpressAPI/prisma/seed.ts +++ b/ExpressAPI/prisma/seed.ts @@ -1,11 +1,30 @@ require('../src/InitialImports'); // ATTENTION : These lines MUST be the first of this file +import * as process from 'process'; +import SharedConfig from '../src/shared/config/SharedConfig'; import { UserRole } from '@prisma/client'; import logger from '../src/shared/logging/WinstonLogger'; import db from '../src/helpers/DatabaseHelper'; async function main() { + await users(); + await assignments(); + await exercises(); + await results(); +} + +main().then(async () => { + await db.$disconnect(); +}).catch(async (e) => { + logger.error(e); + await db.$disconnect(); + process.exit(1); +}); + +//---------------------------------------------------------------------------------------------------------------------------------------------------------- + +async function users() { await db.user.upsert({ where : { id: 142 }, update: {}, @@ -17,12 +36,1547 @@ async function main() { deleted : false } }); + await db.user.upsert({ + where : { id: 133 }, + update: {}, + create: { + id : 133, + gitlabUsername: 'orestis.malaspin', + gitlabLastInfo: {}, + role : UserRole.ADMIN, + deleted : false + } + }); + if ( !SharedConfig.production ) { + await db.user.upsert({ + where : { id: 627 }, + update: {}, + create: { + id : 627, + gitlabUsername: 'kelly.nguyen', + gitlabLastInfo: {}, + role : UserRole.ADMIN, + deleted : false + } + }); + await db.user.upsert({ + where : { id: 623 }, + update: {}, + create: { + id : 623, + gitlabUsername: 'bedran.sezer', + gitlabLastInfo: {}, + role : UserRole.ADMIN, + deleted : false + } + }); + await db.user.upsert({ + where : { id: 642 }, + update: {}, + create: { + id : 642, + gitlabUsername: 'vincent.steinman', + gitlabLastInfo: {}, + role : UserRole.ADMIN, + deleted : false + } + }); + } } -main().then(async () => { - await db.$disconnect(); -}).catch(async (e) => { - logger.error(e); - await db.$disconnect(); - process.exit(1); -}); \ No newline at end of file +async function assignments() { + if ( !SharedConfig.production ) { + await db.assignment.upsert({ + where : { name: 'c_hello_world' }, + update: {}, + create: { + name : 'c_hello_world', + gitlabId : 13862, + gitlabLink : 'https://gitedu.hesge.ch/dojodev/assignment/c_hello_world', + gitlabCreationInfo: { + 'id' : 13862, + 'description' : 'Dojo assignment repository.\n\nName of the assignment: c_hello_world', + 'name' : 'c_hello_world', + 'name_with_namespace' : 'DojoDev / Assignment / c_hello_world', + 'path' : 'c_hello_world', + 'path_with_namespace' : 'dojodev/assignment/c_hello_world', + 'created_at' : '2023-11-02T22:20:15.239+01:00', + 'default_branch' : 'main', + 'tag_list' : [], + 'topics' : [], + 'ssh_url_to_repo' : 'ssh://git@ssh.hesge.ch:10572/dojodev/assignment/c_hello_world.git', + 'http_url_to_repo' : 'https://gitedu.hesge.ch/dojodev/assignment/c_hello_world.git', + 'web_url' : 'https://gitedu.hesge.ch/dojodev/assignment/c_hello_world', + 'readme_url' : null, + 'forks_count' : 0, + 'avatar_url' : null, + 'star_count' : 0, + 'last_activity_at' : '2023-11-02T22:20:15.239+01:00', + 'namespace' : { + 'id' : 14190, + 'name' : 'Assignment', + 'path' : 'assignment', + 'kind' : 'group', + 'full_path' : 'dojodev/assignment', + 'parent_id' : 14189, + 'avatar_url': null, + 'web_url' : 'https://gitedu.hesge.ch/groups/dojodev/assignment' + }, + '_links' : { + 'self' : 'https://gitedu.hesge.ch/api/v4/projects/13862', + 'issues' : 'https://gitedu.hesge.ch/api/v4/projects/13862/issues', + 'merge_requests': 'https://gitedu.hesge.ch/api/v4/projects/13862/merge_requests', + 'repo_branches' : 'https://gitedu.hesge.ch/api/v4/projects/13862/repository/branches', + 'labels' : 'https://gitedu.hesge.ch/api/v4/projects/13862/labels', + 'events' : 'https://gitedu.hesge.ch/api/v4/projects/13862/events', + 'members' : 'https://gitedu.hesge.ch/api/v4/projects/13862/members', + 'cluster_agents': 'https://gitedu.hesge.ch/api/v4/projects/13862/cluster_agents' + }, + 'packages_enabled' : true, + 'empty_repo' : true, + 'archived' : false, + 'visibility' : 'private', + 'resolve_outdated_diff_discussions' : false, + 'container_expiration_policy' : { + 'cadence' : '1d', + 'enabled' : false, + 'keep_n' : 10, + 'older_than' : '90d', + 'name_regex' : '.*', + 'name_regex_keep': null, + 'next_run_at' : '2023-11-03T22:20:15.275+01:00' + }, + 'issues_enabled' : true, + 'merge_requests_enabled' : true, + 'wiki_enabled' : false, + 'jobs_enabled' : true, + 'snippets_enabled' : true, + 'container_registry_enabled' : true, + 'service_desk_enabled' : false, + 'service_desk_address' : null, + 'can_create_merge_request_in' : true, + 'issues_access_level' : 'enabled', + 'repository_access_level' : 'enabled', + 'merge_requests_access_level' : 'enabled', + 'forking_access_level' : 'enabled', + 'wiki_access_level' : 'disabled', + 'builds_access_level' : 'enabled', + 'snippets_access_level' : 'enabled', + 'pages_access_level' : 'private', + 'analytics_access_level' : 'enabled', + 'container_registry_access_level' : 'enabled', + 'security_and_compliance_access_level' : 'private', + 'releases_access_level' : 'enabled', + 'environments_access_level' : 'enabled', + 'feature_flags_access_level' : 'enabled', + 'infrastructure_access_level' : 'enabled', + 'monitor_access_level' : 'enabled', + 'emails_disabled' : null, + 'shared_runners_enabled' : true, + 'lfs_enabled' : true, + 'creator_id' : 1076, + 'import_url' : 'https://gitedu.hesge.ch/dojodev/template/empty_template.git', + 'import_type' : 'git', + 'import_status' : 'scheduled', + 'import_error' : null, + 'open_issues_count' : 0, + 'description_html' : '<p data-sourcepos="1:1-1:27" dir="auto">Dojo assignment repository.</p>\n<p data-sourcepos="3:1-3:37" dir="auto">Name of the assignment: c_hello_world</p>', + 'updated_at' : '2023-11-02T22:20:15.239+01:00', + 'ci_default_git_depth' : 20, + 'ci_forward_deployment_enabled' : true, + 'ci_job_token_scope_enabled' : false, + 'ci_separated_caches' : true, + 'ci_allow_fork_pipelines_to_run_in_parent_project': true, + 'build_git_strategy' : 'fetch', + 'keep_latest_artifact' : true, + 'restrict_user_defined_variables' : false, + 'runners_token' : 'GR1348941TZKVMY5xH7ecxwLxn1x7', + 'runner_token_expiration_interval' : null, + 'group_runners_enabled' : true, + 'auto_cancel_pending_pipelines' : 'enabled', + 'build_timeout' : 3600, + 'auto_devops_enabled' : false, + 'auto_devops_deploy_strategy' : 'continuous', + 'ci_config_path' : '', + 'public_jobs' : true, + 'shared_with_groups' : [], + 'only_allow_merge_if_pipeline_succeeds' : false, + 'allow_merge_on_skipped_pipeline' : null, + 'request_access_enabled' : true, + 'only_allow_merge_if_all_discussions_are_resolved': false, + 'remove_source_branch_after_merge' : true, + 'printing_merge_request_link_enabled' : true, + 'merge_method' : 'merge', + 'squash_option' : 'default_off', + 'enforce_auth_checks_on_uploads' : true, + 'suggestion_commit_message' : null, + 'merge_commit_template' : null, + 'squash_commit_template' : null, + 'issue_branch_template' : null, + 'autoclose_referenced_issues' : true + }, + gitlabLastInfo : { + 'id' : 13862, + 'description' : 'Dojo assignment repository.\n\nName of the assignment: c_hello_world', + 'name' : 'c_hello_world', + 'name_with_namespace' : 'DojoDev / Assignment / c_hello_world', + 'path' : 'c_hello_world', + 'path_with_namespace' : 'dojodev/assignment/c_hello_world', + 'created_at' : '2023-11-02T22:20:15.239+01:00', + 'default_branch' : 'main', + 'tag_list' : [], + 'topics' : [], + 'ssh_url_to_repo' : 'ssh://git@ssh.hesge.ch:10572/dojodev/assignment/c_hello_world.git', + 'http_url_to_repo' : 'https://gitedu.hesge.ch/dojodev/assignment/c_hello_world.git', + 'web_url' : 'https://gitedu.hesge.ch/dojodev/assignment/c_hello_world', + 'readme_url' : null, + 'forks_count' : 0, + 'avatar_url' : null, + 'star_count' : 0, + 'last_activity_at' : '2023-11-02T22:20:15.239+01:00', + 'namespace' : { + 'id' : 14190, + 'name' : 'Assignment', + 'path' : 'assignment', + 'kind' : 'group', + 'full_path' : 'dojodev/assignment', + 'parent_id' : 14189, + 'avatar_url': null, + 'web_url' : 'https://gitedu.hesge.ch/groups/dojodev/assignment' + }, + '_links' : { + 'self' : 'https://gitedu.hesge.ch/api/v4/projects/13862', + 'issues' : 'https://gitedu.hesge.ch/api/v4/projects/13862/issues', + 'merge_requests': 'https://gitedu.hesge.ch/api/v4/projects/13862/merge_requests', + 'repo_branches' : 'https://gitedu.hesge.ch/api/v4/projects/13862/repository/branches', + 'labels' : 'https://gitedu.hesge.ch/api/v4/projects/13862/labels', + 'events' : 'https://gitedu.hesge.ch/api/v4/projects/13862/events', + 'members' : 'https://gitedu.hesge.ch/api/v4/projects/13862/members', + 'cluster_agents': 'https://gitedu.hesge.ch/api/v4/projects/13862/cluster_agents' + }, + 'packages_enabled' : true, + 'empty_repo' : true, + 'archived' : false, + 'visibility' : 'private', + 'resolve_outdated_diff_discussions' : false, + 'container_expiration_policy' : { + 'cadence' : '1d', + 'enabled' : false, + 'keep_n' : 10, + 'older_than' : '90d', + 'name_regex' : '.*', + 'name_regex_keep': null, + 'next_run_at' : '2023-11-03T22:20:15.275+01:00' + }, + 'issues_enabled' : true, + 'merge_requests_enabled' : true, + 'wiki_enabled' : false, + 'jobs_enabled' : true, + 'snippets_enabled' : true, + 'container_registry_enabled' : true, + 'service_desk_enabled' : false, + 'service_desk_address' : null, + 'can_create_merge_request_in' : true, + 'issues_access_level' : 'enabled', + 'repository_access_level' : 'enabled', + 'merge_requests_access_level' : 'enabled', + 'forking_access_level' : 'enabled', + 'wiki_access_level' : 'disabled', + 'builds_access_level' : 'enabled', + 'snippets_access_level' : 'enabled', + 'pages_access_level' : 'private', + 'analytics_access_level' : 'enabled', + 'container_registry_access_level' : 'enabled', + 'security_and_compliance_access_level' : 'private', + 'releases_access_level' : 'enabled', + 'environments_access_level' : 'enabled', + 'feature_flags_access_level' : 'enabled', + 'infrastructure_access_level' : 'enabled', + 'monitor_access_level' : 'enabled', + 'emails_disabled' : null, + 'shared_runners_enabled' : true, + 'lfs_enabled' : true, + 'creator_id' : 1076, + 'import_url' : 'https://gitedu.hesge.ch/dojodev/template/empty_template.git', + 'import_type' : 'git', + 'import_status' : 'scheduled', + 'import_error' : null, + 'open_issues_count' : 0, + 'description_html' : '<p data-sourcepos="1:1-1:27" dir="auto">Dojo assignment repository.</p>\n<p data-sourcepos="3:1-3:37" dir="auto">Name of the assignment: c_hello_world</p>', + 'updated_at' : '2023-11-02T22:20:15.239+01:00', + 'ci_default_git_depth' : 20, + 'ci_forward_deployment_enabled' : true, + 'ci_job_token_scope_enabled' : false, + 'ci_separated_caches' : true, + 'ci_allow_fork_pipelines_to_run_in_parent_project': true, + 'build_git_strategy' : 'fetch', + 'keep_latest_artifact' : true, + 'restrict_user_defined_variables' : false, + 'runners_token' : 'GR1348941TZKVMY5xH7ecxwLxn1x7', + 'runner_token_expiration_interval' : null, + 'group_runners_enabled' : true, + 'auto_cancel_pending_pipelines' : 'enabled', + 'build_timeout' : 3600, + 'auto_devops_enabled' : false, + 'auto_devops_deploy_strategy' : 'continuous', + 'ci_config_path' : '', + 'public_jobs' : true, + 'shared_with_groups' : [], + 'only_allow_merge_if_pipeline_succeeds' : false, + 'allow_merge_on_skipped_pipeline' : null, + 'request_access_enabled' : true, + 'only_allow_merge_if_all_discussions_are_resolved': false, + 'remove_source_branch_after_merge' : true, + 'printing_merge_request_link_enabled' : true, + 'merge_method' : 'merge', + 'squash_option' : 'default_off', + 'enforce_auth_checks_on_uploads' : true, + 'suggestion_commit_message' : null, + 'merge_commit_template' : null, + 'squash_commit_template' : null, + 'issue_branch_template' : null, + 'autoclose_referenced_issues' : true + }, + gitlabLastInfoDate: new Date('2021-10-14T14:20:15.239Z'), + published : false + } + }); + await db.assignment.upsert({ + where : { name: 'Technique de compilation - TP' }, + update: {}, + create: { + name : 'Technique de compilation - TP', + gitlabId : 13893, + gitlabLink : 'https://gitedu.hesge.ch/dojodev/assignment/technique-de-compilation-tp', + gitlabCreationInfo: { + 'id' : 13893, + 'description' : 'Dojo assignment repository.\n\nName of the assignment: Technique de compilation - TP', + 'name' : 'Technique de compilation - TP', + 'name_with_namespace' : 'DojoDev / Assignment / Technique de compilation - TP', + 'path' : 'technique-de-compilation-tp', + 'path_with_namespace' : 'dojodev/assignment/technique-de-compilation-tp', + 'created_at' : '2023-11-07T21:35:48.454+01:00', + 'default_branch' : 'main', + 'tag_list' : [], + 'topics' : [], + 'ssh_url_to_repo' : 'ssh://git@ssh.hesge.ch:10572/dojodev/assignment/technique-de-compilation-tp.git', + 'http_url_to_repo' : 'https://gitedu.hesge.ch/dojodev/assignment/technique-de-compilation-tp.git', + 'web_url' : 'https://gitedu.hesge.ch/dojodev/assignment/technique-de-compilation-tp', + 'readme_url' : null, + 'forks_count' : 0, + 'avatar_url' : null, + 'star_count' : 0, + 'last_activity_at' : '2023-11-07T21:35:48.454+01:00', + 'namespace' : { + 'id' : 14190, + 'name' : 'Assignment', + 'path' : 'assignment', + 'kind' : 'group', + 'full_path' : 'dojodev/assignment', + 'parent_id' : 14189, + 'avatar_url': null, + 'web_url' : 'https://gitedu.hesge.ch/groups/dojodev/assignment' + }, + '_links' : { + 'self' : 'https://gitedu.hesge.ch/api/v4/projects/13893', + 'issues' : 'https://gitedu.hesge.ch/api/v4/projects/13893/issues', + 'merge_requests': 'https://gitedu.hesge.ch/api/v4/projects/13893/merge_requests', + 'repo_branches' : 'https://gitedu.hesge.ch/api/v4/projects/13893/repository/branches', + 'labels' : 'https://gitedu.hesge.ch/api/v4/projects/13893/labels', + 'events' : 'https://gitedu.hesge.ch/api/v4/projects/13893/events', + 'members' : 'https://gitedu.hesge.ch/api/v4/projects/13893/members', + 'cluster_agents': 'https://gitedu.hesge.ch/api/v4/projects/13893/cluster_agents' + }, + 'packages_enabled' : true, + 'empty_repo' : true, + 'archived' : false, + 'visibility' : 'private', + 'resolve_outdated_diff_discussions' : false, + 'container_expiration_policy' : { + 'cadence' : '1d', + 'enabled' : false, + 'keep_n' : 10, + 'older_than' : '90d', + 'name_regex' : '.*', + 'name_regex_keep': null, + 'next_run_at' : '2023-11-08T21:35:48.543+01:00' + }, + 'issues_enabled' : true, + 'merge_requests_enabled' : true, + 'wiki_enabled' : false, + 'jobs_enabled' : true, + 'snippets_enabled' : true, + 'container_registry_enabled' : true, + 'service_desk_enabled' : false, + 'service_desk_address' : null, + 'can_create_merge_request_in' : true, + 'issues_access_level' : 'enabled', + 'repository_access_level' : 'enabled', + 'merge_requests_access_level' : 'enabled', + 'forking_access_level' : 'enabled', + 'wiki_access_level' : 'disabled', + 'builds_access_level' : 'enabled', + 'snippets_access_level' : 'enabled', + 'pages_access_level' : 'private', + 'analytics_access_level' : 'enabled', + 'container_registry_access_level' : 'enabled', + 'security_and_compliance_access_level' : 'private', + 'releases_access_level' : 'enabled', + 'environments_access_level' : 'enabled', + 'feature_flags_access_level' : 'enabled', + 'infrastructure_access_level' : 'enabled', + 'monitor_access_level' : 'enabled', + 'emails_disabled' : null, + 'shared_runners_enabled' : true, + 'lfs_enabled' : true, + 'creator_id' : 1076, + 'import_url' : 'https://gitedu.hesge.ch/dojodev/template/empty_template.git', + 'import_type' : 'git', + 'import_status' : 'scheduled', + 'import_error' : null, + 'open_issues_count' : 0, + 'description_html' : '<p data-sourcepos="1:1-1:27" dir="auto">Dojo assignment repository.</p>\n<p data-sourcepos="3:1-3:53" dir="auto">Name of the assignment: Technique de compilation - TP</p>', + 'updated_at' : '2023-11-07T21:35:48.454+01:00', + 'ci_default_git_depth' : 20, + 'ci_forward_deployment_enabled' : true, + 'ci_job_token_scope_enabled' : false, + 'ci_separated_caches' : true, + 'ci_allow_fork_pipelines_to_run_in_parent_project': true, + 'build_git_strategy' : 'fetch', + 'keep_latest_artifact' : true, + 'restrict_user_defined_variables' : false, + 'runners_token' : 'GR1348941qn9Ju1u5yTSLoWUTWLZy', + 'runner_token_expiration_interval' : null, + 'group_runners_enabled' : true, + 'auto_cancel_pending_pipelines' : 'enabled', + 'build_timeout' : 3600, + 'auto_devops_enabled' : false, + 'auto_devops_deploy_strategy' : 'continuous', + 'ci_config_path' : '', + 'public_jobs' : true, + 'shared_with_groups' : [], + 'only_allow_merge_if_pipeline_succeeds' : false, + 'allow_merge_on_skipped_pipeline' : null, + 'request_access_enabled' : true, + 'only_allow_merge_if_all_discussions_are_resolved': false, + 'remove_source_branch_after_merge' : true, + 'printing_merge_request_link_enabled' : true, + 'merge_method' : 'merge', + 'squash_option' : 'default_off', + 'enforce_auth_checks_on_uploads' : true, + 'suggestion_commit_message' : null, + 'merge_commit_template' : null, + 'squash_commit_template' : null, + 'issue_branch_template' : null, + 'autoclose_referenced_issues' : true + }, + gitlabLastInfo : { + 'id' : 13893, + 'description' : 'Dojo assignment repository.\n\nName of the assignment: Technique de compilation - TP', + 'name' : 'Technique de compilation - TP', + 'name_with_namespace' : 'DojoDev / Assignment / Technique de compilation - TP', + 'path' : 'technique-de-compilation-tp', + 'path_with_namespace' : 'dojodev/assignment/technique-de-compilation-tp', + 'created_at' : '2023-11-07T21:35:48.454+01:00', + 'default_branch' : 'main', + 'tag_list' : [], + 'topics' : [], + 'ssh_url_to_repo' : 'ssh://git@ssh.hesge.ch:10572/dojodev/assignment/technique-de-compilation-tp.git', + 'http_url_to_repo' : 'https://gitedu.hesge.ch/dojodev/assignment/technique-de-compilation-tp.git', + 'web_url' : 'https://gitedu.hesge.ch/dojodev/assignment/technique-de-compilation-tp', + 'readme_url' : null, + 'forks_count' : 0, + 'avatar_url' : null, + 'star_count' : 0, + 'last_activity_at' : '2023-11-07T21:35:48.454+01:00', + 'namespace' : { + 'id' : 14190, + 'name' : 'Assignment', + 'path' : 'assignment', + 'kind' : 'group', + 'full_path' : 'dojodev/assignment', + 'parent_id' : 14189, + 'avatar_url': null, + 'web_url' : 'https://gitedu.hesge.ch/groups/dojodev/assignment' + }, + '_links' : { + 'self' : 'https://gitedu.hesge.ch/api/v4/projects/13893', + 'issues' : 'https://gitedu.hesge.ch/api/v4/projects/13893/issues', + 'merge_requests': 'https://gitedu.hesge.ch/api/v4/projects/13893/merge_requests', + 'repo_branches' : 'https://gitedu.hesge.ch/api/v4/projects/13893/repository/branches', + 'labels' : 'https://gitedu.hesge.ch/api/v4/projects/13893/labels', + 'events' : 'https://gitedu.hesge.ch/api/v4/projects/13893/events', + 'members' : 'https://gitedu.hesge.ch/api/v4/projects/13893/members', + 'cluster_agents': 'https://gitedu.hesge.ch/api/v4/projects/13893/cluster_agents' + }, + 'packages_enabled' : true, + 'empty_repo' : true, + 'archived' : false, + 'visibility' : 'private', + 'resolve_outdated_diff_discussions' : false, + 'container_expiration_policy' : { + 'cadence' : '1d', + 'enabled' : false, + 'keep_n' : 10, + 'older_than' : '90d', + 'name_regex' : '.*', + 'name_regex_keep': null, + 'next_run_at' : '2023-11-08T21:35:48.543+01:00' + }, + 'issues_enabled' : true, + 'merge_requests_enabled' : true, + 'wiki_enabled' : false, + 'jobs_enabled' : true, + 'snippets_enabled' : true, + 'container_registry_enabled' : true, + 'service_desk_enabled' : false, + 'service_desk_address' : null, + 'can_create_merge_request_in' : true, + 'issues_access_level' : 'enabled', + 'repository_access_level' : 'enabled', + 'merge_requests_access_level' : 'enabled', + 'forking_access_level' : 'enabled', + 'wiki_access_level' : 'disabled', + 'builds_access_level' : 'enabled', + 'snippets_access_level' : 'enabled', + 'pages_access_level' : 'private', + 'analytics_access_level' : 'enabled', + 'container_registry_access_level' : 'enabled', + 'security_and_compliance_access_level' : 'private', + 'releases_access_level' : 'enabled', + 'environments_access_level' : 'enabled', + 'feature_flags_access_level' : 'enabled', + 'infrastructure_access_level' : 'enabled', + 'monitor_access_level' : 'enabled', + 'emails_disabled' : null, + 'shared_runners_enabled' : true, + 'lfs_enabled' : true, + 'creator_id' : 1076, + 'import_url' : 'https://gitedu.hesge.ch/dojodev/template/empty_template.git', + 'import_type' : 'git', + 'import_status' : 'scheduled', + 'import_error' : null, + 'open_issues_count' : 0, + 'description_html' : '<p data-sourcepos="1:1-1:27" dir="auto">Dojo assignment repository.</p>\n<p data-sourcepos="3:1-3:53" dir="auto">Name of the assignment: Technique de compilation - TP</p>', + 'updated_at' : '2023-11-07T21:35:48.454+01:00', + 'ci_default_git_depth' : 20, + 'ci_forward_deployment_enabled' : true, + 'ci_job_token_scope_enabled' : false, + 'ci_separated_caches' : true, + 'ci_allow_fork_pipelines_to_run_in_parent_project': true, + 'build_git_strategy' : 'fetch', + 'keep_latest_artifact' : true, + 'restrict_user_defined_variables' : false, + 'runners_token' : 'GR1348941qn9Ju1u5yTSLoWUTWLZy', + 'runner_token_expiration_interval' : null, + 'group_runners_enabled' : true, + 'auto_cancel_pending_pipelines' : 'enabled', + 'build_timeout' : 3600, + 'auto_devops_enabled' : false, + 'auto_devops_deploy_strategy' : 'continuous', + 'ci_config_path' : '', + 'public_jobs' : true, + 'shared_with_groups' : [], + 'only_allow_merge_if_pipeline_succeeds' : false, + 'allow_merge_on_skipped_pipeline' : null, + 'request_access_enabled' : true, + 'only_allow_merge_if_all_discussions_are_resolved': false, + 'remove_source_branch_after_merge' : true, + 'printing_merge_request_link_enabled' : true, + 'merge_method' : 'merge', + 'squash_option' : 'default_off', + 'enforce_auth_checks_on_uploads' : true, + 'suggestion_commit_message' : null, + 'merge_commit_template' : null, + 'squash_commit_template' : null, + 'issue_branch_template' : null, + 'autoclose_referenced_issues' : true + }, + gitlabLastInfoDate: new Date('2023-11-07T20:35:54.692Z'), + published : true + } + }); + } +} + +async function exercises() { + if ( !SharedConfig.production ) { + await db.exercise.upsert({ + where : { id: 'dc7e1433-23f8-4c8a-a7f3-478b65fa9815' }, + update: {}, + create: { + id : 'dc7e1433-23f8-4c8a-a7f3-478b65fa9815', + assignmentName : 'Technique de compilation - TP', + name : 'DojoEx - Technique de compilation - TP - michael.minelli', + gitlabId : 14232, + gitlabLink : 'https://gitedu.hesge.ch/dojodev/exercise/dojo-ex_technique-de-compilation-tp_dc7e1433-23f8-4c8a-a7f3-478b65fa9815', + gitlabCreationInfo: { + 'id' : 14232, + 'description' : 'Dojo exercise repository based on the the assignment: Technique de compilation - TP', + 'name' : 'DojoEx - Technique de compilation - TP - michael.minelli', + 'name_with_namespace' : 'DojoDev / Exercise / DojoEx - Technique de compilation - TP - michael.minelli', + 'path' : 'dojo-ex_technique-de-compilation-tp_dc7e1433-23f8-4c8a-a7f3-478b65fa9815', + 'path_with_namespace' : 'dojodev/exercise/dojo-ex_technique-de-compilation-tp_dc7e1433-23f8-4c8a-a7f3-478b65fa9815', + 'created_at' : '2023-12-14T17:58:48.185+01:00', + 'default_branch' : 'main', + 'tag_list' : [], + 'topics' : [], + 'ssh_url_to_repo' : 'ssh://git@ssh.hesge.ch:10572/dojodev/exercise/dojo-ex_technique-de-compilation-tp_dc7e1433-23f8-4c8a-a7f3-478b65fa9815.git', + 'http_url_to_repo' : 'https://gitedu.hesge.ch/dojodev/exercise/dojo-ex_technique-de-compilation-tp_dc7e1433-23f8-4c8a-a7f3-478b65fa9815.git', + 'web_url' : 'https://gitedu.hesge.ch/dojodev/exercise/dojo-ex_technique-de-compilation-tp_dc7e1433-23f8-4c8a-a7f3-478b65fa9815', + 'readme_url' : null, + 'forks_count' : 0, + 'avatar_url' : null, + 'star_count' : 0, + 'last_activity_at' : '2023-12-14T17:58:48.185+01:00', + 'namespace' : { + 'id' : 14191, + 'name' : 'Exercise', + 'path' : 'exercise', + 'kind' : 'group', + 'full_path' : 'dojodev/exercise', + 'parent_id' : 14189, + 'avatar_url': null, + 'web_url' : 'https://gitedu.hesge.ch/groups/dojodev/exercise' + }, + '_links' : { + 'self' : 'https://gitedu.hesge.ch/api/v4/projects/14232', + 'issues' : 'https://gitedu.hesge.ch/api/v4/projects/14232/issues', + 'merge_requests': 'https://gitedu.hesge.ch/api/v4/projects/14232/merge_requests', + 'repo_branches' : 'https://gitedu.hesge.ch/api/v4/projects/14232/repository/branches', + 'labels' : 'https://gitedu.hesge.ch/api/v4/projects/14232/labels', + 'events' : 'https://gitedu.hesge.ch/api/v4/projects/14232/events', + 'members' : 'https://gitedu.hesge.ch/api/v4/projects/14232/members', + 'cluster_agents': 'https://gitedu.hesge.ch/api/v4/projects/14232/cluster_agents' + }, + 'packages_enabled' : true, + 'empty_repo' : true, + 'archived' : false, + 'visibility' : 'private', + 'resolve_outdated_diff_discussions' : false, + 'container_expiration_policy' : { + 'cadence' : '1d', + 'enabled' : false, + 'keep_n' : 10, + 'older_than' : '90d', + 'name_regex' : '.*', + 'name_regex_keep': null, + 'next_run_at' : '2023-12-15T17:58:48.207+01:00' + }, + 'issues_enabled' : true, + 'merge_requests_enabled' : true, + 'wiki_enabled' : false, + 'jobs_enabled' : true, + 'snippets_enabled' : true, + 'container_registry_enabled' : true, + 'service_desk_enabled' : false, + 'service_desk_address' : null, + 'can_create_merge_request_in' : true, + 'issues_access_level' : 'enabled', + 'repository_access_level' : 'enabled', + 'merge_requests_access_level' : 'enabled', + 'forking_access_level' : 'enabled', + 'wiki_access_level' : 'disabled', + 'builds_access_level' : 'enabled', + 'snippets_access_level' : 'enabled', + 'pages_access_level' : 'private', + 'analytics_access_level' : 'enabled', + 'container_registry_access_level' : 'enabled', + 'security_and_compliance_access_level' : 'private', + 'releases_access_level' : 'enabled', + 'environments_access_level' : 'enabled', + 'feature_flags_access_level' : 'enabled', + 'infrastructure_access_level' : 'enabled', + 'monitor_access_level' : 'enabled', + 'emails_disabled' : null, + 'shared_runners_enabled' : true, + 'lfs_enabled' : true, + 'creator_id' : 1076, + 'forked_from_project' : { + 'id' : 13893, + 'description' : 'Dojo assignment repository.\n\nName of the assignment: Technique de compilation - TP', + 'name' : 'Technique de compilation - TP', + 'name_with_namespace': 'DojoDev / Assignment / Technique de compilation - TP', + 'path' : 'technique-de-compilation-tp', + 'path_with_namespace': 'dojodev/assignment/technique-de-compilation-tp', + 'created_at' : '2023-11-07T21:35:48.454+01:00', + 'default_branch' : 'main', + 'tag_list' : [], + 'topics' : [], + 'ssh_url_to_repo' : 'ssh://git@ssh.hesge.ch:10572/dojodev/assignment/technique-de-compilation-tp.git', + 'http_url_to_repo' : 'https://gitedu.hesge.ch/dojodev/assignment/technique-de-compilation-tp.git', + 'web_url' : 'https://gitedu.hesge.ch/dojodev/assignment/technique-de-compilation-tp', + 'readme_url' : 'https://gitedu.hesge.ch/dojodev/assignment/technique-de-compilation-tp/-/blob/main/README.md', + 'forks_count' : 1, + 'avatar_url' : null, + 'star_count' : 0, + 'last_activity_at' : '2023-11-14T13:14:13.820+01:00', + 'namespace' : { + 'id' : 14190, + 'name' : 'Assignment', + 'path' : 'assignment', + 'kind' : 'group', + 'full_path' : 'dojodev/assignment', + 'parent_id' : 14189, + 'avatar_url': null, + 'web_url' : 'https://gitedu.hesge.ch/groups/dojodev/assignment' + } + }, + 'mr_default_target_self' : false, + 'import_url' : null, + 'import_type' : null, + 'import_status' : 'scheduled', + 'import_error' : null, + 'open_issues_count' : 0, + 'description_html' : '<p data-sourcepos="1:1-1:83" dir="auto">Dojo exercise repository based on the the assignment: Technique de compilation - TP</p>', + 'updated_at' : '2023-12-14T17:58:48.185+01:00', + 'ci_default_git_depth' : 20, + 'ci_forward_deployment_enabled' : true, + 'ci_job_token_scope_enabled' : false, + 'ci_separated_caches' : true, + 'ci_allow_fork_pipelines_to_run_in_parent_project': true, + 'build_git_strategy' : 'fetch', + 'keep_latest_artifact' : true, + 'restrict_user_defined_variables' : false, + 'runners_token' : 'GR1348941tdWz3ZxaqbRBmjL5A6r2', + 'runner_token_expiration_interval' : null, + 'group_runners_enabled' : true, + 'auto_cancel_pending_pipelines' : 'enabled', + 'build_timeout' : 3600, + 'auto_devops_enabled' : false, + 'auto_devops_deploy_strategy' : 'continuous', + 'ci_config_path' : '', + 'public_jobs' : true, + 'shared_with_groups' : [], + 'only_allow_merge_if_pipeline_succeeds' : false, + 'allow_merge_on_skipped_pipeline' : null, + 'request_access_enabled' : true, + 'only_allow_merge_if_all_discussions_are_resolved': false, + 'remove_source_branch_after_merge' : true, + 'printing_merge_request_link_enabled' : true, + 'merge_method' : 'merge', + 'squash_option' : 'default_off', + 'enforce_auth_checks_on_uploads' : true, + 'suggestion_commit_message' : null, + 'merge_commit_template' : null, + 'squash_commit_template' : null, + 'issue_branch_template' : null, + 'autoclose_referenced_issues' : true + }, + gitlabLastInfo : { + 'id' : 14232, + 'description' : 'Dojo exercise repository based on the the assignment: Technique de compilation - TP', + 'name' : 'DojoEx - Technique de compilation - TP - michael.minelli', + 'name_with_namespace' : 'DojoDev / Exercise / DojoEx - Technique de compilation - TP - michael.minelli', + 'path' : 'dojo-ex_technique-de-compilation-tp_dc7e1433-23f8-4c8a-a7f3-478b65fa9815', + 'path_with_namespace' : 'dojodev/exercise/dojo-ex_technique-de-compilation-tp_dc7e1433-23f8-4c8a-a7f3-478b65fa9815', + 'created_at' : '2023-12-14T17:58:48.185+01:00', + 'default_branch' : 'main', + 'tag_list' : [], + 'topics' : [], + 'ssh_url_to_repo' : 'ssh://git@ssh.hesge.ch:10572/dojodev/exercise/dojo-ex_technique-de-compilation-tp_dc7e1433-23f8-4c8a-a7f3-478b65fa9815.git', + 'http_url_to_repo' : 'https://gitedu.hesge.ch/dojodev/exercise/dojo-ex_technique-de-compilation-tp_dc7e1433-23f8-4c8a-a7f3-478b65fa9815.git', + 'web_url' : 'https://gitedu.hesge.ch/dojodev/exercise/dojo-ex_technique-de-compilation-tp_dc7e1433-23f8-4c8a-a7f3-478b65fa9815', + 'readme_url' : null, + 'forks_count' : 0, + 'avatar_url' : null, + 'star_count' : 0, + 'last_activity_at' : '2023-12-14T17:58:48.185+01:00', + 'namespace' : { + 'id' : 14191, + 'name' : 'Exercise', + 'path' : 'exercise', + 'kind' : 'group', + 'full_path' : 'dojodev/exercise', + 'parent_id' : 14189, + 'avatar_url': null, + 'web_url' : 'https://gitedu.hesge.ch/groups/dojodev/exercise' + }, + '_links' : { + 'self' : 'https://gitedu.hesge.ch/api/v4/projects/14232', + 'issues' : 'https://gitedu.hesge.ch/api/v4/projects/14232/issues', + 'merge_requests': 'https://gitedu.hesge.ch/api/v4/projects/14232/merge_requests', + 'repo_branches' : 'https://gitedu.hesge.ch/api/v4/projects/14232/repository/branches', + 'labels' : 'https://gitedu.hesge.ch/api/v4/projects/14232/labels', + 'events' : 'https://gitedu.hesge.ch/api/v4/projects/14232/events', + 'members' : 'https://gitedu.hesge.ch/api/v4/projects/14232/members', + 'cluster_agents': 'https://gitedu.hesge.ch/api/v4/projects/14232/cluster_agents' + }, + 'packages_enabled' : true, + 'empty_repo' : true, + 'archived' : false, + 'visibility' : 'private', + 'resolve_outdated_diff_discussions' : false, + 'container_expiration_policy' : { + 'cadence' : '1d', + 'enabled' : false, + 'keep_n' : 10, + 'older_than' : '90d', + 'name_regex' : '.*', + 'name_regex_keep': null, + 'next_run_at' : '2023-12-15T17:58:48.207+01:00' + }, + 'issues_enabled' : true, + 'merge_requests_enabled' : true, + 'wiki_enabled' : false, + 'jobs_enabled' : true, + 'snippets_enabled' : true, + 'container_registry_enabled' : true, + 'service_desk_enabled' : false, + 'service_desk_address' : null, + 'can_create_merge_request_in' : true, + 'issues_access_level' : 'enabled', + 'repository_access_level' : 'enabled', + 'merge_requests_access_level' : 'enabled', + 'forking_access_level' : 'enabled', + 'wiki_access_level' : 'disabled', + 'builds_access_level' : 'enabled', + 'snippets_access_level' : 'enabled', + 'pages_access_level' : 'private', + 'analytics_access_level' : 'enabled', + 'container_registry_access_level' : 'enabled', + 'security_and_compliance_access_level' : 'private', + 'releases_access_level' : 'enabled', + 'environments_access_level' : 'enabled', + 'feature_flags_access_level' : 'enabled', + 'infrastructure_access_level' : 'enabled', + 'monitor_access_level' : 'enabled', + 'emails_disabled' : null, + 'shared_runners_enabled' : true, + 'lfs_enabled' : true, + 'creator_id' : 1076, + 'forked_from_project' : { + 'id' : 13893, + 'description' : 'Dojo assignment repository.\n\nName of the assignment: Technique de compilation - TP', + 'name' : 'Technique de compilation - TP', + 'name_with_namespace': 'DojoDev / Assignment / Technique de compilation - TP', + 'path' : 'technique-de-compilation-tp', + 'path_with_namespace': 'dojodev/assignment/technique-de-compilation-tp', + 'created_at' : '2023-11-07T21:35:48.454+01:00', + 'default_branch' : 'main', + 'tag_list' : [], + 'topics' : [], + 'ssh_url_to_repo' : 'ssh://git@ssh.hesge.ch:10572/dojodev/assignment/technique-de-compilation-tp.git', + 'http_url_to_repo' : 'https://gitedu.hesge.ch/dojodev/assignment/technique-de-compilation-tp.git', + 'web_url' : 'https://gitedu.hesge.ch/dojodev/assignment/technique-de-compilation-tp', + 'readme_url' : 'https://gitedu.hesge.ch/dojodev/assignment/technique-de-compilation-tp/-/blob/main/README.md', + 'forks_count' : 1, + 'avatar_url' : null, + 'star_count' : 0, + 'last_activity_at' : '2023-11-14T13:14:13.820+01:00', + 'namespace' : { + 'id' : 14190, + 'name' : 'Assignment', + 'path' : 'assignment', + 'kind' : 'group', + 'full_path' : 'dojodev/assignment', + 'parent_id' : 14189, + 'avatar_url': null, + 'web_url' : 'https://gitedu.hesge.ch/groups/dojodev/assignment' + } + }, + 'mr_default_target_self' : false, + 'import_url' : null, + 'import_type' : null, + 'import_status' : 'scheduled', + 'import_error' : null, + 'open_issues_count' : 0, + 'description_html' : '<p data-sourcepos="1:1-1:83" dir="auto">Dojo exercise repository based on the the assignment: Technique de compilation - TP</p>', + 'updated_at' : '2023-12-14T17:58:48.185+01:00', + 'ci_default_git_depth' : 20, + 'ci_forward_deployment_enabled' : true, + 'ci_job_token_scope_enabled' : false, + 'ci_separated_caches' : true, + 'ci_allow_fork_pipelines_to_run_in_parent_project': true, + 'build_git_strategy' : 'fetch', + 'keep_latest_artifact' : true, + 'restrict_user_defined_variables' : false, + 'runners_token' : 'GR1348941tdWz3ZxaqbRBmjL5A6r2', + 'runner_token_expiration_interval' : null, + 'group_runners_enabled' : true, + 'auto_cancel_pending_pipelines' : 'enabled', + 'build_timeout' : 3600, + 'auto_devops_enabled' : false, + 'auto_devops_deploy_strategy' : 'continuous', + 'ci_config_path' : '', + 'public_jobs' : true, + 'shared_with_groups' : [], + 'only_allow_merge_if_pipeline_succeeds' : false, + 'allow_merge_on_skipped_pipeline' : null, + 'request_access_enabled' : true, + 'only_allow_merge_if_all_discussions_are_resolved': false, + 'remove_source_branch_after_merge' : true, + 'printing_merge_request_link_enabled' : true, + 'merge_method' : 'merge', + 'squash_option' : 'default_off', + 'enforce_auth_checks_on_uploads' : true, + 'suggestion_commit_message' : null, + 'merge_commit_template' : null, + 'squash_commit_template' : null, + 'issue_branch_template' : null, + 'autoclose_referenced_issues' : true + }, + gitlabLastInfoDate: new Date('2023-12-14T14:54:35.692Z'), + secret : 'ea01568d-2b84-49b7-8603-7d58346f21c6' + } + }); + } +} + +async function results() { + if ( !SharedConfig.production ) { + await db.result.upsert({ + where : { + exerciseId_dateTime: { + exerciseId: 'dc7e1433-23f8-4c8a-a7f3-478b65fa9815', + dateTime : new Date('2023-12-14T14:55:35.692Z') + } + }, + update: {}, + create: { + exerciseId: 'dc7e1433-23f8-4c8a-a7f3-478b65fa9815', + dateTime : new Date('2023-12-14T14:55:35.692Z'), + commit : { + 'shortSha' : '0444bfb5', + 'description' : '', + 'refName' : 'main', + 'refProtected': 'true', + 'sha' : '0444bfb5e986a15b9dadd96c06a6e08b92d230b4', + 'timestamp' : '2023-12-08T13:57:37+01:00', + 'title' : 'Add .gitlab-ci.yml (DO NOT MODIFY THIS FILE)', + 'author' : 'Dojo <hepia.dojo@protonmail.com>', + 'branch' : 'main', + 'refSlug' : 'main', + 'beforeSha' : '2a48bd3c2cc2f810bf10d2b948acab9229253068', + 'message' : 'Add .gitlab-ci.yml (DO NOT MODIFY THIS FILE)' + }, + exitCode : 1, + files : [ { + 'mode' : 33188, + 'size' : 10546, + 'mtime' : '2023-12-08T12:58:31.109Z', + 'birthtime': '2023-12-08T12:58:31.109Z', + 'ext' : 'txt', + 'name' : 'dockerComposeLogs.txt', + 'path' : 'Dojo/dockerComposeLogs.txt' + }, { + 'mode' : 33188, + 'size' : 493, + 'mtime' : '2023-12-08T12:58:31.562Z', + 'birthtime': '2023-12-08T12:58:31.562Z', + 'ext' : 'json', + 'name' : 'results.json', + 'path' : 'Dojo/results.json' + }, { + 'mode' : 33188, + 'size' : 5593, + 'mtime' : '2023-12-08T12:58:30.891Z', + 'birthtime': '2023-12-08T12:58:30.891Z', + 'ext' : 'txt', + 'name' : 'detailedResults.txt', + 'path' : 'Exercise/detailedResults.txt' + }, { + 'mode' : 33188, + 'size' : 149, + 'mtime' : '2023-12-08T12:58:25.855Z', + 'birthtime': '2023-12-08T12:58:30.892Z', + 'ext' : 'bytecode', + 'name' : 'test_1.bytecode', + 'path' : 'Exercise/TestsResults/test_1.bytecode' + }, { + 'mode' : 33188, + 'size' : 1, + 'mtime' : '2023-12-08T12:58:25.983Z', + 'birthtime': '2023-12-08T12:58:30.892Z', + 'ext' : 'output', + 'name' : 'test_1.output', + 'path' : 'Exercise/TestsResults/test_1.output' + }, { + 'mode' : 33188, + 'size' : 468, + 'mtime' : '2023-12-08T12:58:25.702Z', + 'birthtime': '2023-12-08T12:58:30.892Z', + 'ext' : 'source', + 'name' : 'test_1.source', + 'path' : 'Exercise/TestsResults/test_1.source' + }, { + 'mode' : 33188, + 'size' : 149, + 'mtime' : '2023-12-08T12:58:30.247Z', + 'birthtime': '2023-12-08T12:58:30.894Z', + 'ext' : 'bytecode', + 'name' : 'test_10.bytecode', + 'path' : 'Exercise/TestsResults/test_10.bytecode' + }, { + 'mode' : 33188, + 'size' : 1, + 'mtime' : '2023-12-08T12:58:30.376Z', + 'birthtime': '2023-12-08T12:58:30.894Z', + 'ext' : 'output', + 'name' : 'test_10.output', + 'path' : 'Exercise/TestsResults/test_10.output' + }, { + 'mode' : 33188, + 'size' : 468, + 'mtime' : '2023-12-08T12:58:30.098Z', + 'birthtime': '2023-12-08T12:58:30.894Z', + 'ext' : 'source', + 'name' : 'test_10.source', + 'path' : 'Exercise/TestsResults/test_10.source' + }, { + 'mode' : 33188, + 'size' : 149, + 'mtime' : '2023-12-08T12:58:30.737Z', + 'birthtime': '2023-12-08T12:58:30.894Z', + 'ext' : 'bytecode', + 'name' : 'test_11.bytecode', + 'path' : 'Exercise/TestsResults/test_11.bytecode' + }, { + 'mode' : 33188, + 'size' : 468, + 'mtime' : '2023-12-08T12:58:30.584Z', + 'birthtime': '2023-12-08T12:58:30.894Z', + 'ext' : 'source', + 'name' : 'test_11.source', + 'path' : 'Exercise/TestsResults/test_11.source' + }, { + 'mode' : 33188, + 'size' : 1, + 'mtime' : '2023-12-08T12:58:30.890Z', + 'birthtime': '2023-12-08T12:58:30.894Z', + 'ext' : 'output', + 'name' : 'test_11.output', + 'path' : 'Exercise/TestsResults/test_11.output' + }, { + 'mode' : 33188, + 'size' : 149, + 'mtime' : '2023-12-08T12:58:26.322Z', + 'birthtime': '2023-12-08T12:58:30.892Z', + 'ext' : 'bytecode', + 'name' : 'test_2.bytecode', + 'path' : 'Exercise/TestsResults/test_2.bytecode' + }, { + 'mode' : 33188, + 'size' : 1, + 'mtime' : '2023-12-08T12:58:26.455Z', + 'birthtime': '2023-12-08T12:58:30.892Z', + 'ext' : 'output', + 'name' : 'test_2.output', + 'path' : 'Exercise/TestsResults/test_2.output' + }, { + 'mode' : 33188, + 'size' : 639, + 'mtime' : '2023-12-08T12:58:26.178Z', + 'birthtime': '2023-12-08T12:58:30.892Z', + 'ext' : 'source', + 'name' : 'test_2.source', + 'path' : 'Exercise/TestsResults/test_2.source' + }, { + 'mode' : 33188, + 'size' : 149, + 'mtime' : '2023-12-08T12:58:26.781Z', + 'birthtime': '2023-12-08T12:58:30.892Z', + 'ext' : 'bytecode', + 'name' : 'test_3.bytecode', + 'path' : 'Exercise/TestsResults/test_3.bytecode' + }, { + 'mode' : 33188, + 'size' : 1, + 'mtime' : '2023-12-08T12:58:26.884Z', + 'birthtime': '2023-12-08T12:58:30.892Z', + 'ext' : 'output', + 'name' : 'test_3.output', + 'path' : 'Exercise/TestsResults/test_3.output' + }, { + 'mode' : 33188, + 'size' : 468, + 'mtime' : '2023-12-08T12:58:26.637Z', + 'birthtime': '2023-12-08T12:58:30.892Z', + 'ext' : 'source', + 'name' : 'test_3.source', + 'path' : 'Exercise/TestsResults/test_3.source' + }, { + 'mode' : 33188, + 'size' : 149, + 'mtime' : '2023-12-08T12:58:27.228Z', + 'birthtime': '2023-12-08T12:58:30.893Z', + 'ext' : 'bytecode', + 'name' : 'test_4.bytecode', + 'path' : 'Exercise/TestsResults/test_4.bytecode' + }, { + 'mode' : 33188, + 'size' : 1, + 'mtime' : '2023-12-08T12:58:27.331Z', + 'birthtime': '2023-12-08T12:58:30.893Z', + 'ext' : 'output', + 'name' : 'test_4.output', + 'path' : 'Exercise/TestsResults/test_4.output' + }, { + 'mode' : 33188, + 'size' : 468, + 'mtime' : '2023-12-08T12:58:27.092Z', + 'birthtime': '2023-12-08T12:58:30.893Z', + 'ext' : 'source', + 'name' : 'test_4.source', + 'path' : 'Exercise/TestsResults/test_4.source' + }, { + 'mode' : 33188, + 'size' : 149, + 'mtime' : '2023-12-08T12:58:27.688Z', + 'birthtime': '2023-12-08T12:58:30.893Z', + 'ext' : 'bytecode', + 'name' : 'test_5.bytecode', + 'path' : 'Exercise/TestsResults/test_5.bytecode' + }, { + 'mode' : 33188, + 'size' : 1, + 'mtime' : '2023-12-08T12:58:27.820Z', + 'birthtime': '2023-12-08T12:58:30.893Z', + 'ext' : 'output', + 'name' : 'test_5.output', + 'path' : 'Exercise/TestsResults/test_5.output' + }, { + 'mode' : 33188, + 'size' : 639, + 'mtime' : '2023-12-08T12:58:27.533Z', + 'birthtime': '2023-12-08T12:58:30.893Z', + 'ext' : 'source', + 'name' : 'test_5.source', + 'path' : 'Exercise/TestsResults/test_5.source' + }, { + 'mode' : 33188, + 'size' : 149, + 'mtime' : '2023-12-08T12:58:28.177Z', + 'birthtime': '2023-12-08T12:58:30.893Z', + 'ext' : 'bytecode', + 'name' : 'test_6.bytecode', + 'path' : 'Exercise/TestsResults/test_6.bytecode' + }, { + 'mode' : 33188, + 'size' : 1, + 'mtime' : '2023-12-08T12:58:28.322Z', + 'birthtime': '2023-12-08T12:58:30.893Z', + 'ext' : 'output', + 'name' : 'test_6.output', + 'path' : 'Exercise/TestsResults/test_6.output' + }, { + 'mode' : 33188, + 'size' : 639, + 'mtime' : '2023-12-08T12:58:28.033Z', + 'birthtime': '2023-12-08T12:58:30.893Z', + 'ext' : 'source', + 'name' : 'test_6.source', + 'path' : 'Exercise/TestsResults/test_6.source' + }, { + 'mode' : 33188, + 'size' : 149, + 'mtime' : '2023-12-08T12:58:28.696Z', + 'birthtime': '2023-12-08T12:58:30.893Z', + 'ext' : 'bytecode', + 'name' : 'test_7.bytecode', + 'path' : 'Exercise/TestsResults/test_7.bytecode' + }, { + 'mode' : 33188, + 'size' : 1, + 'mtime' : '2023-12-08T12:58:28.871Z', + 'birthtime': '2023-12-08T12:58:30.893Z', + 'ext' : 'output', + 'name' : 'test_7.output', + 'path' : 'Exercise/TestsResults/test_7.output' + }, { + 'mode' : 33188, + 'size' : 468, + 'mtime' : '2023-12-08T12:58:28.538Z', + 'birthtime': '2023-12-08T12:58:30.893Z', + 'ext' : 'source', + 'name' : 'test_7.source', + 'path' : 'Exercise/TestsResults/test_7.source' + }, { + 'mode' : 33188, + 'size' : 149, + 'mtime' : '2023-12-08T12:58:29.229Z', + 'birthtime': '2023-12-08T12:58:30.893Z', + 'ext' : 'bytecode', + 'name' : 'test_8.bytecode', + 'path' : 'Exercise/TestsResults/test_8.bytecode' + }, { + 'mode' : 33188, + 'size' : 1, + 'mtime' : '2023-12-08T12:58:29.352Z', + 'birthtime': '2023-12-08T12:58:30.893Z', + 'ext' : 'output', + 'name' : 'test_8.output', + 'path' : 'Exercise/TestsResults/test_8.output' + }, { + 'mode' : 33188, + 'size' : 468, + 'mtime' : '2023-12-08T12:58:29.087Z', + 'birthtime': '2023-12-08T12:58:30.893Z', + 'ext' : 'source', + 'name' : 'test_8.source', + 'path' : 'Exercise/TestsResults/test_8.source' + }, { + 'mode' : 33188, + 'size' : 149, + 'mtime' : '2023-12-08T12:58:29.723Z', + 'birthtime': '2023-12-08T12:58:30.894Z', + 'ext' : 'bytecode', + 'name' : 'test_9.bytecode', + 'path' : 'Exercise/TestsResults/test_9.bytecode' + }, { + 'mode' : 33188, + 'size' : 1, + 'mtime' : '2023-12-08T12:58:29.886Z', + 'birthtime': '2023-12-08T12:58:30.894Z', + 'ext' : 'output', + 'name' : 'test_9.output', + 'path' : 'Exercise/TestsResults/test_9.output' + }, { + 'mode' : 33188, + 'size' : 468, + 'mtime' : '2023-12-08T12:58:29.570Z', + 'birthtime': '2023-12-08T12:58:30.894Z', + 'ext' : 'source', + 'name' : 'test_9.source', + 'path' : 'Exercise/TestsResults/test_9.source' + } ], + results : { + 'successfulTests' : 0, + 'failedTests' : 16, + 'successfulTestsList': [], + 'failedTestsList' : [ 'Test 1', 'Test 2', 'Test 3', 'Test 4', 'Test 5', 'Test 6', 'Test 7', 'Test 8', 'Test 9', 'Test 10', 'Test 11', 'Semantic error 1', 'Semantic error 2', 'Semantic error 3', 'Semantic error 4', 'Semantic error 5' ], + 'success' : false, + 'containerExitCode' : 1 + }, + success : false + } + }); + + await db.result.upsert({ + where : { + exerciseId_dateTime: { + exerciseId: 'dc7e1433-23f8-4c8a-a7f3-478b65fa9815', + dateTime : new Date('2023-12-14T15:35:35.692Z') + } + }, + update: {}, + create: { + exerciseId: 'dc7e1433-23f8-4c8a-a7f3-478b65fa9815', + dateTime : new Date('2023-12-14T15:35:35.692Z'), + commit : { + 'shortSha' : 'bacb58a8', + 'description' : '', + 'refName' : 'main', + 'refProtected': 'true', + 'sha' : 'bacb58a801f93ab9eb08a4a5949a498588c656ff', + 'timestamp' : '2023-12-08T14:05:39+01:00', + 'title' : 'Commit final', + 'author' : 'MichaΓ«l Minelli <michael@minelli.me>', + 'branch' : 'main', + 'refSlug' : 'main', + 'beforeSha' : '0444bfb5e986a15b9dadd96c06a6e08b92d230b4', + 'message' : 'Commit final\n' + }, + exitCode : 0, + files : [ { + 'mode' : 33188, + 'size' : 10256, + 'mtime' : '2023-12-08T13:06:36.546Z', + 'birthtime': '2023-12-08T13:06:36.546Z', + 'ext' : 'txt', + 'name' : 'dockerComposeLogs.txt', + 'path' : 'Dojo/dockerComposeLogs.txt' + }, { + 'mode' : 33188, + 'size' : 492, + 'mtime' : '2023-12-08T13:06:36.960Z', + 'birthtime': '2023-12-08T13:06:36.960Z', + 'ext' : 'json', + 'name' : 'results.json', + 'path' : 'Dojo/results.json' + }, { + 'mode' : 33188, + 'size' : 852, + 'mtime' : '2023-12-08T13:06:36.336Z', + 'birthtime': '2023-12-08T13:06:36.336Z', + 'ext' : 'txt', + 'name' : 'detailedResults.txt', + 'path' : 'Exercise/detailedResults.txt' + }, { + 'mode' : 33188, + 'size' : 783, + 'mtime' : '2023-12-08T13:06:30.478Z', + 'birthtime': '2023-12-08T13:06:36.337Z', + 'ext' : 'bytecode', + 'name' : 'test_1.bytecode', + 'path' : 'Exercise/TestsResults/test_1.bytecode' + }, { + 'mode' : 33188, + 'size' : 31, + 'mtime' : '2023-12-08T13:06:30.591Z', + 'birthtime': '2023-12-08T13:06:36.337Z', + 'ext' : 'output', + 'name' : 'test_1.output', + 'path' : 'Exercise/TestsResults/test_1.output' + }, { + 'mode' : 33188, + 'size' : 115, + 'mtime' : '2023-12-08T13:06:30.274Z', + 'birthtime': '2023-12-08T13:06:36.337Z', + 'ext' : 'source', + 'name' : 'test_1.source', + 'path' : 'Exercise/TestsResults/test_1.source' + }, { + 'mode' : 33188, + 'size' : 919, + 'mtime' : '2023-12-08T13:06:35.694Z', + 'birthtime': '2023-12-08T13:06:36.341Z', + 'ext' : 'bytecode', + 'name' : 'test_10.bytecode', + 'path' : 'Exercise/TestsResults/test_10.bytecode' + }, { + 'mode' : 33188, + 'size' : 45, + 'mtime' : '2023-12-08T13:06:35.812Z', + 'birthtime': '2023-12-08T13:06:36.341Z', + 'ext' : 'output', + 'name' : 'test_10.output', + 'path' : 'Exercise/TestsResults/test_10.output' + }, { + 'mode' : 33188, + 'size' : 147, + 'mtime' : '2023-12-08T13:06:35.509Z', + 'birthtime': '2023-12-08T13:06:36.341Z', + 'ext' : 'source', + 'name' : 'test_10.source', + 'path' : 'Exercise/TestsResults/test_10.source' + }, { + 'mode' : 33188, + 'size' : 517, + 'mtime' : '2023-12-08T13:06:36.221Z', + 'birthtime': '2023-12-08T13:06:36.341Z', + 'ext' : 'bytecode', + 'name' : 'test_11.bytecode', + 'path' : 'Exercise/TestsResults/test_11.bytecode' + }, { + 'mode' : 33188, + 'size' : 8, + 'mtime' : '2023-12-08T13:06:36.333Z', + 'birthtime': '2023-12-08T13:06:36.341Z', + 'ext' : 'output', + 'name' : 'test_11.output', + 'path' : 'Exercise/TestsResults/test_11.output' + }, { + 'mode' : 33188, + 'size' : 121, + 'mtime' : '2023-12-08T13:06:36.041Z', + 'birthtime': '2023-12-08T13:06:36.341Z', + 'ext' : 'source', + 'name' : 'test_11.source', + 'path' : 'Exercise/TestsResults/test_11.source' + }, { + 'mode' : 33188, + 'size' : 915, + 'mtime' : '2023-12-08T13:06:31.011Z', + 'birthtime': '2023-12-08T13:06:36.338Z', + 'ext' : 'bytecode', + 'name' : 'test_2.bytecode', + 'path' : 'Exercise/TestsResults/test_2.bytecode' + }, { + 'mode' : 33188, + 'size' : 23, + 'mtime' : '2023-12-08T13:06:31.120Z', + 'birthtime': '2023-12-08T13:06:36.338Z', + 'ext' : 'output', + 'name' : 'test_2.output', + 'path' : 'Exercise/TestsResults/test_2.output' + }, { + 'mode' : 33188, + 'size' : 192, + 'mtime' : '2023-12-08T13:06:30.843Z', + 'birthtime': '2023-12-08T13:06:36.338Z', + 'ext' : 'source', + 'name' : 'test_2.source', + 'path' : 'Exercise/TestsResults/test_2.source' + }, { + 'mode' : 33188, + 'size' : 1730, + 'mtime' : '2023-12-08T13:06:31.592Z', + 'birthtime': '2023-12-08T13:06:36.338Z', + 'ext' : 'bytecode', + 'name' : 'test_3.bytecode', + 'path' : 'Exercise/TestsResults/test_3.bytecode' + }, { + 'mode' : 33188, + 'size' : 32, + 'mtime' : '2023-12-08T13:06:31.695Z', + 'birthtime': '2023-12-08T13:06:36.338Z', + 'ext' : 'output', + 'name' : 'test_3.output', + 'path' : 'Exercise/TestsResults/test_3.output' + }, { + 'mode' : 33188, + 'size' : 331, + 'mtime' : '2023-12-08T13:06:31.399Z', + 'birthtime': '2023-12-08T13:06:36.338Z', + 'ext' : 'source', + 'name' : 'test_3.source', + 'path' : 'Exercise/TestsResults/test_3.source' + }, { + 'mode' : 33188, + 'size' : 1392, + 'mtime' : '2023-12-08T13:06:32.151Z', + 'birthtime': '2023-12-08T13:06:36.339Z', + 'ext' : 'bytecode', + 'name' : 'test_4.bytecode', + 'path' : 'Exercise/TestsResults/test_4.bytecode' + }, { + 'mode' : 33188, + 'size' : 41, + 'mtime' : '2023-12-08T13:06:32.268Z', + 'birthtime': '2023-12-08T13:06:36.339Z', + 'ext' : 'output', + 'name' : 'test_4.output', + 'path' : 'Exercise/TestsResults/test_4.output' + }, { + 'mode' : 33188, + 'size' : 280, + 'mtime' : '2023-12-08T13:06:31.953Z', + 'birthtime': '2023-12-08T13:06:36.339Z', + 'ext' : 'source', + 'name' : 'test_4.source', + 'path' : 'Exercise/TestsResults/test_4.source' + }, { + 'mode' : 33188, + 'size' : 14810, + 'mtime' : '2023-12-08T13:06:32.728Z', + 'birthtime': '2023-12-08T13:06:36.339Z', + 'ext' : 'bytecode', + 'name' : 'test_5.bytecode', + 'path' : 'Exercise/TestsResults/test_5.bytecode' + }, { + 'mode' : 33188, + 'size' : 315, + 'mtime' : '2023-12-08T13:06:32.892Z', + 'birthtime': '2023-12-08T13:06:36.339Z', + 'ext' : 'output', + 'name' : 'test_5.output', + 'path' : 'Exercise/TestsResults/test_5.output' + }, { + 'mode' : 33188, + 'size' : 1383, + 'mtime' : '2023-12-08T13:06:32.533Z', + 'birthtime': '2023-12-08T13:06:36.339Z', + 'ext' : 'source', + 'name' : 'test_5.source', + 'path' : 'Exercise/TestsResults/test_5.source' + }, { + 'mode' : 33188, + 'size' : 1374, + 'mtime' : '2023-12-08T13:06:33.396Z', + 'birthtime': '2023-12-08T13:06:36.339Z', + 'ext' : 'bytecode', + 'name' : 'test_6.bytecode', + 'path' : 'Exercise/TestsResults/test_6.bytecode' + }, { + 'mode' : 33188, + 'size' : 15, + 'mtime' : '2023-12-08T13:06:33.504Z', + 'birthtime': '2023-12-08T13:06:36.339Z', + 'ext' : 'output', + 'name' : 'test_6.output', + 'path' : 'Exercise/TestsResults/test_6.output' + }, { + 'mode' : 33188, + 'size' : 410, + 'mtime' : '2023-12-08T13:06:33.180Z', + 'birthtime': '2023-12-08T13:06:36.339Z', + 'ext' : 'source', + 'name' : 'test_6.source', + 'path' : 'Exercise/TestsResults/test_6.source' + }, { + 'mode' : 33188, + 'size' : 1471, + 'mtime' : '2023-12-08T13:06:33.958Z', + 'birthtime': '2023-12-08T13:06:36.340Z', + 'ext' : 'bytecode', + 'name' : 'test_7.bytecode', + 'path' : 'Exercise/TestsResults/test_7.bytecode' + }, { + 'mode' : 33188, + 'size' : 68, + 'mtime' : '2023-12-08T13:06:34.060Z', + 'birthtime': '2023-12-08T13:06:36.340Z', + 'ext' : 'output', + 'name' : 'test_7.output', + 'path' : 'Exercise/TestsResults/test_7.output' + }, { + 'mode' : 33188, + 'size' : 417, + 'mtime' : '2023-12-08T13:06:33.764Z', + 'birthtime': '2023-12-08T13:06:36.340Z', + 'ext' : 'source', + 'name' : 'test_7.source', + 'path' : 'Exercise/TestsResults/test_7.source' + }, { + 'mode' : 33188, + 'size' : 1301, + 'mtime' : '2023-12-08T13:06:34.524Z', + 'birthtime': '2023-12-08T13:06:36.340Z', + 'ext' : 'bytecode', + 'name' : 'test_8.bytecode', + 'path' : 'Exercise/TestsResults/test_8.bytecode' + }, { + 'mode' : 33188, + 'size' : 72, + 'mtime' : '2023-12-08T13:06:34.654Z', + 'birthtime': '2023-12-08T13:06:36.340Z', + 'ext' : 'output', + 'name' : 'test_8.output', + 'path' : 'Exercise/TestsResults/test_8.output' + }, { + 'mode' : 33188, + 'size' : 352, + 'mtime' : '2023-12-08T13:06:34.336Z', + 'birthtime': '2023-12-08T13:06:36.340Z', + 'ext' : 'source', + 'name' : 'test_8.source', + 'path' : 'Exercise/TestsResults/test_8.source' + }, { + 'mode' : 33188, + 'size' : 771, + 'mtime' : '2023-12-08T13:06:35.117Z', + 'birthtime': '2023-12-08T13:06:36.340Z', + 'ext' : 'bytecode', + 'name' : 'test_9.bytecode', + 'path' : 'Exercise/TestsResults/test_9.bytecode' + }, { + 'mode' : 33188, + 'size' : 31, + 'mtime' : '2023-12-08T13:06:35.257Z', + 'birthtime': '2023-12-08T13:06:36.341Z', + 'ext' : 'output', + 'name' : 'test_9.output', + 'path' : 'Exercise/TestsResults/test_9.output' + }, { + 'mode' : 33188, + 'size' : 132, + 'mtime' : '2023-12-08T13:06:34.916Z', + 'birthtime': '2023-12-08T13:06:36.340Z', + 'ext' : 'source', + 'name' : 'test_9.source', + 'path' : 'Exercise/TestsResults/test_9.source' + } ], + results : { + 'successfulTests' : 16, + 'failedTests' : 0, + 'successfulTestsList': [ 'Test 1', 'Test 2', 'Test 3', 'Test 4', 'Test 5', 'Test 6', 'Test 7', 'Test 8', 'Test 9', 'Test 10', 'Test 11', 'Semantic error 1', 'Semantic error 2', 'Semantic error 3', 'Semantic error 4', 'Semantic error 5' ], + 'failedTestsList' : [], + 'success' : true, + 'containerExitCode' : 0 + }, + success : true + } + }); + } +} \ No newline at end of file diff --git a/ExpressAPI/src/middlewares/SecurityMiddleware.ts b/ExpressAPI/src/middlewares/SecurityMiddleware.ts index f7e807081162bf0a0429daf8c5172dcada2de2ee..37e6e4af13cb1905766ce82231ba7da531882049 100644 --- a/ExpressAPI/src/middlewares/SecurityMiddleware.ts +++ b/ExpressAPI/src/middlewares/SecurityMiddleware.ts @@ -10,7 +10,7 @@ class SecurityMiddleware { check(checkIfConnected: boolean, ...checkTypes: Array<SecurityCheckType>): (req: express.Request, res: express.Response, next: express.NextFunction) => void { return async (req: express.Request, res: express.Response, next: express.NextFunction) => { if ( checkIfConnected ) { - if ( req.session.profile === null ) { + if ( req.session.profile === null || req.session.profile === undefined ) { return req.session.sendResponse(res, StatusCodes.UNAUTHORIZED); } } diff --git a/ExpressAPI/src/routes/ExerciseRoutes.ts b/ExpressAPI/src/routes/ExerciseRoutes.ts index 1b9bc1d28023449c88f8cd065635f6cfadaa6f6b..b337158b4563d6e6eeb8cda9e3f5f5b61810223b 100644 --- a/ExpressAPI/src/routes/ExerciseRoutes.ts +++ b/ExpressAPI/src/routes/ExerciseRoutes.ts @@ -77,7 +77,7 @@ class ExerciseRoutes implements RoutesManager { } private getExerciseName(assignment: Assignment, members: Array<GitlabUser>, suffix: number): string { - return `DojoEx - ${ assignment.name } - ${ members.map(member => member.username).join(' + ') }${ suffix > 0 ? ` - ${ suffix }` : '' }`; + return `DojoEx - ${ assignment.name } - ${ members.map(member => member.username).sort((a, b) => a.localeCompare(b)).join(' + ') }${ suffix > 0 ? ` - ${ suffix }` : '' }`; } private getExercisePath(assignment: Assignment, exerciseId: string): string { diff --git a/README.md b/README.md index ad28ab2253f953e7b60c1f24c18f671797b172c8..1ee8483dfccaf4a186f0f247d0237b82c05ab895 100644 --- a/README.md +++ b/README.md @@ -1 +1,39 @@ -# DojoBackendAPI \ No newline at end of file +# DojoBackendAPI + +## Development environment + +### Env vars + +You can decrypt env var stored in the `.env.vault` file with the following commands in the `ExpressAPI` folder: +```bash +> npx dotenv-vault local keys + environment DOTENV_KEY + βββββββββββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ + development dotenv://:key_1234@dotenv.local/vault/.env.vault?environment=development + +Set DOTENV_KEY on your server + +> npx dotenv-vault local decrypt dotenv://:key_1234@dotenv.local/vault/.env.vault?environment=development > .env.development +``` + +**The `.env.keys` file have to be requested to the project maintainers.** + +### Database + +For development, you can use the docker-compose file in the `Resources/DevInfra/` folder. + +```bash +docker-compose -f Resources/DevInfra/docker-compose.yml up -d +``` + +This will run a MariaDB database on port `59231` with the following credentials: `root:9buz7f312479g6234f1gnioubervw79b8z` + +A second container is created with the Adminer tool on port `62394`. + +#### Structure creation and seeding + +The following command will create the database structure and seed it with some exemple data. + +```bash +npm run database:deploy:dev +``` \ No newline at end of file diff --git a/Resources/DevInfra/docker-compose.yml b/Resources/DevInfra/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..555bdf64aaf207e88cd82eb603485777675595bf --- /dev/null +++ b/Resources/DevInfra/docker-compose.yml @@ -0,0 +1,38 @@ +version: '3.8' +services: + dojo-database: + container_name: dojo-database + image: mariadb:11.0 + environment: + MARIADB_ROOT_PASSWORD: '9buz7f312479g6234f1gnioubervw79b8z' + networks: + dojo-network: + aliases: + - dojo-database + volumes: + - dojo-database:/var/lib/mysql + ports: + - "59231:3306" + restart: always + + adminer: + container_name: adminer + image: adminer:latest + environment: + - ADMINER_DEFAULT_SERVER=dojo-database + - TZ=Europe/Zurich + - ADMINER_PLUGINS=dump-alter dump-bz2 dump-date dump-json dump-xml dump-zip edit-foreign edit-textarea foreign-system json-column sql-log struct-comments tables-filter + networks: + dojo-network: + aliases: + - adminer + depends_on: + - dojo-database + ports: + - "62394:8080" + restart: always + +networks: + dojo-network: +volumes: + dojo-database: \ No newline at end of file