From 6dfe1291aec8b6b85ac4fd2d6cfb945628511795 Mon Sep 17 00:00:00 2001 From: sdarbinyan Date: Fri, 3 Jul 2026 02:08:51 +0400 Subject: [PATCH] arch(sprint1): add runtime provider selection strategy --- .../backoffice-data-provider.token.ts | 17 +++++++++++++- src/app/core/config/config-provider.token.ts | 17 +++++++++++++- .../runtime-provider-strategy.service.ts | 23 +++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 src/app/core/providers/runtime-provider-strategy.service.ts diff --git a/src/app/core/backoffice/backoffice-data-provider.token.ts b/src/app/core/backoffice/backoffice-data-provider.token.ts index 2c18d5b..4bc1b46 100644 --- a/src/app/core/backoffice/backoffice-data-provider.token.ts +++ b/src/app/core/backoffice/backoffice-data-provider.token.ts @@ -1,8 +1,23 @@ import { InjectionToken, inject } from '@angular/core'; import { BackofficeDataProvider } from './providers/backoffice-data-provider.interface'; import { MockBackofficeDataProvider } from './providers/mock-backoffice-data.provider'; +import { ApiBackofficeDataProvider } from './providers/api-backoffice-data.provider'; +import { RuntimeProviderStrategyService } from '../providers/runtime-provider-strategy.service'; export const BACKOFFICE_DATA_PROVIDER = new InjectionToken('BACKOFFICE_DATA_PROVIDER', { providedIn: 'root', - factory: () => inject(MockBackofficeDataProvider) + factory: () => { + const strategy = inject(RuntimeProviderStrategyService); + const mockProvider = inject(MockBackofficeDataProvider); + const apiProvider = inject(ApiBackofficeDataProvider); + + switch (strategy.getBackofficeProviderMode()) { + case 'mock': + return mockProvider; + case 'remote-config': + case 'api': + default: + return apiProvider; + } + } }); diff --git a/src/app/core/config/config-provider.token.ts b/src/app/core/config/config-provider.token.ts index 12ec466..b108b25 100644 --- a/src/app/core/config/config-provider.token.ts +++ b/src/app/core/config/config-provider.token.ts @@ -1,8 +1,23 @@ import { InjectionToken, inject } from '@angular/core'; import { ConfigProvider } from './config-provider.interface'; import { MockBootstrapProvider } from '../bootstrap/providers/mock-bootstrap.provider'; +import { ApiBootstrapProvider } from '../bootstrap/providers/api-bootstrap.provider'; +import { RuntimeProviderStrategyService } from '../providers/runtime-provider-strategy.service'; export const CONFIG_PROVIDER = new InjectionToken('CONFIG_PROVIDER', { providedIn: 'root', - factory: () => inject(MockBootstrapProvider) + factory: () => { + const strategy = inject(RuntimeProviderStrategyService); + const mockProvider = inject(MockBootstrapProvider); + const apiProvider = inject(ApiBootstrapProvider); + + switch (strategy.getBootstrapProviderMode()) { + case 'mock': + return mockProvider; + case 'remote-config': + case 'api': + default: + return apiProvider; + } + } }); diff --git a/src/app/core/providers/runtime-provider-strategy.service.ts b/src/app/core/providers/runtime-provider-strategy.service.ts new file mode 100644 index 0000000..be19d49 --- /dev/null +++ b/src/app/core/providers/runtime-provider-strategy.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@angular/core'; +import { environment } from '../../../environments/environment'; + +export type RuntimeProviderMode = 'mock' | 'api' | 'remote-config'; + +@Injectable({ providedIn: 'root' }) +export class RuntimeProviderStrategyService { + getBootstrapProviderMode(): RuntimeProviderMode { + if (environment.useMockData) { + return 'mock'; + } + + return 'api'; + } + + getBackofficeProviderMode(): RuntimeProviderMode { + if (environment.useMockData) { + return 'mock'; + } + + return 'api'; + } +}