2019-05-30 07:04:34 +02:00
|
|
|
import { ajax } from 'discourse/lib/ajax';
|
|
|
|
import { popupAjaxError } from 'discourse/lib/ajax-error';
|
|
|
|
import CustomWizardApi from '../models/custom-wizard-api';
|
2019-06-03 04:49:54 +02:00
|
|
|
import { default as computed } from 'ember-addons/ember-computed-decorators';
|
2019-05-30 07:04:34 +02:00
|
|
|
|
|
|
|
export default Ember.Controller.extend({
|
2019-06-02 12:54:31 +02:00
|
|
|
queryParams: ['refresh_list'],
|
2019-05-30 07:04:34 +02:00
|
|
|
loadingSubscriptions: false,
|
|
|
|
notAuthorized: Ember.computed.not('api.authorized'),
|
2019-05-31 09:54:11 +02:00
|
|
|
endpointMethods: ['GET', 'PUT', 'POST', 'PATCH', 'DELETE'],
|
2019-06-02 12:54:31 +02:00
|
|
|
showRemove: Ember.computed.not('isNew'),
|
2019-06-07 05:09:31 +02:00
|
|
|
showRedirectUri: Ember.computed.and('threeLeggedOauth', 'api.name'),
|
2019-06-03 04:49:54 +02:00
|
|
|
responseIcon: null,
|
2019-06-02 12:54:31 +02:00
|
|
|
|
2019-06-07 05:09:31 +02:00
|
|
|
@computed('saveDisabled', 'api.authType', 'api.authUrl', 'api.tokenUrl', 'api.clientId', 'api.clientSecret', 'threeLeggedOauth')
|
|
|
|
authDisabled(saveDisabled, authType, authUrl, tokenUrl, clientId, clientSecret, threeLeggedOauth) {
|
|
|
|
if (saveDisabled || !authType || !tokenUrl || !clientId || !clientSecret) return true;
|
|
|
|
if (threeLeggedOauth) return !authUrl;
|
|
|
|
return false;
|
2019-06-02 12:54:31 +02:00
|
|
|
},
|
|
|
|
|
2019-06-03 01:40:54 +02:00
|
|
|
@computed('api.name', 'api.authType')
|
|
|
|
saveDisabled(name, authType) {
|
|
|
|
return !name || !authType;
|
|
|
|
},
|
|
|
|
|
2019-06-07 05:09:31 +02:00
|
|
|
authorizationTypes: ['basic', 'oauth_2', 'oauth_3'],
|
|
|
|
isBasicAuth: Ember.computed.equal('api.authType', 'basic'),
|
|
|
|
|
|
|
|
@computed('api.authType')
|
|
|
|
isOauth(authType) {
|
|
|
|
return authType && authType.indexOf('oauth') > -1;
|
|
|
|
},
|
|
|
|
|
|
|
|
twoLeggedOauth: Ember.computed.equal('api.authType', 'oauth_2'),
|
|
|
|
threeLeggedOauth: Ember.computed.equal('api.authType', 'oauth_3'),
|
|
|
|
|
2019-05-30 07:04:34 +02:00
|
|
|
actions: {
|
|
|
|
addParam() {
|
|
|
|
this.get('api.authParams').pushObject({});
|
|
|
|
},
|
|
|
|
|
|
|
|
removeParam(param) {
|
|
|
|
this.get('api.authParams').removeObject(param);
|
|
|
|
},
|
|
|
|
|
2019-05-31 09:54:11 +02:00
|
|
|
addEndpoint() {
|
|
|
|
this.get('api.endpoints').pushObject({});
|
|
|
|
},
|
|
|
|
|
|
|
|
removeEndpoint(endpoint) {
|
|
|
|
this.get('api.endpoints').removeObject(endpoint);
|
|
|
|
},
|
|
|
|
|
2019-05-30 07:04:34 +02:00
|
|
|
authorize() {
|
|
|
|
const api = this.get('api');
|
2019-06-07 05:09:31 +02:00
|
|
|
const { name, authType, authUrl, authParams } = api;
|
|
|
|
|
|
|
|
this.set('authErrorMessage', '');
|
|
|
|
|
|
|
|
if (authType === 'oauth_2') {
|
|
|
|
this.set('authorizing', true);
|
|
|
|
ajax(`/admin/wizards/apis/${name.underscore()}/authorize`).catch(popupAjaxError)
|
|
|
|
.then(result => {
|
|
|
|
if (result.success) {
|
|
|
|
this.set('api', CustomWizardApi.create(result.api));
|
|
|
|
} else if (result.failed && result.message) {
|
|
|
|
this.set('authErrorMessage', result.message);
|
|
|
|
} else {
|
|
|
|
this.set('authErrorMessage', 'Authorization Failed');
|
|
|
|
}
|
|
|
|
setTimeout(() => {
|
|
|
|
this.set('authErrorMessage', '');
|
|
|
|
}, 6000);
|
|
|
|
}).finally(() => this.set('authorizing', false));
|
|
|
|
} else if (authType === 'oauth_3') {
|
|
|
|
let query = '?';
|
|
|
|
|
|
|
|
query += `client_id=${api.clientId}`;
|
|
|
|
query += `&redirect_uri=${encodeURIComponent(api.redirectUri)}`;
|
|
|
|
query += `&response_type=code`;
|
|
|
|
|
|
|
|
if (authParams) {
|
|
|
|
authParams.forEach(p => {
|
|
|
|
query += `&${p.key}=${encodeURIComponent(p.value)}`;
|
|
|
|
});
|
|
|
|
}
|
2019-05-30 07:04:34 +02:00
|
|
|
|
2019-06-07 05:09:31 +02:00
|
|
|
window.location.href = authUrl + query;
|
2019-05-30 07:04:34 +02:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
save() {
|
|
|
|
const api = this.get('api');
|
2019-06-02 12:54:31 +02:00
|
|
|
const name = api.name;
|
2019-06-03 01:40:54 +02:00
|
|
|
const authType = api.authType;
|
2019-06-02 12:54:31 +02:00
|
|
|
let refreshList = false;
|
2019-06-03 04:49:54 +02:00
|
|
|
let error;
|
2019-05-30 07:04:34 +02:00
|
|
|
|
2019-06-03 01:40:54 +02:00
|
|
|
if (!name || !authType) return;
|
2019-05-30 07:04:34 +02:00
|
|
|
|
2019-06-02 12:54:31 +02:00
|
|
|
let data = {
|
2019-06-03 01:40:54 +02:00
|
|
|
auth_type: authType
|
2019-06-02 12:54:31 +02:00
|
|
|
};
|
|
|
|
|
2019-06-03 01:40:54 +02:00
|
|
|
if (api.title) data['title'] = api.title;
|
|
|
|
|
2019-06-03 04:49:54 +02:00
|
|
|
const originalTitle = this.get('api.originalTitle');
|
|
|
|
if (api.get('isNew') || (originalTitle && (api.title !== originalTitle))) {
|
2019-06-02 12:54:31 +02:00
|
|
|
refreshList = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (api.get('isNew')) {
|
|
|
|
data['new'] = true;
|
|
|
|
};
|
|
|
|
|
2019-06-03 04:49:54 +02:00
|
|
|
let requiredParams;
|
2019-05-30 07:04:34 +02:00
|
|
|
|
2019-06-07 05:09:31 +02:00
|
|
|
if (authType === 'basic') {
|
2019-06-03 04:49:54 +02:00
|
|
|
requiredParams = ['username', 'password'];
|
2019-06-07 05:09:31 +02:00
|
|
|
} else if (authType === 'oauth_2') {
|
|
|
|
requiredParams = ['tokenUrl', 'clientId', 'clientSecret'];
|
|
|
|
} else if (authType === 'oauth_3') {
|
|
|
|
requiredParams = ['authUrl', 'tokenUrl', 'clientId', 'clientSecret'];
|
2019-06-03 04:49:54 +02:00
|
|
|
}
|
2019-05-30 07:04:34 +02:00
|
|
|
|
2019-06-03 04:49:54 +02:00
|
|
|
for (let rp of requiredParams) {
|
|
|
|
if (!api[rp]) {
|
|
|
|
let key = rp.replace('auth', '');
|
|
|
|
error = `${I18n.t(`admin.wizard.api.auth.${key.underscore()}`)} is required for ${authType}`;
|
|
|
|
break;
|
2019-05-30 07:04:34 +02:00
|
|
|
}
|
2019-06-03 04:49:54 +02:00
|
|
|
data[rp.underscore()] = api[rp];
|
|
|
|
}
|
2019-05-30 07:04:34 +02:00
|
|
|
|
2019-06-03 04:49:54 +02:00
|
|
|
const params = api.authParams;
|
|
|
|
if (params.length) {
|
|
|
|
data['auth_params'] = JSON.stringify(params);
|
2019-05-30 07:04:34 +02:00
|
|
|
}
|
|
|
|
|
2019-05-31 23:32:24 +02:00
|
|
|
const endpoints = api.endpoints;
|
2019-06-02 12:54:31 +02:00
|
|
|
if (endpoints.length) {
|
2019-06-03 04:49:54 +02:00
|
|
|
for (let e of endpoints) {
|
|
|
|
if (!e.name) {
|
|
|
|
error = 'Every endpoint must have a name';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2019-06-02 12:54:31 +02:00
|
|
|
data['endpoints'] = JSON.stringify(endpoints);
|
2019-05-31 09:54:11 +02:00
|
|
|
}
|
|
|
|
|
2019-06-03 04:49:54 +02:00
|
|
|
if (error) {
|
|
|
|
this.set('error', error);
|
|
|
|
setTimeout(() => {
|
|
|
|
this.set('error', '');
|
|
|
|
}, 6000);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-06-02 12:54:31 +02:00
|
|
|
this.set('updating', true);
|
2019-05-30 07:04:34 +02:00
|
|
|
|
2019-06-02 12:54:31 +02:00
|
|
|
ajax(`/admin/wizards/apis/${name.underscore()}`, {
|
2019-05-30 07:04:34 +02:00
|
|
|
type: 'PUT',
|
|
|
|
data
|
|
|
|
}).catch(popupAjaxError)
|
|
|
|
.then(result => {
|
|
|
|
if (result.success) {
|
2019-06-02 12:54:31 +02:00
|
|
|
if (refreshList) {
|
|
|
|
this.transitionToRoute('adminWizardsApi', result.api.name.dasherize()).then(() => {
|
|
|
|
this.send('refreshModel');
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
this.set('api', CustomWizardApi.create(result.api));
|
2019-06-03 04:49:54 +02:00
|
|
|
this.set('responseIcon', 'check');
|
2019-06-02 12:54:31 +02:00
|
|
|
}
|
2019-06-03 04:49:54 +02:00
|
|
|
} else {
|
|
|
|
this.set('responseIcon', 'times');
|
2019-06-02 12:54:31 +02:00
|
|
|
}
|
|
|
|
}).finally(() => this.set('updating', false));
|
|
|
|
},
|
|
|
|
|
|
|
|
remove() {
|
|
|
|
const name = this.get('api.name');
|
|
|
|
if (!name) return;
|
|
|
|
|
|
|
|
this.set('updating', true);
|
|
|
|
|
|
|
|
ajax(`/admin/wizards/apis/${name.underscore()}`, {
|
|
|
|
type: 'DELETE'
|
|
|
|
}).catch(popupAjaxError)
|
|
|
|
.then(result => {
|
|
|
|
if (result.success) {
|
2019-06-03 04:49:54 +02:00
|
|
|
this.transitionToRoute('adminWizardsApis').then(() => {
|
|
|
|
this.send('refreshModel');
|
|
|
|
});
|
2019-05-30 07:04:34 +02:00
|
|
|
}
|
2019-06-02 12:54:31 +02:00
|
|
|
}).finally(() => this.set('updating', false));
|
2019-06-06 18:10:13 +02:00
|
|
|
},
|
|
|
|
|
|
|
|
clearLogs() {
|
|
|
|
ajax(`/admin/wizards/apis/logs/${name.underscore()}`, {
|
|
|
|
type: 'DELETE'
|
|
|
|
}).catch(popupAjaxError)
|
|
|
|
.then(result => {
|
|
|
|
if (result.success) {
|
|
|
|
this.transitionToRoute('adminWizardsApis').then(() => {
|
|
|
|
this.send('refreshModel');
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}).finally(() => this.set('updating', false));
|
2019-05-30 07:04:34 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|