1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-02-23 00:22:19 +01:00

chore(modernize): Use base controller for all client controllers

This commit is contained in:
ivaosthu 2018-12-03 08:59:13 +01:00 committed by Ivar Conradi Østhus
parent 39bc265daf
commit a8de54dd73
11 changed files with 50 additions and 85 deletions

View File

@ -49,11 +49,7 @@ module.exports = function(config) {
}
// Setup API routes
const middleware = new IndexRouter(config);
if (!middleware) {
throw new Error('Routes invalid');
}
app.use(`${baseUriPath}/`, middleware.router());
app.use(`${baseUriPath}/`, new IndexRouter(config).router);
if (process.env.NODE_ENV !== 'production') {
app.use(errorHandler());

View File

@ -201,6 +201,7 @@ test('invalid feature names should not pass validation', t => {
);
});
// Make sure current UI works. Should align on joi errors in future.
test('invalid feature names should have error msg', t => {
t.plan(1);
const { request, base } = getSetup();

View File

@ -16,10 +16,10 @@ class AdminApi extends Controller {
const stores = config.stores;
this.app.get('/', this.index);
this.app.use('/features', new FeatureController(stores).router());
this.app.use('/archive', new ArchiveController(stores).router());
this.app.use('/features', new FeatureController(stores).router);
this.app.use('/archive', new ArchiveController(stores).router);
this.app.use('/strategies', strategies.router(config));
this.app.use('/events', new EventController(stores).router());
this.app.use('/events', new EventController(stores).router);
this.app.use('/metrics', metrics.router(config));
this.app.use('/user', user.router(config));
}

View File

@ -1,24 +1,18 @@
'use strict';
const { Router } = require('express');
const { register: prometheusRegister } = require('prom-client');
const Controller = require('./controller');
class BackstageController {
class BackstageController extends Controller {
constructor(config) {
const router = Router();
super();
if (config.serverMetrics) {
router.get('/prometheus', (req, res) => {
this.get('/prometheus', (req, res) => {
res.set('Content-Type', prometheusRegister.contentType);
res.end(prometheusRegister.metrics());
});
}
this.app = router;
}
router() {
return this.app;
}
}

View File

@ -1,18 +1,17 @@
'use strict';
const { Router } = require('express');
const Controller = require('../controller');
const { filter } = require('./util');
const version = 1;
class FeatureController {
class FeatureController extends Controller {
constructor({ featureToggleStore }) {
const router = Router();
this._router = router;
super();
this.toggleStore = featureToggleStore;
router.get('/', (req, res) => this.getAll(req, res));
router.get('/:featureName', this.getFeatureToggle.bind(this));
this.get('/', this.getAll);
this.get('/:featureName', this.getFeatureToggle);
}
async getAll(req, res) {
@ -33,10 +32,6 @@ class FeatureController {
res.status(404).json({ error: 'Could not find feature' });
}
}
router() {
return this._router;
}
}
module.exports = FeatureController;

View File

@ -1,31 +1,26 @@
'use strict';
const { Router } = require('express');
const Controller = require('../controller');
const FeatureController = require('./feature.js');
const MetricsController = require('./metrics.js');
const RegisterController = require('./register.js');
const apiDef = require('./api-def.json');
class ClientApi {
class ClientApi extends Controller {
constructor(config) {
const router = Router();
this._router = router;
super();
const stores = config.stores;
router.get('/', this.index);
router.use('/features', new FeatureController(stores).router());
router.use('/metrics', new MetricsController(stores).router());
router.use('/register', new RegisterController(stores).router());
this.get('/', this.index);
this.use('/features', new FeatureController(stores).router);
this.use('/metrics', new MetricsController(stores).router);
this.use('/register', new RegisterController(stores).router);
}
index(req, res) {
res.json(apiDef);
}
router() {
return this._router;
}
}
module.exports = ClientApi;

View File

@ -1,19 +1,18 @@
'use strict';
const { Router } = require('express');
const joi = require('joi');
const logger = require('../../logger')('client-api/metrics.js');
const Controller = require('../controller');
const { clientMetricsSchema } = require('./metrics-schema');
class ClientMetricsController {
class ClientMetricsController extends Controller {
constructor({ clientMetricsStore, clientInstanceStore }) {
const router = Router();
super();
this.clientMetricsStore = clientMetricsStore;
this.clientInstanceStore = clientInstanceStore;
this._router = router;
router.post('/', (req, res) => this.registerMetrics(req, res));
this.post('/', this.registerMetrics);
}
async registerMetrics(req, res) {
@ -40,10 +39,6 @@ class ClientMetricsController {
res.status(500).end();
}
}
router() {
return this._router;
}
}
module.exports = ClientMetricsController;

View File

@ -1,19 +1,18 @@
'use strict';
const { Router } = require('express');
const joi = require('joi');
const logger = require('../../logger')('/client-api/register.js');
const Controller = require('../controller');
const { clientRegisterSchema: schema } = require('./register-schema');
class RegisterController {
class RegisterController extends Controller {
constructor({ clientInstanceStore, clientApplicationsStore }) {
const router = Router();
this._router = router;
super();
this.clientInstanceStore = clientInstanceStore;
this.clientApplicationsStore = clientApplicationsStore;
router.post('/', (req, res) => this.handleRegister(req, res));
this.post('/', this.handleRegister);
}
async handleRegister(req, res) {
@ -41,10 +40,6 @@ class RegisterController {
return res.status(500).end();
}
}
router() {
return this._router;
}
}
module.exports = RegisterController;

View File

@ -26,7 +26,11 @@ class Controller {
this.app.delete(path, handler.bind(this));
}
router() {
use(path, router) {
this.app.use(path, router);
}
get router() {
return this.app;
}
}

View File

@ -1,16 +1,14 @@
'use strict';
const { Router } = require('express');
const logger = require('../logger')('health-check.js');
const Controller = require('./controller');
class HealthCheckController {
class HealthCheckController extends Controller {
constructor(config) {
const app = Router();
this.app = app;
super();
this.db = config.stores.db;
app.get('/', (req, res) => this.index(req, res));
this.get('/', (req, res) => this.index(req, res));
}
async index(req, res) {
@ -22,10 +20,6 @@ class HealthCheckController {
res.status(500).json({ health: 'BAD' });
}
}
router() {
return this.app;
}
}
module.exports = HealthCheckController;

View File

@ -1,36 +1,32 @@
'use strict';
const { Router } = require('express');
const AdminApi = require('./admin-api');
const ClientApi = require('./client-api');
const FeatureController = require('./client-api/feature.js');
const Controller = require('./controller');
const HealthCheckController = require('./health-check');
const BackstageCTR = require('./backstage.js');
const api = require('./api-def');
class IndexRouter {
class IndexRouter extends Controller {
constructor(config) {
const router = Router();
this._router = router;
router.use('/health', new HealthCheckController(config).router());
router.use('/internal-backstage', new BackstageCTR(config).router());
router.get(api.uri, (req, res) => res.json(api));
router.use(api.links.admin.uri, new AdminApi(config).router());
router.use(api.links.client.uri, new ClientApi(config).router());
super();
this.use('/health', new HealthCheckController(config).router);
this.use('/internal-backstage', new BackstageCTR(config).router);
this.get(api.uri, this.index);
this.use(api.links.admin.uri, new AdminApi(config).router);
this.use(api.links.client.uri, new ClientApi(config).router);
// legacy support (remove in 4.x)
if (config.enableLegacyRoutes) {
router.use(
'/api/features',
new FeatureController(config.stores).router()
);
const featureController = new FeatureController(config.stores);
this.use('/api/features', featureController.router);
}
}
router() {
return this._router;
index(req, res) {
res.json(api);
}
}