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..920abda0193d56ef57d670c01fde14585907eea9 --- /dev/null +++ b/.idea/material_theme_project_new.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="MaterialThemeProjectNewConfig"> + <option name="metadata"> + <MTProjectMetadataState> + <option name="userId" value="-6f2668ee:1924765eb2a:-7fc3" /> + </MTProjectMetadataState> + </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/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/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/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/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 });