mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	Add ability to create custom stratgies. Closes #11.
This commit is contained in:
		
							parent
							
								
									d89ce75906
								
							
						
					
					
						commit
						20c4fe6702
					
				@ -1,6 +1,6 @@
 | 
			
		||||
var eventStore = require('./eventStore'),
 | 
			
		||||
    eventType = require('./eventType'),
 | 
			
		||||
    featureDb = require('./featureDb');
 | 
			
		||||
var eventStore = require('./eventStore');
 | 
			
		||||
var eventType = require('./eventType');
 | 
			
		||||
var featureDb = require('./featureDb');
 | 
			
		||||
 | 
			
		||||
module.exports = function (app) {
 | 
			
		||||
 | 
			
		||||
@ -44,11 +44,9 @@ module.exports = function (app) {
 | 
			
		||||
                type: eventType.featureCreated,
 | 
			
		||||
                createdBy: req.connection.remoteAddress,
 | 
			
		||||
                data: newFeature
 | 
			
		||||
            }).then(function () {
 | 
			
		||||
                res.status(201).end();
 | 
			
		||||
            }, function () {
 | 
			
		||||
                res.status(500).end();
 | 
			
		||||
            });
 | 
			
		||||
            })
 | 
			
		||||
                .then(function ()  { res.status(201).end(); })
 | 
			
		||||
                .catch(function () { res.status(500).end(); });
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        featureDb.getFeature(newFeature.name)
 | 
			
		||||
 | 
			
		||||
@ -1,25 +1,7 @@
 | 
			
		||||
var eventStore = require('./eventStore');
 | 
			
		||||
var eventType = require('./eventType');
 | 
			
		||||
var strategyDb = require('./strategyDb');
 | 
			
		||||
 | 
			
		||||
var strategies = [
 | 
			
		||||
    {
 | 
			
		||||
        name: "default",
 | 
			
		||||
        description: "Default on or off Strategy."
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        name: "usersWithEmail",
 | 
			
		||||
        description: "Active for users defined  in the comma-separated emails-parameter.",
 | 
			
		||||
        parametersTemplate: {
 | 
			
		||||
            emails: "String"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
function byName(name) {
 | 
			
		||||
    return strategies.filter(function(s) {
 | 
			
		||||
        return s.name === name;
 | 
			
		||||
    })[0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = function (app) {
 | 
			
		||||
 | 
			
		||||
    app.get('/strategies', function (req, res) {
 | 
			
		||||
@ -29,16 +11,42 @@ module.exports = function (app) {
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    app.get('/strategies/:name', function (req, res) {
 | 
			
		||||
        var strategy = byName(req.params.name);
 | 
			
		||||
        if (strategy) {
 | 
			
		||||
            res.json(strategy);
 | 
			
		||||
        } else {
 | 
			
		||||
            res.json(404, {error: 'Could not find strategy'});
 | 
			
		||||
        }
 | 
			
		||||
        strategyDb.getStrategy(req.params.name)
 | 
			
		||||
            .then(function (strategy) { res.json(strategy);  })
 | 
			
		||||
            .catch(function () { res.json(404, {error: 'Could not find strategy'}); });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    app.post('/strategies', function (req, res) {
 | 
			
		||||
        res.json(500, {error: 'Not implemented yet'});
 | 
			
		||||
        req.checkBody('name', 'Name is required').notEmpty();
 | 
			
		||||
        req.checkBody('name', 'Name must match format ^[a-zA-Z\\.\\-]+$').matches(/^[a-zA-Z\\.\\-]+$/i);
 | 
			
		||||
 | 
			
		||||
        var errors = req.validationErrors();
 | 
			
		||||
 | 
			
		||||
        if (errors) {
 | 
			
		||||
            res.status(400).json(errors);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var newStrategy = req.body;
 | 
			
		||||
 | 
			
		||||
        var handleStrategyExists = function() {
 | 
			
		||||
            var errors = [{msg: "A strategy named " + newStrategy.name + " already exists."}];
 | 
			
		||||
            res.status(403).json(errors);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        var handleCreateStrategy = function() {
 | 
			
		||||
            eventStore.create({
 | 
			
		||||
                type: eventType.strategyCreated,
 | 
			
		||||
                createdBy: req.connection.remoteAddress,
 | 
			
		||||
                data: newStrategy
 | 
			
		||||
            })
 | 
			
		||||
                .then(function ()  { res.status(201).end(); })
 | 
			
		||||
                .catch(function () { res.status(500).end(); });
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        strategyDb.getStrategy(newStrategy.name)
 | 
			
		||||
            .then(handleStrategyExists)
 | 
			
		||||
            .catch(handleCreateStrategy);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -41,12 +41,20 @@ var StrategiesComponent = React.createClass({
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onSave: function(strategy) {
 | 
			
		||||
        var strategies = this.state.strategies.concat([strategy]);
 | 
			
		||||
        this.setState({
 | 
			
		||||
            createView: false,
 | 
			
		||||
            strategies: strategies
 | 
			
		||||
        });
 | 
			
		||||
        console.log("Saved strategy: ", strategy);
 | 
			
		||||
        function handleSuccess() {
 | 
			
		||||
            var strategies = this.state.strategies.concat([strategy]);
 | 
			
		||||
 | 
			
		||||
            this.setState({
 | 
			
		||||
                createView: false,
 | 
			
		||||
                strategies: strategies
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            console.log("Saved strategy: ", strategy);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        strategyStore.createStrategy(strategy)
 | 
			
		||||
        .then(handleSuccess.bind(this))
 | 
			
		||||
        .catch(this.onError);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    render: function() {
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
var reqwest = require('reqwest');
 | 
			
		||||
 | 
			
		||||
TYPE         = 'json';
 | 
			
		||||
CONTENT_TYPE = 'application/json';
 | 
			
		||||
var TYPE         = 'json';
 | 
			
		||||
var CONTENT_TYPE = 'application/json';
 | 
			
		||||
 | 
			
		||||
var EventStore = {
 | 
			
		||||
    getEvents: function () {
 | 
			
		||||
 | 
			
		||||
@ -3,16 +3,16 @@ var reqwest = require('reqwest');
 | 
			
		||||
var FeatureStore = function () {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
FeatureStore.TYPE         = 'json';
 | 
			
		||||
FeatureStore.CONTENT_TYPE = 'application/json';
 | 
			
		||||
var TYPE         = 'json';
 | 
			
		||||
var CONTENT_TYPE = 'application/json';
 | 
			
		||||
 | 
			
		||||
FeatureStore.prototype = {
 | 
			
		||||
    updateFeature: function (feature) {
 | 
			
		||||
        return reqwest({
 | 
			
		||||
            url: 'features/' + feature.name,
 | 
			
		||||
            method: 'put',
 | 
			
		||||
            type: FeatureStore.TYPE,
 | 
			
		||||
            contentType: FeatureStore.CONTENT_TYPE,
 | 
			
		||||
            type: TYPE,
 | 
			
		||||
            contentType: CONTENT_TYPE,
 | 
			
		||||
            data: JSON.stringify(feature)
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
@ -21,8 +21,8 @@ FeatureStore.prototype = {
 | 
			
		||||
        return reqwest({
 | 
			
		||||
            url: 'features',
 | 
			
		||||
            method: 'post',
 | 
			
		||||
            type: FeatureStore.TYPE,
 | 
			
		||||
            contentType: FeatureStore.CONTENT_TYPE,
 | 
			
		||||
            type: TYPE,
 | 
			
		||||
            contentType: CONTENT_TYPE,
 | 
			
		||||
            data: JSON.stringify(feature)
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
@ -31,7 +31,7 @@ FeatureStore.prototype = {
 | 
			
		||||
        return reqwest({
 | 
			
		||||
            url: 'features',
 | 
			
		||||
            method: 'get',
 | 
			
		||||
            type: FeatureStore.TYPE
 | 
			
		||||
            type: TYPE
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
var reqwest = require('reqwest');
 | 
			
		||||
 | 
			
		||||
TYPE         = 'json';
 | 
			
		||||
CONTENT_TYPE = 'application/json';
 | 
			
		||||
var TYPE         = 'json';
 | 
			
		||||
var CONTENT_TYPE = 'application/json';
 | 
			
		||||
 | 
			
		||||
var StrategyStore = {
 | 
			
		||||
    createStrategy: function (strategy) {
 | 
			
		||||
 | 
			
		||||
@ -13,6 +13,13 @@ describe('The features api', function () {
 | 
			
		||||
            .expect(200, done);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('gets a feature by name', function (done) {
 | 
			
		||||
        request
 | 
			
		||||
            .get('/features/featureX')
 | 
			
		||||
            .expect('Content-Type', /json/)
 | 
			
		||||
            .expect(200, done);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('creates new feature toggle', function (done) {
 | 
			
		||||
        request
 | 
			
		||||
            .post('/features')
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										40
									
								
								test/strategyApiSpec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								test/strategyApiSpec.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,40 @@
 | 
			
		||||
var specHelper = require('./specHelper');
 | 
			
		||||
 | 
			
		||||
describe('The strategy api', function () {
 | 
			
		||||
    var request;
 | 
			
		||||
 | 
			
		||||
    before(function () { request = specHelper.setupMockServer(); });
 | 
			
		||||
    after(specHelper.tearDownMockServer);
 | 
			
		||||
 | 
			
		||||
    it('gets all strategies', function (done) {
 | 
			
		||||
        request
 | 
			
		||||
            .get('/strategies')
 | 
			
		||||
            .expect('Content-Type', /json/)
 | 
			
		||||
            .expect(200, done);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('gets a strategy by name', function (done) {
 | 
			
		||||
        request
 | 
			
		||||
            .get('/strategies/default')
 | 
			
		||||
            .expect('Content-Type', /json/)
 | 
			
		||||
            .expect(200, done);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('creates a new strategy', function (done) {
 | 
			
		||||
        request
 | 
			
		||||
            .post('/strategies')
 | 
			
		||||
            .send({name: 'myCustomStrategy', description: 'Best strategy ever.'})
 | 
			
		||||
            .set('Content-Type', 'application/json')
 | 
			
		||||
            .expect(201, done);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('requires new strategies to have a name', function (done) {
 | 
			
		||||
        request
 | 
			
		||||
            .post('/strategies')
 | 
			
		||||
            .send({name: ''})
 | 
			
		||||
            .set('Content-Type', 'application/json')
 | 
			
		||||
            .expect(400, done);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
@ -26,10 +26,10 @@ module.exports = {
 | 
			
		||||
            resolve(strategies);
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
    getFeature: function(name) {
 | 
			
		||||
        var feature = byName(name);
 | 
			
		||||
        if(feature) {
 | 
			
		||||
            return Promise.resolve(feature);
 | 
			
		||||
    getStrategy: function(name) {
 | 
			
		||||
        var strategy = byName(name);
 | 
			
		||||
        if(strategy) {
 | 
			
		||||
            return Promise.resolve(strategy);
 | 
			
		||||
        } else {
 | 
			
		||||
            return Promise.reject("strategy not found");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user