mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 10:04:11 +00:00
79768: Extract download route method for Bundles with multiple Bitstreams
This commit is contained in:
@@ -327,53 +327,7 @@ export class MetadataService {
|
|||||||
return [getBitstreamDownloadRoute(bitstreamRd.payload.page[0])];
|
return [getBitstreamDownloadRoute(bitstreamRd.payload.page[0])];
|
||||||
} else {
|
} else {
|
||||||
// Otherwise check all bitstreams to see if one matches the format whitelist
|
// Otherwise check all bitstreams to see if one matches the format whitelist
|
||||||
return observableOf(bitstreamRd.payload).pipe(
|
return this.getBitstreamDownloadRoute(bitstreamRd);
|
||||||
// Because there can be more than one page of bitstreams, this expand operator
|
|
||||||
// will retrieve them in turn due to the take(1) at the bottom, it will only
|
|
||||||
// retrieve pages until a match is found
|
|
||||||
expand((paginatedList: PaginatedList<Bitstream>) => {
|
|
||||||
if (hasNoValue(paginatedList.next)) {
|
|
||||||
// If there's no next page, stop.
|
|
||||||
return EMPTY;
|
|
||||||
} else {
|
|
||||||
// Otherwise retrieve the next page
|
|
||||||
return this.bitstreamDataService.findAllByHref(
|
|
||||||
paginatedList.next,
|
|
||||||
undefined,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
followLink('format')
|
|
||||||
).pipe(
|
|
||||||
getFirstCompletedRemoteData(),
|
|
||||||
map((next: RemoteData<PaginatedList<Bitstream>>) => {
|
|
||||||
if (hasValue(next.payload)) {
|
|
||||||
return next.payload;
|
|
||||||
} else {
|
|
||||||
return EMPTY;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
// Return the array of bitstreams inside each paginated list
|
|
||||||
map((paginatedList: PaginatedList<Bitstream>) => paginatedList.page),
|
|
||||||
// Emit the bitstreams in the list one at a time
|
|
||||||
switchMap((bitstreams: Bitstream[]) => bitstreams),
|
|
||||||
// Retrieve the format for each bitstream
|
|
||||||
switchMap((bitstream: Bitstream) => bitstream.format.pipe(
|
|
||||||
getFirstSucceededRemoteDataPayload(),
|
|
||||||
// Keep the original bitstream, because it, not the format, is what we'll need
|
|
||||||
// for the link at the end
|
|
||||||
map((format: BitstreamFormat) => [bitstream, format])
|
|
||||||
)),
|
|
||||||
// Filter out only pairs with whitelisted formats
|
|
||||||
filter(([, format]: [Bitstream, BitstreamFormat]) =>
|
|
||||||
hasValue(format) && format.mimetype === 'application/pdf'), // TODO change to check map of mimetypes
|
|
||||||
// We only need 1
|
|
||||||
take(1),
|
|
||||||
// Emit the link of the match
|
|
||||||
map(([bitstream, ]: [Bitstream, BitstreamFormat]) => getBitstreamDownloadRoute(bitstream))
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
@@ -387,6 +341,56 @@ export class MetadataService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private getBitstreamDownloadRoute(bitstreamRd: RemoteData<PaginatedList<Bitstream>>): Observable<string> {
|
||||||
|
return observableOf(bitstreamRd.payload).pipe(
|
||||||
|
// Because there can be more than one page of bitstreams, this expand operator
|
||||||
|
// will retrieve them in turn due to the take(1) at the bottom, it will only
|
||||||
|
// retrieve pages until a match is found
|
||||||
|
expand((paginatedList: PaginatedList<Bitstream>) => {
|
||||||
|
if (hasNoValue(paginatedList.next)) {
|
||||||
|
// If there's no next page, stop.
|
||||||
|
return EMPTY;
|
||||||
|
} else {
|
||||||
|
// Otherwise retrieve the next page
|
||||||
|
return this.bitstreamDataService.findAllByHref(
|
||||||
|
paginatedList.next,
|
||||||
|
undefined,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
followLink('format')
|
||||||
|
).pipe(
|
||||||
|
getFirstCompletedRemoteData(),
|
||||||
|
map((next: RemoteData<PaginatedList<Bitstream>>) => {
|
||||||
|
if (hasValue(next.payload)) {
|
||||||
|
return next.payload;
|
||||||
|
} else {
|
||||||
|
return EMPTY;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
// Return the array of bitstreams inside each paginated list
|
||||||
|
map((paginatedList: PaginatedList<Bitstream>) => paginatedList.page),
|
||||||
|
// Emit the bitstreams in the list one at a time
|
||||||
|
switchMap((bitstreams: Bitstream[]) => bitstreams),
|
||||||
|
// Retrieve the format for each bitstream
|
||||||
|
switchMap((bitstream: Bitstream) => bitstream.format.pipe(
|
||||||
|
getFirstSucceededRemoteDataPayload(),
|
||||||
|
// Keep the original bitstream, because it, not the format, is what we'll need
|
||||||
|
// for the link at the end
|
||||||
|
map((format: BitstreamFormat) => [bitstream, format])
|
||||||
|
)),
|
||||||
|
// Filter out only pairs with whitelisted formats
|
||||||
|
filter(([, format]: [Bitstream, BitstreamFormat]) =>
|
||||||
|
hasValue(format) && format.mimetype === 'application/pdf'), // TODO change to check map of mimetypes
|
||||||
|
// We only need 1
|
||||||
|
take(1),
|
||||||
|
// Emit the link of the match
|
||||||
|
map(([bitstream, ]: [Bitstream, BitstreamFormat]) => getBitstreamDownloadRoute(bitstream))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add <meta name="Generator" ... > to the <head> containing the current DSpace version
|
* Add <meta name="Generator" ... > to the <head> containing the current DSpace version
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user