import { popupAjaxError } from 'discourse/lib/ajax-error'; import { extractDomainFromUrl } from 'discourse/lib/utilities'; import computed from 'ember-addons/ember-computed-decorators'; import InputValidation from 'discourse/models/input-validation'; export default Ember.Controller.extend({ adminWebHooks: Ember.inject.controller(), eventTypes: Ember.computed.alias('adminWebHooks.eventTypes'), defaultEventTypes: Ember.computed.alias('adminWebHooks.defaultEventTypes'), contentTypes: Ember.computed.alias('adminWebHooks.contentTypes'), @computed('model.isSaving', 'saved', 'saveButtonDisabled') savingStatus(isSaving, saved, saveButtonDisabled) { if (isSaving) { return I18n.t('saving'); } else if (!saveButtonDisabled && saved) { return I18n.t('saved'); } // Use side effect of validation to clear saved text this.set('saved', false); return ''; }, @computed('model.isNew') saveButtonText(isNew) { return isNew ? I18n.t('admin.web_hooks.create') : I18n.t('admin.web_hooks.save'); }, @computed('model.secret') secretValidation(secret) { if (!Ember.isEmpty(secret)) { if (secret.indexOf(' ') !== -1) { return InputValidation.create({ failed: true, reason: I18n.t('admin.web_hooks.secret_invalid') }); } if (secret.length < 12) { return InputValidation.create({ failed: true, reason: I18n.t('admin.web_hooks.secret_too_short') }); } } }, @computed('model.wildcard_web_hook', 'model.web_hook_event_types.[]') eventTypeValidation(isWildcard, eventTypes) { if (!isWildcard && Ember.isEmpty(eventTypes)) { return InputValidation.create({ failed: true, reason: I18n.t('admin.web_hooks.event_type_missing') }); } }, @computed('model.isSaving', 'secretValidation', 'eventTypeValidation') saveButtonDisabled(isSaving, secretValidation, eventTypeValidation) { return isSaving ? false : secretValidation || eventTypeValidation; }, actions: { save() { this.set('saved', false); const url = extractDomainFromUrl(this.get('model.payload_url')); const model = this.get('model'); const saveWebHook = () => { return model.save().then(() => { this.set('saved', true); this.get('adminWebHooks').get('model').addObject(model); }).catch(popupAjaxError); }; if (url === 'localhost' || url.match(/192\.168\.\d+\.\d+/) || url.match(/127\.\d+\.\d+\.\d+/) || url === Discourse.BaseUrl) { return bootbox.confirm(I18n.t('admin.web_hooks.warn_local_payload_url'), I18n.t('no_value'), I18n.t('yes_value'), result => { if (result) { return saveWebHook(); } }); } return saveWebHook(); }, destroy() { return bootbox.confirm(I18n.t('admin.web_hooks.delete_confirm'), I18n.t('no_value'), I18n.t('yes_value'), result => { if (result) { const model = this.get('model'); model.destroyRecord().then(() => { this.get('adminWebHooks').get('model').removeObject(model); this.transitionToRoute('adminWebHooks'); }).catch(popupAjaxError); } }); } } });