diff --git a/ExpressAPI/src/config/Config.ts b/ExpressAPI/src/config/Config.ts index e3a1b78e2926f988b8a6d61675ea78f570987bc3..ebbad6729d8b9c8c420a7455a42218cd28421a2c 100644 --- a/ExpressAPI/src/config/Config.ts +++ b/ExpressAPI/src/config/Config.ts @@ -21,6 +21,11 @@ class Config { } }; // { version: { CLIENT: CONDITION } } + public readonly dojoCLI: { + versionUpdatePeriodMs: number + repositoryId: number + }; + public readonly jwtConfig: { secret: string; expiresIn: number; }; @@ -64,6 +69,11 @@ class Config { this.requestClientValidation = JSON5.parse(process.env.REQUEST_CLIENT_VALIDATION || '{"version": {}}'); + this.dojoCLI = { + versionUpdatePeriodMs: Number(process.env.DOJO_CLI_VERSION_UPDATE_PERIOD_MS || 3600), + repositoryId : Number(process.env.DOJO_CLI_GITLAB_REPOSITORY_ID || 0) + }; + this.jwtConfig = { secret : process.env.JWT_SECRET_KEY || '', expiresIn: Number(process.env.SESSION_TIMEOUT || 0) diff --git a/ExpressAPI/src/express/API.ts b/ExpressAPI/src/express/API.ts index dcc801cee1bbfd160e60d0f3d8f7f63e70e25acf..0d61b88e4f9d007c26b7d1ef13f98a4fa5ae3e85 100644 --- a/ExpressAPI/src/express/API.ts +++ b/ExpressAPI/src/express/API.ts @@ -16,6 +16,7 @@ import compression from 'compression'; import ClientVersionCheckerMiddleware from '../middlewares/ClientVersionCheckerMiddleware'; import swaggerUi from 'swagger-ui-express'; import path from 'path'; +import DojoCliVersionHelper from '../helpers/DojoCliVersionHelper'; class API implements WorkerTask { @@ -25,7 +26,7 @@ class API implements WorkerTask { constructor() { this.backend = express(); - this.initSwagger(); + this.initOpenAPI(); this.initBaseMiddlewares(); this.backend.use(ClientVersionCheckerMiddleware.register()); @@ -43,9 +44,14 @@ class API implements WorkerTask { this.backend.use(helmet()); //Help to secure express, https://helmetjs.github.io/ this.backend.use(cors()); //Allow CORS requests this.backend.use(compression()); //Compress responses + + this.backend.use(async (req, res, next) => { + res.header('dojocli-latest-version', await DojoCliVersionHelper.getLatestVersion()); + next(); + }); } - private initSwagger() { + private initOpenAPI() { const options = { customSiteTitle: 'Dojo API', explorer : false, diff --git a/ExpressAPI/src/helpers/DojoCliVersionHelper.ts b/ExpressAPI/src/helpers/DojoCliVersionHelper.ts new file mode 100644 index 0000000000000000000000000000000000000000..a44e1ec54ed64170f491339b5d91f39423372ba6 --- /dev/null +++ b/ExpressAPI/src/helpers/DojoCliVersionHelper.ts @@ -0,0 +1,33 @@ +import Config from '../config/Config'; +import GitlabRelease from '../shared/types/Gitlab/GitlabRelease'; +import GitlabManager from '../managers/GitlabManager'; + + +class DojoCliVersionHelper { + private latestUpdate: Date | undefined; + private latestVersion: string | undefined; + + constructor() { } + + private async updateVersion(): Promise<void> { + const releases: Array<GitlabRelease> = await GitlabManager.getRepositoryReleases(Config.dojoCLI.repositoryId); + for ( const release of releases ) { + if ( !isNaN(+release.tag_name.replace('.', '')) ) { + this.latestVersion = release.tag_name; + this.latestUpdate = new Date(); + return; + } + } + } + + public async getLatestVersion(): Promise<string> { + if ( !this.latestVersion || !this.latestUpdate || (new Date()).getTime() - this.latestUpdate.getTime() >= Config.dojoCLI.versionUpdatePeriodMs ) { + await this.updateVersion(); + } + + return this.latestVersion!; + } +} + + +export default new DojoCliVersionHelper(); \ No newline at end of file