diff --git a/src/app/core/cache/builders/remote-data-build.service.ts b/src/app/core/cache/builders/remote-data-build.service.ts index d934f60e48..841a4483ca 100644 --- a/src/app/core/cache/builders/remote-data-build.service.ts +++ b/src/app/core/cache/builders/remote-data-build.service.ts @@ -22,6 +22,7 @@ import { getResponseFromSelflink, filterSuccessfulResponses } from '../../shared/operators'; +import { ReplaySubject } from 'rxjs/ReplaySubject'; @Injectable() export class RemoteDataBuildService { @@ -34,6 +35,8 @@ export class RemoteDataBuildService { if (typeof href$ === 'string') { href$ = Observable.of(href$); } + href$ = href$.multicast(new ReplaySubject(1)).refCount(); + const requestHref$ = href$.pipe(flatMap((href: string) => this.objectCache.getRequestHrefBySelfLink(href))); @@ -112,6 +115,7 @@ export class RemoteDataBuildService { if (typeof href$ === 'string') { href$ = Observable.of(href$); } + href$ = href$.shareReplay(); const requestEntry$ = href$.pipe(getRequestFromSelflink(this.requestService)); const responseCache$ = href$.pipe(getResponseFromSelflink(this.responseCache)); diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 61568b99a6..dabdfba0ab 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -63,7 +63,6 @@ import { RegistryBitstreamformatsResponseParsingService } from './data/registry- import { NotificationsService } from '../shared/notifications/notifications.service'; import { UploaderService } from '../shared/uploader/uploader.service'; import { DSpaceObjectDataService } from './data/dspace-object-data.service'; -import { SingleDsoResponseParsingService } from './data/single-dso-response-parsing.service'; const IMPORTS = [ CommonModule, @@ -127,7 +126,6 @@ const PROVIDERS = [ UploaderService, UUIDService, DSpaceObjectDataService, - SingleDsoResponseParsingService, // register AuthInterceptor as HttpInterceptor { provide: HTTP_INTERCEPTORS, diff --git a/src/app/core/data/data.service.ts b/src/app/core/data/data.service.ts index 0d746816c7..53327952c1 100644 --- a/src/app/core/data/data.service.ts +++ b/src/app/core/data/data.service.ts @@ -18,20 +18,18 @@ import { } from './request.models'; import { RequestService } from './request.service'; import { NormalizedObject } from '../cache/models/normalized-object.model'; -import { distinctUntilChanged, flatMap, map, switchMap, take, withLatestFrom } from 'rxjs/operators'; +import { distinctUntilChanged, first, map, take, tap } from 'rxjs/operators'; import { configureRequest, filterSuccessfulResponses, - getResponseFromSelflink, getSucceededRemoteData + getResponseFromSelflink } from '../shared/operators'; import { ResponseCacheEntry } from '../cache/response-cache.reducer'; -import { HttpOptions } from '../dspace-rest-v2/dspace-rest-v2.service'; -import { HttpClient, HttpEvent, HttpHeaders, HttpRequest } from '@angular/common/http'; -import { ErrorResponse, GenericSuccessResponse } from '../cache/response-cache.models'; +import { HttpClient } from '@angular/common/http'; +import { DSOSuccessResponse, ErrorResponse } from '../cache/response-cache.models'; import { AuthService } from '../auth/auth.service'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { NotificationOptions } from '../../shared/notifications/models/notification-options.model'; -import { combineLatest } from 'rxjs/observable/combineLatest'; export abstract class DataService { protected abstract responseCache: ResponseCacheService; @@ -118,7 +116,7 @@ export abstract class DataService return this.rdbService.buildSingle(href); } - public create(dso: TDomain, parentUUID: string): Observable> { + create(dso: TDomain, parentUUID: string): Observable> { const requestId = this.requestService.generateRequestId(); const endpoint$ = this.halService.getEndpoint(this.linkPath).pipe( isNotEmptyOperator(), @@ -132,7 +130,7 @@ export abstract class DataService configureRequest(this.requestService) ); - const payload$ = request$.pipe( + const selfLink$ = request$.pipe( map((request: RestRequest) => request.href), getResponseFromSelflink(this.responseCache), map((response: ResponseCacheEntry) => { @@ -144,16 +142,12 @@ export abstract class DataService }), filterSuccessfulResponses(), map((entry: ResponseCacheEntry) => entry.response), - map((response: GenericSuccessResponse) => response.payload), + map((response: DSOSuccessResponse) => { + return response.resourceSelfLinks[0]; + }), distinctUntilChanged() ); - - const requestEntry$ = this.requestService.getByUUID(requestId); - const responseCache$ = endpoint$.pipe(getResponseFromSelflink(this.responseCache)); - - return this.rdbService.toRemoteDataObservable(requestEntry$, responseCache$, payload$).pipe( - getSucceededRemoteData() - ); + return this.rdbService.buildSingle(selfLink$) as Observable>; } } diff --git a/src/app/core/data/request.models.ts b/src/app/core/data/request.models.ts index f5b9127a6b..7ca152a204 100644 --- a/src/app/core/data/request.models.ts +++ b/src/app/core/data/request.models.ts @@ -1,7 +1,5 @@ import { SortOptions } from '../cache/models/sort-options.model'; import { GenericConstructor } from '../shared/generic-constructor'; -import { GlobalConfig } from '../../../config/global-config.interface'; -import { RESTURLCombiner } from '../url-combiner/rest-url-combiner'; import { BrowseEntriesResponseParsingService } from './browse-entries-response-parsing.service'; import { DSOResponseParsingService } from './dso-response-parsing.service'; import { ResponseParsingService } from './parsing.service'; @@ -10,9 +8,7 @@ import { BrowseResponseParsingService } from './browse-response-parsing.service' import { ConfigResponseParsingService } from './config-response-parsing.service'; import { AuthResponseParsingService } from '../auth/auth-response-parsing.service'; import { HttpOptions } from '../dspace-rest-v2/dspace-rest-v2.service'; -import { HttpHeaders } from '@angular/common/http'; import { IntegrationResponseParsingService } from '../integration/integration-response-parsing.service'; -import { SingleDsoResponseParsingService } from './single-dso-response-parsing.service'; /* tslint:disable:max-classes-per-file */ @@ -231,7 +227,7 @@ export class CreateRequest extends PostRequest { } getResponseParser(): GenericConstructor { - return SingleDsoResponseParsingService; + return DSOResponseParsingService; } } diff --git a/src/app/core/data/single-dso-response-parsing.service.ts b/src/app/core/data/single-dso-response-parsing.service.ts deleted file mode 100644 index 03b9f5bea2..0000000000 --- a/src/app/core/data/single-dso-response-parsing.service.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Inject, Injectable } from '@angular/core'; -import { ResponseParsingService } from './parsing.service'; -import { BaseResponseParsingService } from './base-response-parsing.service'; -import { GlobalConfig } from '../../../config/global-config.interface'; -import { GLOBAL_CONFIG } from '../../../config'; -import { ObjectCacheService } from '../cache/object-cache.service'; -import { RestRequest } from './request.models'; -import { DSpaceRESTV2Response } from '../dspace-rest-v2/dspace-rest-v2-response.model'; -import { - DSOSuccessResponse, - GenericSuccessResponse, - RestResponse -} from '../cache/response-cache.models'; -import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory'; -import { DSpaceRESTv2Serializer } from '../dspace-rest-v2/dspace-rest-v2.serializer'; -import { DSpaceObject } from '../shared/dspace-object.model'; -import { NormalizedObject } from '../cache/models/normalized-object.model'; -import { ResourceType } from '../shared/resource-type'; -import { hasNoValue, hasValue } from '../../shared/empty.util'; - -@Injectable() -export class SingleDsoResponseParsingService extends BaseResponseParsingService implements ResponseParsingService { - protected objectFactory = NormalizedObjectFactory; - protected toCache = true; - - constructor( - @Inject(GLOBAL_CONFIG) protected EnvConfig: GlobalConfig, - protected objectCache: ObjectCacheService, - ) { super(); - } - - parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse { - const processRequestDTO = this.process(data.payload, request.href); - if (hasNoValue(processRequestDTO)) { - return new GenericSuccessResponse(undefined, data.statusCode) - } - return new GenericSuccessResponse(processRequestDTO, data.statusCode); - } - -} diff --git a/src/app/core/shared/hal-endpoint.service.ts b/src/app/core/shared/hal-endpoint.service.ts index 3bedeb9915..a0be10f454 100644 --- a/src/app/core/shared/hal-endpoint.service.ts +++ b/src/app/core/shared/hal-endpoint.service.ts @@ -1,5 +1,5 @@ import { Observable } from 'rxjs/Observable'; -import { distinctUntilChanged, map, flatMap, startWith, tap } from 'rxjs/operators'; +import { distinctUntilChanged, map, flatMap, startWith, tap, switchMap } from 'rxjs/operators'; import { RequestService } from '../data/request.service'; import { ResponseCacheService } from '../cache/response-cache.service'; import { GlobalConfig } from '../../../config/global-config.interface'; @@ -48,7 +48,7 @@ export class HALEndpointService { let currentPath; const pipeArguments = path .map((subPath: string, index: number) => [ - flatMap((href: string) => this.getEndpointMapAt(href)), + switchMap((href: string) => this.getEndpointMapAt(href)), map((endpointMap: EndpointMap) => { if (hasValue(endpointMap) && hasValue(endpointMap[subPath])) { currentPath = endpointMap[subPath];