refactoring

This commit is contained in:
lotte
2018-09-17 08:47:30 +02:00
parent 6aee6e668c
commit 9da839e318
6 changed files with 17 additions and 65 deletions

View File

@@ -22,6 +22,7 @@ import {
getResponseFromSelflink, getResponseFromSelflink,
filterSuccessfulResponses filterSuccessfulResponses
} from '../../shared/operators'; } from '../../shared/operators';
import { ReplaySubject } from 'rxjs/ReplaySubject';
@Injectable() @Injectable()
export class RemoteDataBuildService { export class RemoteDataBuildService {
@@ -34,6 +35,8 @@ export class RemoteDataBuildService {
if (typeof href$ === 'string') { if (typeof href$ === 'string') {
href$ = Observable.of(href$); href$ = Observable.of(href$);
} }
href$ = href$.multicast(new ReplaySubject(1)).refCount();
const requestHref$ = href$.pipe(flatMap((href: string) => const requestHref$ = href$.pipe(flatMap((href: string) =>
this.objectCache.getRequestHrefBySelfLink(href))); this.objectCache.getRequestHrefBySelfLink(href)));
@@ -112,6 +115,7 @@ export class RemoteDataBuildService {
if (typeof href$ === 'string') { if (typeof href$ === 'string') {
href$ = Observable.of(href$); href$ = Observable.of(href$);
} }
href$ = href$.shareReplay();
const requestEntry$ = href$.pipe(getRequestFromSelflink(this.requestService)); const requestEntry$ = href$.pipe(getRequestFromSelflink(this.requestService));
const responseCache$ = href$.pipe(getResponseFromSelflink(this.responseCache)); const responseCache$ = href$.pipe(getResponseFromSelflink(this.responseCache));

View File

@@ -63,7 +63,6 @@ import { RegistryBitstreamformatsResponseParsingService } from './data/registry-
import { NotificationsService } from '../shared/notifications/notifications.service'; import { NotificationsService } from '../shared/notifications/notifications.service';
import { UploaderService } from '../shared/uploader/uploader.service'; import { UploaderService } from '../shared/uploader/uploader.service';
import { DSpaceObjectDataService } from './data/dspace-object-data.service'; import { DSpaceObjectDataService } from './data/dspace-object-data.service';
import { SingleDsoResponseParsingService } from './data/single-dso-response-parsing.service';
const IMPORTS = [ const IMPORTS = [
CommonModule, CommonModule,
@@ -127,7 +126,6 @@ const PROVIDERS = [
UploaderService, UploaderService,
UUIDService, UUIDService,
DSpaceObjectDataService, DSpaceObjectDataService,
SingleDsoResponseParsingService,
// register AuthInterceptor as HttpInterceptor // register AuthInterceptor as HttpInterceptor
{ {
provide: HTTP_INTERCEPTORS, provide: HTTP_INTERCEPTORS,

View File

@@ -18,20 +18,18 @@ import {
} from './request.models'; } from './request.models';
import { RequestService } from './request.service'; import { RequestService } from './request.service';
import { NormalizedObject } from '../cache/models/normalized-object.model'; 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 { import {
configureRequest, configureRequest,
filterSuccessfulResponses, filterSuccessfulResponses,
getResponseFromSelflink, getSucceededRemoteData getResponseFromSelflink
} from '../shared/operators'; } from '../shared/operators';
import { ResponseCacheEntry } from '../cache/response-cache.reducer'; import { ResponseCacheEntry } from '../cache/response-cache.reducer';
import { HttpOptions } from '../dspace-rest-v2/dspace-rest-v2.service'; import { HttpClient } from '@angular/common/http';
import { HttpClient, HttpEvent, HttpHeaders, HttpRequest } from '@angular/common/http'; import { DSOSuccessResponse, ErrorResponse } from '../cache/response-cache.models';
import { ErrorResponse, GenericSuccessResponse } from '../cache/response-cache.models';
import { AuthService } from '../auth/auth.service'; import { AuthService } from '../auth/auth.service';
import { NotificationsService } from '../../shared/notifications/notifications.service'; import { NotificationsService } from '../../shared/notifications/notifications.service';
import { NotificationOptions } from '../../shared/notifications/models/notification-options.model'; import { NotificationOptions } from '../../shared/notifications/models/notification-options.model';
import { combineLatest } from 'rxjs/observable/combineLatest';
export abstract class DataService<TNormalized extends NormalizedObject, TDomain> { export abstract class DataService<TNormalized extends NormalizedObject, TDomain> {
protected abstract responseCache: ResponseCacheService; protected abstract responseCache: ResponseCacheService;
@@ -118,7 +116,7 @@ export abstract class DataService<TNormalized extends NormalizedObject, TDomain>
return this.rdbService.buildSingle<TNormalized, TDomain>(href); return this.rdbService.buildSingle<TNormalized, TDomain>(href);
} }
public create(dso: TDomain, parentUUID: string): Observable<RemoteData<TDomain>> { create(dso: TDomain, parentUUID: string): Observable<RemoteData<TDomain>> {
const requestId = this.requestService.generateRequestId(); const requestId = this.requestService.generateRequestId();
const endpoint$ = this.halService.getEndpoint(this.linkPath).pipe( const endpoint$ = this.halService.getEndpoint(this.linkPath).pipe(
isNotEmptyOperator(), isNotEmptyOperator(),
@@ -132,7 +130,7 @@ export abstract class DataService<TNormalized extends NormalizedObject, TDomain>
configureRequest(this.requestService) configureRequest(this.requestService)
); );
const payload$ = request$.pipe( const selfLink$ = request$.pipe(
map((request: RestRequest) => request.href), map((request: RestRequest) => request.href),
getResponseFromSelflink(this.responseCache), getResponseFromSelflink(this.responseCache),
map((response: ResponseCacheEntry) => { map((response: ResponseCacheEntry) => {
@@ -144,16 +142,12 @@ export abstract class DataService<TNormalized extends NormalizedObject, TDomain>
}), }),
filterSuccessfulResponses(), filterSuccessfulResponses(),
map((entry: ResponseCacheEntry) => entry.response), map((entry: ResponseCacheEntry) => entry.response),
map((response: GenericSuccessResponse<TDomain>) => response.payload), map((response: DSOSuccessResponse) => {
return response.resourceSelfLinks[0];
}),
distinctUntilChanged() distinctUntilChanged()
); );
return this.rdbService.buildSingle(selfLink$) as Observable<RemoteData<TDomain>>;
const requestEntry$ = this.requestService.getByUUID(requestId);
const responseCache$ = endpoint$.pipe(getResponseFromSelflink(this.responseCache));
return this.rdbService.toRemoteDataObservable(requestEntry$, responseCache$, payload$).pipe(
getSucceededRemoteData()
);
} }
} }

View File

@@ -1,7 +1,5 @@
import { SortOptions } from '../cache/models/sort-options.model'; import { SortOptions } from '../cache/models/sort-options.model';
import { GenericConstructor } from '../shared/generic-constructor'; 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 { BrowseEntriesResponseParsingService } from './browse-entries-response-parsing.service';
import { DSOResponseParsingService } from './dso-response-parsing.service'; import { DSOResponseParsingService } from './dso-response-parsing.service';
import { ResponseParsingService } from './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 { ConfigResponseParsingService } from './config-response-parsing.service';
import { AuthResponseParsingService } from '../auth/auth-response-parsing.service'; import { AuthResponseParsingService } from '../auth/auth-response-parsing.service';
import { HttpOptions } from '../dspace-rest-v2/dspace-rest-v2.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 { IntegrationResponseParsingService } from '../integration/integration-response-parsing.service';
import { SingleDsoResponseParsingService } from './single-dso-response-parsing.service';
/* tslint:disable:max-classes-per-file */ /* tslint:disable:max-classes-per-file */
@@ -231,7 +227,7 @@ export class CreateRequest extends PostRequest {
} }
getResponseParser(): GenericConstructor<ResponseParsingService> { getResponseParser(): GenericConstructor<ResponseParsingService> {
return SingleDsoResponseParsingService; return DSOResponseParsingService;
} }
} }

View File

@@ -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<NormalizedObject,ResourceType>(data.payload, request.href);
if (hasNoValue(processRequestDTO)) {
return new GenericSuccessResponse<DSpaceObject>(undefined, data.statusCode)
}
return new GenericSuccessResponse<DSpaceObject>(processRequestDTO, data.statusCode);
}
}

View File

@@ -1,5 +1,5 @@
import { Observable } from 'rxjs/Observable'; 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 { RequestService } from '../data/request.service';
import { ResponseCacheService } from '../cache/response-cache.service'; import { ResponseCacheService } from '../cache/response-cache.service';
import { GlobalConfig } from '../../../config/global-config.interface'; import { GlobalConfig } from '../../../config/global-config.interface';
@@ -48,7 +48,7 @@ export class HALEndpointService {
let currentPath; let currentPath;
const pipeArguments = path const pipeArguments = path
.map((subPath: string, index: number) => [ .map((subPath: string, index: number) => [
flatMap((href: string) => this.getEndpointMapAt(href)), switchMap((href: string) => this.getEndpointMapAt(href)),
map((endpointMap: EndpointMap) => { map((endpointMap: EndpointMap) => {
if (hasValue(endpointMap) && hasValue(endpointMap[subPath])) { if (hasValue(endpointMap) && hasValue(endpointMap[subPath])) {
currentPath = endpointMap[subPath]; currentPath = endpointMap[subPath];