UNPKG

@omnigraph/odata

Version:
131 lines (130 loc) 6.47 kB
"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, }; } }