UNPKG

@omnigraph/odata

Version:
44 lines (43 loc) 2.06 kB
import { parseResolveInfo } from 'graphql-parse-resolve-info'; import urljoin from 'url-join'; import { getDirectiveExtensions, mapMaybePromise } from '@graphql-tools/utils'; import { Request } from '@whatwg-node/fetch'; import { addIdentifierToUrl } from '../utils/addIdentifierToUrl.js'; import { getUrlString } from '../utils/getUrlString.js'; import { handleResponseText } from '../utils/handleResponseText.js'; import { prepareSearchParams } from '../utils/prepareSearchParams.js'; export function createSingularNavResolver({ navigationPropertyName, dataloaderFactory, expandNavProps, headersFactory, }) { return function singularNavResolver(root, args, context, info) { if (navigationPropertyName in root) { return root[navigationPropertyName]; } const url = new URL(root['@odata.id']); url.href = urljoin(url.href, '/' + navigationPropertyName); const returnType = info.returnType; const returnTypeDirectives = getDirectiveExtensions(returnType); const entityInfo = returnTypeDirectives.entityInfo[0]; addIdentifierToUrl(url, entityInfo.identifierFieldName, entityInfo.identifierFieldTypeRef, args); const parsedInfoFragment = parseResolveInfo(info); const searchParams = prepareSearchParams({ fragment: parsedInfoFragment, schema: info.schema, expandNavProps, }); searchParams?.forEach((value, key) => { url.searchParams.set(key, value); }); const urlString = getUrlString(url); const method = 'GET'; const request = new Request(urlString, { method, headers: headersFactory({ root, args, context, info, env: process.env, }, method), }); return mapMaybePromise(dataloaderFactory(context).load(request), response => mapMaybePromise(response.text(), responseText => handleResponseText(responseText, urlString, info))); }; }