1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-12-22 19:07:54 +01:00

API and gui for archiving #43

This commit is contained in:
ivaosthu 2014-12-15 22:40:07 +01:00 committed by Ivar Conradi Østhus
parent 5e40d4dc7f
commit 658e3ac2bc
7 changed files with 76 additions and 4 deletions

View File

@ -1,6 +1,7 @@
module.exports = {
featureCreated : 'feature-created',
featureUpdated : 'feature-updated',
featureArchive : 'feature-archive',
strategyCreated: 'strategy-created',
strategyDeleted: 'strategy-deleted'
};

View File

@ -79,6 +79,32 @@ module.exports = function (app) {
});
});
app.delete('/features/:featureName', function (req, res) {
var featureName = req.params.featureName;
var userName = req.connection.remoteAddress;
featureDb.getFeature(featureName)
.then(function () {
return eventStore.create({
type: eventType.featureArchive,
createdBy: userName,
data: {
name: featureName
}
});
})
.then(function () {
res.status(200).end();
})
.catch(NotFoundError, function () {
res.status(404).end();
})
.catch(function (err) {
logger.error("Could not archive feature="+featureName, err);
res.status(500).end();
});
});
function validateUniqueName(req) {
return new Promise(function(resolve, reject) {
featureDb.getFeature(req.body.name)

View File

@ -13,10 +13,15 @@ eventStore.on(eventType.featureUpdated, function (event) {
return updateFeature(event.data);
});
eventStore.on(eventType.featureArchive, function (event) {
return archiveFeature(event.data);
});
function getFeatures() {
return knex
.select(FEATURE_COLUMNS)
.from('features')
.where({archived: 0})
.orderBy('name', 'asc')
.map(rowToFeature);
}
@ -70,6 +75,16 @@ function updateFeature(data) {
});
}
function archiveFeature(data) {
return knex('features')
.where({name: data.name})
.update({archived: 1})
.catch(function (err) {
logger.error('Could not archive feature, error was: ', err);
});
}
module.exports = {
getFeatures: getFeatures,
getFeature: getFeature,

View File

@ -33,6 +33,12 @@ var Feature = React.createClass({
this.toggleEditMode();
},
archiveFeature: function() {
if (confirm("Are you sure you want to delete " + this.props.feature.name + "?")) {
this.props.onArchive(this.props.feature);
}
},
renderEditMode: function() {
return (
@ -64,14 +70,19 @@ var Feature = React.createClass({
{this.props.feature.strategy}
</td>
<td width="110">
<td width="150">
<div className="line">
<div className="unit size1of2">
<div className="unit size1of3">
<button title='Archive' onClick={this.archiveFeature} title="Remove">
<span className="icon-kryss1" />
</button>
</div>
<div className="unit size1of3">
<button className={this.state.editMode ? "primary" : ""} title='Edit' onClick={this.toggleEditMode}>
<span className="icon-redigere" />
</button>
</div>
<div className="unit size1of2">
<div className="unit size1of3">
<button className={this.state.showHistory ? "primary" : ""} title='History' onClick={this.toggleHistory}>
<span className="icon-visning_liste" />
</button>

View File

@ -8,7 +8,8 @@ var FeatureList = React.createClass({
<Feature
key={feature.name}
feature={feature}
onChange={this.props.onFeatureChanged} />
onChange={this.props.onFeatureChanged}
onArchive={this.props.onFeatureArchive}/>
);
}.bind(this));

View File

@ -55,6 +55,15 @@ var FeatureTogglesComponent = React.createClass({
.catch(this.handleError);
},
archiveFeature: function (feature) {
this.stopFeaturePoller();
this.state.featureStore
.archiveFeature(feature)
.then(this.startFeaturePoller)
.catch(this.handleError);
},
startFeaturePoller: function () {
this.state.featurePoller.start();
},
@ -121,6 +130,7 @@ var FeatureTogglesComponent = React.createClass({
<FeatureList
features={this.state.features}
onFeatureChanged={this.updateFeature}
onFeatureArchive={this.archiveFeature}
onFeatureSubmit={this.createFeature}
onFeatureCancel={this.cancelNewFeature}
onNewFeature={this.newFeature} />

View File

@ -27,6 +27,14 @@ FeatureStore.prototype = {
});
},
archiveFeature: function (feature) {
return reqwest({
url: 'features/' + feature.name,
method: 'delete',
type: TYPE
});
},
getFeatures: function () {
return reqwest({
url: 'features',