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

#18 Use real-db instead of dbMock to fetch feature toggles.

This commit is contained in:
Ivar Conradi Østhus 2014-10-23 15:17:04 +02:00
parent 7b5cf3de2d
commit 7e48350b83
6 changed files with 66 additions and 78 deletions

View File

@ -1,28 +0,0 @@
var Promise = require('bluebird');
var featuresMock = require('./featuresMock');
function getFeature(name) {
var featureFound;
featuresMock.forEach(function (feature) {
if (feature.name === name) {
featureFound = feature;
}
});
return Promise.resolve(featureFound);
}
function getFeatures() {
return Promise.resolve(featuresMock);
}
function addFeature(feature) {
featuresMock.push(feature);
return Promise.resolve();
}
module.exports = {
getFeature: getFeature,
getFeatures: getFeatures,
addFeature: addFeature
};

View File

@ -1,3 +1,4 @@
module.exports = { module.exports = {
featureCreated : 'feature-created' featureCreated : 'feature-created',
featureUpdated : 'feature-updated'
}; };

View File

@ -1,8 +1,8 @@
var db = require('./db'), var eventStore = require('./eventStore'),
eventStore = require('./eventStore'),
eventType = require('./eventType'), eventType = require('./eventType'),
featureDb = require('./featureDb'); featureDb = require('./featureDb');
module.exports = function (app) { module.exports = function (app) {
app.get('/features', function (req, res) { app.get('/features', function (req, res) {
@ -12,7 +12,7 @@ module.exports = function (app) {
}); });
app.get('/features/:id', function (req, res) { app.get('/features/:id', function (req, res) {
db.getFeature.then(function (feature) { featureDb.getFeature(req.params.id).then(function (feature) {
if (feature) { if (feature) {
res.json(feature); res.json(feature);
} else { } else {
@ -25,36 +25,41 @@ module.exports = function (app) {
var newFeature = req.body, var newFeature = req.body,
createdBy = req.connection.remoteAddress; createdBy = req.connection.remoteAddress;
db.getFeature(newFeature.name).then(function (feature) { var handleFeatureExist = function() {
if (feature) {
//Todo: error-msg: feature name is already in use
res.status(403).end(); res.status(403).end();
} else { };
var handleCreateFeature = function () {
eventStore.create({ eventStore.create({
type: eventType.featureCreated, type: eventType.featureCreated,
createdBy: createdBy, createdBy: createdBy,
data: newFeature data: newFeature
}).then(function() { }).then(function () {
res.status(201).end(); res.status(201).end();
}, function () {
res.status(500).end();
}); });
} };
});
featureDb.getFeature(newFeature.name).then(handleFeatureExist, handleCreateFeature);
}); });
app.patch('/features/:featureName', function (req, res) { app.patch('/features/:featureName', function (req, res) {
var featureName = req.params.featureName; var featureName = req.params.featureName;
db.getFeature(featureName).then(function (feature) {
if (feature) { featureDb.getFeature(featureName).then(
function () {
var changeRequest = req.body; var changeRequest = req.body;
var event = {}; var event = {};
event.type = 'feature-update'; event.type = eventType.featureUpdated;
event.user = req.connection.remoteAddress; event.user = req.connection.remoteAddress;
event.data = changeRequest; event.data = changeRequest;
res.status(202).end(); res.status(202).end();
} else { },
function () {
res.status(404).end(); res.status(404).end();
} }
}); );
}); });
}; };

View File

@ -31,6 +31,22 @@ function getFeatures() {
}); });
} }
function getFeature(name) {
var sql = 'SELECT name, enabled, strategy_name as strategy, parameters FROM features WHERE name=$1';
return new Promise(function (resolve, reject) {
dbPool.query(sql, [name], function(err, res) {
if(err) {reject(err);}
if(res.rows.length === 1) {
resolve(mapToToggle(res.rows[0]));
} else {
reject();
}
});
});
}
function mapToToggle(row) { function mapToToggle(row) {
return { return {
name: row.name, name: row.name,
@ -41,6 +57,7 @@ function mapToToggle(row) {
} }
module.exports = { module.exports = {
getFeatures: getFeatures getFeatures: getFeatures,
getFeature: getFeature
}; };

View File

@ -1,26 +0,0 @@
module.exports = [
{
"name": "featureX",
"description": "the #1 feature",
"enabled": true,
"strategy": "default"
},
{
"name": "featureY",
"description": "soon to be the #1 feature",
"enabled": false,
"strategy": "baz",
"parameters": {
"foo": "bar"
}
},
{
"name": "featureZ",
"description": "terrible feature",
"enabled": true,
"strategy": "baz",
"parameters": {
"foo": "rab"
}
}
];

View File

@ -27,10 +27,29 @@ var features = [
} }
]; ];
function getFeature(name) {
var featureFound;
features.forEach(function (feature) {
if (feature.name === name) {
featureFound = feature;
}
});
return featureFound;
}
module.exports = { module.exports = {
getFeatures: function() { getFeatures: function() {
return new Promise(function (resolve) { return new Promise(function (resolve) {
resolve(features); resolve(features);
}); });
},
getFeature: function(name) {
var feature = getFeature(name);
if(feature) {
return Promise.resolve(feature);
} else {
return Promise.reject("feature not found");
}
} }
}; };