From ce4b9273e0f7ccb55f67dfc0d209caa779b4aa7c Mon Sep 17 00:00:00 2001 From: "konstantina.galouni" Date: Fri, 16 Dec 2022 09:59:48 +0200 Subject: [PATCH] [Library | angular-14 & Explore | master]: Updated request to Crossref for bulk uploaded DOIs in linking | Added link for more information to joomla article (Canada's request). 1. sdg.component.html: Added link for more information to joomla article (Canada's request). 2. timeout-interceptor.service.ts: Excluded from timeout interceptor properties.searchCrossrefAPIURL and properties.searchDataciteAPIURL. 3. searchDatacite.service.ts: In method "getDataciteResultByDOI()", for requests coming from file uploaded in linking added timeout to 20 sec, and for other requests timeout similar to the interceptor (6 sec for production, 12 otherwise). 4. searchCrossref.service.ts: In method "searchCrossrefByDOIs()", added timeout similar to the interceptor (6 sec for production, 12 otherwise) | Added method "searchCrossrefByDOI()", called for requests coming from file uploaded in linking. 5. bulkClaim.component.ts: Call new API method for Crossref requests for DOIs | Fixed tooltip to appear. --- .../service/searchCrossref.service.ts | 33 ++++++--- .../service/searchDatacite.service.ts | 8 ++- .../linking/bulkClaim/bulkClaim.component.ts | 38 +++++----- sdg/sdg.component.html | 4 ++ timeout-interceptor.service.ts | 4 +- utils/modal/loading.component.ts | 69 +++++++++++++++++-- 6 files changed, 120 insertions(+), 36 deletions(-) diff --git a/claims/claim-utils/service/searchCrossref.service.ts b/claims/claim-utils/service/searchCrossref.service.ts index 16372b61..9448013c 100644 --- a/claims/claim-utils/service/searchCrossref.service.ts +++ b/claims/claim-utils/service/searchCrossref.service.ts @@ -2,8 +2,10 @@ import {throwError as observableThrowError} from 'rxjs'; import {Injectable} from '@angular/core'; import {HttpClient} from '@angular/common/http'; import {ClaimEntity, ClaimResult} from '../claimHelper.class'; -import {map} from "rxjs/operators"; +import {map, timeout} from "rxjs/operators"; import {EnvProperties} from "../../../utils/properties/env-properties"; +import {properties} from "../../../../../environments/environment"; +import {StringUtils} from "../../../utils/string-utils.class"; @Injectable() export class SearchCrossrefService { @@ -20,7 +22,9 @@ export class SearchCrossrefService { } - searchCrossrefByDOIs(DOIs: string[], properties: EnvProperties, parse: boolean = false): any { + searchCrossrefByDOIs(DOIs: string[], properties: EnvProperties, parse: boolean = false, file: boolean = false): any { + let timeoutTime: number = properties.environment == "production" ? 6000 : 12000; + // let timeoutTimeForFile: number = 60000; var doisParams = ""; for (var i = 0; i < DOIs.length; i++) { @@ -28,11 +32,21 @@ export class SearchCrossrefService { } let url = properties.searchCrossrefAPIURL + '?filter=' + doisParams; return this.http.get(url) - //.map(request => request.json().message) - .pipe(map(request => request['message'])) - .pipe(map(request => [request["total-results"], parse ? this.parse(request['items']) : request])) - //.catch(this.handleError); + // .pipe(timeout(file ? timeoutTimeForFile : (timeoutTime))) + .pipe(timeout(timeoutTime)) + .pipe(map(request => request['message'])) + .pipe(map(request => [request["total-results"], parse ? this.parse(request['items']) : request])) } + + searchCrossrefByDOI(DOI: string): any { + let timeoutTimeForFile: number = 20000; + + let url = properties.searchCrossrefAPIURL + '/' + StringUtils.URIEncode(DOI); + return this.http.get(url) + .pipe(timeout(timeoutTimeForFile)) + .pipe(map(request => request['message'])) + .pipe(map(request => this.parse(request))) + } searchCrossrefByMultipleDOIs(dois: string[], properties: EnvProperties, parse: boolean = false): any { let url = properties.searchCrossrefAPIURL + '?filter=doi:'; for (var i = 0; i < dois.length; i++) { @@ -56,8 +70,11 @@ export class SearchCrossrefService { parse(response): ClaimEntity[] { const results: ClaimEntity[] = []; - for (let i = 0; i < response.length; i++) { - const item = response[i]; + let length = Array.isArray(response) ? response.length : 1; + + for (let i = 0; i < length; i++) { + const item = Array.isArray(response) ? response[i] : response; + const entity: ClaimEntity = new ClaimEntity(); entity.result = new ClaimResult(); entity.result.publisher = null; diff --git a/claims/claim-utils/service/searchDatacite.service.ts b/claims/claim-utils/service/searchDatacite.service.ts index fa8dfbae..52854ed5 100644 --- a/claims/claim-utils/service/searchDatacite.service.ts +++ b/claims/claim-utils/service/searchDatacite.service.ts @@ -3,7 +3,7 @@ import {Injectable} from '@angular/core'; import {HttpClient} from '@angular/common/http'; import {EnvProperties} from '../../../utils/properties/env-properties'; import {ClaimEntity, ClaimResult} from '../claimHelper.class'; -import {catchError, map} from 'rxjs/operators'; +import {catchError, map, timeout} from 'rxjs/operators'; import {properties} from "../../../../../environments/environment"; @@ -21,10 +21,14 @@ export class SearchDataciteService { //.catch(this.handleError); } - getDataciteResultByDOI(doi: string, properties: EnvProperties, parse: boolean = false): any { + getDataciteResultByDOI(doi: string, properties: EnvProperties, parse: boolean = false, file: boolean = false): any { + let timeoutTime: number = properties.environment == "production" ? 6000 : 12000; + let timeoutTimeForFile: number = 20000; + let url = properties.searchDataciteAPIURL + '/' + doi; let key = url; return this.http.get((properties.useCache) ? (properties.cacheUrl + encodeURIComponent(url)) : url) + .pipe(timeout(file ? timeoutTimeForFile : (timeoutTime))) .pipe(map(request => (parse ? SearchDataciteService.parse([request["data"]])[0] : request)), catchError(err => of(null))); } diff --git a/claims/linking/bulkClaim/bulkClaim.component.ts b/claims/linking/bulkClaim/bulkClaim.component.ts index 29f20728..fac882b3 100644 --- a/claims/linking/bulkClaim/bulkClaim.component.ts +++ b/claims/linking/bulkClaim/bulkClaim.component.ts @@ -21,14 +21,16 @@ declare var UIkit: any;
-
- - Upload a DOI's CSV file +
+ + + Upload a DOI's CSV file + -   +  
@@ -107,17 +109,16 @@ export class BulkClaimComponent { exceedsLimit = false; @Input() basketLimit ; tooltip = ` -
-
-
CSV format:
"DOI","ACCESS_MODE","DATE"
-
-
-
- DOI is required
-
- Access mode:
OPEN, CLOSED, EMBARGO
-
- Embargo end date:
YYYY-MM-DD
-
-
-
`; +
+
Up to 100 DOIs
+
CSV format:
"DOI","ACCESS_MODE","DATE"
+
+
+
- DOI is required
+
- Access mode:
OPEN, CLOSED, EMBARGO
+
- Embargo end date:
YYYY-MM-DD
+
+
`; constructor(private _searchCrossrefService: SearchCrossrefService, private _searchDataciteService: SearchDataciteService) { this.filesToUpload = []; } @@ -247,11 +248,12 @@ export class BulkClaimComponent { } fetchResult(id: string, accessMode: string, date: string, row: number) { - this.subscriptions.push(this._searchCrossrefService.searchCrossrefByDOIs([id], this.properties, true).subscribe( + // this.subscriptions.push(this._searchCrossrefService.searchCrossrefByDOIs([id], this.properties, true, true).subscribe( + this.subscriptions.push(this._searchCrossrefService.searchCrossrefByDOI(id).subscribe( data => { - const result:ClaimEntity = data[1][0]; - if (data[1].length > 0) { + if (data.length > 0) { + const result:ClaimEntity = data[0]; this.foundIds.push(id); result.result.accessRights = accessMode; result.result.embargoEndDate = date; diff --git a/sdg/sdg.component.html b/sdg/sdg.component.html index 2bad4bed..1acb5d08 100644 --- a/sdg/sdg.component.html +++ b/sdg/sdg.component.html @@ -18,6 +18,10 @@
We have developed a classification scheme for UN Sustainable Development Goals, to view contributions of research towards complex challenges for humanity such as climate change, biodiversity loss, pollution and poverty reduction. + +
diff --git a/timeout-interceptor.service.ts b/timeout-interceptor.service.ts index 4737ab60..d796a751 100644 --- a/timeout-interceptor.service.ts +++ b/timeout-interceptor.service.ts @@ -9,7 +9,9 @@ export const DEFAULT_TIMEOUT = new InjectionToken('defaultTimeout'); @Injectable() export class TimeoutInterceptor implements HttpInterceptor { - private static TIMEOUT_WHITELIST = [properties.csvAPIURL, properties.registryUrl, properties.claimsAPIURL]; + // timeout inside services for: properties.searchCrossrefAPIURL, properties.searchDataciteAPIURL + private static TIMEOUT_WHITELIST = [properties.csvAPIURL, properties.registryUrl, properties.claimsAPIURL, + properties.searchCrossrefAPIURL, properties.searchDataciteAPIURL]; constructor(@Inject(DEFAULT_TIMEOUT) protected defaultTimeout: number, @Inject(PLATFORM_ID) private platformId: any) { } diff --git a/utils/modal/loading.component.ts b/utils/modal/loading.component.ts index 81c84c23..aafa6789 100644 --- a/utils/modal/loading.component.ts +++ b/utils/modal/loading.component.ts @@ -1,10 +1,21 @@ -import {Component, ViewEncapsulation, ComponentRef, ElementRef, Input, EventEmitter, Output} from '@angular/core'; +import { + Component, + ViewEncapsulation, + ComponentRef, + ElementRef, + Input, + EventEmitter, + Output, + ViewChild +} from '@angular/core'; +declare var UIkit: any; @Component({ selector: 'modal-loading', template: ` - -
+ + +
@@ -23,6 +34,23 @@ import {Component, ViewEncapsulation, ComponentRef, ElementRef, Input, EventEmit
+ + + + + + + + + + + + + + + + +