discourse/app/assets/javascripts/admin/models/web-hook.js.es6
2016-09-05 18:44:00 +08:00

86 lines
2.7 KiB
JavaScript

import RestModel from 'discourse/models/rest';
import Category from 'discourse/models/category';
import Group from 'discourse/models/group';
import { default as computed, observes } from 'ember-addons/ember-computed-decorators';
export default RestModel.extend({
content_type: 1, // json
last_delivery_status: 1, // inactive
wildcard_web_hook: false,
verify_certificate: true,
active: false,
web_hook_event_types: null,
categoriesFilter: null,
groupsFilterInName: null,
@computed('wildcard_web_hook')
webHookType: {
get(wildcard) {
return wildcard ? 'wildcard' : 'individual';
},
set(value) {
this.set('wildcard_web_hook', value === 'wildcard');
}
},
@observes('category_ids')
updateCategoriesFilter() {
this.set('categoriesFilter', Category.findByIds(this.get('category_ids')));
},
@observes('group_ids')
updateGroupsFilter() {
const groupIds = this.get('group_ids');
this.set('groupsFilterInName', Discourse.Site.currentProp('groups').reduce((groupNames, g) => {
if (groupIds.includes(g.id)) { groupNames.push(g.name); }
return groupNames;
}, []));
},
groupFinder(term) {
return Group.findAll({search: term, ignore_automatic: false});
},
@computed('wildcard_web_hook', 'web_hook_event_types.[]')
description(isWildcardWebHook, types) {
let desc = '';
types.forEach(type => {
const name = `${type.name.toLowerCase()}_event`;
desc += (desc !== '' ? `, ${name}` : name);
});
return (isWildcardWebHook ? '*' : desc);
},
createProperties() {
const types = this.get('web_hook_event_types');
const categories = this.get('categoriesFilter');
// Hack as {{group-selector}} accepts a comma-separated string as data source, but
// we use an array to populate the datasource above.
const groupsFilter = this.get('groupsFilterInName');
const groupNames = typeof groupsFilter === 'string' ? groupsFilter.split(',') : groupsFilter;
return {
payload_url: this.get('payload_url'),
content_type: this.get('content_type'),
secret: this.get('secret'),
wildcard_web_hook: this.get('wildcard_web_hook'),
verify_certificate: this.get('verify_certificate'),
active: this.get('active'),
web_hook_event_type_ids: Ember.isEmpty(types) ? [null] : types.map(type => type.id),
category_ids: Ember.isEmpty(categories) ? [null] : categories.map(c => c.id),
group_ids: Ember.isEmpty(groupNames) || Ember.isEmpty(groupNames[0]) ? [null] : Discourse.Site.currentProp('groups')
.reduce((groupIds, g) => {
if (groupNames.includes(g.name)) { groupIds.push(g.id); }
return groupIds;
}, [])
};
},
updateProperties() {
return this.createProperties();
}
});