{"version":3,"file":"inputConverter.mjs","sources":["../../../lib/data-provider-interface/utils/inputConverter.js"],"sourcesContent":["import generalHelper from \"./general-helper\";\nimport { has, isEmpty } from \"lodash\";\n\n/**\n * Converts given data for given property into input form format\n * @param {*} state state from store\n * @param {*} property Property to convert data for (datasets/catalogues)\n * @param {*} data Linked data within a dataset\n */\nasync function convertToInput(state, property, data, dpiConfig) {\n  let generalID;\n  let namespaceKeys;\n  let propertyQuads;\n\n  if (property === \"datasets\") {\n    propertyQuads = data.match(\n      null,\n      \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\",\n      \"http://www.w3.org/ns/dcat#Dataset\",\n      null\n    );\n  } else {\n    propertyQuads = data.match(\n      null,\n      \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\",\n      \"http://www.w3.org/ns/dcat#Catalog\",\n      null\n    );\n  }\n\n  // extract data for datasets/catalogues\n  namespaceKeys = generalHelper.getPagePrefixedNames(\n    property,\n    dpiConfig.inputDefinition,\n    dpiConfig.pageConent\n  );\n  state[property] = {};\n  for (let el of propertyQuads) {\n    // there should be only one dataset id\n    generalID = el.subject.value;\n\n    for (let pageName in namespaceKeys[property]) {\n      state[property][pageName] = {};\n      convertProperties(\n        property,\n        state[property][pageName],\n        generalID,\n        data,\n        namespaceKeys[property][pageName],\n        dpiConfig\n      );\n    }\n  }\n\n  // also add distribution data\n  if (property === \"datasets\") {\n    const distributionQuads = data.match(\n      generalID,\n      \"http://www.w3.org/ns/dcat#distribution\",\n      null,\n      null\n    );\n    namespaceKeys = generalHelper.getPagePrefixedNames(\n      \"distributions\",\n      dpiConfig.inputDefinition,\n      dpiConfig.pageConent\n    );\n    state.datasets.Distributions[\"distributionList\"] = [];\n    for (let el of distributionQuads) {\n      const currentDistribution = {};\n\n      const distributionId = el.object.value;\n      for (let pageName in namespaceKeys[\"distributions\"]) {\n        currentDistribution[pageName] = {};\n        convertProperties(\n          \"distributions\",\n          currentDistribution[pageName],\n          distributionId,\n          data,\n          namespaceKeys[\"distributions\"][pageName],\n          dpiConfig\n        );\n      }\n      state.datasets.Distributions.distributionList.push(currentDistribution);\n    }\n  }\n}\n\n/**\n * Converts value for given property from RDF into input form format\n * @param {*} property Parent property of given value (datasets/distributions/catalogues)\n * @param {*} state State from store\n * @param {*} id Id of parent node which serves as subject\n * @param {*} data Linked data\n * @param {*} propertyKeys Keys of properties to check\n */\nfunction convertProperties(property, state, id, data, propertyKeys, dpiConfig) {\n  const formatType = dpiConfig.formatTypes;\n\n  for (let index = 0; index < propertyKeys.length; index += 1) {\n    const key = propertyKeys[index];\n    let subData = data.match(\n      id,\n      generalHelper.addNamespace(key, dpiConfig),\n      null,\n      null\n    );\n\n    if (formatType.singularString[property].includes(key)) {\n      convertSingularStrings(subData, state, key);\n    } else if (formatType.multipleURI[property].includes(key)) {\n      convertMultipleURI(subData, state, key, property, dpiConfig);\n    } else if (formatType.singularURI[property].includes(key)) {\n      convertSingularURI(subData, state, key, dpiConfig);\n    } else if (formatType.typedStrings[property].includes(key)) {\n      convertTypedString(subData, state, key, property);\n    } else if (formatType.multilingualStrings[property].includes(key)) {\n      convertMultilingual(subData, state, key);\n    } else if (formatType.conditionalProperties[property].includes(key)) {\n      // publisher either is an URI or a group with multiple values (name, homepage, email)\n      if (key === \"dct:publisher\" || key === \"dct:license\") {\n        for (let el of subData) {\n          if (el.object.termType === \"NamedNode\") {\n            state[key] = { name: el.object.value, resource: el.object.value };\n          } else if (el.object.termType === \"BlankNode\") {\n            // get keys for nested values without dct'title (special format)\n            const nestedKeys = generalHelper\n              .getNestedKeys(data.match(el.object, null, null, null), dpiConfig)\n              .filter((el) => el !== \"dct:title\");\n            const nestedProperties = {};\n\n            // convert nested values\n            if (key === \"dct:license\") {\n              const licenceTitleQuad = data.match(\n                el.object,\n                generalHelper.addNamespace(\"dct:title\", dpiConfig),\n                null,\n                null\n              );\n              for (let el of licenceTitleQuad) {\n                nestedProperties[\"dct:title\"] = el.object.value;\n              }\n            }\n\n            convertProperties(\n              property,\n              nestedProperties,\n              el.object,\n              data,\n              nestedKeys,\n              dpiConfig\n            );\n            state[key] = nestedProperties;\n          }\n        }\n      }\n    } else if (formatType.groupedProperties[property].includes(key)) {\n      if (subData.size > 0) {\n        state[key] = [];\n        // there could be multiple nodes with data for a property\n        for (let el of subData) {\n          let currentState = {};\n          if (key === \"skos:notation\") {\n            // skos notation behaves differently\n            // there should be a typed literal given which should be seperated into @value and @type\n            if (el.object.value) currentState[\"@value\"] = el.object.value;\n            if (el.object.datatypeString)\n              currentState[\"@type\"] = {\n                name: el.object.datatypeString,\n                resource: el.object.datatypeString,\n              };\n          } else {\n            // some properties have a named node containing data, the value of this named node also is a value form the input form (typically @id)\n            if (el.object.termType === \"NamedNode\")\n              currentState[\"@id\"] = el.object.value;\n            // get keys of node properties\n            const nestedKeys = generalHelper.getNestedKeys(\n              data.match(el.object, null, null, null),\n              dpiConfig\n            );\n            convertProperties(\n              property,\n              currentState,\n              el.object,\n              data,\n              nestedKeys,\n              dpiConfig\n            );\n          }\n          // creator not an array\n          if (\n            key === \"dct:creator\" ||\n            key === \"vcard:hasAddress\" ||\n            key === \"skos:notation\" ||\n            key === \"spdx:checksum\"\n          )\n            state[key] = currentState;\n          else state[key].push(currentState);\n        }\n      }\n    } else if (key === \"dcat:temporalResolution\") {\n      // temporal resolution is displayed as group of input forms for each property (year, month, day, ...)\n      // the form provides the data as following: [ { 'Year': '...', 'Month': '...', ... } ]\n      // the linked data format of this property looks like this: P?Y?M?DT?H?M?S\n      if (subData.size > 0) {\n        state[key] = {};\n\n        const shorts = [\"Y\", \"M\", \"D\", \"H\", \"M\", \"S\"];\n        const forms = {\n          0: \"Year\",\n          1: \"Month\",\n          2: \"Day\",\n          3: \"Hour\",\n          4: \"Minute\",\n          5: \"Second\",\n        };\n\n        // should be oly one quad\n        let resolutionValue;\n        for (let el of subData) {\n          resolutionValue = el.object.value;\n        }\n\n        // backend converts temporalResolution values without a date into seconds for time values\n        if (!resolutionValue.startsWith(\"P\")) {\n          // setting year, month and day to 0\n          state[key][forms[0]] = 0;\n          state[key][forms[1]] = 0;\n          state[key][forms[2]] = 0;\n\n          // converting seconds into HH:MM:SS\n          const data = new Date(resolutionValue * 1000)\n            .toISOString()\n            .slice(11, 19);\n          state[key][forms[3]] = data.slice(0, 2);\n          state[key][forms[4]] = data.slice(3, 5);\n          state[key][forms[5]] = data.slice(7, 9);\n        } else {\n          // find index of letter for time period\n          // extract substring until this index\n          // extract number from string and set as according value for input\n          for (let tempIndex = 0; tempIndex < shorts.length; tempIndex += 1) {\n            const position = resolutionValue.indexOf(shorts[tempIndex]); // position of duration letter\n            const subDuration = resolutionValue.substring(0, position); // substring until position of duration letter\n            const value = subDuration?.match(/\\d+/g)?.[0] ?? \"\"; // extract number\n            resolutionValue = resolutionValue.substring(position); // overwrite resolution string with shortened version (missing the extracted part)\n            state[key][forms[tempIndex]] = value; // write to result object\n          }\n        }\n      }\n    } else if (key === \"dct:identifier\") {\n      if (subData.size > 0) {\n        // identifier should be provided as array of strings\n        // [{'@value': '...'}, {'@value': '...'}, ...]\n        state[key] = [];\n\n        for (let el of subData) {\n          state[key].push({ \"@value\": el.object.value });\n        }\n      }\n    } else if (key === \"dct:rights\") {\n      // rights is conditional and gets a string\n      // rights always includes a type so everything is located within a blank node\n      // also rights is a singular property\n      if (subData.size > 0) {\n        let nodeData;\n        // get id of blank node and associated label data\n        for (let el of subData) {\n          const rightsBlankNode = el.object;\n          nodeData = data.match(\n            rightsBlankNode,\n            generalHelper.addNamespace(\"rdfs:label\", dpiConfig),\n            null,\n            null\n          );\n          for (let label of nodeData) {\n            if (generalHelper.isUrl(label.object.value))\n              state[key] = { \"@type\": \"url\", \"rdfs:value\": label.object.value };\n            else\n              state[key] = {\n                \"@type\": \"text\",\n                \"rdfs:value\": label.object.value,\n              };\n          }\n        }\n      }\n    } else if (key === \"datasetID\" && property !== \"datatsets\") {\n      // id is given as complete URI\n      // dataset-/catalogue-id is string following the last /\n      state[key] = id.substr(id.lastIndexOf(\"/\") + 1);\n      state[\"hidden_datasetIDFormHidden\"] = id.substr(id.lastIndexOf(\"/\") + 1);\n    } else if (key === \"dcat:catalog\" && property === \"datasets\") {\n      // datasets also have a property called dcat:catalog (not valid DCAT-AP)\n      // property is needed to determine catalog the dataset belongs to\n      if (!(subData.size > 0)) {\n        // bceause dcat:catalog is no valid DCAT-AP it is possible that the prefix is not resolved\n        // therefore it is also possible to get the data by using the shortned key\n        subData = data.match(id, \"dcat:catalog\", null, null);\n      }\n\n      state[key] = \"\";\n\n      // there should only be one catalog\n      for (let cat of subData) {\n        state[key] = cat.object.value;\n      }\n    } else if (key === \"rdf:type\") {\n      // some properties have a type which can be selected\n      // the type also has a namespace and therefore need to be shortened ( e.g. from https://...Individual to vcard:Individual)\n      if (subData.size > 0) {\n        state[key] = \"\";\n\n        // typically there is only on type provided for each property instance\n        for (let el of subData) {\n          state[key] = generalHelper.removeNamespace(\n            el.object.value,\n            dpiConfig\n          );\n        }\n      }\n    }\n  }\n}\n\n//-----------------------------------------------------------------------------------------------------\n//                  basic conversion methods for different categories of data\n//-----------------------------------------------------------------------------------------------------\n// seems at first to be unnecessary but if we want to convert nested properties as well, we need these\n// methods (especially to provide the correct parent URI)\n\n/**\n *\n * @param {*} data\n * @param {*} state\n * @param {*} key\n */\nfunction convertSingularStrings(data, state, key) {\n  if (data.size > 0) {\n    state[key] = \"\";\n\n    for (let el of data) {\n      state[key] = el.object.value;\n    }\n  }\n}\n\n/**\n *\n * @param {*} data\n * @param {*} state\n * @param {*} key\n */\nfunction convertSingularURI(data, state, key, dpiConfig) {\n  const formatType = dpiConfig.formatTypes;\n\n  if (data.size > 0) {\n    state[key] = \"\";\n\n    for (let el of data) {\n      const value = el.object.value;\n\n      if (value.startsWith(\"mailto:\")) {\n        state[key] = value.replace(\"mailto:\", \"\");\n      } else {\n        if (formatType.URIformat.voc.includes(key)) {\n          state[key] = { name: value, resource: value };\n          \n        } else if (formatType.URIformat.string.includes(key)) {\n          state[key] = value;\n          \n        } else {\n          // Exception for qualifiedRelation\n          if (\n            state.hasOwnProperty(\"rdf:type\") &&\n            state[\"rdf:type\"] === \"dcat:Relationship\"\n          ) {\n            state[key] = value;\n            \n          } else {\n            state[key] = { \"@id\": value };\n          }\n        }\n      }\n    }\n  }\n}\n\n/**\n *\n * @param {*} data\n * @param {*} state\n * @param {*} key\n */\nfunction convertMultipleURI(data, state, key, property, dpiConfig) {\n  // there are two different formats the frontend need to deliver multiple URIs\n  // 1: [ \"URI1\", \"URI2\" ]\n  // 2: [ { \"@id\": \"URI1\" }, { \"@id\": \"URI2\" } ]\n\n  const formatType = dpiConfig.formatTypes;\n\n  if (data.size > 0) {\n    state[key] = [];\n    for (let el of data) {\n      if (formatType.URIformat.voc.includes(key))\n        state[key].push({ name: el.object.value, resource: el.object.value });\n      else if (formatType.URIformat.string.includes(key))\n        state[key].push(el.object.value);\n      else state[key].push({ \"@id\": el.object.value });\n    }\n  }\n}\n\n/**\n *\n * @param {*} data\n * @param {*} state\n * @param {*} key\n */\nfunction convertTypedString(data, state, key, property) {\n  // some properties have a type\n  // normally this type is not used within the forntend form and therefore won't be saved to frontend values\n\n  if (data.size > 0) {\n    state[key] = \"\";\n    for (let el of data) {\n      if (key === \"dcat:spatialResolutionInMeters\" || key === \"dcat:byteSize\")\n        state[key] = el.object.value;\n      else if (key === \"dcat:startDate\" || key === \"dcat:endDate\") {\n        state[key] = el.object.value;\n      } else if (key === \"pv:distributionType\") {\n        state[key] = { \"@Tag\": el.object.value };\n      } else if (key === \"pv:isLeading\") {\n        state[\"pv:distributionType\"].lead = el.object.value;\n      } else {\n        let dateType;\n        if (el.object.value.includes(\"T\")) {\n          dateType = \"dateTime\";\n        } else {\n          if (property === \"distributions\") {\n            dateType = \"dateTime\";\n            let newDateString = el.object.value + \"T00:00:00\";\n            // console.log(newDateString);\n            state[key] = { \"@type\": dateType, \"@value\": newDateString };\n            break;\n          } else dateType = \"date\";\n        }\n        state[key] = { \"@type\": dateType, \"@value\": el.object.value };\n      }\n    }\n  }\n}\n\n/**\n * Converts and writes multilingual data to store\n * @param {*} data DatasetCore containing an array of quads\n * @param {*} state State for current key\n * @param {*} key Name of current property (e.g: 'dct:title')\n */\nfunction convertMultilingual(data, state, key) {\n  // multilingual data is always stored within an array containing object with the value and it's language\n  // [ {'@value': '...', '@language': '...'}, ...]\n  if (data.size > 0) {\n    state[key] = [];\n\n    for (let el of data) {\n      if (!el.object.language.includes(\"-\")) {\n        // machine translation language tags look like this \"fi-t-en-t0-mtec\" and should not be included\n        const currentElement = {};\n        currentElement[\"@value\"] = el.object.value; // actual value\n        currentElement[\"@language\"] = el.object.language; // language of value\n        state[key].push(currentElement);\n      }\n    }\n  }\n}\n\nexport default {\n  convertToInput,\n};\n"],"names":["convertToInput","state","property","data","dpiConfig","generalID","namespaceKeys","propertyQuads","generalHelper","el","pageName","convertProperties","distributionQuads","currentDistribution","distributionId","id","propertyKeys","formatType","index","key","subData","convertSingularStrings","convertMultipleURI","convertSingularURI","convertTypedString","convertMultilingual","nestedKeys","nestedProperties","licenceTitleQuad","currentState","shorts","forms","resolutionValue","tempIndex","position","subDuration","value","_a","nodeData","rightsBlankNode","label","cat","dateType","newDateString","currentElement","toInput"],"mappings":"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"}