mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			111 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						||
 | 
						||
const logger = require('../logger');
 | 
						||
const ClientMetrics = require('../client-metrics');
 | 
						||
const joi = require('joi');
 | 
						||
const { clientMetricsSchema, clientRegisterSchema } = require('./metrics-schema');
 | 
						||
const { catchLogAndSendErrorResponse } = require('./route-utils');
 | 
						||
 | 
						||
module.exports = function (app, config) {
 | 
						||
    const {
 | 
						||
        clientMetricsStore,
 | 
						||
        clientStrategyStore,
 | 
						||
        clientInstanceStore,
 | 
						||
    } = config.stores;
 | 
						||
 | 
						||
    const metrics = new ClientMetrics(clientMetricsStore);
 | 
						||
    
 | 
						||
    app.get('/client/seen-toggles', (req, res) => {
 | 
						||
        const seenAppToggles = metrics.getAppsWitToggles();
 | 
						||
        res.json(seenAppToggles);
 | 
						||
    });
 | 
						||
 | 
						||
    app.get('/client/metrics/feature-toggles', (req, res) => {
 | 
						||
        res.json(metrics.getTogglesMetrics());
 | 
						||
    });
 | 
						||
 | 
						||
    app.post('/client/metrics', (req, res) => {
 | 
						||
        const data = req.body;
 | 
						||
        const clientIp = req.ip;
 | 
						||
 | 
						||
        joi.validate(data, clientMetricsSchema, (err, cleaned) => {
 | 
						||
            if (err) {
 | 
						||
                return res.status(400).json(err);
 | 
						||
            }
 | 
						||
 | 
						||
            clientMetricsStore
 | 
						||
                .insert(cleaned)
 | 
						||
                .then(() => clientInstanceStore.insert({
 | 
						||
                    appName: cleaned.appName,
 | 
						||
                    instanceId: cleaned.instanceId,
 | 
						||
                    clientIp,
 | 
						||
                }))
 | 
						||
                .catch(err => catchLogAndSendErrorResponse(err, res));
 | 
						||
            
 | 
						||
            res.status(202).end();
 | 
						||
        });
 | 
						||
    });
 | 
						||
 | 
						||
    app.post('/client/register', (req, res) => {
 | 
						||
        const data = req.body;
 | 
						||
        const clientIp = req.ip;
 | 
						||
 | 
						||
        joi.validate(data, clientRegisterSchema, (err, cleaned) => {
 | 
						||
            if (err) {
 | 
						||
                return res.status(400).json(err);
 | 
						||
            }
 | 
						||
 | 
						||
            clientStrategyStore
 | 
						||
                .insert(cleaned.appName, cleaned.strategies)
 | 
						||
                .then(() => clientInstanceStore.insert({
 | 
						||
                    appName: cleaned.appName,
 | 
						||
                    instanceId: cleaned.instanceId,
 | 
						||
                    clientIp,
 | 
						||
                }))
 | 
						||
                .then(() => logger.info(`New client registered with 
 | 
						||
                            appName=${cleaned.appName} and instanceId=${cleaned.instanceId}`))
 | 
						||
                .catch(err => catchLogAndSendErrorResponse(err, res));
 | 
						||
 | 
						||
            res.status(202).end();
 | 
						||
        });
 | 
						||
    });
 | 
						||
 | 
						||
    app.get('/client/strategies', (req, res) => {
 | 
						||
        const appName = req.query.appName;
 | 
						||
        if(appName) {
 | 
						||
            clientStrategyStore.getByAppName(appName)
 | 
						||
                .then(data => res.json(data))
 | 
						||
                .catch(err => catchLogAndSendErrorResponse(err, res));
 | 
						||
        } else {
 | 
						||
            clientStrategyStore.getAll()
 | 
						||
                .then(data => res.json(data))
 | 
						||
                .catch(err => catchLogAndSendErrorResponse(err, res));
 | 
						||
        }
 | 
						||
    });
 | 
						||
 | 
						||
    app.get('/client/applications/', (req, res) => {
 | 
						||
        clientInstanceStore.getApplications()
 | 
						||
            .then(apps => {
 | 
						||
                const applications = apps.map(({appName}) => ({
 | 
						||
                    appName: appName, 
 | 
						||
                    links: {
 | 
						||
                        appDetails: `/api/client/applications/${appName}`
 | 
						||
                    }
 | 
						||
                }))
 | 
						||
                res.json({applications})
 | 
						||
            })
 | 
						||
            .catch(err => catchLogAndSendErrorResponse(err, res));
 | 
						||
    });
 | 
						||
 | 
						||
    app.get('/client/applications/:appName', (req, res) => {
 | 
						||
        const appName = req.params.appName;
 | 
						||
        const seenToggles = metrics.getSeenTogglesByAppName(appName);
 | 
						||
        Promise.all([
 | 
						||
                clientInstanceStore.getByAppName(appName), 
 | 
						||
                clientStrategyStore.getByAppName(appName)
 | 
						||
            ])
 | 
						||
            .then(([instances, strategies]) => res.json({appName, instances, strategies, seenToggles}))
 | 
						||
            .catch(err => catchLogAndSendErrorResponse(err, res));
 | 
						||
    });
 | 
						||
};
 |