Clean up VersionHistoryDataService changes

This commit is contained in:
Yury Bondarenko
2024-02-07 10:01:39 +01:00
parent 9960b93f58
commit 9f39358efb

View File

@@ -6,23 +6,21 @@ import { ObjectCacheService } from '../cache/object-cache.service';
import { HALEndpointService } from '../shared/hal-endpoint.service'; import { HALEndpointService } from '../shared/hal-endpoint.service';
import { HttpHeaders } from '@angular/common/http'; import { HttpHeaders } from '@angular/common/http';
import { PostRequest } from './request.models'; import { PostRequest } from './request.models';
import { Observable, of } from 'rxjs'; import { combineLatest, Observable, of as observableOf } from 'rxjs';
import { PaginatedSearchOptions } from '../../shared/search/models/paginated-search-options.model'; import { PaginatedSearchOptions } from '../../shared/search/models/paginated-search-options.model';
import { RemoteData } from './remote-data'; import { RemoteData } from './remote-data';
import { PaginatedList } from './paginated-list.model'; import { PaginatedList } from './paginated-list.model';
import { Version } from '../shared/version.model'; import { Version } from '../shared/version.model';
import { filter, map, switchMap, take } from 'rxjs/operators'; import { filter, find, map, switchMap, take } from 'rxjs/operators';
import { VERSION_HISTORY } from '../shared/version-history.resource-type'; import { VERSION_HISTORY } from '../shared/version-history.resource-type';
import { followLink, FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { followLink, FollowLinkConfig } from '../../shared/utils/follow-link-config.model';
import { VersionDataService } from './version-data.service'; import { VersionDataService } from './version-data.service';
import { HttpOptions } from '../dspace-rest/dspace-rest.service'; import { HttpOptions } from '../dspace-rest/dspace-rest.service';
import { getAllSucceededRemoteData, getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload, getRemoteDataPayload } from '../shared/operators'; import { getAllSucceededRemoteData, getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload, getRemoteDataPayload } from '../shared/operators';
import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model';
import { hasValueOperator } from '../../shared/empty.util'; import { hasValue, hasValueOperator } from '../../shared/empty.util';
import { Item } from '../shared/item.model'; import { Item } from '../shared/item.model';
import { FindListOptions } from './find-list-options.model'; import { FindListOptions } from './find-list-options.model';
import { sendRequest } from '../shared/request.operators';
import { RestRequest } from './rest-request.model';
import { IdentifiableDataService } from './base/identifiable-data.service'; import { IdentifiableDataService } from './base/identifiable-data.service';
import { dataService } from './base/data-service.decorator'; import { dataService } from './base/data-service.decorator';
@@ -86,29 +84,31 @@ export class VersionHistoryDataService extends IdentifiableDataService<VersionHi
* @param summary the summary of the new version * @param summary the summary of the new version
*/ */
createVersion(itemHref: string, summary: string): Observable<RemoteData<Version>> { createVersion(itemHref: string, summary: string): Observable<RemoteData<Version>> {
const requestId = this.requestService.generateRequestId();
const requestOptions: HttpOptions = Object.create({}); const requestOptions: HttpOptions = Object.create({});
let requestHeaders = new HttpHeaders(); let requestHeaders = new HttpHeaders();
requestHeaders = requestHeaders.append('Content-Type', 'text/uri-list'); requestHeaders = requestHeaders.append('Content-Type', 'text/uri-list');
requestOptions.headers = requestHeaders; requestOptions.headers = requestHeaders;
const response$ = this.halService.getEndpoint(this.versionsEndpoint).pipe( this.halService.getEndpoint(this.versionsEndpoint).pipe(
take(1), take(1),
map((endpointUrl: string) => (summary?.length > 0) ? `${endpointUrl}?summary=${summary}` : `${endpointUrl}`), map((endpointUrl: string) => (summary?.length > 0) ? `${endpointUrl}?summary=${summary}` : `${endpointUrl}`),
map((endpointURL: string) => new PostRequest(this.requestService.generateRequestId(), endpointURL, itemHref, requestOptions)), find((href: string) => hasValue(href)),
sendRequest(this.requestService), ).subscribe((href) => {
switchMap((restRequest: RestRequest) => this.rdbService.buildFromRequestUUID(restRequest.uuid)), const request = new PostRequest(requestId, href, itemHref, requestOptions);
getFirstCompletedRemoteData() if (hasValue(this.responseMsToLive)) {
) as Observable<RemoteData<Version>>; request.responseMsToLive = this.responseMsToLive;
}
response$.subscribe((versionRD: RemoteData<Version>) => { this.requestService.send(request);
// invalidate version history
// note: we should do this regardless of whether the request succeeds,
// because it may have failed due to cached data that is out of date
this.requestService.setStaleByHrefSubstring(versionRD.payload._links.self.href);
this.requestService.setStaleByHrefSubstring(versionRD.payload._links.versionhistory.href);
}); });
return response$; return this.rdbService.buildFromRequestUUIDAndAwait<Version>(requestId, (versionRD) => combineLatest([
this.requestService.setStaleByHrefSubstring(versionRD.payload._links.self.href),
this.requestService.setStaleByHrefSubstring(versionRD.payload._links.versionhistory.href),
])).pipe(
getFirstCompletedRemoteData(),
);
} }
/** /**
@@ -147,7 +147,7 @@ export class VersionHistoryDataService extends IdentifiableDataService<VersionHi
switchMap((res) => res.versionhistory), switchMap((res) => res.versionhistory),
getFirstSucceededRemoteDataPayload(), getFirstSucceededRemoteDataPayload(),
switchMap((versionHistoryRD) => this.getLatestVersionFromHistory$(versionHistoryRD)), switchMap((versionHistoryRD) => this.getLatestVersionFromHistory$(versionHistoryRD)),
) : of(null); ) : observableOf(null);
} }
/** /**
@@ -158,8 +158,8 @@ export class VersionHistoryDataService extends IdentifiableDataService<VersionHi
isLatest$(version: Version): Observable<boolean> { isLatest$(version: Version): Observable<boolean> {
return version ? this.getLatestVersion$(version).pipe( return version ? this.getLatestVersion$(version).pipe(
take(1), take(1),
switchMap((latestVersion) => of(version.version === latestVersion.version)) switchMap((latestVersion) => observableOf(version.version === latestVersion.version))
) : of(null); ) : observableOf(null);
} }
/** /**
@@ -170,21 +170,20 @@ export class VersionHistoryDataService extends IdentifiableDataService<VersionHi
hasDraftVersion$(versionHref: string): Observable<boolean> { hasDraftVersion$(versionHref: string): Observable<boolean> {
return this.versionDataService.findByHref(versionHref, false, true, followLink('versionhistory')).pipe( return this.versionDataService.findByHref(versionHref, false, true, followLink('versionhistory')).pipe(
getFirstCompletedRemoteData(), getFirstCompletedRemoteData(),
switchMap((res) => { switchMap((versionRD: RemoteData<Version>) => {
if (res.hasSucceeded && !res.hasNoContent) { if (versionRD.hasSucceeded && !versionRD.hasNoContent) {
return res.payload.versionhistory.pipe( return versionRD.payload.versionhistory.pipe(
getFirstCompletedRemoteData(), getFirstCompletedRemoteData(),
map((versionHistoryRD) => { map((versionHistoryRD: RemoteData<VersionHistory>) => {
if (res.hasSucceeded) { if (versionHistoryRD.hasSucceeded && !versionHistoryRD.hasNoContent) {
const versionHistory = versionHistoryRD.payload; return versionHistoryRD.payload.draftVersion;
return versionHistory ? versionHistory.draftVersion : false;
} else { } else {
return false; return false;
} }
}), }),
); );
} else { } else {
return of(false); return observableOf(false);
} }
}), }),
); );