From 93d3f294d60ce8e38feb1e8811de6b1a2beec88b Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Tue, 26 Jul 2022 17:51:55 +0300 Subject: [PATCH] add base config service --- src/lib/common-ui.module.ts | 25 ++++++++++------ src/lib/services/base-config.service.ts | 38 ++++++++++++++++++++++++ src/lib/services/index.ts | 1 + src/lib/utils/base-app-config.ts | 8 +++++ src/lib/utils/index.ts | 1 + src/lib/utils/types/common-ui-options.ts | 5 ++-- 6 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 src/lib/services/base-config.service.ts create mode 100644 src/lib/utils/base-app-config.ts diff --git a/src/lib/common-ui.module.ts b/src/lib/common-ui.module.ts index 2073435..adbbb00 100644 --- a/src/lib/common-ui.module.ts +++ b/src/lib/common-ui.module.ts @@ -1,4 +1,4 @@ -import { ModuleWithProviders, NgModule, Provider } from '@angular/core'; +import { ModuleWithProviders, NgModule, Provider, Type } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatIconModule } from '@angular/material/icon'; import { TranslateModule } from '@ngx-translate/core'; @@ -34,9 +34,10 @@ import { DragDropFileUploadDirective } from './upload-file/drag-drop-file-upload import { MatProgressBarModule } from '@angular/material/progress-bar'; import { ConfirmationDialogComponent } from './dialog'; import { MatTooltipModule } from '@angular/material/tooltip'; -import { DefaultUserPreferenceService } from './services/default-user-preference.service'; import { CommonUiOptions } from './utils/types/common-ui-options'; import { BaseUserPreferenceService } from './services'; +import { BaseConfigService } from './services/base-config.service'; +import { DefaultUserPreferenceService } from './services/default-user-preference.service'; const matModules = [MatIconModule, MatProgressSpinnerModule, MatButtonModule, MatDialogModule, MatCheckboxModule, MatTooltipModule]; const modules = [ @@ -75,8 +76,14 @@ const pipes = [SortByPipe, HumanizePipe, CapitalizePipe]; exports: [...components, ...pipes, ...modules], }) export class CommonUiModule { - static forRoot(options?: CommonUiOptions): ModuleWithProviders { - const userPreferenceService = this._getUserPreferenceService(options); + static forRoot( + options?: CommonUiOptions, + ): ModuleWithProviders { + const userPreferenceService = this._getService( + BaseUserPreferenceService, + DefaultUserPreferenceService, + options?.existingUserPreferenceService, + ); return { ngModule: CommonUiModule, @@ -84,13 +91,13 @@ export class CommonUiModule { }; } - private static _getUserPreferenceService(options?: CommonUiOptions): Provider { - if (options?.existingUserPreferenceService) { + private static _getService(base: B, _default: Type, existing?: E): Provider { + if (existing) { return { - provide: BaseUserPreferenceService, - useExisting: options.existingUserPreferenceService, + provide: base, + useExisting: existing, }; } - return { provide: BaseUserPreferenceService, useClass: DefaultUserPreferenceService }; + return { provide: base, useClass: _default }; } } diff --git a/src/lib/services/base-config.service.ts b/src/lib/services/base-config.service.ts new file mode 100644 index 0000000..edc96fe --- /dev/null +++ b/src/lib/services/base-config.service.ts @@ -0,0 +1,38 @@ +import { inject } from '@angular/core'; +import { Title } from '@angular/platform-browser'; +import { CacheApiService, wipeAllCaches } from '../caching'; +import { BaseAppConfig } from '../utils'; + +export class BaseConfigService { + protected readonly _cacheApiService = inject(CacheApiService); + protected readonly _titleService = inject(Title); + + constructor(protected _values: T) { + this._checkFrontendVersion(); + } + + get values() { + return this._values; + } + + updateDisplayName(name: string): void { + this._values = { ...this._values, APP_NAME: name ?? this._values.APP_NAME }; + this._titleService.setTitle(this._values.APP_NAME); + } + + private _checkFrontendVersion(): void { + this._cacheApiService.getCachedValue('FRONTEND_APP_VERSION').then(async lastVersion => { + const version = this._values.FRONTEND_APP_VERSION; + console.log('Last app version: ', lastVersion, ' current version ', version); + if (lastVersion !== version) { + console.warn('Version-mismatch - wiping caches!'); + await wipeAllCaches(); + } + await this._cacheApiService.cacheValue('FRONTEND_APP_VERSION', version); + }); + } +} + +export function getConfig() { + return inject(BaseConfigService).values; +} diff --git a/src/lib/services/index.ts b/src/lib/services/index.ts index 8809cd1..0e219ae 100644 --- a/src/lib/services/index.ts +++ b/src/lib/services/index.ts @@ -7,3 +7,4 @@ export * from './stats.service'; export * from './entities-map.service'; export * from './base-user-preference.service'; export * from './language.service'; +export * from './base-config.service'; diff --git a/src/lib/utils/base-app-config.ts b/src/lib/utils/base-app-config.ts new file mode 100644 index 0000000..5929c45 --- /dev/null +++ b/src/lib/utils/base-app-config.ts @@ -0,0 +1,8 @@ +export interface BaseAppConfig { + readonly API_URL: string; + readonly APP_NAME: string; + readonly FRONTEND_APP_VERSION: string; + readonly OAUTH_CLIENT_ID: string; + readonly OAUTH_IDP_HINT: string; + readonly OAUTH_URL: string; +} diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 3bca7be..005e9ab 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -18,3 +18,4 @@ export * from './custom-route-reuse.strategy'; export * from './headers-configuration'; export * from './context.component'; export * from './tokens'; +export * from './base-app-config'; diff --git a/src/lib/utils/types/common-ui-options.ts b/src/lib/utils/types/common-ui-options.ts index 0807715..98bcc6a 100644 --- a/src/lib/utils/types/common-ui-options.ts +++ b/src/lib/utils/types/common-ui-options.ts @@ -1,6 +1,7 @@ +import { BaseConfigService, BaseUserPreferenceService } from '../../services'; import { Type } from '@angular/core'; -import { BaseUserPreferenceService } from '../../services'; -export interface CommonUiOptions { +export interface CommonUiOptions { existingUserPreferenceService: Type; + configServiceFactory: () => C; }