diff --git a/packages/common/jsonld.js b/packages/common/jsonld.js index 2109d5b04ddc384e4a79c20639e920ccec25d3e4..ca16e378a51703c617cb32312dbb26190a2fd03e 100644 --- a/packages/common/jsonld.js +++ b/packages/common/jsonld.js @@ -61,73 +61,88 @@ export default class JSONLD { xhr.setRequestHeader('Authorization', 'Bearer ' + window.VPUAuthToken); xhr.onreadystatechange = function () { - if (xhr.readyState === 4) { - if (xhr.status === 200) { - const json = JSON.parse(xhr.responseText); - - let entryPoints = {}; - for (let property in json) { - // for some reason the properties start with a lower case character - if (!property.startsWith("@")) entryPoints[property.toLowerCase()] = json[property]; - } - - // read the link header of the api response - // const utils = require("./utils"); - const links = utils.parseLinkHeader(this.getResponseHeader("link")); - - // get the hydra apiDocumentation url - const apiDocUrl = links["http://www.w3.org/ns/hydra/core#apiDocumentation"]; - - if (apiDocUrl !== undefined) { - // load the hydra apiDocumentation - const docXhr = new XMLHttpRequest(); - docXhr.open("GET", apiDocUrl, true); - docXhr.setRequestHeader("Content-Type", "application/json"); - docXhr.onreadystatechange = function () { - if (docXhr.readyState === 4) { - if (docXhr.status === 200) { - const json = JSON.parse(docXhr.responseText); - const supportedClasses = json["hydra:supportedClass"]; - - let entities = {}; - const baseUrl = utils.parseBaseUrl(apiUrl); - - // gather the entities - supportedClasses.forEach(function (classData) { - // add entry point url - const entityName = classData["hydra:title"]; - let entryPoint = entryPoints[entityName.toLowerCase()]; - if (entryPoint !== undefined && !entryPoint.startsWith("http")) entryPoint = baseUrl + entryPoint; - classData["@entryPoint"] = entryPoint; - - entities[entityName] = classData; - }); - - const instance = new JSONLD(baseUrl, entities); - instances[apiUrl] = instance; - - // return the initialized JSONLD object - for (const fnc of successFunctions[apiUrl]) if (typeof fnc == 'function') fnc(instance); - successFunctions[apiUrl] = []; - } else { - JSONLD.executeFailureFunctions(apiUrl, i18n.t('jsonld.api-documentation-server', {apiUrl: apiDocUrl})); - } - } - }; - - docXhr.send(); - } else { - JSONLD.executeFailureFunctions(apiUrl, i18n.t('jsonld.error-hydra-documentation-url-not-set', {apiUrl: apiUrl})); - } + if (xhr.readyState !== 4) { + return; + } + + if (xhr.status === 200) { + const json = JSON.parse(xhr.responseText); + + let entryPoints = {}; + for (let property in json) { + // for some reason the properties start with a lower case character + if (!property.startsWith("@")) entryPoints[property.toLowerCase()] = json[property]; + } + + // read the link header of the api response + // const utils = require("./utils"); + const links = utils.parseLinkHeader(this.getResponseHeader("link")); + + // get the hydra apiDocumentation url + const apiDocUrl = links["http://www.w3.org/ns/hydra/core#apiDocumentation"]; + + if (apiDocUrl !== undefined) { + // load the hydra apiDocumentation + const docXhr = new XMLHttpRequest(); + docXhr.open("GET", apiDocUrl, true); + docXhr.setRequestHeader("Content-Type", "application/json"); + docXhr.onreadystatechange = function () { + if (docXhr.readyState !== 4) { + return; + } + + if (docXhr.status === 200) { + JSONLD.gatherEntities(docXhr, apiUrl, entryPoints); + } else { + JSONLD.executeFailureFunctions(apiUrl, i18n.t('jsonld.api-documentation-server', {apiUrl: apiDocUrl})); + } + }; + + docXhr.send(); } else { - JSONLD.executeFailureFunctions(apiUrl, i18n.t('jsonld.error-api-server', {apiUrl: apiUrl})); + JSONLD.executeFailureFunctions(apiUrl, i18n.t('jsonld.error-hydra-documentation-url-not-set', {apiUrl: apiUrl})); } + } else { + JSONLD.executeFailureFunctions(apiUrl, i18n.t('jsonld.error-api-server', {apiUrl: apiUrl})); } }; xhr.send(); } + /** + * Gather the entities + * + * @param docXhr + * @param apiUrl + * @param entryPoints + */ + static gatherEntities(docXhr, apiUrl, entryPoints) { + const json = JSON.parse(docXhr.responseText); + const supportedClasses = json["hydra:supportedClass"]; + + let entities = {}; + const baseUrl = utils.parseBaseUrl(apiUrl); + + // gather the entities + supportedClasses.forEach(function (classData) { + // add entry point url + const entityName = classData["hydra:title"]; + let entryPoint = entryPoints[entityName.toLowerCase()]; + if (entryPoint !== undefined && !entryPoint.startsWith("http")) entryPoint = baseUrl + entryPoint; + classData["@entryPoint"] = entryPoint; + + entities[entityName] = classData; + }); + + const instance = new JSONLD(baseUrl, entities); + instances[apiUrl] = instance; + + // return the initialized JSONLD object + for (const fnc of successFunctions[apiUrl]) if (typeof fnc == 'function') fnc(instance); + successFunctions[apiUrl] = []; + } + /** * Execute failure functions and send general notification *