diff --git a/ExerciseChecker/src/managers/HttpManager.ts b/ExerciseChecker/src/managers/HttpManager.ts index fb113963ab8d37459ff72bf05d33827598889edd..54d6990ad2c31f3a0307a56b13f305b0285ee0db 100644 --- a/ExerciseChecker/src/managers/HttpManager.ts +++ b/ExerciseChecker/src/managers/HttpManager.ts @@ -2,6 +2,11 @@ import axios, { AxiosRequestHeaders } from 'axios'; import FormData from 'form-data'; import ClientsSharedConfig from '../sharedByClients/config/ClientsSharedConfig'; import Config from '../config/Config'; +import { version } from '../config/Version'; +import boxen from 'boxen'; +import DojoStatusCode from '../shared/types/Dojo/DojoStatusCode'; +import DojoBackendResponse from '../shared/types/Dojo/DojoBackendResponse'; +import { StatusCodes } from 'http-status-codes'; class HttpManager { @@ -12,6 +17,19 @@ class HttpManager { this.registerResponseInterceptor(); } + private requestError(message: string) { + console.log(boxen(message, { + title : 'Request error', + titleAlignment: 'center', + borderColor : 'red', + borderStyle : 'bold', + margin : 1, + padding : 1, + textAlignment : 'left' + })); + process.exit(1); + } + private registerRequestInterceptor() { axios.interceptors.request.use((config) => { if ( config.data instanceof FormData ) { @@ -26,6 +44,9 @@ class HttpManager { } config.headers.Authorization = `ExerciseSecret ${ Config.exercise.secret }`; + + config.headers['client'] = 'DojoExerciseChecker'; + config.headers['client-version'] = version; } return config; @@ -36,6 +57,25 @@ class HttpManager { axios.interceptors.response.use((response) => { return response; }, (error) => { + if ( error.response ) { + if ( error.response.status === StatusCodes.METHOD_NOT_ALLOWED && error.response.data ) { + const data: DojoBackendResponse<{}> = error.response.data; + + switch ( data.code ) { + case DojoStatusCode.CLIENT_NOT_SUPPORTED: + this.requestError('Client not recognized by the server. Please contact the administrator.'); + break; + case DojoStatusCode.CLIENT_VERSION_NOT_SUPPORTED: + this.requestError(`ExerciseChecker version not supported by the server.\nPlease check that the CI/CD pipeline use the "${ Config.dockerhub.repositories.exerciseChecker }:latest" image.\nIf yes, try again later and if the problem persists, please contact the administrator.`); + break; + default: + break; + } + } + } else { + this.requestError('Error connecting to the server. Please check your internet connection. If the problem persists, please contact the administrator.'); + } + return Promise.reject(error); }); }