ensure object cache uses responseMsToLive from request

This commit is contained in:
Art Lowel
2019-10-07 15:27:45 +02:00
committed by Michael W Spalti
parent 2475de726f
commit 70a5e271f4
8 changed files with 25 additions and 25 deletions

View File

@@ -25,7 +25,7 @@ export class AuthResponseParsingService extends BaseResponseParsingService imple
parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse { parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse {
if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links) && (data.statusCode === 200)) { if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links) && (data.statusCode === 200)) {
const response = this.process<NormalizedObject<AuthStatus>>(data.payload, request.uuid); const response = this.process<NormalizedObject<AuthStatus>>(data.payload, request);
return new AuthStatusResponse(response, data.statusCode, data.statusText); return new AuthStatusResponse(response, data.statusCode, data.statusText);
} else { } else {
return new AuthStatusResponse(data.payload as NormalizedAuthStatus, data.statusCode, data.statusText); return new AuthStatusResponse(data.payload as NormalizedAuthStatus, data.statusCode, data.statusText);

View File

@@ -24,7 +24,7 @@ export class ConfigResponseParsingService extends BaseResponseParsingService imp
parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse { parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse {
if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links) && (data.statusCode === 201 || data.statusCode === 200)) { if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links) && (data.statusCode === 201 || data.statusCode === 200)) {
const configDefinition = this.process<ConfigObject>(data.payload, request.uuid); const configDefinition = this.process<ConfigObject>(data.payload, request);
return new ConfigSuccessResponse(configDefinition, data.statusCode, data.statusText, this.processPageInfo(data.payload)); return new ConfigSuccessResponse(configDefinition, data.statusCode, data.statusText, this.processPageInfo(data.payload));
} else { } else {
return new ErrorResponse( return new ErrorResponse(

View File

@@ -9,6 +9,7 @@ import { PaginatedList } from './paginated-list';
import { isRestDataObject, isRestPaginatedList } from '../cache/builders/normalized-object-build.service'; import { isRestDataObject, isRestPaginatedList } from '../cache/builders/normalized-object-build.service';
import { ResourceType } from '../shared/resource-type'; import { ResourceType } from '../shared/resource-type';
import { getMapsToType } from '../cache/builders/build-decorators'; import { getMapsToType } from '../cache/builders/build-decorators';
import { RestRequest } from './request.models';
/* tslint:disable:max-classes-per-file */ /* tslint:disable:max-classes-per-file */
export abstract class BaseResponseParsingService { export abstract class BaseResponseParsingService {
@@ -16,14 +17,14 @@ export abstract class BaseResponseParsingService {
protected abstract objectCache: ObjectCacheService; protected abstract objectCache: ObjectCacheService;
protected abstract toCache: boolean; protected abstract toCache: boolean;
protected process<ObjectDomain>(data: any, requestUUID: string): any { protected process<ObjectDomain>(data: any, request: RestRequest): any {
if (isNotEmpty(data)) { if (isNotEmpty(data)) {
if (hasNoValue(data) || (typeof data !== 'object')) { if (hasNoValue(data) || (typeof data !== 'object')) {
return data; return data;
} else if (isRestPaginatedList(data)) { } else if (isRestPaginatedList(data)) {
return this.processPaginatedList(data, requestUUID); return this.processPaginatedList(data, request);
} else if (Array.isArray(data)) { } else if (Array.isArray(data)) {
return this.processArray(data, requestUUID); return this.processArray(data, request);
} else if (isRestDataObject(data)) { } else if (isRestDataObject(data)) {
const object = this.deserialize(data); const object = this.deserialize(data);
if (isNotEmpty(data._embedded)) { if (isNotEmpty(data._embedded)) {
@@ -31,7 +32,7 @@ export abstract class BaseResponseParsingService {
.keys(data._embedded) .keys(data._embedded)
.filter((property) => data._embedded.hasOwnProperty(property)) .filter((property) => data._embedded.hasOwnProperty(property))
.forEach((property) => { .forEach((property) => {
const parsedObj = this.process<ObjectDomain>(data._embedded[property], requestUUID); const parsedObj = this.process<ObjectDomain>(data._embedded[property], request);
if (isNotEmpty(parsedObj)) { if (isNotEmpty(parsedObj)) {
if (isRestPaginatedList(data._embedded[property])) { if (isRestPaginatedList(data._embedded[property])) {
object[property] = parsedObj; object[property] = parsedObj;
@@ -45,7 +46,7 @@ export abstract class BaseResponseParsingService {
}); });
} }
this.cache(object, requestUUID); this.cache(object, request);
return object; return object;
} }
const result = {}; const result = {};
@@ -53,14 +54,14 @@ export abstract class BaseResponseParsingService {
.filter((property) => data.hasOwnProperty(property)) .filter((property) => data.hasOwnProperty(property))
.filter((property) => hasValue(data[property])) .filter((property) => hasValue(data[property]))
.forEach((property) => { .forEach((property) => {
result[property] = this.process(data[property], requestUUID); result[property] = this.process(data[property], request);
}); });
return result; return result;
} }
} }
protected processPaginatedList<ObjectDomain>(data: any, requestUUID: string): PaginatedList<ObjectDomain> { protected processPaginatedList<ObjectDomain>(data: any, request: RestRequest): PaginatedList<ObjectDomain> {
const pageInfo: PageInfo = this.processPageInfo(data); const pageInfo: PageInfo = this.processPageInfo(data);
let list = data._embedded; let list = data._embedded;
@@ -70,14 +71,14 @@ export abstract class BaseResponseParsingService {
} else if (!Array.isArray(list)) { } else if (!Array.isArray(list)) {
list = this.flattenSingleKeyObject(list); list = this.flattenSingleKeyObject(list);
} }
const page: ObjectDomain[] = this.processArray(list, requestUUID); const page: ObjectDomain[] = this.processArray(list, request);
return new PaginatedList<ObjectDomain>(pageInfo, page, ); return new PaginatedList<ObjectDomain>(pageInfo, page, );
} }
protected processArray<ObjectDomain>(data: any, requestUUID: string): ObjectDomain[] { protected processArray<ObjectDomain>(data: any, request: RestRequest): ObjectDomain[] {
let array: ObjectDomain[] = []; let array: ObjectDomain[] = [];
data.forEach((datum) => { data.forEach((datum) => {
array = [...array, this.process(datum, requestUUID)]; array = [...array, this.process(datum, request)];
} }
); );
return array; return array;
@@ -104,17 +105,17 @@ export abstract class BaseResponseParsingService {
} }
} }
protected cache<ObjectDomain>(obj, requestUUID) { protected cache<ObjectDomain>(obj, request: RestRequest) {
if (this.toCache) { if (this.toCache) {
this.addToObjectCache(obj, requestUUID); this.addToObjectCache(obj, request);
} }
} }
protected addToObjectCache(co: CacheableObject, requestUUID: string): void { protected addToObjectCache(co: CacheableObject, request: RestRequest): void {
if (hasNoValue(co) || hasNoValue(co.self)) { if (hasNoValue(co) || hasNoValue(co.self)) {
throw new Error('The server returned an invalid object'); throw new Error('The server returned an invalid object');
} }
this.objectCache.add(co, this.EnvConfig.cache.msToLive.default, requestUUID); this.objectCache.add(co, hasValue(request.responseMsToLive) ? request.responseMsToLive : this.EnvConfig.cache.msToLive.default, request.uuid);
} }
processPageInfo(payload: any): PageInfo { processPageInfo(payload: any): PageInfo {

View File

@@ -30,7 +30,7 @@ export class DSOResponseParsingService extends BaseResponseParsingService implem
if (hasValue(data.payload) && hasValue(data.payload.page) && data.payload.page.totalElements === 0) { if (hasValue(data.payload) && hasValue(data.payload.page) && data.payload.page.totalElements === 0) {
processRequestDTO = { page: [] }; processRequestDTO = { page: [] };
} else { } else {
processRequestDTO = this.process<NormalizedObject<DSpaceObject>>(data.payload, request.uuid); processRequestDTO = this.process<NormalizedObject<DSpaceObject>>(data.payload, request);
} }
let objectList = processRequestDTO; let objectList = processRequestDTO;

View File

@@ -148,8 +148,7 @@ export class RequestService {
*/ */
configure<T extends CacheableObject>(request: RestRequest): void { configure<T extends CacheableObject>(request: RestRequest): void {
const isGetRequest = request.method === RestRequestMethod.GET; const isGetRequest = request.method === RestRequestMethod.GET;
const isSubmission = request instanceof SubmissionRequest; if (!isGetRequest || !this.isCachedOrPending(request)) {
if (!isGetRequest || !this.isCachedOrPending(request) || isSubmission) {
this.dispatchRequest(request); this.dispatchRequest(request);
if (isGetRequest) { if (isGetRequest) {
this.trackRequestsOnTheirWayToTheStore(request); this.trackRequestsOnTheirWayToTheStore(request);

View File

@@ -28,7 +28,7 @@ export class EpersonResponseParsingService extends BaseResponseParsingService im
parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse { parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse {
if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links)) { if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links)) {
const epersonDefinition = this.process<DSpaceObject>(data.payload, request.href); const epersonDefinition = this.process<DSpaceObject>(data.payload, request);
return new EpersonSuccessResponse(epersonDefinition[Object.keys(epersonDefinition)[0]], data.statusCode, data.statusText, this.processPageInfo(data.payload)); return new EpersonSuccessResponse(epersonDefinition[Object.keys(epersonDefinition)[0]], data.statusCode, data.statusText, this.processPageInfo(data.payload));
} else { } else {
return new ErrorResponse( return new ErrorResponse(

View File

@@ -27,7 +27,7 @@ export class IntegrationResponseParsingService extends BaseResponseParsingServic
parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse { parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse {
if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links)) { if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links)) {
const dataDefinition = this.process<IntegrationModel>(data.payload, request.uuid); const dataDefinition = this.process<IntegrationModel>(data.payload, request);
return new IntegrationSuccessResponse(this.processResponse(dataDefinition), data.statusCode, data.statusText, this.processPageInfo(data.payload)); return new IntegrationSuccessResponse(this.processResponse(dataDefinition), data.statusCode, data.statusText, this.processPageInfo(data.payload));
} else { } else {
return new ErrorResponse( return new ErrorResponse(

View File

@@ -91,7 +91,7 @@ export class SubmissionResponseParsingService extends BaseResponseParsingService
if (isNotEmpty(data.payload) if (isNotEmpty(data.payload)
&& isNotEmpty(data.payload._links) && isNotEmpty(data.payload._links)
&& this.isSuccessStatus(data.statusCode)) { && this.isSuccessStatus(data.statusCode)) {
const dataDefinition = this.processResponse<SubmissionObject | ConfigObject>(data.payload, request.href); const dataDefinition = this.processResponse<SubmissionObject | ConfigObject>(data.payload, request);
return new SubmissionSuccessResponse(dataDefinition, data.statusCode, data.statusText, this.processPageInfo(data.payload)); return new SubmissionSuccessResponse(dataDefinition, data.statusCode, data.statusText, this.processPageInfo(data.payload));
} else if (isEmpty(data.payload) && this.isSuccessStatus(data.statusCode)) { } else if (isEmpty(data.payload) && this.isSuccessStatus(data.statusCode)) {
return new SubmissionSuccessResponse(null, data.statusCode, data.statusText); return new SubmissionSuccessResponse(null, data.statusCode, data.statusText);
@@ -109,11 +109,11 @@ export class SubmissionResponseParsingService extends BaseResponseParsingService
* Parses response and normalize it * Parses response and normalize it
* *
* @param {DSpaceRESTV2Response} data * @param {DSpaceRESTV2Response} data
* @param {string} requestHref * @param {RestRequest} request
* @returns {any[]} * @returns {any[]}
*/ */
protected processResponse<ObjectDomain>(data: any, requestHref: string): any[] { protected processResponse<ObjectDomain>(data: any, request: RestRequest): any[] {
const dataDefinition = this.process<ObjectDomain>(data, requestHref); const dataDefinition = this.process<ObjectDomain>(data, request);
const normalizedDefinition = Array.of(); const normalizedDefinition = Array.of();
const processedList = Array.isArray(dataDefinition) ? dataDefinition : Array.of(dataDefinition); const processedList = Array.isArray(dataDefinition) ? dataDefinition : Array.of(dataDefinition);