@omnigraph/odata
Version:
131 lines (130 loc) • 6.47 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.handleResponseText = handleResponseText;
const tslib_1 = require("tslib");
const graphql_1 = require("graphql");
const url_join_1 = tslib_1.__importDefault(require("url-join"));
const utils_1 = require("@graphql-tools/utils");
const addIdentifierToUrl_js_1 = require("./addIdentifierToUrl.js");
const getUrlString_js_1 = require("./getUrlString.js");
function handleResponseText(responseText, urlString, info) {
let responseJson;
try {
responseJson = JSON.parse(responseText);
}
catch (error) {
return (0, utils_1.createGraphQLError)(`Failed to parse response JSON: ${error.message}`, {
extensions: {
request: {
url: urlString,
},
response: {
body: responseText,
},
originalError: error,
},
});
}
if (responseJson.error) {
return (0, utils_1.createGraphQLError)(responseJson.error.message || responseJson.error, {
extensions: {
request: {
url: urlString,
},
response: {
body: responseJson,
},
},
});
}
const urlStringWithoutSearchParams = urlString.split('?')[0];
if ((0, graphql_1.isListType)(info.returnType)) {
const actualReturnType = (0, graphql_1.getNamedType)(info.returnType);
const entityTypeDirectives = (0, utils_1.getDirectiveExtensions)(actualReturnType);
if ('Message' in responseJson && !('value' in responseJson)) {
return (0, utils_1.createGraphQLError)(responseJson.Message, {
extensions: {
request: {
url: urlString,
},
response: {
body: responseJson,
},
},
});
}
const returnList = responseJson.value;
return returnList.map(element => {
if (!entityTypeDirectives?.entityInfo?.[0]) {
return element;
}
const urlOfElement = new URL(urlStringWithoutSearchParams);
(0, addIdentifierToUrl_js_1.addIdentifierToUrl)(urlOfElement, entityTypeDirectives.entityInfo[0].identifierFieldName, entityTypeDirectives.entityInfo[0].identifierFieldTypeRef, element);
const identifierUrl = element['@odata.id'] || (0, getUrlString_js_1.getUrlString)(urlOfElement);
const fieldMap = actualReturnType.getFields();
for (const fieldName in element) {
if (entityTypeDirectives.entityInfo[0].navigationFields.includes(fieldName)) {
const field = element[fieldName];
let fieldType = fieldMap[fieldName].type;
if ('ofType' in fieldType) {
fieldType = fieldType.ofType;
}
const fieldTypeDirectives = (0, utils_1.getDirectiveExtensions)(fieldType);
const fieldEntityInfo = fieldTypeDirectives?.entityInfo?.[0];
if (field instanceof Array) {
for (const fieldElement of field) {
const urlOfField = new URL((0, url_join_1.default)(identifierUrl, fieldName));
(0, addIdentifierToUrl_js_1.addIdentifierToUrl)(urlOfField, fieldEntityInfo.identifierFieldName, fieldEntityInfo.identifierFieldTypeRef, fieldElement);
fieldElement['@odata.id'] = fieldElement['@odata.id'] || (0, getUrlString_js_1.getUrlString)(urlOfField);
}
}
else {
const urlOfField = new URL((0, url_join_1.default)(identifierUrl, fieldName));
(0, addIdentifierToUrl_js_1.addIdentifierToUrl)(urlOfField, fieldEntityInfo.identifierFieldName, fieldEntityInfo.identifierFieldTypeRef, field);
field['@odata.id'] = field['@odata.id'] || (0, getUrlString_js_1.getUrlString)(urlOfField);
}
}
}
return {
'@odata.id': identifierUrl,
...element,
};
});
}
else {
const actualReturnType = info.returnType;
const entityTypeDirectives = (0, utils_1.getDirectiveExtensions)(actualReturnType);
if (!entityTypeDirectives?.entityInfo?.[0]) {
return responseJson;
}
const identifierUrl = responseJson['@odata.id'] || urlStringWithoutSearchParams;
const fieldMap = actualReturnType.getFields();
for (const fieldName in responseJson) {
if (entityTypeDirectives?.entityInfo?.[0]?.navigationFields.includes(fieldName)) {
const field = responseJson[fieldName];
let fieldType = fieldMap[fieldName].type;
if ('ofType' in fieldType) {
fieldType = fieldType.ofType;
}
const fieldTypeDirectives = (0, utils_1.getDirectiveExtensions)(fieldType);
const fieldEntityInfo = fieldTypeDirectives?.entityInfo?.[0];
if (field instanceof Array) {
for (const fieldElement of field) {
const urlOfField = new URL((0, url_join_1.default)(identifierUrl, fieldName));
(0, addIdentifierToUrl_js_1.addIdentifierToUrl)(urlOfField, fieldEntityInfo.identifierFieldName, fieldEntityInfo.identifierFieldTypeRef, fieldElement);
fieldElement['@odata.id'] = fieldElement['@odata.id'] || (0, getUrlString_js_1.getUrlString)(urlOfField);
}
}
else {
const urlOfField = new URL((0, url_join_1.default)(identifierUrl, fieldName));
(0, addIdentifierToUrl_js_1.addIdentifierToUrl)(urlOfField, fieldEntityInfo.identifierFieldName, fieldEntityInfo.identifierFieldTypeRef, field);
field['@odata.id'] = field['@odata.id'] || (0, getUrlString_js_1.getUrlString)(urlOfField);
}
}
}
return {
'@odata.id': responseJson['@odata.id'] || urlStringWithoutSearchParams,
...responseJson,
};
}
}