@granito/ngx-hal-client
Version:
A HAL client to be used in Angular projects
112 lines • 13.3 kB
JavaScript
import { catchError, map, throwError } from 'rxjs';
import { Accessor, HalError, objectFrom } from './internal';
const self = 'self';
/**
* The common base for resource and accessor.
*/
export class HalBase {
/**
* The URI of `self` link.
*/
get self() {
return this._links[self]?.href;
}
/**
* This property is `true` when either `methods` array does not exist
* in the `self` link or the array exists and contains `POST` string.
* It is `false` otherwise.
*/
get canCreate() {
return this.can('POST');
}
/**
* This property is `true` when either `methods` array does not exist
* in the `self` link or the array exists and contains `GET` string.
* It is `false` otherwise.
*/
get canRead() {
return this.can('GET');
}
/**
* This property is `true` when either `methods` array does not exist
* in the `self` link or the array exists and contains `DELETE`
* string. It is `false` otherwise.
*/
get canDelete() {
return this.can('DELETE');
}
/**
* @param obj the object used to assign the properties
*/
constructor(obj) {
this._links = {};
this._embedded = {};
Object.assign(this, obj);
}
/**
* Create a new resource in the collection identified by `self` link.
* It makes a `POST` call to the URI in `self` link and returns an
* observable for the call. The observable normally emits an accessor
* for the newly created resource or `undefined` if `Location` header
* was not returned by the call.
*
* @param obj the payload for the `POST` method call
* @returns an observable of the resource's accessor
*/
create(obj) {
return this.withSelf(self => this._client.post(self, objectFrom(obj), {
observe: 'response'
}).pipe(map(response => response.headers.get('Location') || undefined), map(location => !location ? undefined : this.accessor(location)), catchError(this.handleError)));
}
/**
* Delete the resource identified by `self` link.
*
* @returns an observable that emits next signal on successful delete
*/
delete() {
return this.withSelf(self => this._client.delete(self).pipe(map(() => undefined), catchError(this.handleError)));
}
withSelf(func) {
const self = this.self;
if (!self)
return throwError(() => new HalError({
message: 'no valid "self" relation'
}));
return func(self);
}
accessor(href, methods) {
return this.instanceOf(Accessor, {
_links: {
self: {
href,
methods
}
}
});
}
instanceOf(type, obj) {
return new type({ ...obj, _client: this._client });
}
handleError(err) {
if (err.error instanceof Event)
return throwError(() => new HalError({
message: err.message,
path: err.url
}));
return throwError(() => new HalError({
message: err.message,
status: err.status,
error: err.statusText,
path: err.url,
...err.error
}));
}
can(method) {
const methods = this._links[self]?.methods;
if (!Array.isArray(methods))
return true;
return !!methods.find(m => typeof m === 'string' &&
m.toUpperCase() === method);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFsLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2hhbC1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBYyxVQUFVLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFNUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDO0FBVXBCOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixPQUFPO0lBT3pCOztPQUVHO0lBQ0gsSUFBSSxJQUFJO1FBQ0osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLEdBQVc7UUF6Q0osV0FBTSxHQUFtQyxFQUFFLENBQUM7UUFFNUMsY0FBUyxHQUFxQyxFQUFFLENBQUM7UUF3Q2hFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxNQUFNLENBQUMsR0FBUTtRQUNYLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FDaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFD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Q3BDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgY2F0Y2hFcnJvciwgbWFwLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBY2Nlc3NvciwgSGFsRXJyb3IsIG9iamVjdEZyb20gfSBmcm9tICcuL2ludGVybmFsJztcblxuY29uc3Qgc2VsZiA9ICdzZWxmJztcblxuaW50ZXJmYWNlIExpbmsge1xuICAgIGhyZWY6IHN0cmluZztcblxuICAgIHRlbXBsYXRlZD86IGJvb2xlYW47XG5cbiAgICBtZXRob2RzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIGNvbW1vbiBiYXNlIGZvciByZXNvdXJjZSBhbmQgYWNjZXNzb3IuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBIYWxCYXNlIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2NsaWVudCE6IEh0dHBDbGllbnQ7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2xpbmtzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBMaW5rPj4gPSB7fTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBfZW1iZWRkZWQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIE9iamVjdD4+ID0ge307XG5cbiAgICAvKipcbiAgICAgKiBUaGUgVVJJIG9mIGBzZWxmYCBsaW5rLlxuICAgICAqL1xuICAgIGdldCBzZWxmKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW5rc1tzZWxmXT8uaHJlZjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIHByb3BlcnR5IGlzIGB0cnVlYCB3aGVuIGVpdGhlciBgbWV0aG9kc2AgYXJyYXkgZG9lcyBub3QgZXhpc3RcbiAgICAgKiBpbiB0aGUgYHNlbGZgIGxpbmsgb3IgdGhlIGFycmF5IGV4aXN0cyBhbmQgY29udGFpbnMgYFBPU1RgIHN0cmluZy5cbiAgICAgKiBJdCBpcyBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBnZXQgY2FuQ3JlYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW4oJ1BPU1QnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIHByb3BlcnR5IGlzIGB0cnVlYCB3aGVuIGVpdGhlciBgbWV0aG9kc2AgYXJyYXkgZG9lcyBub3QgZXhpc3RcbiAgICAgKiBpbiB0aGUgYHNlbGZgIGxpbmsgb3IgdGhlIGFycmF5IGV4aXN0cyBhbmQgY29udGFpbnMgYEdFVGAgc3RyaW5nLlxuICAgICAqIEl0IGlzIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGdldCBjYW5SZWFkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW4oJ0dFVCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgcHJvcGVydHkgaXMgYHRydWVgIHdoZW4gZWl0aGVyIGBtZXRob2RzYCBhcnJheSBkb2VzIG5vdCBleGlzdFxuICAgICAqIGluIHRoZSBgc2VsZmAgbGluayBvciB0aGUgYXJyYXkgZXhpc3RzIGFuZCBjb250YWlucyBgREVMRVRFYFxuICAgICAqIHN0cmluZy4gSXQgaXMgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZ2V0IGNhbkRlbGV0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuKCdERUxFVEUnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdXNlZCB0byBhc3NpZ24gdGhlIHByb3BlcnRpZXNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvYmo6IE9iamVjdCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIG9iaik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHJlc291cmNlIGluIHRoZSBjb2xsZWN0aW9uIGlkZW50aWZpZWQgYnkgYHNlbGZgIGxpbmsuXG4gICAgICogSXQgbWFrZXMgYSBgUE9TVGAgY2FsbCB0byB0aGUgVVJJIGluIGBzZWxmYCBsaW5rIGFuZCByZXR1cm5zIGFuXG4gICAgICogb2JzZXJ2YWJsZSBmb3IgdGhlIGNhbGwuIFRoZSBvYnNlcnZhYmxlIG5vcm1hbGx5IGVtaXRzIGFuIGFjY2Vzc29yXG4gICAgICogZm9yIHRoZSBuZXdseSBjcmVhdGVkIHJlc291cmNlIG9yIGB1bmRlZmluZWRgIGlmIGBMb2NhdGlvbmAgaGVhZGVyXG4gICAgICogd2FzIG5vdCByZXR1cm5lZCBieSB0aGUgY2FsbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvYmogdGhlIHBheWxvYWQgZm9yIHRoZSBgUE9TVGAgbWV0aG9kIGNhbGxcbiAgICAgKiBAcmV0dXJucyBhbiBvYnNlcnZhYmxlIG9mIHRoZSByZXNvdXJjZSdzIGFjY2Vzc29yXG4gICAgICovXG4gICAgY3JlYXRlKG9iajogYW55KTogT2JzZXJ2YWJsZTxBY2Nlc3NvciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoU2VsZihcbiAgICAgICAgICAgIHNlbGYgPT4gdGhpcy5fY2xpZW50LnBvc3Qoc2VsZiwgb2JqZWN0RnJvbShvYmopLCB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJ1xuICAgICAgICAgICAgfSkucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzcG9uc2UgPT4gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0xvY2F0aW9uJykgfHwgdW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICBtYXAobG9jYXRpb24gPT4gIWxvY2F0aW9uID8gdW5kZWZpbmVkIDogdGhpcy5hY2Nlc3Nvcihsb2NhdGlvbikpLFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgYHNlbGZgIGxpbmsuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBhbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgbmV4dCBzaWduYWwgb24gc3VjY2Vzc2Z1bCBkZWxldGVcbiAgICAgKi9cbiAgICBkZWxldGUoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhTZWxmKFxuICAgICAgICAgICAgc2VsZiA9PiB0aGlzLl9jbGllbnQuZGVsZXRlKHNlbGYpLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB3aXRoU2VsZjxUPihmdW5jOiAodXJpOiBzdHJpbmcpID0+IE9ic2VydmFibGU8VD4pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXMuc2VsZjtcblxuICAgICAgICBpZiAoIXNlbGYpXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgSGFsRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdubyB2YWxpZCBcInNlbGZcIiByZWxhdGlvbidcbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4gZnVuYyhzZWxmKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYWNjZXNzb3IoaHJlZjogc3RyaW5nLCBtZXRob2RzPzogc3RyaW5nW10pOiBBY2Nlc3NvciB7XG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlT2YoQWNjZXNzb3IsIHtcbiAgICAgICAgICAgIF9saW5rczoge1xuICAgICAgICAgICAgICAgIHNlbGY6IHtcbiAgICAgICAgICAgICAgICAgICAgaHJlZixcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGluc3RhbmNlT2Y8VD4odHlwZTogVHlwZTxUPiwgb2JqOiBPYmplY3QpOiBUIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0eXBlKHsgLi4ub2JqLCBfY2xpZW50OiB0aGlzLl9jbGllbnQgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUVycm9yKGVycjogSHR0cEVycm9yUmVzcG9uc2UpOiBPYnNlcnZhYmxlPG5ldmVyPiB7XG4gICAgICAgIGlmIChlcnIuZXJyb3IgaW5zdGFuY2VvZiBFdmVudClcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBIYWxFcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgcGF0aDogZXJyLnVybFxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBIYWxFcnJvcih7XG4gICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgIHN0YXR1czogZXJyLnN0YXR1cyxcbiAgICAgICAgICAgIGVycm9yOiBlcnIuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgIHBhdGg6IGVyci51cmwsXG4gICAgICAgICAgICAuLi5lcnIuZXJyb3JcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjYW4obWV0aG9kOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbWV0aG9kcyA9IHRoaXMuX2xpbmtzW3NlbGZdPy5tZXRob2RzO1xuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtZXRob2RzKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIHJldHVybiAhIW1ldGhvZHMuZmluZChtID0+IHR5cGVvZiBtID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgbS50b1VwcGVyQ2FzZSgpID09PSBtZXRob2QpO1xuICAgIH1cbn1cbiJdfQ==