import {Injectable} from '@angular/core'; import {HttpClient, HttpErrorResponse} from "@angular/common/http"; import {throwError} from 'rxjs'; import {ResultLandingInfo} from '../../utils/entities/resultLandingInfo'; import {EnvProperties} from '../../utils/properties/env-properties'; import {ParsingFunctions} from '../landing-utils/parsingFunctions.class'; import {map} from "rxjs/operators"; import {HostedByCollectedFrom, Organization} from "../../utils/result-preview/result-preview"; import {Dates, Identifier, StringUtils} from "../../utils/string-utils.class"; import {properties} from "../../../../environments/environment"; @Injectable() export class ResultLandingService { constructor(private http: HttpClient ) { this.parsingFunctions = new ParsingFunctions(); } public parsingFunctions: ParsingFunctions; resultLandingInfo: ResultLandingInfo; private buildResultLandingInfoUrl(id: string, identifier: Identifier, type: string): string { if (id) { let url = properties.searchAPIURLLAst; if (type === 'publication') { url += 'publications/'; } else if (type === 'dataset') { url += 'datasets/'; } else if (type === 'software') { url += 'software/'; } else if (type === 'orp' || type === 'other') { url += 'other/'; } else if (type === 'result') { url += 'results/'; } url += id + '?format=json'; return url; } else if (identifier) { // pid = "10.3389/fphys.2014.00466"; let url = properties.searchAPIURLLAst + "resources2"; url += "?pid="+encodeURIComponent(identifier.id) + "&pidtype=" + identifier.class + "&type="; if (type === 'publication') { url += 'publications'; } else if (type === 'dataset') { url += 'datasets'; } else if (type === 'software') { url += 'software'; } else if (type === 'orp') { url += 'other'; } else if (type === 'result') { url += 'results'; } url += "&format=json"; return url; } } getResultLandingInfo (id: string, identifier: Identifier, type: string, provenanceActionVocabulary: any, properties: EnvProperties): any { let url: string = this.buildResultLandingInfoUrl(id, identifier, type); let finalUrl: string = (properties.useCache) ? (properties.cacheUrl + encodeURIComponent(url)) : url; return this.http.get(finalUrl) .pipe(map(res => { if(!id && identifier) { if(!res['results'] || res['results'].length == 0) { throw new HttpErrorResponse({ status: 404, statusText: "Not found", url: finalUrl, error: "Http failure response for "+finalUrl+": 404 Not Found" }); } return res['results'][0]; } else { return res; } })) .pipe(map(res => [res['result']['header']['dri:status'], res['result']['metadata']['oaf:entity'], res])) .pipe(map(res => [ res[1]['oaf:result'], // 0 res[1]['oaf:result']['title'], // 1 res[1]['oaf:result']['rels']['rel'], // 2 res[1]['oaf:result']['children'], // 3 res[1]['oaf:result']['pid'], // 4 res[1]['oaf:result']['journal'], // 5 res[1]['oaf:result']['language'], // 6 res[1]['oaf:result']['subject'], // 7 res[1]['oaf:result']['context'], // 8 res[1]['oaf:result']['creator'], // 9 res[1]['oaf:result']['country'] , // 10 res[1]['oaf:result']['programmingLanguage'], // 11 - software //res[1]['oaf:result']['resulttype'], (res[1]['extraInfo'] !== undefined && res[1]['extraInfo']['citations'] !== undefined) ? res[1]['extraInfo']['citations']['citation'] : null, // 12 res[0], // 13 res[2] // 14 ])) .pipe(map(res => this.parseResultLandingInfo(res, provenanceActionVocabulary, properties))); } // getProvenanceActionVocabulary (properties: EnvProperties): any { // let url = properties.vocabulariesAPI+"dnet:provenanceActions.json"; // // return this.http.get((properties.useCache) ? (properties.cacheUrl + encodeURIComponent(url)) : url) // .pipe(map(res => res['terms'])) // .pipe(map(res => this.parseProvenanceActionVocabulary(res, properties))); // } // // parseProvenanceActionVocabulary(terms: any, properties: EnvProperties) { // var provenanceActionVocabulary: {} = {}; // for(let term of terms) { // provenanceActionVocabulary[term.code] = term.englishName; // } // return provenanceActionVocabulary; // } private handleError (error: HttpErrorResponse) { // in a real world app, we may send the error to some remote logging infrastructure // instead of just logging it to the console console.log(error); return throwError(error || 'Server error'); } parseResultLandingInfo (data: any, provenanceActionVocabulary: any, properties: EnvProperties): any { this.resultLandingInfo = new ResultLandingInfo(); // res this.resultLandingInfo.record = data[14]; this.resultLandingInfo.objIdentifier = data[14]["result"]["header"]["dri:objIdentifier"]; this.resultLandingInfo.relcanId = ParsingFunctions.parseRelCanonicalId(this.resultLandingInfo.record, "result"); this.resultLandingInfo.resultType = data[0].resulttype.classid; // res['result']['metadata']['oaf:entity']['oaf:result'] if (data[0] != null) { let date: string = (data[0].dateofacceptance ? data[0].dateofacceptance : '') + ''; // transform to string in case it is an integer this.resultLandingInfo.date = (date && (date).indexOf('-') !== -1) ? date.split('-')[0] : date; this.resultLandingInfo.dateofacceptance = data[0].dateofacceptance?Dates.getDate(data[0].dateofacceptance):null; this.resultLandingInfo.publisher = data[0].publisher; if(!Array.isArray(data[0].description)) { //this.resultLandingInfo.description = String(data[0].description); this.resultLandingInfo.description = (data[0] && data[0].description) ? String(data[0].description) : ""; } else { //this.resultLandingInfo.description = String(data[0].description[0]); this.resultLandingInfo.description = (data[0] && data[0].description[0]) ? String(data[0].description[0]) : ""; } try{ this.resultLandingInfo.description = StringUtils.HTMLToString(this.resultLandingInfo.description); } catch (e) {} this.resultLandingInfo.embargoEndDate = data[0].embargoenddate?Dates.getDate(data[0].embargoenddate):null; } if(data[0]['bestaccessright'] && data[0]['bestaccessright'].hasOwnProperty("classname")) { this.resultLandingInfo.accessMode = data[0]['bestaccessright'].classname; } // res['result']['metadata']['oaf:entity']['oaf:result']['title'] if(data[1] != null) { if(Array.isArray(data[1])) { for(let i=0; i(); this.resultLandingInfo.types = new Array(); let types = new Set(); let counter = 0; let instance; let length = Array.isArray(data[3]['instance']) ? data[3]['instance'].length : 1; for(let i=0; i { if(a.bestAccessMode && a.bestAccessMode.toLowerCase() === 'open access') { return -1; } else if(b.bestAccessMode && b.bestAccessMode.toLowerCase() === 'open access') { return 1; } else if(!a.bestAccessMode || a.bestAccessMode.toLowerCase() !== 'not available') { return 1; } else if(!b.bestAccessMode || b.bestAccessMode.toLowerCase() !== 'not available') { return -1; } else { return 0; } }); } if(data[3].hasOwnProperty("externalreference")) { let externalResults: Map> = this.parseBioentitiesAndSoftware(data[3]); this.resultLandingInfo.bioentities = externalResults; } } // res['result']['metadata']['oaf:entity']['oaf:result']['pid'] if(data[4] != null) { this.resultLandingInfo.identifiers = this.parsingFunctions.parseIdentifiers(data[4]); } // res['result']['metadata']['oaf:entity']['oaf:result']['journal'] if(data[5] != null) { this.resultLandingInfo.journal = {"journal": "", "issn": "", "lissn": "", "eissn": "", "issue": "", "volume": "", "start_page": "", "end_page": ""} this.resultLandingInfo.journal['journal'] = data[5].content; this.resultLandingInfo.journal['issn'] = data[5].issn; this.resultLandingInfo.journal['lissn'] = data[5].lissn; this.resultLandingInfo.journal['eissn'] = data[5].eissn; this.resultLandingInfo.journal['issue'] = data[5].iss; this.resultLandingInfo.journal['volume'] = data[5].vol; this.resultLandingInfo.journal['start_page'] = data[5].sp; this.resultLandingInfo.journal['end_page'] = data[5].ep; } // res['result']['metadata']['oaf:entity']['oaf:result']['language'] if(data[6] != null) { this.resultLandingInfo.languages = this.parsingFunctions.parseLanguages(data[6]); // let languagesAndCodes: string[][] = this.parsingFunctions.parseLanguages(data[6]); // this.resultLandingInfo.languages = languagesAndCodes[0]; // this.resultLandingInfo.languageCodes = languagesAndCodes[1]; } // res['result']['metadata']['oaf:entity']['oaf:result']['country'] if(data[10] != null) { this.resultLandingInfo.countries = this.parsingFunctions.parseCountries(data[10]); } // res['result']['metadata']['oaf:entity']['oaf:result']['subject'] if(data[7] != null) { let subjectResults: [string[], Map, Map] = this.parsingFunctions.parseAllSubjects(data[7]); this.resultLandingInfo.subjects = subjectResults[0]; this.resultLandingInfo.otherSubjects = subjectResults[1]; this.resultLandingInfo.classifiedSubjects = subjectResults[2]; this.resultLandingInfo.showEgiNotebookButton = this.parsingFunctions.notebookInSubjects; } this.resultLandingInfo.hostedBy_collectedFrom = this.parsingFunctions.addPublisherToHostedBy_collectedFrom( this.resultLandingInfo.hostedBy_collectedFrom, this.resultLandingInfo.publisher, this.resultLandingInfo.journal, this.resultLandingInfo.identifiers); // res['result']['metadata']['oaf:entity']['oaf:result']['programmingLanguage'] if(data[11] != null) { this.resultLandingInfo.programmingLanguages = this.parsingFunctions.parseProgrammingLanguages(data[11]); } // res['result']['metadata']['oaf:entity']['extraInfo']['citations']['citation'] if(data[12] != null) { this.resultLandingInfo.references = this.parsingFunctions.parseReferences(data[12]); } // res['result']['metadata']['oaf:entity']['oaf:result']['context'] if(data[8] != null) { this.resultLandingInfo.contexts = this.parsingFunctions.parseContexts(data[8]); } // res['result']['header']['dri:status'] if(data[13] != null && data[13] == "under curation") { this.resultLandingInfo.underCurationMessage = true; } else { this.resultLandingInfo.underCurationMessage = false; } // res['result']['metadata']['oaf:entity']['oaf:result']['creator'] if(data[9] != null) { if(this.resultLandingInfo.authors == undefined) { this.resultLandingInfo.authors = new Array<{"fullName": string, "orcid": string, "orcid_pending": string}>(); } let authors = data[9]; let length = Array.isArray(authors) ? authors.length : 1; for(let i=0; i> { let bioentities: Map>; let length = Array.isArray(children['externalreference']) ? children['externalreference'].length : 1; let externalreference; for(let i=0; i>(); } if(!bioentities.has(externalreference.sitename)) { bioentities.set(externalreference.sitename, new Map()); } bioentities.get(externalreference.sitename).set(externalreference.refidentifier, externalreference.url); } } } return bioentities; } getOpenCitations(id: string, properties:EnvProperties) { //https://services.openaire.eu/opencitations/getCitations?id=doajarticles::2634200c24772ee8f10232d3e184ec65 let url = properties.openCitationsAPIURL+id;// "https://services.openaire.eu/opencitations/getCitations?id=" + id; let key = url; //return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) return this.http.get(url) .pipe(map(res => [res['total'], this.parseOpenCitations(res['results'])])); } parseOpenCitations(openCitations: any): {"url": string, "title": string, "year": string, "doi": string, "authors": string[]}[] { //title, doi, authors let citations = new Array<{"url": string, "title": string, "year": string, "doi": string, "authors": string[]}>(); let openCitation; let length = Array.isArray(openCitations) ? openCitations.length : 1; for(let i=0; i this.parseEnermapsDetails(res))); } parseEnermapsDetails(response: any) { let details = Array.isArray(response) ? response[0] : response; let metadata = (details && details.metadata) ? details.metadata : null; let entries = []; let keys = metadata ? Object.keys(metadata) : null; for(let key of keys) { if(key != "shared_id" && key && metadata[key]) { entries.push([key+"", metadata[key]+""]); } } return entries; } }