diff --git a/lib/options.js b/lib/options.js index 3dfc59bdf6..6b5e5ccb58 100644 --- a/lib/options.js +++ b/lib/options.js @@ -27,6 +27,7 @@ function defaultOptions() { importFile: undefined, dropBeforeImport: false, getLogger: defaultLogProvider, + customContextFields: [], }; } diff --git a/lib/routes/admin-api/api-def.json b/lib/routes/admin-api/api-def.json index c0fbf518f0..ed0fbd5492 100644 --- a/lib/routes/admin-api/api-def.json +++ b/lib/routes/admin-api/api-def.json @@ -18,6 +18,9 @@ }, "state": { "uri": "/api/admin/state" + }, + "context": { + "uri": "/api/admin/context" } } } diff --git a/lib/routes/admin-api/context.js b/lib/routes/admin-api/context.js new file mode 100644 index 0000000000..46f45e9bfa --- /dev/null +++ b/lib/routes/admin-api/context.js @@ -0,0 +1,27 @@ +'use strict'; + +const Controller = require('../controller'); + +const builtInContextFields = [ + { name: 'environment' }, + { name: 'userId' }, + { name: 'appName' }, +]; + +class ContextController extends Controller { + constructor(config) { + super(config); + this.contextFields = builtInContextFields.concat( + config.customContextFields + ); + this.get('/', this.getContextFields); + } + + getContextFields(req, res) { + res.status(200) + .json(this.contextFields) + .end(); + } +} + +module.exports = ContextController; diff --git a/lib/routes/admin-api/context.test.js b/lib/routes/admin-api/context.test.js new file mode 100644 index 0000000000..827fb91f09 --- /dev/null +++ b/lib/routes/admin-api/context.test.js @@ -0,0 +1,42 @@ +'use strict'; + +const test = require('ava'); +const store = require('./../../../test/fixtures/store'); +const getLogger = require('../../../test/fixtures/no-logger'); +const supertest = require('supertest'); +const getApp = require('../../app'); + +const { EventEmitter } = require('events'); +const eventBus = new EventEmitter(); + +function getSetup() { + const base = `/random${Math.round(Math.random() * 1000)}`; + const stores = store.createStores(); + const app = getApp({ + baseUriPath: base, + stores, + eventBus, + extendedPermissions: false, + customContextFields: [{ name: 'tenantId' }], + getLogger, + }); + + return { + base, + request: supertest(app), + }; +} + +test('should get context definition', t => { + t.plan(2); + const { request, base } = getSetup(); + return request + .get(`${base}/api/admin/context`) + .expect('Content-Type', /json/) + .expect(200) + .expect(res => { + t.true(res.body.length === 4); + const envField = res.body.find(c => c.name === 'environment'); + t.true(envField.name === 'environment'); + }); +}); diff --git a/lib/routes/admin-api/index.js b/lib/routes/admin-api/index.js index af5261d1ac..deb9f69c75 100644 --- a/lib/routes/admin-api/index.js +++ b/lib/routes/admin-api/index.js @@ -8,6 +8,7 @@ const StrategyController = require('./strategy'); const MetricsController = require('./metrics'); const UserController = require('./user'); const ConfigController = require('./config'); +const ContextController = require('./context'); const StateController = require('./state'); const apiDef = require('./api-def.json'); @@ -23,6 +24,7 @@ class AdminApi extends Controller { this.app.use('/metrics', new MetricsController(config).router); this.app.use('/user', new UserController(config).router); this.app.use('/ui-config', new ConfigController(config).router); + this.app.use('/context', new ContextController(config).router); this.app.use('/state', new StateController(config).router); } diff --git a/lib/routes/client-api/register.js b/lib/routes/client-api/register.js index e2efc5fc22..132431e1ac 100644 --- a/lib/routes/client-api/register.js +++ b/lib/routes/client-api/register.js @@ -30,7 +30,9 @@ class RegisterController extends Controller { await this.clientApplicationsStore.upsert(clientRegistration); await this.clientInstanceStore.insert(clientRegistration); this.logger.info( - `New client registered with appName=${clientRegistration.appName} and instanceId=${clientRegistration.instanceId}` + `New client registered with appName=${ + clientRegistration.appName + } and instanceId=${clientRegistration.instanceId}` ); return res.status(202).end(); } catch (err) {