@piveau/piveau-hub-ui-modules 4.6.0 → 4.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/datasetDetails/distributions/Distributions.vue.d.ts +1 -0
- package/dist/datasetDetails/distributions/Distributions.vue.mjs +34 -29
- package/dist/datasetDetails/distributions/Distributions.vue.mjs.map +1 -1
- package/dist/datasetDetails/distributions/distributionDetails/DistributionContent.vue.mjs +48 -48
- package/dist/datasetDetails/distributions/distributionDetails/DistributionContent.vue.mjs.map +1 -1
- package/dist/piveau-hub-ui-modules.css +1 -1
- package/dist/services/datasetService.mjs +1 -1
- package/dist/services/datasetService.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datasetService.mjs","sources":["../../lib/services/datasetService.ts"],"sourcesContent":["/* eslint-disable no-console */\n\n import axios from 'axios';\n import { has, isNil, isArray } from 'lodash-es';\n\n import dataGetters from './getters/data-getters';\n\n export const getResponseData = (dataset: { is_hvd: boolean; }) => {\n const ds: {[key: string]: unknown} = {};\n // New fields from DCAT-AP.de\n // Dataset\n ds.politicalGeocodingLevelURI = dataGetters.getArrayOfObjects(dataset, 'political_geocoding_level_uri', ['resource', 'label']);\n ds.politicalGeocodingURI = dataGetters.getArrayOfObjects(dataset, 'political_geocoding_uri', ['resource', 'label']);\n ds.availability = dataGetters.getObject(dataset, 'availability', ['resource', 'label']);\n ds.contributorID = dataGetters.getArrayOfObjects(dataset, 'contributor_id', ['resource', 'label']);\n ds.geocodingDescriptionDe = dataGetters.getObjectLanguage(dataset, 'geocoding_description');\n ds.legalBasis = dataGetters.getObjectLanguage(dataset, 'legal_basis');\n ds.qualityProcessURI = dataGetters.getString(dataset, 'quality_process_uri');\n ds.typeDe = dataGetters.getString(dataset, 'type');\n ds.references = dataGetters.getString(dataset, 'references');\n ds.contributor = dataGetters.getArrayOfObjects(dataset, 'contributor', ['name', 'type', 'resource', 'email', 'homepage']);\n ds.originator = dataGetters.getArrayOfObjects(dataset, 'originator', ['name', 'type', 'resource', 'email', 'homepage']);\n ds.maintainer = dataGetters.getArrayOfObjects(dataset, 'maintainer', ['name', 'type', 'resource', 'email', 'homepage']);\n //\n ds.accessRights = dataGetters.getObject(dataset, 'access_right', ['label', 'resource']);\n ds.accrualPeriodicity = dataGetters.getObject(dataset, 'accrual_periodicity', ['resource', 'label']);\n ds.admsIdentifiers = dataGetters.getArrayOfObjects(dataset, 'adms_identifier', ['identifier', 'schema', 'resource']);\n ds.attributes = dataGetters.getArrayOfStrings(dataset, 'attribute');\n ds.catalog = dataGetters.getObject(dataset, 'catalog', ['id', 'title', 'description', 'country', 'homepage', 'issued', 'modified', 'language', 'license', 'publisher', 'spatial', 'spatial_resource', 'availability','is_part_of']);\n ds.catalogRecord = dataGetters.getObject(dataset, 'catalog_record', ['issued', 'modified']);\n ds.categories = dataGetters.getArrayOfObjects(dataset, 'categories', ['id', 'label']);\n ds.conformsTo = dataGetters.getArrayOfObjects(dataset, 'conforms_to', ['label', 'resource']);\n ds.contactPoints = dataGetters.getArrayOfObjects(dataset, 'contact_point', ['name','organisation_name', 'type', 'resource', 'email', 'telephone', 'address', 'url']);\n ds.country = dataGetters.getObject(dataset, 'country', [{ key: 'id', default: 'eu' }, { key: 'title', default: 'European Union' }]);\n ds.creator = dataGetters.getObject(dataset, 'creator', ['name', 'type', 'email', 'resource', 'homepage']);\n ds.deadline = dataGetters.getString(dataset, 'deadline');\n ds.description = dataGetters.getObjectLanguage(dataset, 'description');\n ds.dimensions = dataGetters.getArrayOfStrings(dataset, 'dimension');\n ds.distributions = [];\n ds.distributionFormats = [];\n ds.documentations = dataGetters.getArrayOfStrings(dataset, 'documentations');\n ds.extendetMetadata = dataGetters.getObject(dataset, 'extended_metadata', ['is_used_by']);\n ds.frequency = dataGetters.getObject(dataset, 'frequency', ['title', 'resource']);\n ds.geocodingDescription = dataGetters.getObject(dataset, 'geocoding_description', ['id', 'label']);\n ds.hasQualityAnnotations = dataGetters.getArrayOfStrings(dataset, 'has_quality_annotation');\n ds.hasVersion = dataGetters.getArrayOfStrings(dataset, 'has_version');\n ds.id = dataGetters.getString(dataset, 'id');\n ds.identifiers = dataGetters.getArrayOfStrings(dataset, 'identifier');\n ds.idName = dataGetters.getString(dataset, 'idName');\n ds.isHvd = dataset.is_hvd || false;\n ds.hvdCategory = dataGetters.getArrayOfObjects(dataset, 'hvd_category', ['id', 'label', 'resource']);\n ds.isReferencedBy = dataGetters.getArrayOfStrings(dataset, 'is_referenced_by');\n ds.isVersionOf = dataGetters.getArrayOfStrings(dataset, 'is_version_of');\n ds.keywords = dataGetters.getArrayOfObjects(dataset, 'keywords', ['id', 'label', 'language']);\n ds.landingPages = dataGetters.getArrayOfObjects(dataset, 'landing_page', ['format', 'description', 'title', 'resource']);\n ds.languages = dataGetters.getArrayOfObjects(dataset, 'language', ['id', 'label', 'resource']);\n ds.licences = [];\n ds.modificationDate = dataGetters.getString(dataset, 'modified');\n ds.numSeries = dataGetters.getNumber(dataset, 'num_series');\n ds.originalLanguage = dataGetters.getOriginalLanguage(dataset);\n ds.otherIdentifiers = dataGetters.getArrayOfObjects(dataset, 'adms_identifier', ['identifier', 'scheme', 'resource']);\n ds.pages = dataGetters.getArrayOfObjects(dataset, 'page', ['format', 'description', 'title', 'resource']);\n ds.provenances = dataGetters.getArrayOfObjects(dataset, 'provenance', ['label', 'resource']);\n ds.publisher = dataGetters.getObject(dataset, 'publisher', ['name', 'type', 'email', 'resource', 'homepage']);\n ds.qualifiedAttributions = dataGetters.getArrayOfStrings(dataset, 'qualified_attribution');\n ds.qualifiedRelations = dataGetters.getArrayOfObjects(dataset, 'qualified_relation', ['relation', 'had_role']);\n ds.relations = dataGetters.getArrayOfStrings(dataset, 'relation');\n // ds.relatedResources = dataGetters.getArrayOfStrings(dataset, 'related_resources');\n ds.releaseDate = dataGetters.getString(dataset, 'issued');\n ds.sample = dataGetters.getArrayOfStrings(dataset, 'sample');\n ds.sources = dataGetters.getArrayOfStrings(dataset, 'source');\n ds.spatial = dataGetters.getArrayOfObjects(dataset, 'spatial', ['type', 'coordinates']);\n ds.spatialResolutionInMeters = dataGetters.getArrayOfNumbers(dataset, 'spatial_resolution_in_meters');\n ds.spatialResource = dataGetters.getArrayOfObjects(dataset, 'spatial_resource', ['label', 'resource']);\n ds.statUnitMeasures = dataGetters.getArrayOfStrings(dataset, 'stat_unit_measure');\n ds.subject = dataGetters.getArrayOfObjects(dataset, 'subject', ['resource', 'label', 'id']);\n ds.temporal = dataGetters.getArrayOfObjects(dataset, 'temporal', ['gte', 'lte']);\n ds.temporalResolution = dataGetters.getString(dataset, 'temporal_resolution');\n ds.theme = dataGetters.getArrayOfObjects(dataset, 'categories', ['id', 'label', 'resource']);\n ds.translationMetaData = dataGetters.getTranslationMetaData(dataset);\n ds.title = dataGetters.getObjectLanguage(dataset, 'title', '');\n ds.type = dataGetters.getObject(dataset, 'type', ['id', 'label', 'resource']);\n ds.resource = dataGetters.getString(dataset, 'resource');\n ds.versionInfo = dataGetters.getString(dataset, 'version_info');\n ds.versionNotes = dataGetters.getObjectLanguage(dataset, 'version_notes');\n ds.visualisations = [];\n ds.wasGeneratedBy = dataGetters.getArrayOfStrings(dataset, 'was_generated_by');\n\n // High-value dataset fields\n // https://semiceu.github.io/DCAT-AP/releases/2.2.0-hvd/\n // NOTE: This is a solution primarily addressing Open Data Bayern's needs.\n ds.isHvd = dataset.is_hvd || false;\n ds.applicableLegislation = dataGetters.getArrayOfStrings(dataset, 'applicable_legislation');\n ds.hvdCategory = dataGetters.getArrayOfObjects(dataset, 'hvd_category', ['id', 'label', 'resource']);\n\n for (const dist of dataGetters.getDistributions(dataset)) {\n const distribution : {[key: string]: unknown} = {};\n distribution.accessUrl = dataGetters.getArrayOfStrings(dist, 'access_url');\n distribution.accessService = dataGetters.getArrayOfObjects(dist, 'access_service', [\n 'title',\n 'description',\n 'endpoint_url',\n 'availability',\n 'applicable_legislation',\n 'contact_point',\n 'page',\n 'hvd_category',\n 'rights',\n ]); // availability field for DCAT-AP.de\n // distribution.accessService = dataGetters.getArrayOfStrings(dist, 'access_service');\n distribution.licenseAttributionByText = dataGetters.getObjectLanguage(dist, 'license_attribution_by_text');\n distribution.byteSize = dataGetters.getNumber(dist, 'byte_size');\n distribution.checksum = dataGetters.getObject(dist, 'checksum', ['algorithm', 'checksum_value']);\n distribution.compressFormat = dataGetters.getObject(dist, 'compress_format', ['label', 'resource']);\n distribution.conformsTo = dataGetters.getArrayOfObjects(dist, 'conforms_to', ['label', 'resource']);\n distribution.description = dataGetters.getObjectLanguage(dist, 'description', '');\n distribution.downloadUrls = dataGetters.getArrayOfStrings(dist, 'download_url');\n distribution.format = dataGetters.getObject(dist, 'format', ['id', 'resource', { key: 'label', default: 'UNKNOWN' }]);\n distribution.hasPolicy = dataGetters.getString(dist, 'has_policy');\n distribution.id = dataGetters.getString(dist, 'id');\n distribution.languages = dataGetters.getArrayOfObjects(dist, 'language', ['id', 'label', 'resource']);\n distribution.licence = dataGetters.getObject(dist, 'license', ['id', 'label', 'description', 'resource', 'la_url', 'homepage']);\n distribution.mediaType = dataGetters.getString(dist, 'media_type');\n distribution.modificationDate = dataGetters.getString(dist, 'modified');\n distribution.packageFormat = dataGetters.getObject(dist, 'package_format', ['label', 'resource']);\n distribution.pages = dataGetters.getArrayOfObjects(dist, 'page', ['format', 'title', 'description', 'resource']);\n distribution.releaseDate = dataGetters.getString(dist, 'issued');\n distribution.rights = dataGetters.getObject(dist, 'rights', ['label', 'resource']);\n distribution.spatialResolutionInMeters = dataGetters.getArrayOfNumbers(dist, 'spatial_resolution_in_meters');\n distribution.status = dataGetters.getObject(dist, 'status', ['label', 'resource']);\n distribution.temporalResolution = dataGetters.getArrayOfStrings(dist, 'temporal_resolution');\n distribution.title = dataGetters.getObjectLanguage(dist, 'title', '');\n distribution.type = dataGetters.getObject(dist, 'type', ['label', 'resource']);\n\n // High-value dataset fields\n // https://semiceu.github.io/DCAT-AP/releases/2.2.0-hvd/\n // NOTE: This is a solution primarily addressing Open Data Bayern's needs.\n distribution.applicableLegislation = dataGetters.getArrayOfObjects(dist, 'applicable_legislation', ['id', 'label', 'resource']);\n\n\n // Check type of ditribution\n if (distribution.type.resource === 'http://publications.europa.eu/resource/authority/distribution-type/VISUALIZATION') {\n ds.visualisations.push(distribution);\n } else {\n ds.distributions.push(distribution);\n }\n\n ds.distributionFormats.push(distribution.format);\n ds.licences.push(distribution.licence);\n\n }\n\n return ds;\n };\n\n const checkBounds = (bounds: any) => {\n try {\n let gb = bounds;\n if (isNil(gb)) return undefined;\n // If gb is a string, split to array\n if (!isArray(gb) && typeof gb === 'string') gb = gb.split(',');\n // Check number of elements. we need 4 for latMin, LonMin, LatMax, LonMax\n if (isArray(gb) && gb.length === 4) {\n for (const coord of gb) {\n // Check if items are floats\n if (!parseFloat(coord)) return undefined;\n return gb;\n }\n }\n return undefined;\n } catch (error) {\n console.error(error.message);\n return undefined;\n }\n };\n\n export default class Datasets {\n\n private readonly baseUrl: string;\n private readonly hubUrl: string;\n private readonly qualityBaseUrl: string;\n private readonly similarityBaseUrl: string;\n private readonly similarityServiceName: string;\n private readonly defaultScoringFacets: any[];\n\n constructor(baseUrl: string, hubUrl: string, qualityBaseUrl: string, similarityBaseUrl: string, similarityServiceName: string, defaultScoringFacets: any[]) {\n this.baseUrl = baseUrl;\n this.hubUrl = hubUrl;\n this.qualityBaseUrl = qualityBaseUrl;\n this.similarityBaseUrl = similarityBaseUrl;\n this.similarityServiceName = similarityServiceName;\n this.defaultScoringFacets = defaultScoringFacets;\n }\n\n /**\n * @description GET dataset by given id.\n * @param id\n */\n getSingle(id: any) {\n return new Promise((resolve, reject) => {\n const endpoint = 'datasets';\n const reqStr = `${this.baseUrl}${endpoint}/${id}`;\n axios.get(reqStr, {\n params: {},\n })\n .then((response) => {\n const dataset = response.data.result;\n let ds = {};\n try {\n ds = getResponseData(dataset);\n } catch (error) {\n console.warn('Error in datasets.js while checking response:', error.message);\n console.error(error.stack);\n }\n resolve(ds);\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n\n /**\n * @description GET all datasets matching the given criteria.\n * @param q\n * @param locale\n * @param facets\n * @param geoBounds\n * @param minScoring\n * @param dataScope\n * @returns {Promise}\n */\n get(q: any, locale: any, limit: any, page = 0, sort = `relevance+desc, modified+desc, title.${locale}+asc`, facetOperator = 'AND', facetGroupOperator = 'AND', dataServices = 'false', facets: { scoring: any; dataServices: any; }, geoBounds: any, minScoring = 0, dataScope: string) {\n\n facets = { ...facets }; // create a copy to prevent side effects\n delete facets.scoring; // Those are not facets in the api call! They are separate query parameters\n delete facets.dataServices; // ...\n // The request parameters\n const params: {[key: string]: unknown} = {\n q,\n filter: 'dataset',\n limit,\n page: page - 1,\n sort,\n facetOperator,\n facetGroupOperator,\n dataServices,\n includes: `id,title.${locale},description.${locale},languages,modified,issued,catalog.id,catalog.title,catalog.country.id,distributions.id,distributions.format.label,distributions.format.id,distributions.license,categories.label,publisher`,\n facets,\n };\n\n // Check if minScoring is set\n if (minScoring > 0) params.minScoring = minScoring;\n\n // Check if dataScope is set and then modify params to fullfil the corresponding data scope criterias\n if (!isNil(dataScope)) {\n // Set countryData param to true if Country data is requested\n params.countryData = dataScope === 'countryData';\n // Set country facets param\n if (params.countryData) {\n params.facets.country = params.facets.country.filter((c: string) => c !== 'countryData');\n } else {\n params.facets.country = [];\n params.facets.country.push(dataScope);\n }\n }\n\n // Add geoBounds parameters if the bounds are valid\n const bounds = checkBounds(geoBounds);\n if (!isNil(bounds)) {\n params.bboxMinLat = bounds[0];\n params.bboxMaxLat = bounds[2];\n params.bboxMinLon = bounds[1];\n params.bboxMaxLon = bounds[3];\n }\n\n return new Promise((resolve, reject) => {\n const endpoint = 'search';\n const reqStr = `${this.baseUrl}${endpoint}`;\n axios.get(reqStr, {\n params,\n })\n .then((response) => {\n if (!has(response.data, 'result')) {\n console.warn('Error in datasets.js while checking response');\n return reject(new Error('Empty Response Data'));\n }\n /**\n * @property availableFacets\n * @type {availableFacets: Array, datasetsCount, datasets: Array}\n * @description The set union of all available facets for the .\n */\n const resData = {\n availableFacets: [],\n scoringCount: {},\n datasetsCount: response.data.result.count,\n datasets: [],\n };\n\n // Transform fetched facets\n for (const field of response.data.result.facets) {\n // Check for required field keys\n if (has(field, 'id') && has(field, 'title') && has(field, 'items')) {\n const items = [];\n for (const facet of field.items) {\n const item: {id?: any, title?: any, count?: any, minScoring?: any, maxScoring?: any} = {};\n // Check for required facet/item keys\n if (has(facet, 'id') && has(facet, 'title') && has(facet, 'count')) {\n item.id = facet.id;\n item.title = facet.title;\n item.count = facet.count;\n }\n // Handle Scoring Facets\n if (has(facet, 'from') && has(facet, 'to')) {\n const currentScoringFacet: {id?: any, title?: any, count?: any, minScoring?: any, maxScoring?: any} = this.defaultScoringFacets[facet.id];\n item.minScoring = facet.from;\n item.maxScoring = facet.to;\n\n // Use config values to overwrite the default values from the backend\n if (currentScoringFacet.title) item.title = currentScoringFacet.title;\n if (currentScoringFacet.minScoring) item.minScoring = currentScoringFacet.minScoring;\n if (currentScoringFacet.maxScoring) item.maxScoring = currentScoringFacet.maxScoring;\n }\n items.push(item);\n }\n // Add to response array\n resData.availableFacets.push({\n id: field.id,\n title: field.title,\n items,\n });\n }\n }\n\n // Transform Datasets Data model\n const datasets = response.data.result.results;\n\n for (const dataset of datasets) {\n let ds = {};\n try {\n ds = getResponseData(dataset);\n } catch (error) {\n console.warn('Error in datasets.js while checking response:', error.message);\n console.error(error.stack);\n }\n resData.datasets.push(ds);\n }\n return resolve(resData);\n })\n .catch((error) => {\n console.error(error);\n reject(error);\n });\n });\n }\n\n /**\n * @description Get similar datasets to the dataset represented by the provided id.\n * @param id {string} The dataset id to get similar datasets for.\n * @param properties additional parameters, in particular for the knn-request\n * @param query {SimilarDatasetsQuery} query params\n */\n getSimilarDatasets(id: any, properties: any, query?: SimilarDatasetsQuery) {\n return new Promise((resolve, reject) => {\n let url = this.similarityBaseUrl;\n if ( ! url.endsWith('/')) {\n url += '/';\n }\n const similarityServiceName = this.similarityServiceName;\n if (similarityServiceName === 'knn_request') {\n properties.exclude_uris = [`http://data.europa.eu/88u/dataset/${id}`];\n // properties.exclude_uris = [`https://data.europa.eu/api/hub/search/datasets/${id}`];\n axios.post(`${url}knn_request/`, { ...properties, k: 10})\n .then((response) => {\n resolve(response);\n })\n .catch((error) => {\n reject(error);\n });\n } else {\n const reqStr = `${url}similarity/${id}`;\n axios.get(reqStr, {\n params: query,\n }).then((response) => {\n resolve(response);\n })\n .catch((error) => {\n reject(error);\n });\n }\n });\n }\n // curl -i -X POST -H \"Content-Type: application/json\" -d '{\"k\": 10, \"query\": \"This dataset presents all the political groups of the French National Assembly since the 14th legislature (2012). The data comes from open data from the National Assembly.\"}' https://live-service-server-data-europa-eu.apps.osc.fokus.fraunhofer.de/knn_request\n\n getQualityData(id: any) {\n return new Promise((resolve, reject) => {\n const endpoint = 'datasets';\n const reqStr = `${this.qualityBaseUrl}${endpoint}/${id} `;\n axios.get(reqStr, {\n timeout: 30000,\n })\n .then((response) => {\n resolve(response);\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n\n getQualityDistributionData(id: any) {\n return new Promise((resolve, reject) => {\n const endpoint = `datasets/${id}/distributions`;\n const reqStr = `${this.qualityBaseUrl}${endpoint} `;\n axios.get(reqStr, {\n timeout: 30000,\n })\n .then((response) => {\n resolve(response);\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n\n getDQVDataHead(id: any, locale: any) {\n return new Promise((resolve, reject) => {\n // Only check if DQV data is available. No need to request single formats.\n const reqStr = `${this.hubUrl}datasets/${id}/metrics`;\n axios.head(reqStr, {\n })\n .then((response) => {\n resolve(response);\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n\n /**\n * @description Autocomplete the given query.\n * @param q {String} The Query to autocomplete.\n */\n autocomplete(q: any) {\n return new Promise((resolve, reject) => {\n const endpoint = 'autocomplete';\n const reqStr = `${this.baseUrl}${endpoint}`;\n axios.get(reqStr, {\n params: {\n q,\n },\n })\n .then((response) => {\n resolve(response);\n })\n .catch((err) => {\n reject(err);\n });\n });\n }\n}\n\nexport interface SimilarDatasetsQuery {\n limits?: number\n}\n"],"names":["getResponseData","dataset","ds","dataGetters","dist","distribution","checkBounds","bounds","gb","isNil","isArray","coord","error","Datasets","baseUrl","hubUrl","qualityBaseUrl","similarityBaseUrl","similarityServiceName","defaultScoringFacets","__publicField","id","resolve","reject","endpoint","reqStr","axios","response","q","locale","limit","page","sort","facetOperator","facetGroupOperator","dataServices","facets","geoBounds","minScoring","dataScope","params","c","has","resData","field","items","facet","item","currentScoringFacet","datasets","properties","query","url","err"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"datasetService.mjs","sources":["../../lib/services/datasetService.ts"],"sourcesContent":["/* eslint-disable no-console */\n\n import axios from 'axios';\n import { has, isNil, isArray } from 'lodash-es';\n\n import dataGetters from './getters/data-getters';\n\n export const getResponseData = (dataset: { is_hvd: boolean; }) => {\n const ds: {[key: string]: unknown} = {};\n // New fields from DCAT-AP.de\n // Dataset\n ds.politicalGeocodingLevelURI = dataGetters.getArrayOfObjects(dataset, 'political_geocoding_level_uri', ['resource', 'label']);\n ds.politicalGeocodingURI = dataGetters.getArrayOfObjects(dataset, 'political_geocoding_uri', ['resource', 'label']);\n ds.availability = dataGetters.getObject(dataset, 'availability', ['resource', 'label']);\n ds.contributorID = dataGetters.getArrayOfObjects(dataset, 'contributor_id', ['resource', 'label']);\n ds.geocodingDescriptionDe = dataGetters.getObjectLanguage(dataset, 'geocoding_description');\n ds.legalBasis = dataGetters.getObjectLanguage(dataset, 'legal_basis');\n ds.qualityProcessURI = dataGetters.getString(dataset, 'quality_process_uri');\n ds.typeDe = dataGetters.getString(dataset, 'type');\n ds.references = dataGetters.getString(dataset, 'references');\n ds.contributor = dataGetters.getArrayOfObjects(dataset, 'contributor', ['name', 'type', 'resource', 'email', 'homepage']);\n ds.originator = dataGetters.getArrayOfObjects(dataset, 'originator', ['name', 'type', 'resource', 'email', 'homepage']);\n ds.maintainer = dataGetters.getArrayOfObjects(dataset, 'maintainer', ['name', 'type', 'resource', 'email', 'homepage']);\n //\n ds.accessRights = dataGetters.getObject(dataset, 'access_right', ['label', 'resource']);\n ds.accrualPeriodicity = dataGetters.getObject(dataset, 'accrual_periodicity', ['resource', 'label']);\n ds.admsIdentifiers = dataGetters.getArrayOfObjects(dataset, 'adms_identifier', ['identifier', 'schema', 'resource']);\n ds.attributes = dataGetters.getArrayOfStrings(dataset, 'attribute');\n ds.catalog = dataGetters.getObject(dataset, 'catalog', ['id', 'title', 'description', 'country', 'homepage', 'issued', 'modified', 'language', 'license', 'publisher', 'spatial', 'spatial_resource', 'availability','is_part_of']);\n ds.catalogRecord = dataGetters.getObject(dataset, 'catalog_record', ['issued', 'modified']);\n ds.categories = dataGetters.getArrayOfObjects(dataset, 'categories', ['id', 'label']);\n ds.conformsTo = dataGetters.getArrayOfObjects(dataset, 'conforms_to', ['label', 'resource']);\n ds.contactPoints = dataGetters.getArrayOfObjects(dataset, 'contact_point', ['name','organisation_name', 'type', 'resource', 'email', 'telephone', 'address', 'url']);\n ds.country = dataGetters.getObject(dataset, 'country', [{ key: 'id', default: 'eu' }, { key: 'title', default: 'European Union' }]);\n ds.creator = dataGetters.getObject(dataset, 'creator', ['name', 'type', 'email', 'resource', 'homepage']);\n ds.deadline = dataGetters.getString(dataset, 'deadline');\n ds.description = dataGetters.getObjectLanguage(dataset, 'description');\n ds.dimensions = dataGetters.getArrayOfStrings(dataset, 'dimension');\n ds.distributions = [];\n ds.distributionFormats = [];\n ds.documentations = dataGetters.getArrayOfStrings(dataset, 'documentations');\n ds.extendetMetadata = dataGetters.getObject(dataset, 'extended_metadata', ['is_used_by']);\n ds.frequency = dataGetters.getObject(dataset, 'frequency', ['title', 'resource']);\n ds.geocodingDescription = dataGetters.getObject(dataset, 'geocoding_description', ['id', 'label']);\n ds.hasQualityAnnotations = dataGetters.getArrayOfStrings(dataset, 'has_quality_annotation');\n ds.hasVersion = dataGetters.getArrayOfStrings(dataset, 'has_version');\n ds.id = dataGetters.getString(dataset, 'id');\n ds.identifiers = dataGetters.getArrayOfStrings(dataset, 'identifier');\n ds.idName = dataGetters.getString(dataset, 'idName');\n ds.isHvd = dataset.is_hvd || false;\n ds.hvdCategory = dataGetters.getArrayOfObjects(dataset, 'hvd_category', ['id', 'label', 'resource']);\n ds.isReferencedBy = dataGetters.getArrayOfStrings(dataset, 'is_referenced_by');\n ds.isVersionOf = dataGetters.getArrayOfStrings(dataset, 'is_version_of');\n ds.keywords = dataGetters.getArrayOfObjects(dataset, 'keywords', ['id', 'label', 'language']);\n ds.landingPages = dataGetters.getArrayOfObjects(dataset, 'landing_page', ['format', 'description', 'title', 'resource']);\n ds.languages = dataGetters.getArrayOfObjects(dataset, 'language', ['id', 'label', 'resource']);\n ds.licences = [];\n ds.modificationDate = dataGetters.getString(dataset, 'modified');\n ds.numSeries = dataGetters.getNumber(dataset, 'num_series');\n ds.originalLanguage = dataGetters.getOriginalLanguage(dataset);\n ds.otherIdentifiers = dataGetters.getArrayOfObjects(dataset, 'adms_identifier', ['identifier', 'scheme', 'resource']);\n ds.pages = dataGetters.getArrayOfObjects(dataset, 'page', ['format', 'description', 'title', 'resource']);\n ds.provenances = dataGetters.getArrayOfObjects(dataset, 'provenance', ['label', 'resource']);\n ds.publisher = dataGetters.getObject(dataset, 'publisher', ['name', 'type', 'email', 'resource', 'homepage']);\n ds.qualifiedAttributions = dataGetters.getArrayOfStrings(dataset, 'qualified_attribution');\n ds.qualifiedRelations = dataGetters.getArrayOfObjects(dataset, 'qualified_relation', ['relation', 'had_role']);\n ds.relations = dataGetters.getArrayOfStrings(dataset, 'relation');\n // ds.relatedResources = dataGetters.getArrayOfStrings(dataset, 'related_resources');\n ds.releaseDate = dataGetters.getString(dataset, 'issued');\n ds.sample = dataGetters.getArrayOfStrings(dataset, 'sample');\n ds.sources = dataGetters.getArrayOfStrings(dataset, 'source');\n ds.spatial = dataGetters.getArrayOfObjects(dataset, 'spatial', ['type', 'coordinates']);\n ds.spatialResolutionInMeters = dataGetters.getArrayOfNumbers(dataset, 'spatial_resolution_in_meters');\n ds.spatialResource = dataGetters.getArrayOfObjects(dataset, 'spatial_resource', ['label', 'resource']);\n ds.statUnitMeasures = dataGetters.getArrayOfStrings(dataset, 'stat_unit_measure');\n ds.subject = dataGetters.getArrayOfObjects(dataset, 'subject', ['resource', 'label', 'id']);\n ds.temporal = dataGetters.getArrayOfObjects(dataset, 'temporal', ['gte', 'lte']);\n ds.temporalResolution = dataGetters.getString(dataset, 'temporal_resolution');\n ds.theme = dataGetters.getArrayOfObjects(dataset, 'categories', ['id', 'label', 'resource']);\n ds.translationMetaData = dataGetters.getTranslationMetaData(dataset);\n ds.title = dataGetters.getObjectLanguage(dataset, 'title', '');\n ds.type = dataGetters.getObject(dataset, 'type', ['id', 'label', 'resource']);\n ds.resource = dataGetters.getString(dataset, 'resource');\n ds.versionInfo = dataGetters.getString(dataset, 'version_info');\n ds.versionNotes = dataGetters.getObjectLanguage(dataset, 'version_notes');\n ds.visualisations = [];\n ds.wasGeneratedBy = dataGetters.getArrayOfStrings(dataset, 'was_generated_by');\n\n // High-value dataset fields\n // https://semiceu.github.io/DCAT-AP/releases/2.2.0-hvd/\n // NOTE: This is a solution primarily addressing Open Data Bayern's needs.\n ds.isHvd = dataset.is_hvd || false;\n ds.applicableLegislation = dataGetters.getArrayOfStrings(dataset, 'applicable_legislation');\n ds.hvdCategory = dataGetters.getArrayOfObjects(dataset, 'hvd_category', ['id', 'label', 'resource']);\n\n for (const dist of dataGetters.getDistributions(dataset)) {\n const distribution : {[key: string]: unknown} = {};\n distribution.accessUrl = dataGetters.getArrayOfStrings(dist, 'access_url');\n distribution.accessService = dataGetters.getArrayOfObjects(dist, 'access_service', [\n 'title',\n 'description',\n 'endpoint_url',\n 'availability',\n 'applicable_legislation',\n 'contact_point',\n 'page',\n 'hvd_category',\n 'rights',\n ]); // availability field for DCAT-AP.de\n // distribution.accessService = dataGetters.getArrayOfStrings(dist, 'access_service');\n distribution.licenseAttributionByText = dataGetters.getObjectLanguage(dist, 'license_attribution_by_text');\n distribution.byteSize = dataGetters.getNumber(dist, 'byte_size');\n distribution.checksum = dataGetters.getObject(dist, 'checksum', ['algorithm', 'checksum_value']);\n distribution.compressFormat = dataGetters.getObject(dist, 'compress_format', ['label', 'resource']);\n distribution.conformsTo = dataGetters.getArrayOfObjects(dist, 'conforms_to', ['label', 'resource']);\n distribution.description = dataGetters.getObjectLanguage(dist, 'description', '');\n distribution.downloadUrls = dataGetters.getArrayOfStrings(dist, 'download_url');\n distribution.format = dataGetters.getObject(dist, 'format', ['id', 'resource', { key: 'label', default: 'UNKNOWN' }]);\n distribution.hasPolicy = dataGetters.getString(dist, 'has_policy');\n distribution.id = dataGetters.getString(dist, 'id');\n distribution.languages = dataGetters.getArrayOfObjects(dist, 'language', ['id', 'label', 'resource']);\n distribution.licence = dataGetters.getObject(dist, 'license', ['id', 'label', 'description', 'resource', 'la_url', 'homepage']);\n distribution.mediaType = dataGetters.getString(dist, 'media_type');\n distribution.modificationDate = dataGetters.getString(dist, 'modified');\n distribution.packageFormat = dataGetters.getObject(dist, 'package_format', ['label', 'resource']);\n distribution.pages = dataGetters.getArrayOfObjects(dist, 'page', ['format', 'title', 'description', 'resource']);\n distribution.releaseDate = dataGetters.getString(dist, 'issued');\n distribution.rights = dataGetters.getObject(dist, 'rights', ['label', 'resource']);\n //distribution.spatialResolutionInMeters = dataGetters.getArrayOfNumbers(dist, 'spatial_resolution_in_meters');\n distribution.spatialResolutionInMeters = dataGetters.getNumber(dist, 'spatial_resolution_in_meters');\n distribution.status = dataGetters.getObject(dist, 'status', ['label', 'resource']);\n distribution.temporalResolution = dataGetters.getArrayOfStrings(dist, 'temporal_resolution');\n distribution.title = dataGetters.getObjectLanguage(dist, 'title', '');\n distribution.type = dataGetters.getObject(dist, 'type', ['label', 'resource']);\n\n // High-value dataset fields\n // https://semiceu.github.io/DCAT-AP/releases/2.2.0-hvd/\n // NOTE: This is a solution primarily addressing Open Data Bayern's needs.\n distribution.applicableLegislation = dataGetters.getArrayOfObjects(dist, 'applicable_legislation', ['id', 'label', 'resource']);\n\n\n // Check type of ditribution\n if (distribution.type.resource === 'http://publications.europa.eu/resource/authority/distribution-type/VISUALIZATION') {\n ds.visualisations.push(distribution);\n } else {\n ds.distributions.push(distribution);\n }\n\n ds.distributionFormats.push(distribution.format);\n ds.licences.push(distribution.licence);\n\n }\n\n return ds;\n };\n\n const checkBounds = (bounds: any) => {\n try {\n let gb = bounds;\n if (isNil(gb)) return undefined;\n // If gb is a string, split to array\n if (!isArray(gb) && typeof gb === 'string') gb = gb.split(',');\n // Check number of elements. we need 4 for latMin, LonMin, LatMax, LonMax\n if (isArray(gb) && gb.length === 4) {\n for (const coord of gb) {\n // Check if items are floats\n if (!parseFloat(coord)) return undefined;\n return gb;\n }\n }\n return undefined;\n } catch (error) {\n console.error(error.message);\n return undefined;\n }\n };\n\n export default class Datasets {\n\n private readonly baseUrl: string;\n private readonly hubUrl: string;\n private readonly qualityBaseUrl: string;\n private readonly similarityBaseUrl: string;\n private readonly similarityServiceName: string;\n private readonly defaultScoringFacets: any[];\n\n constructor(baseUrl: string, hubUrl: string, qualityBaseUrl: string, similarityBaseUrl: string, similarityServiceName: string, defaultScoringFacets: any[]) {\n this.baseUrl = baseUrl;\n this.hubUrl = hubUrl;\n this.qualityBaseUrl = qualityBaseUrl;\n this.similarityBaseUrl = similarityBaseUrl;\n this.similarityServiceName = similarityServiceName;\n this.defaultScoringFacets = defaultScoringFacets;\n }\n\n /**\n * @description GET dataset by given id.\n * @param id\n */\n getSingle(id: any) {\n return new Promise((resolve, reject) => {\n const endpoint = 'datasets';\n const reqStr = `${this.baseUrl}${endpoint}/${id}`;\n axios.get(reqStr, {\n params: {},\n })\n .then((response) => {\n const dataset = response.data.result;\n let ds = {};\n try {\n ds = getResponseData(dataset);\n } catch (error) {\n console.warn('Error in datasets.js while checking response:', error.message);\n console.error(error.stack);\n }\n resolve(ds);\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n\n /**\n * @description GET all datasets matching the given criteria.\n * @param q\n * @param locale\n * @param facets\n * @param geoBounds\n * @param minScoring\n * @param dataScope\n * @returns {Promise}\n */\n get(q: any, locale: any, limit: any, page = 0, sort = `relevance+desc, modified+desc, title.${locale}+asc`, facetOperator = 'AND', facetGroupOperator = 'AND', dataServices = 'false', facets: { scoring: any; dataServices: any; }, geoBounds: any, minScoring = 0, dataScope: string) {\n\n facets = { ...facets }; // create a copy to prevent side effects\n delete facets.scoring; // Those are not facets in the api call! They are separate query parameters\n delete facets.dataServices; // ...\n // The request parameters\n const params: {[key: string]: unknown} = {\n q,\n filter: 'dataset',\n limit,\n page: page - 1,\n sort,\n facetOperator,\n facetGroupOperator,\n dataServices,\n includes: `id,title.${locale},description.${locale},languages,modified,issued,catalog.id,catalog.title,catalog.country.id,distributions.id,distributions.format.label,distributions.format.id,distributions.license,categories.label,publisher`,\n facets,\n };\n\n // Check if minScoring is set\n if (minScoring > 0) params.minScoring = minScoring;\n\n // Check if dataScope is set and then modify params to fullfil the corresponding data scope criterias\n if (!isNil(dataScope)) {\n // Set countryData param to true if Country data is requested\n params.countryData = dataScope === 'countryData';\n // Set country facets param\n if (params.countryData) {\n params.facets.country = params.facets.country.filter((c: string) => c !== 'countryData');\n } else {\n params.facets.country = [];\n params.facets.country.push(dataScope);\n }\n }\n\n // Add geoBounds parameters if the bounds are valid\n const bounds = checkBounds(geoBounds);\n if (!isNil(bounds)) {\n params.bboxMinLat = bounds[0];\n params.bboxMaxLat = bounds[2];\n params.bboxMinLon = bounds[1];\n params.bboxMaxLon = bounds[3];\n }\n\n return new Promise((resolve, reject) => {\n const endpoint = 'search';\n const reqStr = `${this.baseUrl}${endpoint}`;\n axios.get(reqStr, {\n params,\n })\n .then((response) => {\n if (!has(response.data, 'result')) {\n console.warn('Error in datasets.js while checking response');\n return reject(new Error('Empty Response Data'));\n }\n /**\n * @property availableFacets\n * @type {availableFacets: Array, datasetsCount, datasets: Array}\n * @description The set union of all available facets for the .\n */\n const resData = {\n availableFacets: [],\n scoringCount: {},\n datasetsCount: response.data.result.count,\n datasets: [],\n };\n\n // Transform fetched facets\n for (const field of response.data.result.facets) {\n // Check for required field keys\n if (has(field, 'id') && has(field, 'title') && has(field, 'items')) {\n const items = [];\n for (const facet of field.items) {\n const item: {id?: any, title?: any, count?: any, minScoring?: any, maxScoring?: any} = {};\n // Check for required facet/item keys\n if (has(facet, 'id') && has(facet, 'title') && has(facet, 'count')) {\n item.id = facet.id;\n item.title = facet.title;\n item.count = facet.count;\n }\n // Handle Scoring Facets\n if (has(facet, 'from') && has(facet, 'to')) {\n const currentScoringFacet: {id?: any, title?: any, count?: any, minScoring?: any, maxScoring?: any} = this.defaultScoringFacets[facet.id];\n item.minScoring = facet.from;\n item.maxScoring = facet.to;\n\n // Use config values to overwrite the default values from the backend\n if (currentScoringFacet.title) item.title = currentScoringFacet.title;\n if (currentScoringFacet.minScoring) item.minScoring = currentScoringFacet.minScoring;\n if (currentScoringFacet.maxScoring) item.maxScoring = currentScoringFacet.maxScoring;\n }\n items.push(item);\n }\n // Add to response array\n resData.availableFacets.push({\n id: field.id,\n title: field.title,\n items,\n });\n }\n }\n\n // Transform Datasets Data model\n const datasets = response.data.result.results;\n\n for (const dataset of datasets) {\n let ds = {};\n try {\n ds = getResponseData(dataset);\n } catch (error) {\n console.warn('Error in datasets.js while checking response:', error.message);\n console.error(error.stack);\n }\n resData.datasets.push(ds);\n }\n return resolve(resData);\n })\n .catch((error) => {\n console.error(error);\n reject(error);\n });\n });\n }\n\n /**\n * @description Get similar datasets to the dataset represented by the provided id.\n * @param id {string} The dataset id to get similar datasets for.\n * @param properties additional parameters, in particular for the knn-request\n * @param query {SimilarDatasetsQuery} query params\n */\n getSimilarDatasets(id: any, properties: any, query?: SimilarDatasetsQuery) {\n return new Promise((resolve, reject) => {\n let url = this.similarityBaseUrl;\n if ( ! url.endsWith('/')) {\n url += '/';\n }\n const similarityServiceName = this.similarityServiceName;\n if (similarityServiceName === 'knn_request') {\n properties.exclude_uris = [`http://data.europa.eu/88u/dataset/${id}`];\n // properties.exclude_uris = [`https://data.europa.eu/api/hub/search/datasets/${id}`];\n axios.post(`${url}knn_request/`, { ...properties, k: 10})\n .then((response) => {\n resolve(response);\n })\n .catch((error) => {\n reject(error);\n });\n } else {\n const reqStr = `${url}similarity/${id}`;\n axios.get(reqStr, {\n params: query,\n }).then((response) => {\n resolve(response);\n })\n .catch((error) => {\n reject(error);\n });\n }\n });\n }\n // curl -i -X POST -H \"Content-Type: application/json\" -d '{\"k\": 10, \"query\": \"This dataset presents all the political groups of the French National Assembly since the 14th legislature (2012). The data comes from open data from the National Assembly.\"}' https://live-service-server-data-europa-eu.apps.osc.fokus.fraunhofer.de/knn_request\n\n getQualityData(id: any) {\n return new Promise((resolve, reject) => {\n const endpoint = 'datasets';\n const reqStr = `${this.qualityBaseUrl}${endpoint}/${id} `;\n axios.get(reqStr, {\n timeout: 30000,\n })\n .then((response) => {\n resolve(response);\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n\n getQualityDistributionData(id: any) {\n return new Promise((resolve, reject) => {\n const endpoint = `datasets/${id}/distributions`;\n const reqStr = `${this.qualityBaseUrl}${endpoint} `;\n axios.get(reqStr, {\n timeout: 30000,\n })\n .then((response) => {\n resolve(response);\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n\n getDQVDataHead(id: any, locale: any) {\n return new Promise((resolve, reject) => {\n // Only check if DQV data is available. No need to request single formats.\n const reqStr = `${this.hubUrl}datasets/${id}/metrics`;\n axios.head(reqStr, {\n })\n .then((response) => {\n resolve(response);\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n\n /**\n * @description Autocomplete the given query.\n * @param q {String} The Query to autocomplete.\n */\n autocomplete(q: any) {\n return new Promise((resolve, reject) => {\n const endpoint = 'autocomplete';\n const reqStr = `${this.baseUrl}${endpoint}`;\n axios.get(reqStr, {\n params: {\n q,\n },\n })\n .then((response) => {\n resolve(response);\n })\n .catch((err) => {\n reject(err);\n });\n });\n }\n}\n\nexport interface SimilarDatasetsQuery {\n limits?: number\n}\n"],"names":["getResponseData","dataset","ds","dataGetters","dist","distribution","checkBounds","bounds","gb","isNil","isArray","coord","error","Datasets","baseUrl","hubUrl","qualityBaseUrl","similarityBaseUrl","similarityServiceName","defaultScoringFacets","__publicField","id","resolve","reject","endpoint","reqStr","axios","response","q","locale","limit","page","sort","facetOperator","facetGroupOperator","dataServices","facets","geoBounds","minScoring","dataScope","params","c","has","resData","field","items","facet","item","currentScoringFacet","datasets","properties","query","url","err"],"mappings":"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"}
|