hal-4-angular
Version:
This Angular module offers a HAL/JSON http-client to easily interact with a Spring Data Rest API or any API that implements the Spring Data Rest resource model
240 lines (207 loc) • 9.21 kB
text/typescript
import {of as observableOf, throwError as observableThrowError} from 'rxjs';
import {map, mergeMap} from 'rxjs/operators';
import {Resource} from './resource';
import {ResourceArray} from './resource-array';
import {Sort} from './sort';
import {ResourceService} from './resource.service';
import {SubTypeBuilder} from './subtype-builder';
import {isNullOrUndefined} from 'util';
import {Observable} from 'rxjs/internal/Observable';
import {Injector} from "@angular/core";
import {HttpResponse} from '@angular/common/http';
export type HalParam = { key: string, value: string | number | boolean };
export type HalOptions = { notPaged?: boolean, size?: number, sort?: Sort[], params?: HalParam[] };
export class RestService<T extends Resource> {
private type: any;
private resource: string;
public resourceArray: ResourceArray<T>;
private resourceService: ResourceService;
private _embedded: string = '_embedded';
constructor(type: { new(): T },
resource: string,
private injector: Injector,
_embedded?: string) {
this.type = type;
this.resource = resource;
this.resourceService = injector.get(ResourceService);
if (!isNullOrUndefined(_embedded))
this._embedded = _embedded;
}
protected handleError(error: any):Observable<never> {
return RestService.handleError(error);
}
protected static handleError(error: any):Observable<never> {
return observableThrowError(error);
}
public getAll(options?: HalOptions, subType?: SubTypeBuilder): Observable<T[]> {
return this.resourceService.getAll(this.type, this.resource, this._embedded, options, subType).pipe(
mergeMap((resourceArray: ResourceArray<T>) => {
if (options && options.notPaged && !isNullOrUndefined(resourceArray.first_uri)) {
options.notPaged = false;
options.size = resourceArray.totalElements;
return this.getAll(options);
} else {
this.resourceArray = resourceArray;
return observableOf(resourceArray.result);
}
}));
}
public get(id: any, params?: HalParam[]): Observable<T> {
return this.resourceService.get(this.type, this.resource, id, params);
}
public selfURI(id: any): string {
return this.resourceService.selfURI(this.type, this.resource, id);
}
public getBySelfLink(selfLink: string): Observable<T> {
return this.resourceService.getBySelfLink(this.type, selfLink);
}
public search(query: string, options?: HalOptions, subType?: SubTypeBuilder): Observable<T[]> {
return this.resourceService.search(this.type, query, this.resource, this._embedded, options, subType).pipe(
mergeMap((resourceArray: ResourceArray<T>) => {
if (options && options.notPaged && !isNullOrUndefined(resourceArray.first_uri)) {
options.notPaged = false;
options.size = resourceArray.totalElements;
return this.search(query, options, subType);
} else {
this.resourceArray = resourceArray;
return observableOf(resourceArray.result);
}
}));
}
public query(query: string, options?: HalOptions): Observable<any> {
return this.resourceService.query(this.resource, query, options);
}
public searchSingle(query: string, options?: HalOptions): Observable<T> {
return this.resourceService.searchSingle(this.type, query, this.resource, options);
}
public customQuery(query: string, options?: HalOptions): Observable<T[]> {
return this.resourceService.customQuery(this.type, query, this.resource, this._embedded, options).pipe(
mergeMap((resourceArray: ResourceArray<T>) => {
if (options && options.notPaged && !isNullOrUndefined(resourceArray.first_uri)) {
options.notPaged = false;
options.size = resourceArray.totalElements;
return this.customQuery(query, options);
} else {
this.resourceArray = resourceArray;
return observableOf(resourceArray.result);
}
}));
}
public customQueryPost(query: string, options?: HalOptions, body?: any): Observable<T[]> {
return this.resourceService.customQueryPost(this.type, query, this.resource, this._embedded, options, body).pipe(
mergeMap((resourceArray: ResourceArray<T>) => {
if (options && options.notPaged && !isNullOrUndefined(resourceArray.first_uri)) {
options.notPaged = false;
options.size = resourceArray.totalElements;
return this.customQueryPost(query, options, body);
} else {
this.resourceArray = resourceArray;
return observableOf(resourceArray.result);
}
}));
}
public getByRelationArray(relation: string, builder?: SubTypeBuilder): Observable<T[]> {
return this.resourceService.getByRelationArray(this.type, relation, this._embedded, builder).pipe(
map((resourceArray: ResourceArray<T>) => {
this.resourceArray = resourceArray;
return resourceArray.result;
}));
}
public getByRelation(relation: string): Observable<T> {
return this.resourceService.getByRelation(this.type, relation);
}
public count(): Observable<number> {
return this.resourceService.count(this.resource);
}
public create(entity: T) {
return this.resourceService.create(this.resource, entity);
}
public update(entity: T) {
return this.resourceService.update(entity);
}
public patch(entity: T) {
return this.resourceService.patch(entity);
}
public delete(entity: T): Observable<Object> {
return this.resourceService.delete(entity);
}
public totalElement(): number {
if (this.resourceArray && this.resourceArray.totalElements)
return this.resourceArray.totalElements;
return 0;
}
public hasFirst(): boolean {
if (this.resourceArray)
return this.resourceService.hasFirst(this.resourceArray);
return false;
}
public hasNext(): boolean {
if (this.resourceArray)
return this.resourceService.hasNext(this.resourceArray);
return false;
}
public hasPrev(): boolean {
if (this.resourceArray)
return this.resourceService.hasPrev(this.resourceArray);
return false;
}
public hasLast(): boolean {
if (this.resourceArray)
return this.resourceService.hasLast(this.resourceArray);
return false;
}
public next(): Observable<T[]> {
if (this.resourceArray)
return this.resourceService.next(this.resourceArray, this.type).pipe(
map((resourceArray: ResourceArray<T>) => {
this.resourceArray = resourceArray;
return resourceArray.result;
}));
else
observableThrowError('no resourceArray found');
}
public prev(): Observable<T[]> {
if (this.resourceArray)
return this.resourceService.prev(this.resourceArray, this.type).pipe(
map((resourceArray: ResourceArray<T>) => {
this.resourceArray = resourceArray;
return resourceArray.result;
}));
else
observableThrowError('no resourceArray found');
}
public first(): Observable<T[]> {
if (this.resourceArray)
return this.resourceService.first(this.resourceArray, this.type)
.pipe(
map((resourceArray: ResourceArray<T>) => {
this.resourceArray = resourceArray;
return resourceArray.result;
})
);
else
observableThrowError('no resourceArray found');
}
public last(): Observable<T[]> {
if (this.resourceArray)
return this.resourceService.last(this.resourceArray, this.type)
.pipe(
map((resourceArray: ResourceArray<T>) => {
this.resourceArray = resourceArray;
return resourceArray.result;
})
);
else
observableThrowError('no resourceArray found');
}
public page(pageNumber: number): Observable<T[]> {
if (this.resourceArray)
return this.resourceService.page(this.resourceArray, this.type, pageNumber).pipe(
map((resourceArray: ResourceArray<T>) => {
this.resourceArray = resourceArray;
return resourceArray.result;
}));
else
observableThrowError('no resourceArray found');
}
}