catch and handle unsuccessful "convert rels to items" responses

This commit is contained in:
Kim Shepherd
2023-06-29 16:09:54 +02:00
parent 884aa07430
commit a35b7d8356

View File

@@ -5,8 +5,7 @@ import { RemoteData } from '../../../../core/data/remote-data';
import { Relationship } from '../../../../core/shared/item-relationships/relationship.model'; import { Relationship } from '../../../../core/shared/item-relationships/relationship.model';
import { Item } from '../../../../core/shared/item.model'; import { Item } from '../../../../core/shared/item.model';
import { import {
getFirstSucceededRemoteDataPayload, getFirstCompletedRemoteData
getFirstSucceededRemoteData
} from '../../../../core/shared/operators'; } from '../../../../core/shared/operators';
import { hasValue } from '../../../../shared/empty.util'; import { hasValue } from '../../../../shared/empty.util';
import { InjectionToken } from '@angular/core'; import { InjectionToken } from '@angular/core';
@@ -77,24 +76,42 @@ export const relationsToItems = (thisId: string) =>
* @param {string} thisId The item's id of which the relations belong to * @param {string} thisId The item's id of which the relations belong to
* @returns {(source: Observable<Relationship[]>) => Observable<Item[]>} * @returns {(source: Observable<Relationship[]>) => Observable<Item[]>}
*/ */
export const paginatedRelationsToItems = (thisId: string) => export const paginatedRelationsToItems = (thisId: string) => (source: Observable<RemoteData<PaginatedList<Relationship>>>): Observable<RemoteData<PaginatedList<Item>>> =>
(source: Observable<RemoteData<PaginatedList<Relationship>>>): Observable<RemoteData<PaginatedList<Item>>> =>
source.pipe( source.pipe(
getFirstSucceededRemoteData(), getFirstCompletedRemoteData(),
switchMap((relationshipsRD: RemoteData<PaginatedList<Relationship>>) => { switchMap((relationshipsRD: RemoteData<PaginatedList<Relationship>>) => {
return observableCombineLatest( return observableCombineLatest(
relationshipsRD.payload.page.map((rel: Relationship) => relationshipsRD.payload.page.map((rel: Relationship) =>
observableCombineLatest([ observableCombineLatest([
rel.leftItem.pipe(getFirstSucceededRemoteDataPayload()), rel.leftItem.pipe(
rel.rightItem.pipe(getFirstSucceededRemoteDataPayload())] getFirstCompletedRemoteData(),
map((rd: RemoteData<Item>) => {
if (rd.hasSucceeded) {
return rd.payload;
} else {
return null;
}
})
),
rel.rightItem.pipe(
getFirstCompletedRemoteData(),
map((rd: RemoteData<Item>) => {
if (rd.hasSucceeded) {
return rd.payload;
} else {
return null;
}
})
),
]
) )
)).pipe( )
).pipe(
map((arr) => map((arr) =>
arr arr.map(([leftItem, rightItem]) => {
.map(([leftItem, rightItem]) => { if (hasValue(leftItem) && leftItem.id === thisId) {
if (leftItem.id === thisId) {
return rightItem; return rightItem;
} else if (rightItem.id === thisId) { } else if (hasValue(rightItem) && rightItem.id === thisId) {
return leftItem; return leftItem;
} }
}) })