Spiegel von
https://github.com/paviliondev/discourse-custom-wizard.git
synchronisiert 2024-11-24 10:20:28 +01:00
262 Zeilen
6,7 KiB
JavaScript
262 Zeilen
6,7 KiB
JavaScript
import Controller from "@ember/controller";
|
|
import { and, equal, not } from "@ember/object/computed";
|
|
import { service } from "@ember/service";
|
|
import { underscore } from "@ember/string";
|
|
import { ajax } from "discourse/lib/ajax";
|
|
import { popupAjaxError } from "discourse/lib/ajax-error";
|
|
import { default as discourseComputed } from "discourse-common/utils/decorators";
|
|
import I18n from "I18n";
|
|
import { selectKitContent } from "../lib/wizard";
|
|
import CustomWizardApi from "../models/custom-wizard-api";
|
|
|
|
export default Controller.extend({
|
|
router: service(),
|
|
|
|
queryParams: ["refresh_list"],
|
|
loadingSubscriptions: false,
|
|
notAuthorized: not("api.authorized"),
|
|
endpointMethods: selectKitContent(["PUT", "POST", "PATCH", "DELETE"]),
|
|
showRemove: not("isNew"),
|
|
showRedirectUri: and("threeLeggedOauth", "api.name"),
|
|
responseIcon: null,
|
|
contentTypes: selectKitContent([
|
|
"application/json",
|
|
"application/x-www-form-urlencoded",
|
|
]),
|
|
successCodes: selectKitContent([
|
|
100, 101, 102, 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301,
|
|
302, 303, 303, 304, 305, 306, 307, 308,
|
|
]),
|
|
|
|
@discourseComputed(
|
|
"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;
|
|
},
|
|
|
|
@discourseComputed("api.name", "api.authType")
|
|
saveDisabled(name, authType) {
|
|
return !name || !authType;
|
|
},
|
|
|
|
authorizationTypes: selectKitContent(["none", "basic", "oauth_2", "oauth_3"]),
|
|
isBasicAuth: equal("api.authType", "basic"),
|
|
|
|
@discourseComputed("api.authType")
|
|
isOauth(authType) {
|
|
return authType && authType.indexOf("oauth") > -1;
|
|
},
|
|
|
|
twoLeggedOauth: equal("api.authType", "oauth_2"),
|
|
threeLeggedOauth: equal("api.authType", "oauth_3"),
|
|
|
|
@discourseComputed("api.isNew")
|
|
nameClass(isNew) {
|
|
return isNew ? "new" : "saved";
|
|
},
|
|
|
|
actions: {
|
|
addParam() {
|
|
this.get("api.authParams").pushObject({});
|
|
},
|
|
|
|
removeParam(param) {
|
|
this.get("api.authParams").removeObject(param);
|
|
},
|
|
|
|
addEndpoint() {
|
|
this.get("api.endpoints").pushObject({});
|
|
},
|
|
|
|
removeEndpoint(endpoint) {
|
|
this.get("api.endpoints").removeObject(endpoint);
|
|
},
|
|
|
|
authorize() {
|
|
const api = this.get("api");
|
|
const { name, authType, authUrl, authParams } = api;
|
|
|
|
this.set("authErrorMessage", "");
|
|
|
|
if (authType === "oauth_2") {
|
|
this.set("authorizing", true);
|
|
ajax(`/admin/wizards/apis/${underscore(name)}/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)}`;
|
|
});
|
|
}
|
|
|
|
window.location.href = authUrl + query;
|
|
}
|
|
},
|
|
|
|
save() {
|
|
const api = this.get("api");
|
|
const name = api.name;
|
|
const authType = api.authType;
|
|
let error;
|
|
|
|
if (!name || !authType) {
|
|
return;
|
|
}
|
|
|
|
let data = {
|
|
auth_type: authType,
|
|
};
|
|
|
|
if (api.title) {
|
|
data["title"] = api.title;
|
|
}
|
|
|
|
if (api.get("isNew")) {
|
|
data["new"] = true;
|
|
}
|
|
|
|
let requiredParams;
|
|
|
|
if (authType === "basic") {
|
|
requiredParams = ["username", "password"];
|
|
} else if (authType === "oauth_2") {
|
|
requiredParams = ["tokenUrl", "clientId", "clientSecret"];
|
|
} else if (authType === "oauth_3") {
|
|
requiredParams = ["authUrl", "tokenUrl", "clientId", "clientSecret"];
|
|
}
|
|
|
|
if (requiredParams) {
|
|
for (let rp of requiredParams) {
|
|
if (!api[rp]) {
|
|
let key = rp.replace("auth", "");
|
|
error = `${I18n.t(
|
|
`admin.wizard.api.auth.${underscore(key)}`
|
|
)} is required for ${authType}`;
|
|
break;
|
|
}
|
|
data[underscore(rp)] = api[rp];
|
|
}
|
|
}
|
|
|
|
const params = api.authParams;
|
|
if (params.length) {
|
|
data["auth_params"] = JSON.stringify(params);
|
|
}
|
|
|
|
const endpoints = api.endpoints;
|
|
if (endpoints.length) {
|
|
for (let e of endpoints) {
|
|
if (!e.name) {
|
|
error = "Every endpoint must have a name";
|
|
break;
|
|
}
|
|
}
|
|
data["endpoints"] = JSON.stringify(endpoints);
|
|
}
|
|
|
|
if (error) {
|
|
this.set("error", error);
|
|
setTimeout(() => {
|
|
this.set("error", "");
|
|
}, 6000);
|
|
return;
|
|
}
|
|
|
|
this.set("updating", true);
|
|
|
|
ajax(`/admin/wizards/api/${underscore(name)}`, {
|
|
type: "PUT",
|
|
data,
|
|
})
|
|
.catch(popupAjaxError)
|
|
.then((result) => {
|
|
if (result.success) {
|
|
this.send("afterSave", result.api.name);
|
|
} else {
|
|
this.set("responseIcon", "times");
|
|
}
|
|
})
|
|
.finally(() => this.set("updating", false));
|
|
},
|
|
|
|
remove() {
|
|
const name = this.get("api.name");
|
|
if (!name) {
|
|
return;
|
|
}
|
|
|
|
this.set("updating", true);
|
|
|
|
ajax(`/admin/wizards/api/${underscore(name)}`, {
|
|
type: "DELETE",
|
|
})
|
|
.catch(popupAjaxError)
|
|
.then((result) => {
|
|
if (result.success) {
|
|
this.send("afterDestroy");
|
|
}
|
|
})
|
|
.finally(() => this.set("updating", false));
|
|
},
|
|
|
|
clearLogs() {
|
|
const name = this.get("api.name");
|
|
if (!name) {
|
|
return;
|
|
}
|
|
|
|
ajax(`/admin/wizards/api/${underscore(name)}/logs`, {
|
|
type: "DELETE",
|
|
})
|
|
.catch(popupAjaxError)
|
|
.then((result) => {
|
|
if (result.success) {
|
|
this.router.transitionTo("adminWizardsApis").then(() => {
|
|
this.send("refreshModel");
|
|
});
|
|
}
|
|
})
|
|
.finally(() => this.set("updating", false));
|
|
},
|
|
},
|
|
});
|