diff --git a/.gitignore b/.gitignore index 3d3345425a8616324ffadec9f97a5a6e85a840ee..cdf8c8c9de66faea499ec10e6c555332c6f87065 100644 --- a/.gitignore +++ b/.gitignore @@ -195,6 +195,7 @@ web_modules/ .flaskenv* !.env.project !.env.vault +!config.env # parcel-bundler cache (https://parceljs.org/) .cache diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml new file mode 100644 index 0000000000000000000000000000000000000000..9bdfa3108397a36a6eab8df0940c232f9cfc4458 --- /dev/null +++ b/.idea/material_theme_project_new.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="MaterialThemeProjectNewConfig"> + <option name="metadata"> + <MTProjectMetadataState> + <option name="migrated" value="true" /> + <option name="pristineConfig" value="false" /> + <option name="userId" value="104e8585:19002424fea:-7ffe" /> + </MTProjectMetadataState> + </option> + <option name="titleBarState"> + <MTProjectTitleBarConfigState> + <option name="overrideColor" value="false" /> + </MTProjectTitleBarConfigState> + </option> + </component> +</project> \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 35eb1ddfbbc029bcab630581847471d7f238ec53..05ce24af59594c62a686c8ba4e7987f4073508bd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,5 +2,6 @@ <project version="4"> <component name="VcsDirectoryMappings"> <mapping directory="" vcs="Git" /> + <mapping directory="$PROJECT_DIR$/ExpressAPI/src/shared" vcs="Git" /> </component> </project> \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 5eb5d7950ed4faaa05b5e093b664b6cb83fbb0e9..b5bc8e6d6e724a21fa3310c37ed28ea62d31177f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,12 @@ - No modifications / Keep major and minors versions in sync with all parts of the project --> +## 5.0.0 (Upcoming) + +### ✨ Feature +- Add possibility of self-host the solution + + ## 4.2.0 (2024-07-05) ### ✨ Feature diff --git a/ExpressAPI/.env.vault b/ExpressAPI/.env.vault index 58739571f86148dce0b51f8c4b61e7f8f81bc008..7ac1c765633f9f8b279fde28bbfbb846b14d968a 100644 --- a/ExpressAPI/.env.vault +++ b/ExpressAPI/.env.vault @@ -4,11 +4,11 @@ #/--------------------------------------------------/ # development -DOTENV_VAULT_DEVELOPMENT="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" +DOTENV_VAULT_DEVELOPMENT="NqYn17d990xqkl4t1qrPJcCm4D7N6DJVH9QffHCO8Qa+9YYOZLKASTb1VQN3nEbM4hbno4GDP5tX9nF5Nq3KCDd/QK2MuSGpRy/ab7JV8KbG/TsYCcUcTC8j6FvE1pfbeRSXskBgH4HbTDFJWfOfke7RbqcAqrlhQE72T0vEDYTuJqQrilQljzaDVwOw2JW/iZFXForpG5KYP4JZeGXuiyzwrFa+lRrdgm1oIiR9hENP+kcqCWDfySvCWJLqUAal+L7WAR4obue6ASSEZn/GGE1jZHD+8KrHJKyNzKBpdzaGcpeuuXuT8Qp9takZQ0Y0vf+LJVUGxy1oibwpIVOmsT/ICnmmfyYVW1VheOuMFPueTFTzrcgCtiw+E9U7TfIOufDFkpFz5sF7zTzkM2rc4nNEgRSCsNibkfM1Btc9Tt2CviJwk6NXBlb0r8+BW9aEMHv7r0Kf/WW7C6D3Rgma1LhxGYDhDsQOfBDpxMoEFmkGV4t2xVH+OKLpyU+8afFZE75Tfhwuhp0aLKfm/Dyo83/+98KSgNNRqKllvSm9Ar3qE/9DQLJZkBJGw5ZmnDJ4l6hAGHN4Wr0eQa0qqzh9oE7UXId/0i4ZH1b1GQYUrCiLeqYejv2A3gEG2ZIlf0qHiWltEhqNa85HkpO9oZg0OGPYvIz7DOqOGn8tnjR+zPxmDjiGyV66LnU/+7sK/itKwF3AIljQS1nz2oxZoD3OM3CVjNHufwN2HHaOh0qdchA46RX0Jj4LuZL579IV9Hd9jXKO9gjouyjzAwSloxRssFbi3JlWCd2QJFu04U4UTeNvL1jb+N/knGOzTdTEee4sCvdl8Rc/lii2gf8YaB6N8ga74ZOocvBUBxWmS/TdTzh35PkP5YNVNOBPJ4kLoozA7CPBCqvo7WWijlSMRq81XcWAsHWEBptXYQB9NeHwWZc09UyVYewdWgIQ6m5Gtdl361tjRxMzYFeEnpObVz0bhBulqbtx3UtpBFO2DjV3VrqFKDIcBExFOc67iUTXHUmgFjZ2oS6+n+61NxJ42xhacBYnQYcKrPwhabrTCLDOpRh/7aDsGCKmD5KzD/r6qmv9WmC3IYYxn2coYsCUNEBFcRn+MqbUO6PSfgLHD6aSe3lnRQOhvdbkIJqQ8VfqB4mAW8av56cljBafZmcqa221bDUwMfhI8wrWb6ddxcVtAjpkWBlLbjnwFhqHtCLPKN+Gd5Pwc6IpnJPAZmCd1+UbZXJzoFT7apzmdh7VlEpCHkEbj8yTzn9TA7H3GdtOEv/4M/x+OlgB3OixXYNfPwnrZzEHxrWjsvADTXxj5EQUlxuXaS5f4fQN3SoSJooRqhyeEEfNFL4T5JaUY9AMI9RiZxBbAzj/LEi+zmZ8bZTkcwmB1ALoaIOiwyPpHt1S+7f3Uulqm4dvvvuNAwWo+IgGv2T/tNztO+PhfAJ2+IoGny+bQ/GggMifDuRLEmKfFz2EEeqOE+aIKGBasn27+gACHjBZ52BZAJH/GmpwPd+08gV+pTnCkLCfXhErOpaQKstCD76Sn1lUwCpI2eDPzQWUOHSgaNxzUtELFaqUCVL3pa+wO0elknfD4EsKKsBc8vpQYeOaADtfndpaJPbZ/xshhee82Vh3p0d+acYLq8xyActP+B/+fpaxg10HXkpjcypsDAjORZqStsYdirGBArdqKjFk0Y7+dybqeSrdNNK0DlkP6kAK9dZAh6pJ4AAw7hCpEJ+I+XPXByx/25TWlWmHWwnPW7luTLU6+VA=" # production -DOTENV_VAULT_PRODUCTION="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" +DOTENV_VAULT_PRODUCTION="0OzXeuQZxAt17kp/qb9ocAB9iAjs1CxKeWnrV5bOpSfxdQzuWnbKq5QdPOPhFOF/PfK5bhwXZ9Rwc/2ZcpJHTyRQvi24/y3pUf4GjWeKBVn+MynOeO7X8OMgW5xQpmz7Gfgn198gFOIl8A57dtE00rCa+itlnkM/srqPWWsySkvoO0ncScqZJRQVK1r1w+jiM8SV1Ikcq/RMr5n3xHEd3fZLmuHdp3AGcZ8opo/nNu9GEXMWCoGTgdYUaTzwnEbzHvP/9dGRrQiFd9hZjM96rXjYOPBadLmNC63u3YaaJ+AztChZM7QnMYy0FHqvQT4OIVWqkB1H+hxaavnENrd0MAkEhVg/kCHN7Ao1cvauPwh9gWlIbOvTH4Q231hkXDz3Ud07kX07VLYKEZUBG8yjkjSmTS+UQ8oWzBRwtvW7FKcDSOYiG5sw7oY16TSrHe+rAQUwB0Ii6PaP9UM/yQ5GUNePBQwwPkc9w2mU4SDzmh1e78kqK5HIRH+GtT/ld4HgVbkOoJkdAUtqJJwdNwaUkrT17Z5CV56+6ntydZhoa14urPBU9AaiDaC+EhhnnIjTeTdQaev02t9d2iqm5M67GgLsADlyGlzVtr2Dpn+Dtnvic8Qw0CE9zhGUwh11GQdImUYpr7QPvmAI/Rr6gFetWTaIyh7Uz8KixINqMvWlVmS0KNN46R9g2GeeBqKqJ5hF0k6i+psWquZo988cE5mYIb9FTe1lQL2mfGAJiIz7YKHLDTZEIOtD7DV74Tb4E3ylXFS6JZPuIv2ehhZO+4GqYaXAvjWpLDfFOAR3rbzBs92ZHmnbebyh6bEaU7G8ojDxYSddfGeB+R/Vts/WFJfxpcB04kAeOSdb4uSS6qh2inq9eAHO3lfeD3CyJ4Q7l0GwHSLB2sxm4cfYw7kZgPQMaaO2hOanQSG5JiAhQi+zyF1p3vUVwgVeepuF3scF4EpU/sBtBm9k7qoonIsGYKRcEiQUcRj6zOCGgmkKshqdNIVUvRfioBgkHiz+ozx3sSdA8hKrqw17LcDFHJr/m4VjixxbNRtK1pi9VCsw4n6Yrp6ezNa+3CU4M5BfXeDHsA2kPBwrie//wmiliq0cq1KR0xp51SBOG5NhBmx7Bf086D6nLKWpC5PATL6GsptiZs0TkPGIYTjh/Suh6usZ9NU9pUKaB88lVQuMgAHkRKG3Z6Qhb9nWoqUEBCi/LkkAk1u4e/rKTEBBxa/hTH8q9dfo9VX8XbgKS1LJXaYAV2aXn/dAfn4W4/yFsyL3n7M9LabXVVEIxc9Lh0j4QrRtmvsYv0cptIsdxMlpobWlKB9eVfEMo79TBAnJIOgt18ihWfUq57bClN9qyRZ7qV7N4mG4AgfG/Zx3o5Kvpyp6FqI0KlGRhgcUDkUt/CDy/RHjQ+U1VbybbbrPdSu6xw3fmrWbf095YLP2vZGuC7o1RZUGM4hbLkGlpfMkw4izcNmD5K3E1Zwmuh2JhlqZZf7AA3l5EjTCTL4FudNm8mRpbvJ7qgEA0tawozC52HtngnrlaTS+LMuN7YsoUh2w61JFkbCTjzMbQ8uCXjArW21tPWaHBQqm2jMyOYN1/wIPIM8E6LVHUq0N68jOVZC5bxIt0bT+sTxzUT2U1pz9kHiOoKUOQYl/Kj+0Z6H5zTotyNEpomkmpukudLcjkmjxfcJkOrFZQfbQdRCO5Jl8Pce4u0Z0EDfOskkEwRWBPCZnlqR/jajBaP2qGMySbS6l8v7YSuzfuSUA2/c56x0yCoFhc7+d90C5" # test -DOTENV_VAULT_TEST="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" +DOTENV_VAULT_TEST="PT3yDxOvkX0FmdvfLXZz6lqc0ra5aVnKVQ10ccpXr9CANo8d7hFT8vQcN8dgdYci43tIKclQ4MWKCWukWX76cCZdkEYMnF8W3zmjtRNDTKpzjcNocW2TjtzNsM7aCGKM1QS9qpBqRmyvBqjIXHz1UAZYwyC7Z58BXOIOW8UY+Nf2eQmLn5jTl3ClPT1HcdROaXv3b3wykgZkBB0M82b4+RcF9MrJeS5zhf3X8hMYAlqPk2r5x8T6neFPThcXl5pX39xc/31B/Xin6jo9E94RaBVVKQQnEJD5BV+rKfPCStSCvlme5s74+yfKutx5ZD0zzx0sqy6LfDIo0YEvvz3v1eUTYwKARnQ7Ua7OSE/pslyvAKlePlfdurO9vdFq/tvgLFhbPWQnG6zRonJg2xxX5h/fp/W1U4h57oP6KnIG3bAnIcS3nZ1JXvI1PAwRasXhJzdF28Vy1TufK2D7RNlZwDZuVfBaXiltAQWBXcGgo4AqC8WHRwDS/ZO7q2zcxiFQ9z7YHfOL3pogr16VP5T7IUS5AD5U8ZgFmARmLNluaZTQfrXfByqzu5Z6f9w/OBOM7RaNG5aeK/YtVm9CMwz3ZVw0a+5Un6lY33WzStynucNcai2/1kEyxDrloKstSoYp2nzWsBIHUS2DbRYN50JWgkRuC7n6KXHfovnJ97/YAUmlaDBETO0uK9Lj0zzaGEDEEU/4vZRLQfzqc0iwU8R5alBSH0egn1o+Wm+hEpeWecyZmB7IfxO7cGMjSRuW0tAwPCrAMwWfXRiGQdpNmrL3jj2yqLN9dABOy5yWkOaofJ9czkXA2J6CnKDRwB1A6tQ7L/sohnjwpkFXwjgsI8zPrROWga7m5Z8rQMLDQ93ZYHc4onYfA6ey1bgSgu4u3vZZ6LB4x3F3FITA5JskrgyAxgvgU2iKyasOZO24CAQ+Noz+I6lfY89hIV4MzNio0pTeZmlv4fhHnPVj9n5fqsgt5+f0gzXGRx1U7Swtam9grOdHu2aC//jtnUe/vvoimq+EE9q0e7cPzWtt0LjgKB2PpVc5U8v7gZiHowMlyyr0/plDnCNgtih5Dt7l7O5pUaPLiF5EW81u2UeHsUYxu7okSmHRELVTQjV19TMUquyGhtng+Et1EOmHJ6qA+qMCjmsZfqEzNGmOm3WOc8kpodP1d2yph/KBSm8Ozu20YJmc73fSw83ia6BKhVrRFw0pm7mzFH7+IXE0ZcGdHtwiwrrKrJBztuHxL+kBOZiYgL/cR6LOVUwuF3stQX3fWST8W+0gZyWOKn18DCVhkfQqH84b9ZeQ365f6PDAk0BNPtdI6X8sLCZcSIAu8Nqt61aqCIsR3apE2jhLoqjaMuJLKK1rbwCBgX6gdIwS2jbVLuog+F1lh8bJgh5mr1F5Quu4triX1O2IIoTY51nsEaYGnwiFtS155lgUIt7KHuRaOKI8JhW3U5fxJa0R/BJW0OVuyu4zV4LDRYsIrR3b9ZSyKqpzHiWhV1wA73tszMIOfAxt3hxFIjHskUaxJ4AxW/pmiIJobXR5VXDPSt/zTF9Bi2fB3uXaYTlaKCTYhRXIm8q52hxIqNOFmUtzuidy8brm40okpbt8lthZ6Xz+qtSjFqNe6YJKyEpssLnLfghoWvX6V5MdhzQHZTCMolxejQCP7QJv2Wdhrm9d9rC1gHxv7NSKyZfQqxB3JyVOS9CE/afb5vlYBD/gL1/bPHP4GM/tIxAji2Gf2sLF6hslio7hwgl2zUxOGNwhOAJrJv1e96UQQW3yIMu/7SE9" diff --git a/ExpressAPI/.idea/dataSources b/ExpressAPI/.idea/dataSources new file mode 120000 index 0000000000000000000000000000000000000000..dad593ac636a6315d6d91992d4b1e57e31182df2 --- /dev/null +++ b/ExpressAPI/.idea/dataSources @@ -0,0 +1 @@ +jetbrainsConfiguration/dataSources/ \ No newline at end of file diff --git a/ExpressAPI/assets/OpenAPI/OpenAPI.yaml b/ExpressAPI/assets/OpenAPI/OpenAPI.yaml index 23d099e0a7b64cb6a9bff5c5fe886336cbe3d1d8..a1da612e2b238b3f285d14fa2f115b2c69bb716d 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: 4.2.0 + version: 5.0.0 description: | **Backend API of the Dojo project.** @@ -46,8 +46,46 @@ paths: schema: $ref: '#/components/schemas/DojoBackendResponse' description: OK - default: - $ref: '#/components/responses/ERROR' + /clients_config: + get: + tags: + - General + summary: Config of the clients + description: This route is used to get the configuration that clients (CLI, Checkers, etc.) need to operate. + responses: + '200': + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/DojoBackendResponse' + - type: object + properties: + data: + type: object + properties: + gitlabUrl: + type: string + examples: + - https://gitedu.hesge.ch/ + gitlabAccountId: + type: number + examples: + - 1076 + gitlabAccountUsername: + type: string + examples: + - isc-dojo + loginGitlabClientId: + type: string + examples: + - 262b4d7c215233fa6fc91e70fb387a9314c02472dc3c6d22d6861fe93db6996a + required: + - gitlabUrl + - gitlabAccountId + - gitlabAccountUsername + - loginGitlabClientId + description: OK /login: post: tags: diff --git a/ExpressAPI/assets/assignment_gitlab_ci.yml b/ExpressAPI/assets/assignment_gitlab_ci.yml index 7eadda7b31d8297073572b103cd5275561190eae..2ed66f75184073e396c25c1deb1fca1b604e74c1 100644 --- a/ExpressAPI/assets/assignment_gitlab_ci.yml +++ b/ExpressAPI/assets/assignment_gitlab_ci.yml @@ -20,7 +20,7 @@ dojo: services: - docker:24.0.6-dind image: - name: dojohesso/dojo_assignment_checker:latest + name: {{DOCKERHUB_REPO_ASSIGNMENT_CHECKER}}:latest script: - dojo_assignment_checker allow_failure: false \ No newline at end of file diff --git a/ExpressAPI/assets/exercise_gitlab_ci.yml b/ExpressAPI/assets/exercise_gitlab_ci.yml index 27c2bd7e0042707a78822c7815ac2e1cd42dfdf0..e15282d6cffd086106ab79296205536fe0799395 100644 --- a/ExpressAPI/assets/exercise_gitlab_ci.yml +++ b/ExpressAPI/assets/exercise_gitlab_ci.yml @@ -20,7 +20,7 @@ dojo: services: - docker:24.0.6-dind image: - name: dojohesso/dojo_exercise_checker:latest + name: {{DOCKERHUB_REPO_EXERCISE_CHECKER}}:latest script: - dojo_exercise_checker artifacts: diff --git a/ExpressAPI/config.env b/ExpressAPI/config.env new file mode 100644 index 0000000000000000000000000000000000000000..e3f29d426c0823ec9767c546c037c65ae4fe706e --- /dev/null +++ b/ExpressAPI/config.env @@ -0,0 +1,55 @@ +########################### Server env vars +API_PORT=30992 +LOGS_FOLDER=logs + + +########################### Requests env vars +REQUEST_CLIENT_VALIDATION="{ + 'version': { + 'DojoCLI': '>=5.0.0', + 'DojoExerciseChecker': '>=5.0.0', + 'DojoAssignmentChecker': '>=5.0.0' + } +}" + + +########################### DojoCLI env vars +DOJO_CLI_VERSION_UPDATE_PERIOD_MS=7200000 +DOJO_CLI_GITLAB_REPOSITORY_ID=12972 + + +########################### Session env vars +SESSION_TIMEOUT=0 + +LOGIN_SERVER_PORT=30992 +LOGIN_SERVER_ROUTE=login +LOGIN_GITLAB_URL_REDIRECT=http://localhost:${LOGIN_SERVER_PORT}/${LOGIN_SERVER_ROUTE} +LOGIN_GITLAB_URL_TOKEN=${GITLAB_URL}/oauth/token + + +########################### Gitlab env vars +GITLAB_API_URL=${GITLAB_URL}/api/v4 +GITLAB_REPOSITORY_CREATION_TIMEOUT=5000 + +GITLAB_BADGE_PIPELINE_LINK=${GITLAB_URL}/%{project_path}/-/pipelines +GITLAB_BADGE_PIPELINE_IMAGE_URL=${GITLAB_URL}/%{project_path}/badges/%{default_branch}/pipeline.svg + + +########################### Assignment env vars +ASSIGNMENT_DEFAULT_DESCRIPTION="Dojo assignment repository.\n\nName of the assignment: {{ASSIGNMENT_NAME}}" +ASSIGNMENT_DEFAULT_INIT_README=false +ASSIGNMENT_DEFAULT_SHARED_RUNNERS_ENABLED=true +ASSIGNMENT_DEFAULT_VISIBILITY=private +ASSIGNMENT_DEFAULT_WIKI_ENABLED=false +ASSIGNMENT_FILENAME=dojo_assignment.json +ASSIGNMENT_BASE_FILES='["${ASSIGNMENT_FILENAME}", "README.md", "docker-compose.yml"]' +ASSIGNMENT_DEFAULT_TEMPLATE=https://{{USERNAME}}:{{TOKEN}}@${GITLAB_DOMAIN}/dojo/template/empty_template.git + + +########################### Exercise env vars +EXERCISE_DEFAULT_DESCRIPTION="Dojo exercise repository based on the the assignment: {{ASSIGNMENT_NAME}}" +EXERCISE_DEFAULT_VISIBILITY=private +EXERCISE_MAX_PER_ASSIGNMENT=2 +EXERCISE_MAX_SAME_NAME=10 +EXERCISE_PIPELINE_RESULTS_FOLDER=\$CI_PROJECT_DIR/Results_of_exercise_\$DOJO_EXERCISE_ID +EXERCISE_RESULTS_FOLDER=/dojoFiles/results/ \ No newline at end of file diff --git a/ExpressAPI/package-lock.json b/ExpressAPI/package-lock.json index 331702eac921eafa560421b6a286e1ad20230e4d..806d82cdaff1b83716607f53aa2d2e7e865ee655 100644 --- a/ExpressAPI/package-lock.json +++ b/ExpressAPI/package-lock.json @@ -1,12 +1,12 @@ { "name": "dojo_backend_api", - "version": "4.2.0", + "version": "5.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "dojo_backend_api", - "version": "4.2.0", + "version": "5.0.0", "license": "AGPLv3", "dependencies": { "@dotenvx/dotenvx": "^0.45.0", diff --git a/ExpressAPI/package.json b/ExpressAPI/package.json index f94f1bbf30859785fa63366b9f62f84b8536a9f4..8f2ffb9a2ffbb3cedc9395295de3997f90df553b 100644 --- a/ExpressAPI/package.json +++ b/ExpressAPI/package.json @@ -1,7 +1,7 @@ { "name" : "dojo_backend_api", "description" : "Backend API of the Dojo project", - "version" : "4.2.0", + "version" : "5.0.0", "license" : "AGPLv3", "author" : "Michaël Minelli <dojo@minelli.me>", "main" : "dist/src/app.js", diff --git a/ExpressAPI/src/config/Config.ts b/ExpressAPI/src/config/Config.ts index 29301c0cc30fca094b4d1b3b7ba59de1c4c99085..e191f2162d1780d14fe48c39c9e1c934916e4cdb 100644 --- a/ExpressAPI/src/config/Config.ts +++ b/ExpressAPI/src/config/Config.ts @@ -33,13 +33,21 @@ class Config { public readonly login: { gitlab: { client: { - secret: string + id: string, secret: string + }, url: { + redirect: string, token: string } } }; + public readonly dockerhub: { + repositories: { + assignmentChecker: string, exerciseChecker: string + } + }; + public readonly gitlab: { - urls: Array<string>; repository: { + url: string; urls: Array<string>; repository: { timeoutAfterCreation: number; }; account: { id: number; username: string; token: string; @@ -82,12 +90,25 @@ class Config { this.login = { gitlab: { client: { + id : process.env.LOGIN_GITLAB_CLIENT_ID || '', secret: process.env.LOGIN_GITLAB_CLIENT_SECRET || '' + }, + url : { + redirect: process.env.LOGIN_GITLAB_URL_REDIRECT ?? '', + token : process.env.LOGIN_GITLAB_URL_TOKEN ?? '' } } }; + this.dockerhub = { + repositories: { + assignmentChecker: process.env.DOCKERHUB_REPO_ASSIGNMENT_CHECKER ?? '', + exerciseChecker : process.env.DOCKERHUB_REPO_EXERCISE_CHECKER ?? '' + } + }; + this.gitlab = { + url : process.env.GITLAB_URL || '', urls : JSON5.parse(process.env.GITLAB_URLS || '[]'), account : { id : Number(process.env.GITLAB_DOJO_ACCOUNT_ID || 0), diff --git a/ExpressAPI/src/init.ts b/ExpressAPI/src/init.ts index 59695b2570077508b4ea44ffb4d9c45222cf7a34..98c30469cf440496d2a1871731dbafc5ed1435d0 100644 --- a/ExpressAPI/src/init.ts +++ b/ExpressAPI/src/init.ts @@ -7,9 +7,12 @@ import './shared/helpers/TypeScriptExtensions.js'; if ( cluster.isPrimary ) { if ( process.env.NODE_ENV && process.env.NODE_ENV === 'production' ) { - dotenvExpand.expand(dotenv.config()); + dotenvExpand.expand(dotenv.config({ + path: [ path.join(__dirname, '../.env'), path.join(__dirname, '../config.env') ] + })); } else { dotenv.config({ path: path.join(__dirname, '../.env.keys') }); dotenvExpand.expand(dotenv.config({ DOTENV_KEY: process.env.DOTENV_KEY_DEVELOPMENT })); + dotenvExpand.expand(dotenv.config({ path: path.join(__dirname, '../config.env') })); } } diff --git a/ExpressAPI/src/managers/GitlabManager.ts b/ExpressAPI/src/managers/GitlabManager.ts index 5ad9dca9dd1bad96492bdb4dd32040c040442aaa..e153d8958e0d0f309809032051a4a4e1bc32db7f 100644 --- a/ExpressAPI/src/managers/GitlabManager.ts +++ b/ExpressAPI/src/managers/GitlabManager.ts @@ -2,7 +2,6 @@ import Config import { StatusCodes } from 'http-status-codes'; import GitlabVisibility from '../shared/types/Gitlab/GitlabVisibility.js'; import express from 'express'; -import SharedConfig from '../shared/config/SharedConfig.js'; import { CommitSchema, ExpandedUserSchema, Gitlab, MemberSchema, ProjectBadgeSchema, ProjectSchema, ReleaseSchema, RepositoryFileExpandedSchema, RepositoryFileSchema, RepositoryTreeSchema } from '@gitbeaker/rest'; import logger from '../shared/logging/WinstonLogger.js'; import { AccessLevel, EditProjectOptions, ProjectVariableSchema, ProtectedBranchAccessLevel, ProtectedBranchSchema } from '@gitbeaker/core'; @@ -12,13 +11,13 @@ import SharedGitlabManager class GitlabManager extends SharedGitlabManager { constructor() { - super(Config.gitlab.account.token); + super(Config.gitlab.url, Config.gitlab.account.token); } getUserProfile(token: string): Promise<ExpandedUserSchema> | undefined { try { const profileApi = new Gitlab({ - host : SharedConfig.gitlab.URL, + host : Config.gitlab.url, oauthToken: token }); diff --git a/ExpressAPI/src/routes/AssignmentRoutes.ts b/ExpressAPI/src/routes/AssignmentRoutes.ts index 0f06d74728a684153763d8b7d710809ff6f6e9f4..1259cb0fabd2cc013e15eeee69eee955d7d0eaf0 100644 --- a/ExpressAPI/src/routes/AssignmentRoutes.ts +++ b/ExpressAPI/src/routes/AssignmentRoutes.ts @@ -164,7 +164,7 @@ class AssignmentRoutes implements RoutesManager { await repoCreationFnExec(() => GitlabManager.protectBranch(repository.id, '*', true, Gitlab.AccessLevel.DEVELOPER, Gitlab.AccessLevel.DEVELOPER, Gitlab.AccessLevel.ADMIN), 'Branch protection modification error'); await repoCreationFnExec(() => GitlabManager.addRepositoryBadge(repository.id, Config.gitlab.badges.pipeline.link, Config.gitlab.badges.pipeline.imageUrl, 'Pipeline Status'), 'Pipeline badge addition error'); await repoCreationFnExec(() => GitlabManager.deleteFile(repository.id, '.gitlab-ci.yml', 'Remove .gitlab-ci.yml')); - await repoCreationFnExec(() => GitlabManager.createFile(repository.id, '.gitlab-ci.yml', fs.readFileSync(path.join(__dirname, '../../assets/assignment_gitlab_ci.yml'), 'base64'), 'Add .gitlab-ci.yml (DO NOT MODIFY THIS FILE)'), 'CI/CD file creation error'); + await repoCreationFnExec(() => GitlabManager.createFile(repository.id, '.gitlab-ci.yml', Buffer.from(fs.readFileSync(path.join(__dirname, '../../assets/assignment_gitlab_ci.yml'), 'utf8').replace('{{DOCKERHUB_REPO_ASSIGNMENT_CHECKER}}', Config.dockerhub.repositories.assignmentChecker)).toString('base64'), 'Add .gitlab-ci.yml (DO NOT MODIFY THIS FILE)'), 'CI/CD file creation error'); await repoCreationFnExec(() => Promise.all(params.members.map(member => member.id).map(GlobalHelper.addRepoMember(repository.id))), 'Add repository members error'); diff --git a/ExpressAPI/src/routes/BaseRoutes.ts b/ExpressAPI/src/routes/BaseRoutes.ts index e26e11ace9bba1b6740f3d7a9af7948a59409d76..f4a74dee7a164f219e3b271614ad6afdb640d6a3 100644 --- a/ExpressAPI/src/routes/BaseRoutes.ts +++ b/ExpressAPI/src/routes/BaseRoutes.ts @@ -2,12 +2,15 @@ import { Express } from 'express-serve-static-core'; import express, { RequestHandler } from 'express'; import { StatusCodes } from 'http-status-codes'; import RoutesManager from '../express/RoutesManager.js'; +import Config from '../config/Config'; class BaseRoutes implements RoutesManager { registerOnBackend(backend: Express) { backend.get('/', this.homepage.bind(this) as RequestHandler); backend.get('/health_check', this.healthCheck.bind(this) as RequestHandler); + + backend.get('/clients_config', this.clientsConfig.bind(this) as RequestHandler); } private async homepage(req: express.Request, res: express.Response) { @@ -17,6 +20,15 @@ class BaseRoutes implements RoutesManager { private async healthCheck(req: express.Request, res: express.Response) { return req.session.sendResponse(res, StatusCodes.OK); } + + private async clientsConfig(req: express.Request, res: express.Response) { + return req.session.sendResponse(res, StatusCodes.OK, { + gitlabUrl : Config.gitlab.url, + gitlabAccountId : Config.gitlab.account.id, + gitlabAccountUsername: Config.gitlab.account.username, + loginGitlabClientId : Config.login.gitlab.client.id + }); + } } diff --git a/ExpressAPI/src/routes/ExerciseRoutes.ts b/ExpressAPI/src/routes/ExerciseRoutes.ts index 463f353a4e47c9cb2ace3b91be3f3fad2018d3ab..f3939c7c94905d684940337cb5024eec71dd456a 100644 --- a/ExpressAPI/src/routes/ExerciseRoutes.ts +++ b/ExpressAPI/src/routes/ExerciseRoutes.ts @@ -212,7 +212,7 @@ class ExerciseRoutes implements RoutesManager { await GitlabManager.addRepositoryVariable(repository.id, 'DOJO_RESULTS_FOLDER', Config.exercise.pipelineResultsFolder, false, false); }, 'Pipeline variables addition error'); - await repoCreationFnExec(() => GitlabManager.updateFile(repository.id, '.gitlab-ci.yml', fs.readFileSync(path.join(__dirname, '../../assets/exercise_gitlab_ci.yml'), 'base64'), 'Add .gitlab-ci.yml (DO NOT MODIFY THIS FILE)'), 'CI/CD file update error'); + await repoCreationFnExec(() => GitlabManager.updateFile(repository.id, '.gitlab-ci.yml', Buffer.from(fs.readFileSync(path.join(__dirname, '../../assets/exercise_gitlab_ci.yml'), 'utf8').replace('{{DOCKERHUB_REPO_EXERCISE_CHECKER}}', Config.dockerhub.repositories.exerciseChecker)).toString('base64'), 'Add .gitlab-ci.yml (DO NOT MODIFY THIS FILE)'), 'CI/CD file update error'); await repoCreationFnExec(async () => Promise.all([ ...new Set([ ...assignment.staff, ...params.members ].map(member => member.id)) ].map(GlobalHelper.addRepoMember(repository.id))), 'Add repository members error'); diff --git a/ExpressAPI/src/shared b/ExpressAPI/src/shared index bf75a99ba472386daa111c2fefbe69a4272ef48c..d9ecaee5f58b1b94413903ebf737b4d235bc2858 160000 --- a/ExpressAPI/src/shared +++ b/ExpressAPI/src/shared @@ -1 +1 @@ -Subproject commit bf75a99ba472386daa111c2fefbe69a4272ef48c +Subproject commit d9ecaee5f58b1b94413903ebf737b4d235bc2858