mirror of https://github.com/status-im/consul.git
106 lines
3.5 KiB
JavaScript
106 lines
3.5 KiB
JavaScript
|
import SingleRoute from 'consul-ui/routing/single';
|
||
|
import { inject as service } from '@ember/service';
|
||
|
import { hash } from 'rsvp';
|
||
|
import { set, get } from '@ember/object';
|
||
|
import updateArrayObject from 'consul-ui/utils/update-array-object';
|
||
|
|
||
|
import WithTokenActions from 'consul-ui/mixins/token/with-actions';
|
||
|
|
||
|
const ERROR_PARSE_RULES = 'Failed to parse ACL rules';
|
||
|
const ERROR_NAME_EXISTS = 'Invalid Policy: A Policy with Name';
|
||
|
export default SingleRoute.extend(WithTokenActions, {
|
||
|
repo: service('tokens'),
|
||
|
policiesRepo: service('policies'),
|
||
|
datacenterRepo: service('dc'),
|
||
|
settings: service('settings'),
|
||
|
model: function(params, transition) {
|
||
|
const dc = this.modelFor('dc').dc.Name;
|
||
|
const policiesRepo = get(this, 'policiesRepo');
|
||
|
return this._super(...arguments).then(model => {
|
||
|
return hash({
|
||
|
...model,
|
||
|
...{
|
||
|
// TODO: I only need these to create a new policy
|
||
|
datacenters: get(this, 'datacenterRepo').findAll(),
|
||
|
policy: this.getEmptyPolicy(),
|
||
|
token: get(this, 'settings').findBySlug('token'),
|
||
|
items: policiesRepo.findAllByDatacenter(dc).catch(function(e) {
|
||
|
switch (get(e, 'errors.firstObject.status')) {
|
||
|
case '403':
|
||
|
case '401':
|
||
|
// do nothing the SingleRoute will have caught it already
|
||
|
return;
|
||
|
}
|
||
|
throw e;
|
||
|
}),
|
||
|
},
|
||
|
});
|
||
|
});
|
||
|
},
|
||
|
setupController: function(controller, model) {
|
||
|
this._super(...arguments);
|
||
|
controller.setProperties(model);
|
||
|
},
|
||
|
getEmptyPolicy: function() {
|
||
|
const dc = this.modelFor('dc').dc.Name;
|
||
|
return get(this, 'policiesRepo').create({ Datacenter: dc });
|
||
|
},
|
||
|
actions: {
|
||
|
// TODO: Some of this could potentially be moved to the repo services
|
||
|
loadPolicy: function(item, items) {
|
||
|
const repo = get(this, 'policiesRepo');
|
||
|
const dc = this.modelFor('dc').dc.Name;
|
||
|
const slug = get(item, repo.getSlugKey());
|
||
|
repo.findBySlug(slug, dc).then(item => {
|
||
|
updateArrayObject(items, item, repo.getSlugKey());
|
||
|
});
|
||
|
},
|
||
|
remove: function(item, items) {
|
||
|
return items.removeObject(item);
|
||
|
},
|
||
|
clearPolicy: function() {
|
||
|
// TODO: I should be able to reset the ember-data object
|
||
|
// back to it original state?
|
||
|
// possibly Forms could know how to create
|
||
|
const controller = get(this, 'controller');
|
||
|
controller.setProperties({
|
||
|
policy: this.getEmptyPolicy(),
|
||
|
});
|
||
|
},
|
||
|
createPolicy: function(item, policies, success) {
|
||
|
get(this, 'policiesRepo')
|
||
|
.persist(item)
|
||
|
.then(item => {
|
||
|
set(item, 'CreateTime', new Date().getTime());
|
||
|
policies.pushObject(item);
|
||
|
return item;
|
||
|
})
|
||
|
.then(function() {
|
||
|
success();
|
||
|
})
|
||
|
.catch(err => {
|
||
|
if (typeof err.errors !== 'undefined') {
|
||
|
const error = err.errors[0];
|
||
|
let prop;
|
||
|
let message = error.detail;
|
||
|
switch (true) {
|
||
|
case message.indexOf(ERROR_PARSE_RULES) === 0:
|
||
|
prop = 'Rules';
|
||
|
message = error.detail;
|
||
|
break;
|
||
|
case message.indexOf(ERROR_NAME_EXISTS) === 0:
|
||
|
prop = 'Name';
|
||
|
message = message.substr(ERROR_NAME_EXISTS.indexOf(':') + 1);
|
||
|
break;
|
||
|
}
|
||
|
if (prop) {
|
||
|
item.addError(prop, message);
|
||
|
}
|
||
|
} else {
|
||
|
throw err;
|
||
|
}
|
||
|
});
|
||
|
},
|
||
|
},
|
||
|
});
|