Select Git revision
resource.service.ts
resource.service.ts 6.08 KiB
import {
BehaviorSubject,
Observable,
catchError,
combineLatest,
filter,
map,
mergeMap,
of,
startWith,
tap,
throwError,
} from 'rxjs';
import { ResourceServiceConfig } from './resource.model';
import {
StateResource,
createEmptyStateResource,
createErrorStateResource,
createStateResource,
isLoadingRequired,
throwErrorOn,
} from './resource.util';
import { Resource, getUrl, hasLink } from '@ngxp/rest';
import { ResourceRepository } from './resource.repository';
import { isEqual, isNull } from 'lodash-es';
import { isNotNull } from '../tech.util';
import { HttpErrorResponse } from '@angular/common/http';
import { isUnprocessableEntity } from '../http.util';
import { HttpError, ProblemDetail } from '../tech.model';
import { isDevMode } from '@angular/core';
/**
* B = Type of baseresource
* T = Type of the resource which is working on
*/
export class ResourceService<B extends Resource, T extends Resource> {
readonly stateResource: BehaviorSubject<StateResource<T>> = new BehaviorSubject(
createEmptyStateResource(),
);
configResource: B;
constructor(
private config: ResourceServiceConfig<B>,
private repository: ResourceRepository,
) {}
public get(): Observable<StateResource<T>> {
return combineLatest([this.stateResource.asObservable(), this.getConfigResource()]).pipe(
tap(([, configResource]) => this.handleConfigResourceChanged(configResource)),
tap(([, configResource]) => this.handleNullConfigResource(configResource)),
tap(([stateResource, configResource]) =>
this.handleConfigResource(stateResource, configResource),
),
filter(([stateResource]) => !this.shouldFilter(stateResource)),
map(([stateResource]) => stateResource),
startWith(createEmptyStateResource<T>(true)),
);
}
private getConfigResource(): Observable<B> {
return this.config.resource.pipe(
filter((stateResource) => stateResource.loaded && !stateResource.loading),
map((stateResource) => stateResource.resource),
);
}
handleConfigResourceChanged(configResource: B): void {
if (!isEqual(this.configResource, configResource)) {
this.configResource = configResource;