1- import { filter , Observable , switchMap , take } from 'rxjs' ;
1+ import { filter , map , Observable , switchMap , take } from 'rxjs' ;
22
33import { inject , Injectable } from '@angular/core' ;
44
5+ import { Identifier } from '@shared/models' ;
56import { DataciteService } from '@shared/services/datacite/datacite.service' ;
67
78@Injectable ( )
89export abstract class DataciteTrackerComponent {
910 private dataciteService = inject ( DataciteService ) ;
10-
1111 /**
12- * Abstract method to retrieve the DOI (Digital Object Identifier) of the resource.
12+ * Abstract method to retrieve an observable of resource to be tracked.
13+ * This method is generic enough to support all objects that have `identifiers` property.
1314 * Must be implemented by subclasses.
1415 *
15- * @returns An Observable that emits a string DOI or null if unavailable .
16+ * @returns An Observable that emits an item which may contain DOI identifier or null .
1617 */
17- protected abstract getDoi ( ) : Observable < string | null > ;
18+ protected abstract get trackable ( ) : Observable < { identifiers ?: Identifier [ ] } | null > ;
1819
1920 /**
2021 * Sets up a one-time effect to log a "view" event to Datacite for the resource DOI.
@@ -24,7 +25,9 @@ export abstract class DataciteTrackerComponent {
2425 * @returns An Observable that completes after logging the view.
2526 */
2627 protected setupDataciteViewTrackerEffect ( ) : Observable < void > {
27- return this . getDoi ( ) . pipe (
28+ return this . trackable . pipe (
29+ filter ( ( item ) => item != null ) ,
30+ map ( ( item ) => item ?. identifiers ?. find ( ( identifier ) => identifier . category == 'doi' ) ?. value ?? null ) ,
2831 take ( 1 ) ,
2932 filter ( ( doi ) : doi is string => ! ! doi ) ,
3033 switchMap ( ( doi ) => this . dataciteService . logView ( doi ) )
0 commit comments