Web: Doceditor: added initDoceditor, api, requestManager

This commit is contained in:
Artem Tarasov 2022-07-14 03:39:56 +03:00
parent 12ed025fad
commit c47a265eff
4 changed files with 1365 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View 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;
});
};

View 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);
};

View 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,
},
};
}
};