mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-14 05:23:06 +00:00
parse page info from rest api and add it to remotedata objects
This commit is contained in:
@@ -26,6 +26,7 @@ export class RemoteDataBuildService {
|
||||
) {
|
||||
}
|
||||
|
||||
//TODO refactor, nearly identical to buildList, only payload differs
|
||||
buildSingle<TNormalized extends CacheableObject, TDomain>(
|
||||
href: string,
|
||||
normalizedType: GenericConstructor<TNormalized>
|
||||
@@ -50,6 +51,12 @@ export class RemoteDataBuildService {
|
||||
.map((entry: ResponseCacheEntry) => entry.response.statusCode)
|
||||
.distinctUntilChanged();
|
||||
|
||||
const pageInfo = responseCacheObs
|
||||
.filter((entry: ResponseCacheEntry) => hasValue(entry)
|
||||
&& hasValue(entry.response) && hasValue(entry.response['pageInfo']))
|
||||
.map((entry: ResponseCacheEntry) => (<SuccessResponse> entry.response).pageInfo)
|
||||
.distinctUntilChanged();
|
||||
|
||||
const payload =
|
||||
Observable.race(
|
||||
this.objectCache.getBySelfLink<TNormalized>(href, normalizedType),
|
||||
@@ -76,10 +83,12 @@ export class RemoteDataBuildService {
|
||||
isSuccessFul,
|
||||
errorMessage,
|
||||
statusCode,
|
||||
pageInfo,
|
||||
payload
|
||||
);
|
||||
}
|
||||
|
||||
//TODO refactor, nearly identical to buildSingle, only payload differs
|
||||
buildList<TNormalized extends CacheableObject, TDomain>(
|
||||
href: string,
|
||||
normalizedType: GenericConstructor<TNormalized>
|
||||
@@ -104,6 +113,12 @@ export class RemoteDataBuildService {
|
||||
.map((entry: ResponseCacheEntry) => entry.response.statusCode)
|
||||
.distinctUntilChanged();
|
||||
|
||||
const pageInfo = responseCacheObs
|
||||
.filter((entry: ResponseCacheEntry) => hasValue(entry)
|
||||
&& hasValue(entry.response) && hasValue(entry.response['pageInfo']))
|
||||
.map((entry: ResponseCacheEntry) => (<SuccessResponse> entry.response).pageInfo)
|
||||
.distinctUntilChanged();
|
||||
|
||||
const payload = responseCacheObs
|
||||
.filter((entry: ResponseCacheEntry) => hasValue(entry) && entry.response.isSuccessful)
|
||||
.map((entry: ResponseCacheEntry) => (<SuccessResponse> entry.response).resourceUUIDs)
|
||||
@@ -124,6 +139,7 @@ export class RemoteDataBuildService {
|
||||
isSuccessFul,
|
||||
errorMessage,
|
||||
statusCode,
|
||||
pageInfo,
|
||||
payload
|
||||
);
|
||||
}
|
||||
@@ -210,6 +226,8 @@ export class RemoteDataBuildService {
|
||||
.join(", ")
|
||||
);
|
||||
|
||||
const pageInfo = Observable.of(undefined);
|
||||
|
||||
const payload = <Observable<T[]>> Observable.combineLatest(
|
||||
...input.map(rd => rd.payload)
|
||||
);
|
||||
@@ -224,6 +242,7 @@ export class RemoteDataBuildService {
|
||||
isSuccessFul,
|
||||
errorMessage,
|
||||
statusCode,
|
||||
pageInfo,
|
||||
payload
|
||||
);
|
||||
}
|
||||
|
5
src/app/core/cache/response-cache.models.ts
vendored
5
src/app/core/cache/response-cache.models.ts
vendored
@@ -1,4 +1,6 @@
|
||||
import { RequestError } from "../data/request.models";
|
||||
import { PageInfo } from "../shared/page-info.model";
|
||||
|
||||
export class Response {
|
||||
constructor(
|
||||
public isSuccessful: boolean,
|
||||
@@ -9,7 +11,8 @@ export class Response {
|
||||
export class SuccessResponse extends Response {
|
||||
constructor(
|
||||
public resourceUUIDs: Array<String>,
|
||||
public statusCode: string
|
||||
public statusCode: string,
|
||||
public pageInfo?: PageInfo
|
||||
) {
|
||||
super(true, statusCode);
|
||||
}
|
||||
|
@@ -1,4 +1,5 @@
|
||||
import { Observable } from "rxjs";
|
||||
import { PageInfo } from "../shared/page-info.model";
|
||||
|
||||
export enum RemoteDataState {
|
||||
RequestPending,
|
||||
@@ -18,6 +19,7 @@ export class RemoteData<T> {
|
||||
private isSuccessFul: Observable<boolean>,
|
||||
public errorMessage: Observable<string>,
|
||||
public statusCode: Observable<string>,
|
||||
public pageInfo: Observable<PageInfo>,
|
||||
public payload: Observable<T>
|
||||
) {
|
||||
}
|
||||
|
@@ -19,6 +19,7 @@ import { RequestService } from "./request.service";
|
||||
import { NormalizedObjectFactory } from "../cache/models/normalized-object-factory";
|
||||
import { ResourceType } from "../shared/resource-type";
|
||||
import { RequestError } from "./request.models";
|
||||
import { PageInfo } from "../shared/page-info.model";
|
||||
|
||||
function isObjectLevel(halObj: any) {
|
||||
return isNotEmpty(halObj._links) && hasValue(halObj._links.self);
|
||||
@@ -48,7 +49,7 @@ export class RequestEffects {
|
||||
})
|
||||
.flatMap((entry: RequestEntry) => {
|
||||
return this.restApi.get(entry.request.href)
|
||||
.map((data: DSpaceRESTV2Response) => new SuccessResponse(this.process(data.payload), data.statusCode))
|
||||
.map((data: DSpaceRESTV2Response) => new SuccessResponse(this.process(data.payload), data.statusCode, this.processPageInfo(data.payload.page)))
|
||||
.do((response: Response) => this.responseCache.add(entry.request.href, response, this.EnvConfig.cache.msToLive))
|
||||
.map((response: Response) => new RequestCompleteAction(entry.request.href))
|
||||
.catch((error: RequestError) => Observable.of(new ErrorResponse(error))
|
||||
@@ -60,7 +61,6 @@ export class RequestEffects {
|
||||
|
||||
if (isNotEmpty(data)) {
|
||||
if (isPaginatedResponse(data)) {
|
||||
//TODO parse page object
|
||||
return this.process(data._embedded);
|
||||
}
|
||||
else if (isObjectLevel(data)) {
|
||||
@@ -138,4 +138,14 @@ export class RequestEffects {
|
||||
}
|
||||
this.objectCache.add(co, this.EnvConfig.cache.msToLive);
|
||||
}
|
||||
|
||||
protected processPageInfo(pageObj: any): PageInfo {
|
||||
if (isNotEmpty(pageObj)) {
|
||||
return new DSpaceRESTv2Serializer(PageInfo).deserialize(pageObj);
|
||||
}
|
||||
else {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -2,6 +2,7 @@ export interface DSpaceRESTV2Response {
|
||||
payload: {
|
||||
_embedded?: any;
|
||||
_links?: any;
|
||||
page?: any;
|
||||
},
|
||||
statusCode: string
|
||||
}
|
||||
|
30
src/app/core/shared/page-info.model.ts
Normal file
30
src/app/core/shared/page-info.model.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import { autoserialize, autoserializeAs } from "cerialize";
|
||||
|
||||
/**
|
||||
* Represents the state of a paginated response
|
||||
*/
|
||||
export class PageInfo {
|
||||
/**
|
||||
* The number of elements on a page
|
||||
*/
|
||||
@autoserializeAs(Number, 'size')
|
||||
elementsPerPage: number;
|
||||
|
||||
/**
|
||||
* The total number of elements in the entire set
|
||||
*/
|
||||
@autoserialize
|
||||
totalElements: number;
|
||||
|
||||
/**
|
||||
* The total number of pages
|
||||
*/
|
||||
@autoserialize
|
||||
totalPages: number;
|
||||
|
||||
/**
|
||||
* The number of the current page, zero-based
|
||||
*/
|
||||
@autoserializeAs(Number, 'number')
|
||||
currentPage: number;
|
||||
}
|
Reference in New Issue
Block a user