UNPKG

@knora/api

Version:

JavaScript library that handles API requests to Knora

355 lines 18.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var rxjs_1 = require("rxjs"); var operators_1 = require("rxjs/operators"); var Constants_1 = require("../Constants"); var resource_property_definition_1 = require("../ontologies/resource-property-definition"); var count_query_response_1 = require("../search/count-query-response"); var read_resource_1 = require("./read/read-resource"); var read_boolean_value_1 = require("./values/read/read-boolean-value"); var read_color_value_1 = require("./values/read/read-color-value"); var read_date_value_1 = require("./values/read/read-date-value"); var read_decimal_value_1 = require("./values/read/read-decimal-value"); var read_file_value_1 = require("./values/read/read-file-value"); var read_geom_value_1 = require("./values/read/read-geom-value"); var read_geoname_value_1 = require("./values/read/read-geoname-value"); var read_int_value_1 = require("./values/read/read-int-value"); var read_interval_value_1 = require("./values/read/read-interval-value"); var read_link_value_1 = require("./values/read/read-link-value"); var read_list_value_1 = require("./values/read/read-list-value"); var read_text_value_1 = require("./values/read/read-text-value"); var read_uri_value_1 = require("./values/read/read-uri-value"); var read_value_1 = require("./values/read/read-value"); var ResourcesConversionUtil; (function (ResourcesConversionUtil) { /** * Given a JSON-LD representing zero, one more resources, converts it to an array of ReadResource. * * JSON-LD is expected to have expanded prefixes (processed by jsonld processor). * * @param resourcesJsonld a JSON-LD object with expanded prefixes representing zero, one or more resources. * @param ontologyCache instance of OntologyCache to be used. * @param listNodeCache instance of ListNodeCache to be used. * @param jsonConvert instance of JsonConvert to be used. */ ResourcesConversionUtil.createReadResourceSequence = function (resourcesJsonld, ontologyCache, listNodeCache, jsonConvert) { if (resourcesJsonld.hasOwnProperty("@graph")) { // sequence of resources return rxjs_1.forkJoin(resourcesJsonld["@graph"] .map(function (res) { return createReadResource(res, ontologyCache, listNodeCache, jsonConvert); })); } else { // one or no resource if (Object.keys(resourcesJsonld).length === 0) { return rxjs_1.of([]); } else { return rxjs_1.forkJoin([createReadResource(resourcesJsonld, ontologyCache, listNodeCache, jsonConvert)]); } } }; /** * Creates a single ReadResource. * * @param resourceJsonld a JSON-LD object representing a single resource. * @param ontologyCache instance of OntologyCache to be used. * @param listNodeCache instance of ListNodeCache to be used. * @param jsonConvert instance of JsonConvert to be used. */ var createReadResource = function (resourceJsonld, ontologyCache, listNodeCache, jsonConvert) { if (Array.isArray(resourceJsonld)) throw new Error("resource is expected to be a single object"); var resource = jsonConvert.deserialize(resourceJsonld, read_resource_1.ReadResource); return ontologyCache.getResourceClassDefinition(resource.type).pipe(operators_1.mergeMap(function (entitiyDefs) { var resourceProps = Object.keys(resourceJsonld) .filter(function (propIri) { return entitiyDefs.properties[propIri] instanceof resource_property_definition_1.ResourcePropertyDefinition; }); // add information from ontology resource.resourceClassLabel = entitiyDefs.classes[resource.type].label; resource.resourceClassComment = entitiyDefs.classes[resource.type].comment; resource.entityInfo = entitiyDefs; if (resourceProps.length > 0) { var values_1 = []; resourceProps.forEach(function (propIri) { if (Array.isArray(resourceJsonld[propIri])) { for (var _i = 0, _a = resourceJsonld[propIri]; _i < _a.length; _i++) { var value = _a[_i]; values_1.push(createValueValue(propIri, value, entitiyDefs, ontologyCache, listNodeCache, jsonConvert)); } } else { values_1.push(createValueValue(propIri, resourceJsonld[propIri], entitiyDefs, ontologyCache, listNodeCache, jsonConvert)); } }); return rxjs_1.forkJoin(values_1).pipe(operators_1.map(function (vals) { // get link values var linkVals = vals.filter(function (val) { return val instanceof read_link_value_1.ReadLinkValue; }); // incoming references with embedded resource var incomingRefs = linkVals.filter(function (linkVal) { return linkVal.incoming && linkVal.linkedResource !== undefined; }); // outgoing references with embedded resource var outgoingRefs = linkVals.filter(function (linkVal) { return !linkVal.incoming && linkVal.linkedResource !== undefined; }); // create a map structure property Iri -> values var propMap = {}; vals.forEach(function (val) { if (!propMap.hasOwnProperty(val.property)) { propMap[val.property] = [val]; } else { propMap[val.property].push(val); } }); // assign values resource.properties = propMap; resource.incomingReferences = incomingRefs.map(function (linkVal) { return linkVal.linkedResource; }); resource.outgoingReferences = outgoingRefs.map(function (linkVal) { return linkVal.linkedResource; }); return resource; })); } else { return rxjs_1.of(resource); } })); }; /** * Converts a simple value serialized as JSON-LD to a `ReadValue`. * * @param valueJsonld value as JSON-LD to be converted. * @param dataType the specific value type to convert to. * @param jsonConvert the converter to be used. */ var handleSimpleValue = function (valueJsonld, dataType, jsonConvert) { return rxjs_1.of(jsonConvert.deserialize(valueJsonld, dataType)); }; /** * Converts a text value serialized as JSON-LD to a `ReadTextValue`. * * @param valueJsonld text value as JSON-LD to be converted. * @param jsonConvert jsonConvert the converter to be used. */ var handleTextValue = function (valueJsonld, jsonConvert) { if (valueJsonld.hasOwnProperty(Constants_1.Constants.ValueAsString)) { // TODO: query standoff, if any. var textValue = jsonConvert.deserialize(valueJsonld, read_text_value_1.ReadTextValueAsString); return rxjs_1.of(textValue); } else if (valueJsonld.hasOwnProperty(Constants_1.Constants.TextValueAsXml)) { var textValue = jsonConvert.deserialize(valueJsonld, read_text_value_1.ReadTextValueAsXml); return rxjs_1.of(textValue); } else if (valueJsonld.hasOwnProperty(Constants_1.Constants.TextValueAsHtml)) { var textValue = jsonConvert.deserialize(valueJsonld, read_text_value_1.ReadTextValueAsHtml); return rxjs_1.of(textValue); } else { throw new Error("Invalid Text value"); } }; /** * Converts a link value serialized as JSON-LD to a `ReadTextValue`. * * @param valueJsonld link value as JSON-LD to be converted. * @param ontologyCache instance of `OntologyCache` to be used. * @param listNodeCache instance of ListNodeCache to be used. * @param jsonConvert jsonConvert the converter to be used. */ var handleLinkValue = function (valueJsonld, ontologyCache, listNodeCache, jsonConvert) { var linkValue = jsonConvert.deserialize(valueJsonld, read_link_value_1.ReadLinkValue); var handleLinkedResource = function (linkedResource, incoming) { var referredRes = createReadResource(linkedResource, ontologyCache, listNodeCache, jsonConvert); return referredRes.pipe(operators_1.map(function (refRes) { linkValue.linkedResource = refRes; linkValue.linkedResourceIri = refRes.id; linkValue.incoming = incoming; return linkValue; })); }; var handleLinkedResourceIri = function (linkedResourceIri, incoming) { if (linkedResourceIri === undefined) throw new Error("Invalid resource Iri"); linkValue.linkedResourceIri = linkedResourceIri; linkValue.incoming = incoming; return rxjs_1.of(linkValue); }; // check if linked resource is nested or if just its IRI is present if (valueJsonld.hasOwnProperty(Constants_1.Constants.LinkValueHasTarget)) { return handleLinkedResource(valueJsonld[Constants_1.Constants.LinkValueHasTarget], false); } else if (valueJsonld.hasOwnProperty(Constants_1.Constants.LinkValueHasTargetIri)) { // TODO: check for existence of @id return handleLinkedResourceIri(valueJsonld[Constants_1.Constants.LinkValueHasTargetIri]["@id"], false); } else if (valueJsonld.hasOwnProperty(Constants_1.Constants.LinkValueHasSource)) { return handleLinkedResource(valueJsonld[Constants_1.Constants.LinkValueHasSource], true); } else if (valueJsonld.hasOwnProperty(Constants_1.Constants.LinkValueHasSourceIri)) { // TODO: check for existence of @id return handleLinkedResourceIri(valueJsonld[Constants_1.Constants.LinkValueHasSourceIri]["@id"], true); } else { throw new Error("Invalid Link Value"); } }; /** * Creates a single ReadValue. * * @param propIri Iri of the property pointing to the value. * @param valueJsonld JSON-LD object representing a single value. * @param entitiyDefs entity definitions for the given value type. * @param ontologyCache instance of OntologyCache to be used. * @param listNodeCache instance of ListNodeCache to be used. * @param jsonConvert instance of JsonConvert to be used. */ var createValueValue = function (propIri, valueJsonld, entitiyDefs, ontologyCache, listNodeCache, jsonConvert) { if (Array.isArray(valueJsonld)) throw new Error("value is expected to be a single object"); var type = valueJsonld["@type"]; var value; switch (type) { case Constants_1.Constants.BooleanValue: { var boolVal = handleSimpleValue(valueJsonld, read_boolean_value_1.ReadBooleanValue, jsonConvert); value = boolVal.pipe(operators_1.map(function (val) { val.strval = val.bool ? "TRUE" : "FALSE"; return val; })); break; } case Constants_1.Constants.ColorValue: { var colorVal = handleSimpleValue(valueJsonld, read_color_value_1.ReadColorValue, jsonConvert); value = colorVal.pipe(operators_1.map(function (val) { val.strval = val.color; return val; })); break; } case Constants_1.Constants.DateValue: { var dateVal = handleSimpleValue(valueJsonld, read_date_value_1.ParseReadDateValue, jsonConvert); value = dateVal.pipe(operators_1.map(function (val) { return new read_date_value_1.ReadDateValue(val); })); break; } case Constants_1.Constants.IntValue: { var intVal = handleSimpleValue(valueJsonld, read_int_value_1.ReadIntValue, jsonConvert); value = intVal.pipe(operators_1.map(function (val) { val.strval = val.int.toString(); return val; })); break; } case Constants_1.Constants.DecimalValue: { var decimalVal = handleSimpleValue(valueJsonld, read_decimal_value_1.ReadDecimalValue, jsonConvert); value = decimalVal.pipe(operators_1.map(function (val) { val.strval = val.decimal.toString(); return val; })); break; } case Constants_1.Constants.IntervalValue: { var intervalVal = handleSimpleValue(valueJsonld, read_interval_value_1.ReadIntervalValue, jsonConvert); value = intervalVal.pipe(operators_1.map(function (val) { val.strval = val.start.toString() + " - " + val.end.toString(); return val; })); break; } case Constants_1.Constants.ListValue: { var listValue = value = handleSimpleValue(valueJsonld, read_list_value_1.ReadListValue, jsonConvert); value = listValue.pipe(operators_1.mergeMap(function (listVal) { // get referred list node's label return listNodeCache.getNode(listVal.listNode).pipe(operators_1.map(function (listNode) { listVal.listNodeLabel = listNode.label; listVal.strval = listNode.label; return listVal; })); })); break; } case Constants_1.Constants.UriValue: { var uriVal = handleSimpleValue(valueJsonld, read_uri_value_1.ReadUriValue, jsonConvert); value = uriVal.pipe(operators_1.map(function (val) { val.strval = val.uri; return val; })); break; } case Constants_1.Constants.TextValue: { var textVal = handleTextValue(valueJsonld, jsonConvert); value = textVal.pipe(operators_1.map(function (val) { if (val instanceof read_text_value_1.ReadTextValueAsString) { val.strval = val.text; } else if (val instanceof read_text_value_1.ReadTextValueAsXml) { val.strval = val.xml; } else if (val instanceof read_text_value_1.ReadTextValueAsHtml) { val.strval = val.html; } else { console.error("String representation for a ReadTextValue could not be constructed for: ", type); } return val; })); break; } case Constants_1.Constants.LinkValue: { var linkVal = handleLinkValue(valueJsonld, ontologyCache, listNodeCache, jsonConvert); value = linkVal.pipe(operators_1.map(function (val) { val.strval = val.linkedResourceIri; return val; })); break; } case Constants_1.Constants.GeomValue: { var geomVal = handleSimpleValue(valueJsonld, read_geom_value_1.ParseReadGeomValue, jsonConvert); value = geomVal.pipe(operators_1.map(function (geom) { return new read_geom_value_1.ReadGeomValue(geom); })); break; } case Constants_1.Constants.StillImageFileValue: { var stillImageVal = handleSimpleValue(valueJsonld, read_file_value_1.ReadStillImageFileValue, jsonConvert); value = stillImageVal.pipe(operators_1.map(function (val) { val.strval = val.fileUrl; return val; })); break; } case Constants_1.Constants.GeonameValue: { var geonameVal = handleSimpleValue(valueJsonld, read_geoname_value_1.ReadGeonameValue, jsonConvert); value = geonameVal.pipe(operators_1.map(function (val) { val.strval = val.geoname; return val; })); break; } default: { console.error("Unknown value type: ", type); value = rxjs_1.of(jsonConvert.deserialize(valueJsonld, read_value_1.ReadValue)); } } return value.pipe(operators_1.map(function (val) { val.property = propIri; val.propertyLabel = entitiyDefs.properties[propIri].label; val.propertyComment = entitiyDefs.properties[propIri].comment; return val; })); }; /** * Creates a response to a count query. * @param countQueryResult the result of the count query. * @param jsonConvert the instance of jsonConvert to be used. */ ResourcesConversionUtil.createCountQueryResponse = function (countQueryResult, jsonConvert) { if (Array.isArray(countQueryResult)) throw new Error("countQueryResult is expected to be a single object"); return jsonConvert.deserialize(countQueryResult, count_query_response_1.CountQueryResponse); }; })(ResourcesConversionUtil = exports.ResourcesConversionUtil || (exports.ResourcesConversionUtil = {})); //# sourceMappingURL=ResourcesConversionUtil.js.map