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, groupsFilterInName: null, @computed('wildcard_web_hook') webHookType: { get(wildcard) { return wildcard ? 'wildcard' : 'individual'; }, set(value) { this.set('wildcard_web_hook', value === 'wildcard'); } }, @computed('category_ids') categories(categoryIds) { return Category.findByIds(categoryIds); }, @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 categoryIds = this.get('categories').map(c => c.id); // 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(categoryIds) ? [null] : categoryIds, 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(); } });