UNPKG

@granito/ngx-hal-client

Version:

A HAL client to be used in Angular projects

112 lines 13.3 kB
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==