Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • Dojo_Project_Nguyen/backend/dojobackendapi
  • dojo_project/projects/backend/dojobackendapi
2 results
Select Git revision
Show changes
Commits on Source (10)
Showing
with 174 additions and 20 deletions
...@@ -195,6 +195,7 @@ web_modules/ ...@@ -195,6 +195,7 @@ web_modules/
.flaskenv* .flaskenv*
!.env.project !.env.project
!.env.vault !.env.vault
!config.env
# parcel-bundler cache (https://parceljs.org/) # parcel-bundler cache (https://parceljs.org/)
.cache .cache
......
<?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
...@@ -2,5 +2,6 @@ ...@@ -2,5 +2,6 @@
<project version="4"> <project version="4">
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" /> <mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$/ExpressAPI/src/shared" vcs="Git" />
</component> </component>
</project> </project>
\ No newline at end of file
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
- No modifications / Keep major and minors versions in sync with all parts of the project - 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) ## 4.2.0 (2024-07-05)
### ✨ Feature ### ✨ Feature
......
...@@ -4,11 +4,11 @@ ...@@ -4,11 +4,11 @@
#/--------------------------------------------------/ #/--------------------------------------------------/
# development # 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 # 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 # 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"
jetbrainsConfiguration/dataSources/
\ No newline at end of file
openapi: 3.1.0 openapi: 3.1.0
info: info:
title: Dojo API title: Dojo API
version: 4.2.0 version: 5.0.0
description: | description: |
**Backend API of the Dojo project.** **Backend API of the Dojo project.**
...@@ -46,8 +46,46 @@ paths: ...@@ -46,8 +46,46 @@ paths:
schema: schema:
$ref: '#/components/schemas/DojoBackendResponse' $ref: '#/components/schemas/DojoBackendResponse'
description: OK description: OK
default: /clients_config:
$ref: '#/components/responses/ERROR' 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: /login:
post: post:
tags: tags:
......
...@@ -20,7 +20,7 @@ dojo: ...@@ -20,7 +20,7 @@ dojo:
services: services:
- docker:24.0.6-dind - docker:24.0.6-dind
image: image:
name: dojohesso/dojo_assignment_checker:latest name: {{DOCKERHUB_REPO_ASSIGNMENT_CHECKER}}:latest
script: script:
- dojo_assignment_checker - dojo_assignment_checker
allow_failure: false allow_failure: false
\ No newline at end of file
...@@ -20,7 +20,7 @@ dojo: ...@@ -20,7 +20,7 @@ dojo:
services: services:
- docker:24.0.6-dind - docker:24.0.6-dind
image: image:
name: dojohesso/dojo_exercise_checker:latest name: {{DOCKERHUB_REPO_EXERCISE_CHECKER}}:latest
script: script:
- dojo_exercise_checker - dojo_exercise_checker
artifacts: artifacts:
......
########################### 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
{ {
"name": "dojo_backend_api", "name": "dojo_backend_api",
"version": "4.2.0", "version": "5.0.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "dojo_backend_api", "name": "dojo_backend_api",
"version": "4.2.0", "version": "5.0.0",
"license": "AGPLv3", "license": "AGPLv3",
"dependencies": { "dependencies": {
"@dotenvx/dotenvx": "^0.45.0", "@dotenvx/dotenvx": "^0.45.0",
......
{ {
"name" : "dojo_backend_api", "name" : "dojo_backend_api",
"description" : "Backend API of the Dojo project", "description" : "Backend API of the Dojo project",
"version" : "4.2.0", "version" : "5.0.0",
"license" : "AGPLv3", "license" : "AGPLv3",
"author" : "Michaël Minelli <dojo@minelli.me>", "author" : "Michaël Minelli <dojo@minelli.me>",
"main" : "dist/src/app.js", "main" : "dist/src/app.js",
......
...@@ -33,13 +33,21 @@ class Config { ...@@ -33,13 +33,21 @@ class Config {
public readonly login: { public readonly login: {
gitlab: { gitlab: {
client: { client: {
secret: string id: string, secret: string
}, url: {
redirect: string, token: string
} }
} }
}; };
public readonly dockerhub: {
repositories: {
assignmentChecker: string, exerciseChecker: string
}
};
public readonly gitlab: { public readonly gitlab: {
urls: Array<string>; repository: { url: string; urls: Array<string>; repository: {
timeoutAfterCreation: number; timeoutAfterCreation: number;
}; account: { }; account: {
id: number; username: string; token: string; id: number; username: string; token: string;
...@@ -82,12 +90,25 @@ class Config { ...@@ -82,12 +90,25 @@ class Config {
this.login = { this.login = {
gitlab: { gitlab: {
client: { client: {
id : process.env.LOGIN_GITLAB_CLIENT_ID || '',
secret: process.env.LOGIN_GITLAB_CLIENT_SECRET || '' 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 = { this.gitlab = {
url : process.env.GITLAB_URL || '',
urls : JSON5.parse(process.env.GITLAB_URLS || '[]'), urls : JSON5.parse(process.env.GITLAB_URLS || '[]'),
account : { account : {
id : Number(process.env.GITLAB_DOJO_ACCOUNT_ID || 0), id : Number(process.env.GITLAB_DOJO_ACCOUNT_ID || 0),
......
...@@ -7,9 +7,12 @@ import './shared/helpers/TypeScriptExtensions.js'; ...@@ -7,9 +7,12 @@ import './shared/helpers/TypeScriptExtensions.js';
if ( cluster.isPrimary ) { if ( cluster.isPrimary ) {
if ( process.env.NODE_ENV && process.env.NODE_ENV === 'production' ) { 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 { } else {
dotenv.config({ path: path.join(__dirname, '../.env.keys') }); dotenv.config({ path: path.join(__dirname, '../.env.keys') });
dotenvExpand.expand(dotenv.config({ DOTENV_KEY: process.env.DOTENV_KEY_DEVELOPMENT })); dotenvExpand.expand(dotenv.config({ DOTENV_KEY: process.env.DOTENV_KEY_DEVELOPMENT }));
dotenvExpand.expand(dotenv.config({ path: path.join(__dirname, '../config.env') }));
} }
} }
...@@ -2,7 +2,6 @@ import Config ...@@ -2,7 +2,6 @@ import Config
import { StatusCodes } from 'http-status-codes'; import { StatusCodes } from 'http-status-codes';
import GitlabVisibility from '../shared/types/Gitlab/GitlabVisibility.js'; import GitlabVisibility from '../shared/types/Gitlab/GitlabVisibility.js';
import express from 'express'; 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 { CommitSchema, ExpandedUserSchema, Gitlab, MemberSchema, ProjectBadgeSchema, ProjectSchema, ReleaseSchema, RepositoryFileExpandedSchema, RepositoryFileSchema, RepositoryTreeSchema } from '@gitbeaker/rest';
import logger from '../shared/logging/WinstonLogger.js'; import logger from '../shared/logging/WinstonLogger.js';
import { AccessLevel, EditProjectOptions, ProjectVariableSchema, ProtectedBranchAccessLevel, ProtectedBranchSchema } from '@gitbeaker/core'; import { AccessLevel, EditProjectOptions, ProjectVariableSchema, ProtectedBranchAccessLevel, ProtectedBranchSchema } from '@gitbeaker/core';
...@@ -12,13 +11,13 @@ import SharedGitlabManager ...@@ -12,13 +11,13 @@ import SharedGitlabManager
class GitlabManager extends SharedGitlabManager { class GitlabManager extends SharedGitlabManager {
constructor() { constructor() {
super(Config.gitlab.account.token); super(Config.gitlab.url, Config.gitlab.account.token);
} }
getUserProfile(token: string): Promise<ExpandedUserSchema> | undefined { getUserProfile(token: string): Promise<ExpandedUserSchema> | undefined {
try { try {
const profileApi = new Gitlab({ const profileApi = new Gitlab({
host : SharedConfig.gitlab.URL, host : Config.gitlab.url,
oauthToken: token oauthToken: token
}); });
......
...@@ -164,7 +164,7 @@ class AssignmentRoutes implements RoutesManager { ...@@ -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.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.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.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'); await repoCreationFnExec(() => Promise.all(params.members.map(member => member.id).map(GlobalHelper.addRepoMember(repository.id))), 'Add repository members error');
......
...@@ -2,12 +2,15 @@ import { Express } from 'express-serve-static-core'; ...@@ -2,12 +2,15 @@ import { Express } from 'express-serve-static-core';
import express, { RequestHandler } from 'express'; import express, { RequestHandler } from 'express';
import { StatusCodes } from 'http-status-codes'; import { StatusCodes } from 'http-status-codes';
import RoutesManager from '../express/RoutesManager.js'; import RoutesManager from '../express/RoutesManager.js';
import Config from '../config/Config';
class BaseRoutes implements RoutesManager { class BaseRoutes implements RoutesManager {
registerOnBackend(backend: Express) { registerOnBackend(backend: Express) {
backend.get('/', this.homepage.bind(this) as RequestHandler); backend.get('/', this.homepage.bind(this) as RequestHandler);
backend.get('/health_check', this.healthCheck.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) { private async homepage(req: express.Request, res: express.Response) {
...@@ -17,6 +20,15 @@ class BaseRoutes implements RoutesManager { ...@@ -17,6 +20,15 @@ class BaseRoutes implements RoutesManager {
private async healthCheck(req: express.Request, res: express.Response) { private async healthCheck(req: express.Request, res: express.Response) {
return req.session.sendResponse(res, StatusCodes.OK); 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
});
}
} }
......
...@@ -212,7 +212,7 @@ class ExerciseRoutes implements RoutesManager { ...@@ -212,7 +212,7 @@ class ExerciseRoutes implements RoutesManager {
await GitlabManager.addRepositoryVariable(repository.id, 'DOJO_RESULTS_FOLDER', Config.exercise.pipelineResultsFolder, false, false); await GitlabManager.addRepositoryVariable(repository.id, 'DOJO_RESULTS_FOLDER', Config.exercise.pipelineResultsFolder, false, false);
}, 'Pipeline variables addition error'); }, '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'); await repoCreationFnExec(async () => Promise.all([ ...new Set([ ...assignment.staff, ...params.members ].map(member => member.id)) ].map(GlobalHelper.addRepoMember(repository.id))), 'Add repository members error');
......
Subproject commit bf75a99ba472386daa111c2fefbe69a4272ef48c Subproject commit d9ecaee5f58b1b94413903ebf737b4d235bc2858