From cdd20751dc8845f45258a033214a6fdf52b1a760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Thu, 18 Nov 2021 21:15:50 +0200 Subject: [PATCH] Check for changes supports mapping --- src/lib/services/generic.service.ts | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/lib/services/generic.service.ts b/src/lib/services/generic.service.ts index ce346b4..f6ae603 100644 --- a/src/lib/services/generic.service.ts +++ b/src/lib/services/generic.service.ts @@ -4,6 +4,8 @@ import { Observable } from 'rxjs'; import { CustomHttpUrlEncodingCodec, HeadersConfiguration, List, RequiredParam, Validate } from '../utils'; import { map, tap } from 'rxjs/operators'; +const ROOT_CHANGES_KEY = 'root'; + export interface HeaderOptions { readonly authorization?: boolean; readonly accept?: boolean; @@ -21,16 +23,10 @@ export interface QueryParam { */ export abstract class GenericService { protected readonly _http = this._injector.get(HttpClient); - private _lastCheckedForChanges = '0'; + private _lastCheckedForChanges = new Map([[ROOT_CHANGES_KEY, '0']]); protected constructor(protected readonly _injector: Injector, protected readonly _defaultModelPath: string) {} - protected get _hasChanges$(): Observable { - return this._post<{ value: boolean }>({ value: this._lastCheckedForChanges }, `${this._defaultModelPath}/changes`).pipe( - map((res: { value: boolean }) => res.value), - ); - } - get(): Observable; // eslint-disable-next-line @typescript-eslint/unified-signatures @@ -51,6 +47,10 @@ export abstract class GenericService { .pipe(tap(() => this._updateLastChanged())); } + getFor(entityId: string, queryParams?: List): Observable { + return this.getAll(`${this._defaultModelPath}/${entityId}`, queryParams).pipe(tap(() => this._updateLastChanged(entityId))); + } + @Validate() delete(@RequiredParam() body: unknown, modelPath = this._defaultModelPath, queryParams?: List): Observable { let path = `/${encodeURI(modelPath)}`; @@ -84,6 +84,14 @@ export abstract class GenericService { }); } + hasChanges$(key = ROOT_CHANGES_KEY): Observable { + const modelPath = key === ROOT_CHANGES_KEY ? '' : `${key}/`; + return this._post<{ value: boolean }>( + { value: this._lastCheckedForChanges.get(key) }, + `${this._defaultModelPath}/${modelPath}changes`, + ).pipe(map((res: { value: boolean }) => res.value)); + } + @Validate() protected _post( @RequiredParam() body: unknown, @@ -136,7 +144,7 @@ export abstract class GenericService { return queryParameters; } - protected _updateLastChanged(): void { - this._lastCheckedForChanges = new Date().toISOString(); + protected _updateLastChanged(key = ROOT_CHANGES_KEY): void { + this._lastCheckedForChanges.set(key, new Date().toISOString()); } }