Files
pedwfrontend/pages/api/proxy/[...route].js
T

196 lines
5.9 KiB
JavaScript

import axios from "axios";
import https from "https";
import CryptoJS from "crypto-js";
import HmacSHA256 from "crypto-js/hmac-sha256";
import { rest } from "lodash";
const PROXY_RELAY_URL =
"https://" +
(process.env.RELAYURI || "dev-pedw-ns.servicebus.windows.net") +
"/" +
(process.env.RELAYPATH || "dev-pedw-hc") +
"/";
const accessTokenEndpoint = process.env.ACCESS_TOKEN_ENDPOINT;
const tenantId = process.env.TENANT;
const tokenBody =
"grant_type=" +
process.env.GRANT_TYPE +
"&client_id=" +
process.env.CLIENT_ID +
"&client_secret=" +
process.env.CLIENT_SECRET +
"&scope=" +
"https://" +
process.env.RELAYURI +
"/.default";
const tokenConfig = {
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"Cache-Control": "no-cache",
},
};
export const getToken = () => {
return axios
.post(
`${accessTokenEndpoint}${tenantId}/oauth2/v2.0/token`,
tokenBody,
tokenConfig
)
.then((res) => res.data)
.then((data) => {
return data;
})
.catch((error) => {
console.log("error :", error.response);
// return error;
});
};
function checkProxyPath(queryPath) {
const WORDKEY = process.env.NEXT_PUBLIC_HASHKEY;
var hashPath =
queryPath.indexOf("/api/proxy/") == -1
? queryPath
: queryPath.split("/api/proxy/")[1];
const wordKey = WORDKEY;
var hashlink = CryptoJS.HmacSHA256(
decodeURI(hashPath),
CryptoJS.enc.Hex.parse(wordKey)
);
hashlink = hashlink.toString(CryptoJS.enc.Hex);
return hashlink;
}
export default async function ApiProxy(req, res) {
var data = req.body; //JSON.stringify(req.body);
var accessToken = await getToken();
accessToken = accessToken.access_token;
const isDocument = req.url.indexOf("/documents/download") > -1;
let hashCheckPath =
req.url.indexOf("?hash=") > -1
? req.url.split("?hash=")[0]
: req.url.split("&hash=")[0];
let hashCheckValue =
req.url.indexOf("?hash=") > -1
? req.url.split("?hash=")[1]
: req.url.split("&hash=")[1];
let hashFromRequest = checkProxyPath(hashCheckPath);
let proxyDestinationURL =
PROXY_RELAY_URL +
(req.url.indexOf("?hash=") > -1
? req.url.split("?hash=")[0]
: req.url.split("&hash=")[0]
).split("/api/proxy/")[1] +
(req.url.indexOf("?hash=") > -1
? "?hash=" + req.url.split("?hash=")[1]
: "&hash=" + req.url.split("&hash=")[1]);
var configNoData = {
method: req.method,
//url: PROXY_RELAY_URL + updateFormCollection + "(" + incidentId + ")",
url: proxyDestinationURL,
headers: {
"OData-MaxVersion": "4.0",
"OData-Version": "4.0",
"Accept": "application/json",
"Prefer":
'odata.include-annotations="*",return=representation,odata.maxpagesize=10',
"Authorization": "Bearer " + accessToken,
"Content-Type": "application/json",
},
};
var config = {
method: req.method,
url: proxyDestinationURL,
headers: {
"OData-MaxVersion": "4.0",
"OData-Version": "4.0",
"Accept": "application/json",
"Prefer": 'odata.include-annotations="*",return=representation',
"Authorization": "Bearer " + accessToken,
"Content-Type": "application/json",
},
data: data,
};
var configDocument = {
method: req.method,
url:
PROXY_RELAY_URL +
req.url.split("?hash=")[0].split("/api/proxy/")[1] +
"?hash=" +
req.url.split("?hash=")[1],
headers: {
"OData-MaxVersion": "4.0",
"OData-Version": "4.0",
"Accept": "application/json",
"Prefer": 'odata.include-annotations="*",return=representation',
"Authorization": "Bearer " + accessToken,
"Content-Type": "application/json",
},
responseType: "arraybuffer",
};
if (hashCheckValue == hashFromRequest) {
return new Promise((resolve, reject) => {
let hasDocument =
hashCheckPath.indexOf("/download") > 0 ? true : false;
axios(
req.method == "PATCH"
? config
: req.method == "GET"
? hasDocument
? configDocument
: configNoData
: config
)
.then((response) => {
res.statusCode = 200;
if (hasDocument) {
res.setHeader(
"Content-disposition",
"attachment; filename=" +
response.headers["content-disposition"].split(
"filename="
)[1]
);
res.end(response.data);
} else {
res.setHeader("Content-Type", "application/json");
// res.setHeader("Cache-Control", "max-age=1800000");
res.end(JSON.stringify(response.data));
}
resolve();
})
.catch((error) => {
console.log("proxy response error", error);
//res.json(error);
res.status(405).end();
return resolve();
});
});
} else {
console.log(
"no matching hash",
hashCheckValue + " - " + hashFromRequest
);
res.status(405).end();
return resolve();
}
}