forked from hazza/dspace-angular
Cache redesign part 1, and add support for alternative links
This commit is contained in:
@@ -1,28 +1,25 @@
|
||||
import { Inject, Injectable, Injector } from '@angular/core';
|
||||
import { Injectable, Injector } from '@angular/core';
|
||||
import { Actions, Effect, ofType } from '@ngrx/effects';
|
||||
import { Observable, of as observableOf } from 'rxjs';
|
||||
import { catchError, filter, flatMap, map, take } from 'rxjs/operators';
|
||||
|
||||
import { hasValue, isNotEmpty } from '../../shared/empty.util';
|
||||
import { StoreActionTypes } from '../../store.actions';
|
||||
import { getClassForType } from '../cache/builders/build-decorators';
|
||||
import { ErrorResponse, RestResponse } from '../cache/response.models';
|
||||
import { DSpaceRESTV2Response } from '../dspace-rest-v2/dspace-rest-v2-response.model';
|
||||
import { RawRestResponse } from '../dspace-rest/raw-rest-response.model';
|
||||
|
||||
import { DSpaceRESTv2Service } from '../dspace-rest-v2/dspace-rest-v2.service';
|
||||
import { DSpaceSerializer } from '../dspace-rest-v2/dspace.serializer';
|
||||
import { RequestActionTypes, RequestCompleteAction, RequestExecuteAction, ResetResponseTimestampsAction } from './request.actions';
|
||||
import { DspaceRestService } from '../dspace-rest/dspace-rest.service';
|
||||
import { DSpaceSerializer } from '../dspace-rest/dspace.serializer';
|
||||
import {
|
||||
RequestActionTypes,
|
||||
RequestExecuteAction,
|
||||
ResetResponseTimestampsAction,
|
||||
RequestSuccessAction,
|
||||
RequestErrorAction
|
||||
} from './request.actions';
|
||||
import { RequestError, RestRequest } from './request.models';
|
||||
import { RequestEntry } from './request.reducer';
|
||||
import { RequestService } from './request.service';
|
||||
|
||||
export const addToResponseCacheAndCompleteAction = (request: RestRequest) =>
|
||||
(source: Observable<RestResponse>): Observable<RequestCompleteAction> =>
|
||||
source.pipe(
|
||||
map((response: RestResponse) => {
|
||||
return new RequestCompleteAction(request.uuid, response);
|
||||
})
|
||||
);
|
||||
import { ParsedResponse } from '../cache/response.models';
|
||||
|
||||
@Injectable()
|
||||
export class RequestEffects {
|
||||
@@ -43,11 +40,17 @@ export class RequestEffects {
|
||||
body = serializer.serialize(request.body);
|
||||
}
|
||||
return this.restApi.request(request.method, request.href, body, request.options, request.isMultipart).pipe(
|
||||
map((data: DSpaceRESTV2Response) => this.injector.get(request.getResponseParser()).parse(request, data)),
|
||||
addToResponseCacheAndCompleteAction(request),
|
||||
catchError((error: RequestError) => observableOf(new ErrorResponse(error)).pipe(
|
||||
addToResponseCacheAndCompleteAction(request)
|
||||
))
|
||||
map((data: RawRestResponse) => this.injector.get(request.getResponseParser()).parse(request, data)),
|
||||
map((response: ParsedResponse) => new RequestSuccessAction(request.uuid, response.statusCode, response.link, response.unCacheableObject)),
|
||||
catchError((error: RequestError) => {
|
||||
if (hasValue(error.statusCode)) {
|
||||
// if it's an error returned by the server, complete the request
|
||||
return [new RequestErrorAction(request.uuid, error.statusCode, error.message)];
|
||||
} else {
|
||||
// if it's a client side error, throw it
|
||||
throw error;
|
||||
}
|
||||
})
|
||||
);
|
||||
})
|
||||
);
|
||||
@@ -67,10 +70,9 @@ export class RequestEffects {
|
||||
|
||||
constructor(
|
||||
private actions$: Actions,
|
||||
private restApi: DSpaceRESTv2Service,
|
||||
private restApi: DspaceRestService,
|
||||
private injector: Injector,
|
||||
protected requestService: RequestService
|
||||
) { }
|
||||
|
||||
}
|
||||
/* tslint:enable:max-classes-per-file */
|
||||
|
Reference in New Issue
Block a user