Web: Doceditor: added initDoceditor, api, requestManager
This commit is contained in:
parent
12ed025fad
commit
c47a265eff
1144
web/ASC.Web.Editor/src/server/lib/api/encoder.js
Normal file
1144
web/ASC.Web.Editor/src/server/lib/api/encoder.js
Normal file
File diff suppressed because it is too large
Load Diff
63
web/ASC.Web.Editor/src/server/lib/api/init.js
Normal file
63
web/ASC.Web.Editor/src/server/lib/api/init.js
Normal file
@ -0,0 +1,63 @@
|
||||
const request = require("./requestManager");
|
||||
const Encoder = require("./encoder");
|
||||
exports.getDocServiceUrl = (headers) => {
|
||||
return request({ method: "get", url: `/files/docservice`, headers });
|
||||
};
|
||||
|
||||
exports.getFileInfo = (fileId, headers) => {
|
||||
const options = {
|
||||
method: "get",
|
||||
url: `/files/file/${fileId}`,
|
||||
headers,
|
||||
};
|
||||
|
||||
return request(options);
|
||||
};
|
||||
|
||||
exports.openEdit = (fileId, version, doc, view, headers) => {
|
||||
const params = []; // doc ? `?doc=${doc}` : "";
|
||||
|
||||
if (view) {
|
||||
params.push(`view=${view}`);
|
||||
}
|
||||
|
||||
if (version) {
|
||||
params.push(`version=${version}`);
|
||||
}
|
||||
|
||||
if (doc) {
|
||||
params.push(`doc=${doc}`);
|
||||
}
|
||||
|
||||
const paramsString = params.length > 0 ? `?${params.join("&")}` : "";
|
||||
|
||||
const options = {
|
||||
method: "get",
|
||||
url: `/files/file/${fileId}/openedit${paramsString}`,
|
||||
headers,
|
||||
};
|
||||
|
||||
return request(options);
|
||||
};
|
||||
|
||||
exports.getSettings = (headers) => {
|
||||
return request({
|
||||
method: "get",
|
||||
url: "/settings.json",
|
||||
headers,
|
||||
});
|
||||
};
|
||||
|
||||
exports.getUser = (userName = null, headers) => {
|
||||
return request({
|
||||
method: "get",
|
||||
url: `/people/${userName || "@self"}.json`,
|
||||
skipUnauthorized: true,
|
||||
headers,
|
||||
}).then((user) => {
|
||||
if (user && user.displayName) {
|
||||
user.displayName = Encoder.htmlDecode(user.displayName);
|
||||
}
|
||||
return user;
|
||||
});
|
||||
};
|
48
web/ASC.Web.Editor/src/server/lib/api/requestManager.js
Normal file
48
web/ASC.Web.Editor/src/server/lib/api/requestManager.js
Normal file
@ -0,0 +1,48 @@
|
||||
const axios = require("axios");
|
||||
const apiPrefixURL = "/api/2.0";
|
||||
const apiTimeout = 30000;
|
||||
|
||||
module.exports = (options) => {
|
||||
const basePath = options.basePath;
|
||||
const xRewriterUrl = options.headers["x-rewriter-url"];
|
||||
const url = `${xRewriterUrl}${apiPrefixURL}${options.url}`;
|
||||
|
||||
const axiosOptions = {
|
||||
baseURL: url,
|
||||
responseType: "json",
|
||||
timeout: apiTimeout,
|
||||
headers: options.headers,
|
||||
};
|
||||
|
||||
const getResponseError = (res) => {
|
||||
if (!res) return;
|
||||
|
||||
if (res.data && res.data.error) {
|
||||
return res.data.error.message;
|
||||
}
|
||||
|
||||
if (res.isAxiosError && res.message) {
|
||||
return res.message;
|
||||
}
|
||||
};
|
||||
|
||||
const onSuccess = (response) => {
|
||||
const error = getResponseError(response);
|
||||
if (error) throw new Error(error);
|
||||
|
||||
if (!response || !response.data || response.isAxiosError) return null;
|
||||
if (response.request.responseType === "text") return response.data;
|
||||
|
||||
return response.data.response;
|
||||
};
|
||||
|
||||
const onError = (error) => {
|
||||
const errorText = error.response
|
||||
? getResponseError(error.response)
|
||||
: error.message;
|
||||
return Promise.reject(errorText || error);
|
||||
};
|
||||
|
||||
const request = axios.create(axiosOptions);
|
||||
return request().then(onSuccess).catch(onError);
|
||||
};
|
110
web/ASC.Web.Editor/src/server/lib/initDocEditor.js
Normal file
110
web/ASC.Web.Editor/src/server/lib/initDocEditor.js
Normal file
@ -0,0 +1,110 @@
|
||||
const {
|
||||
getDocServiceUrl,
|
||||
getFileInfo,
|
||||
openEdit,
|
||||
getUser,
|
||||
getSettings,
|
||||
} = require("./api/init");
|
||||
|
||||
const combineUrl = (host = "", ...params) => {
|
||||
let url = host.replace(/\/+$/, "");
|
||||
|
||||
params.forEach((part) => {
|
||||
const newPart = part.trim().replace(/^\/+/, "");
|
||||
url += newPart
|
||||
? url.length > 0 && url[url.length - 1] === "/"
|
||||
? newPart
|
||||
: `/${newPart}`
|
||||
: "";
|
||||
});
|
||||
|
||||
return url;
|
||||
};
|
||||
|
||||
module.exports = async (req) => {
|
||||
if (!req) return false;
|
||||
|
||||
const { headers, url, query } = req;
|
||||
const { version, desktop: isDesktop } = query;
|
||||
let error = null;
|
||||
|
||||
try {
|
||||
const decodedId = query.fileId || query.fileid || null;
|
||||
const fileId =
|
||||
typeof decodedId === "string" ? encodeURIComponent(decodedId) : decodedId;
|
||||
|
||||
if (!fileId) {
|
||||
return {
|
||||
props: {
|
||||
needLoader: true,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
const doc = query?.doc || null;
|
||||
const view = url.indexOf("action=view") !== -1;
|
||||
const fileVersion = version || null;
|
||||
|
||||
const [user, settings] = await Promise.all([
|
||||
getUser(null, headers),
|
||||
getSettings(headers),
|
||||
]);
|
||||
|
||||
const successAuth = !!user;
|
||||
const personal = settings?.personal;
|
||||
|
||||
if (!successAuth && !doc) {
|
||||
error = {
|
||||
unAuthorized: true,
|
||||
redirectPath: combineUrl(
|
||||
"", //AppServerConfig.proxyURL,
|
||||
personal ? "/sign-in" : "/login"
|
||||
),
|
||||
};
|
||||
return {
|
||||
props: {
|
||||
error,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
let [config, docApiUrl, fileInfo] = await Promise.all([
|
||||
openEdit(fileId, fileVersion, doc, view, headers),
|
||||
getDocServiceUrl(headers),
|
||||
getFileInfo(fileId, headers),
|
||||
]);
|
||||
|
||||
const isSharingAccess = fileInfo && fileInfo.canShare;
|
||||
|
||||
if (view) {
|
||||
config.editorConfig.mode = "view";
|
||||
}
|
||||
|
||||
const actionLink = config?.editorConfig?.actionLink || null;
|
||||
|
||||
return {
|
||||
props: {
|
||||
fileInfo,
|
||||
docApiUrl,
|
||||
config,
|
||||
personal,
|
||||
successAuth,
|
||||
user,
|
||||
error,
|
||||
actionLink,
|
||||
isSharingAccess,
|
||||
url,
|
||||
doc,
|
||||
fileId,
|
||||
view,
|
||||
},
|
||||
};
|
||||
} catch (err) {
|
||||
error = { errorMessage: typeof err === "string" ? err : err.message };
|
||||
return {
|
||||
props: {
|
||||
error,
|
||||
},
|
||||
};
|
||||
}
|
||||
};
|
Loading…
Reference in New Issue
Block a user