Select Git revision
identifier.mapper.js

Martin Weise authored
identifier.mapper.js 7.36 KiB
import store from '@/store'
const baseUrl = `${location.protocol}//${location.host}`
class IdentifierMapper {
identifierToCreators (identifier) {
if (!identifier) {
return null
}
const creators = identifier.creators
let str = ''
for (let i = 0; i < creators.length; i++) {
/* separator */
if (creators.length > 1 && i === creators.length - 1) {
str += ', & '
} else if (i > 0 && creators.length !== 2) {
str += ', '
}
/* name */
str += creators[i].creator_name
}
return str
}
identifierToIdentifierSave (data) {
return {
database_id: data.database_id,
query_id: data.query_id,
view_id: data.view_id,
table_id: data.table_id,
type: data.type,
titles: data.titles.map((t) => {
return {
id: t.id,
title: t.title,
language: t.language,
type: t.type
}
}),
descriptions: data.descriptions.map((d) => {
return {
id: d.id,
description: d.description,
language: d.language,
type: d.type
}
}),
funders: data.funders.map((f) => {
return {
id: f.id,
funder_name: f.funder_name,
funder_identifier: f.funder_identifier,
funder_identifier_type: f.funder_identifier_scheme,
scheme_uri: f.scheme_uri,
award_number: f.award_number,
award_title: f.award_title
}
}),
visibility: data.visibility,
publisher: data.publisher,
language: data.language,
licenses: data.licenses,
creators: data.creators.map((c) => {
return {
id: c.id,
firstname: c.name_type === 'Personal' ? c.firstname : null,
lastname: c.name_type === 'Personal' ? c.lastname : null,
creator_name: c.creator_name,
name_type: c.name_type,
name_identifier: c.name_identifier,
name_identifier_scheme: c.name_identifier_scheme,
affiliation: c.affiliation,
affiliation_identifier: c.affiliation_identifier,
affiliation_identifier_scheme: this.identifierToIdentifierScheme(c.affiliation_identifier)
}
}),
publication_day: data.publication_day,
publication_month: data.publication_month,
publication_year: data.publication_year,
related_identifiers: data.related_identifiers.map((r) => {
return {
id: r.id,
value: r.value,
type: r.type,
relation: r.relation
}
})
}
}
identifierToIdentifierScheme (data) {
if (!data) {
return null
}
if (data.includes('ror.org')) {
return 'ROR'
} else if (data.includes('orcid.org')) {
return 'ORCID'
} else if (data.includes('grid.ac')) {
return 'GRID'
} else if (data.includes('isni.org')) {
return 'ISNI'
}
return null
}
identifierToPreferFirstLicenseUri (identifier) {
if (!identifier || !identifier.licenses || identifier.licenses.length === 0) {
return null
}
return identifier.licenses[0].uri
}
identifierPreferEnglishDescription (identifier) {
if (!identifier || !identifier.descriptions || identifier.descriptions.length === 0) {
return null
}
const filtered = identifier.descriptions.filter(d => d.language && d.language === 'en')
if (filtered.length === 0) {
return identifier.descriptions[0].description
}
return filtered[0].description
}
descriptionShort (description) {
const targetLength = 280
const lengthMax = 300
if (!description) {
return null
}
if (description.length <= lengthMax) {
return description
}
const extra = description.substring(targetLength, lengthMax)
const idx = extra.indexOf(' ')
return description.substring(0, targetLength + idx) + '...'
}
identifierPreferEnglishTitle (identifier) {
if (!identifier || !identifier.titles || identifier.titles.length === 0) {
return null
}
const filtered = identifier.titles.filter(d => d.language && d.language === 'en')
if (filtered.length === 0) {
return identifier.titles[0].title
}
return filtered[0].title
}
identifierToUrl (identifier) {
if (!identifier) {
return null
}
if (identifier.doi !== null) {
if (identifier.doi.startsWith('http')) {
return identifier.doi
}
return `${store().state.doiUrl}/${identifier.doi}`
}
return `${baseUrl}/pid/${identifier.id}`
}
identifierToDisplayName (identifier) {
if (!identifier) {
return null
}
if (identifier.doi !== null) {
if (identifier.doi.startsWith('http')) {
return identifier.replaceAll('https?://doi.org/', '')
}
return identifier.doi
}
return `${baseUrl}/pid/${identifier.id}`
}
identifierToDisplayAcronym (identifier) {
if (!identifier) {
return null
}
return identifier.doi !== null ? 'DOI' : 'URI'
}
creatorToCreatorJsonLd (creator) {
const jsonLd = {
name: creator.creator_name
}
if (creator.name_type === 'Personal') {
jsonLd['@type'] = 'Person'
if (creator.name_identifier) {
jsonLd.sameAs = creator.name_identifier
}
if (creator.firstname) {
jsonLd.givenName = creator.firstname
}
if (creator.lastname) {
jsonLd.familyName = creator.lastname
}
} else {
jsonLd['@type'] = 'Organization'
if (creator.affiliation_identifier) {
jsonLd.sameAs = creator.affiliation_identifier
}
}
return jsonLd
}
identifierToHasPartJsonLd (identifier) {
return {
'@type': 'Dataset',
name: this.identifierPreferEnglishTitle(identifier),
description: this.identifierPreferEnglishDescription(identifier),
identifier: this.identifierToUrl(identifier),
citation: this.identifierToUrl(identifier),
temporalCoverage: identifier.publication_year,
version: identifier.created
}
}
identifiersToJsonLd (database) {
const identifier = database.identifiers[0]
const partIdentifiers = []
if (database.subsets.length > 0) {
database.subsets.forEach((s) => { if (s.identifiers.length > 0) { s.identifiers.forEach(i => partIdentifiers.push(i)) } })
}
if (database.tables.length > 0) {
database.tables.forEach((t) => { if (t.identifiers.length > 0) { t.identifiers.forEach(i => partIdentifiers.push(i)) } })
}
if (database.views.length > 0) {
database.views.forEach((v) => { if (v.identifiers.length > 0) { v.identifiers.forEach(i => partIdentifiers.push(i)) } })
}
return {
'@context': 'https://schema.org/',
'@type': 'Dataset',
name: this.identifierPreferEnglishTitle(identifier),
description: this.identifierPreferEnglishDescription(identifier),
url: `${baseUrl}/database/${identifier.database_id}/info`,
identifier: database.identifiers.map(i => this.identifierToUrl(i)),
license: this.identifierToPreferFirstLicenseUri(identifier),
isAccessibleForFree: database.is_public,
creator: identifier.creators.map(c => this.creatorToCreatorJsonLd(c)),
citation: this.identifierToUrl(identifier),
hasPart: partIdentifiers.map(i => this.identifierToHasPartJsonLd(i)),
temporalCoverage: identifier.publication_year,
version: identifier.created
}
}
}
export default new IdentifierMapper()