@plyaz/core 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/index.d.ts +16 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/nestjs.d.ts +79 -0
- package/dist/adapters/nestjs.d.ts.map +1 -0
- package/dist/adapters/nextjs.d.ts +28 -0
- package/dist/adapters/nextjs.d.ts.map +1 -0
- package/dist/backend/example/example.controller.d.ts +121 -0
- package/dist/backend/example/example.controller.d.ts.map +1 -0
- package/dist/backend/example/example.module.d.ts +29 -0
- package/dist/backend/example/example.module.d.ts.map +1 -0
- package/dist/backend/example/index.d.ts +8 -0
- package/dist/backend/example/index.d.ts.map +1 -0
- package/dist/backend/featureFlags/FeatureFlagDomainService.d.ts +150 -0
- package/dist/backend/featureFlags/FeatureFlagDomainService.d.ts.map +1 -0
- package/dist/backend/featureFlags/config/feature-flag.config.d.ts +28 -50
- package/dist/backend/featureFlags/config/feature-flag.config.d.ts.map +1 -1
- package/dist/backend/featureFlags/config/validation.d.ts +6 -6
- package/dist/backend/featureFlags/config/validation.d.ts.map +1 -1
- package/dist/backend/featureFlags/feature-flag.controller.d.ts +14 -55
- package/dist/backend/featureFlags/feature-flag.controller.d.ts.map +1 -1
- package/dist/backend/featureFlags/feature-flag.module.d.ts +36 -43
- package/dist/backend/featureFlags/feature-flag.module.d.ts.map +1 -1
- package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts +16 -2
- package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts.map +1 -1
- package/dist/backend/featureFlags/index.d.ts +6 -7
- package/dist/backend/featureFlags/index.d.ts.map +1 -1
- package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts.map +1 -1
- package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts.map +1 -1
- package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts +6 -11
- package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts.map +1 -1
- package/dist/backend/index.d.ts +5 -0
- package/dist/backend/index.d.ts.map +1 -1
- package/dist/base/cache/CacheKeyBuilder.d.ts +115 -0
- package/dist/base/cache/CacheKeyBuilder.d.ts.map +1 -0
- package/dist/base/cache/index.d.ts +1 -0
- package/dist/base/cache/index.d.ts.map +1 -1
- package/dist/base/cache/strategies/redis.d.ts.map +1 -1
- package/dist/base/observability/BaseAdapter.d.ts +79 -0
- package/dist/base/observability/BaseAdapter.d.ts.map +1 -0
- package/dist/base/observability/CompositeAdapter.d.ts +72 -0
- package/dist/base/observability/CompositeAdapter.d.ts.map +1 -0
- package/dist/base/observability/DatadogAdapter.d.ts +117 -0
- package/dist/base/observability/DatadogAdapter.d.ts.map +1 -0
- package/dist/base/observability/LoggerAdapter.d.ts +54 -0
- package/dist/base/observability/LoggerAdapter.d.ts.map +1 -0
- package/dist/base/observability/ObservabilityService.d.ts +160 -0
- package/dist/base/observability/ObservabilityService.d.ts.map +1 -0
- package/dist/base/observability/index.d.ts +17 -0
- package/dist/base/observability/index.d.ts.map +1 -0
- package/dist/domain/base/BaseBackendDomainService.d.ts +528 -0
- package/dist/domain/base/BaseBackendDomainService.d.ts.map +1 -0
- package/dist/domain/base/BaseDomainService.d.ts +284 -0
- package/dist/domain/base/BaseDomainService.d.ts.map +1 -0
- package/dist/domain/base/BaseFrontendDomainService.d.ts +493 -0
- package/dist/domain/base/BaseFrontendDomainService.d.ts.map +1 -0
- package/dist/domain/base/BaseMapper.d.ts +100 -0
- package/dist/domain/base/BaseMapper.d.ts.map +1 -0
- package/dist/domain/base/BaseValidator.d.ts +105 -0
- package/dist/domain/base/BaseValidator.d.ts.map +1 -0
- package/dist/domain/base/index.d.ts +10 -0
- package/dist/domain/base/index.d.ts.map +1 -0
- package/dist/domain/example/BackendExampleDomainService.d.ts +257 -0
- package/dist/domain/example/BackendExampleDomainService.d.ts.map +1 -0
- package/dist/domain/example/FrontendExampleDomainService.d.ts +164 -0
- package/dist/domain/example/FrontendExampleDomainService.d.ts.map +1 -0
- package/dist/domain/example/index.d.ts +10 -0
- package/dist/domain/example/index.d.ts.map +1 -0
- package/dist/domain/example/mappers/ExampleMapper.d.ts +67 -0
- package/dist/domain/example/mappers/ExampleMapper.d.ts.map +1 -0
- package/dist/domain/example/validators/ExampleValidator.d.ts +33 -0
- package/dist/domain/example/validators/ExampleValidator.d.ts.map +1 -0
- package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts +86 -0
- package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts.map +1 -0
- package/dist/domain/featureFlags/index.d.ts +10 -5
- package/dist/domain/featureFlags/index.d.ts.map +1 -1
- package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts +72 -0
- package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts.map +1 -0
- package/dist/domain/featureFlags/mappers/index.d.ts +8 -0
- package/dist/domain/featureFlags/mappers/index.d.ts.map +1 -0
- package/dist/domain/featureFlags/module.d.ts +20 -0
- package/dist/domain/featureFlags/module.d.ts.map +1 -0
- package/dist/domain/featureFlags/provider.d.ts +40 -1
- package/dist/domain/featureFlags/provider.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/api.d.ts +59 -34
- package/dist/domain/featureFlags/providers/api.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/database.d.ts +48 -46
- package/dist/domain/featureFlags/providers/database.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/factory.d.ts +50 -33
- package/dist/domain/featureFlags/providers/factory.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/file.d.ts +48 -1
- package/dist/domain/featureFlags/providers/file.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/memory.d.ts +32 -6
- package/dist/domain/featureFlags/providers/memory.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/redis.d.ts +6 -1
- package/dist/domain/featureFlags/providers/redis.d.ts.map +1 -1
- package/dist/domain/featureFlags/service.d.ts +112 -0
- package/dist/domain/featureFlags/service.d.ts.map +1 -0
- package/dist/domain/index.d.ts +2 -0
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/engine/featureFlags/engine.d.ts +8 -0
- package/dist/engine/featureFlags/engine.d.ts.map +1 -1
- package/dist/entry-backend.d.ts +24 -0
- package/dist/entry-backend.d.ts.map +1 -0
- package/dist/entry-backend.js +15635 -0
- package/dist/entry-backend.js.map +1 -0
- package/dist/entry-backend.mjs +15506 -0
- package/dist/entry-backend.mjs.map +1 -0
- package/dist/entry-frontend.d.ts +23 -0
- package/dist/entry-frontend.d.ts.map +1 -0
- package/dist/entry-frontend.js +11152 -0
- package/dist/entry-frontend.js.map +1 -0
- package/dist/entry-frontend.mjs +11089 -0
- package/dist/entry-frontend.mjs.map +1 -0
- package/dist/events/CoreEventManager.d.ts +116 -0
- package/dist/events/CoreEventManager.d.ts.map +1 -0
- package/dist/events/index.d.ts +27 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/frontend/base/index.d.ts +8 -0
- package/dist/frontend/base/index.d.ts.map +1 -0
- package/dist/frontend/components/InitializationError.d.ts +25 -0
- package/dist/frontend/components/InitializationError.d.ts.map +1 -0
- package/dist/frontend/components/InitializationLoading.d.ts +22 -0
- package/dist/frontend/components/InitializationLoading.d.ts.map +1 -0
- package/dist/frontend/components/index.d.ts +9 -0
- package/dist/frontend/components/index.d.ts.map +1 -0
- package/dist/frontend/example/index.d.ts +9 -0
- package/dist/frontend/example/index.d.ts.map +1 -0
- package/dist/frontend/featureFlags/index.d.ts +28 -7
- package/dist/frontend/featureFlags/index.d.ts.map +1 -1
- package/dist/frontend/index.d.ts +4 -0
- package/dist/frontend/index.d.ts.map +1 -1
- package/dist/frontend/providers/ApiProvider.d.ts +2 -2
- package/dist/frontend/providers/ApiProvider.d.ts.map +1 -1
- package/dist/frontend/providers/PlyazProvider.d.ts +305 -0
- package/dist/frontend/providers/PlyazProvider.d.ts.map +1 -0
- package/dist/frontend/providers/index.d.ts +1 -0
- package/dist/frontend/providers/index.d.ts.map +1 -1
- package/dist/frontend/store/feature-flags.d.ts +63 -0
- package/dist/frontend/store/feature-flags.d.ts.map +1 -0
- package/dist/frontend/store/index.d.ts +14 -0
- package/dist/frontend/store/index.d.ts.map +1 -0
- package/dist/frontend/store/integrations.d.ts +36 -0
- package/dist/frontend/store/integrations.d.ts.map +1 -0
- package/dist/frontend/store/service-accessors.d.ts +78 -0
- package/dist/frontend/store/service-accessors.d.ts.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15450 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +13678 -4697
- package/dist/index.mjs.map +1 -1
- package/dist/init/CoreInitializer.d.ts +582 -0
- package/dist/init/CoreInitializer.d.ts.map +1 -0
- package/dist/init/ServiceRegistry.d.ts +256 -0
- package/dist/init/ServiceRegistry.d.ts.map +1 -0
- package/dist/init/index.d.ts +14 -0
- package/dist/init/index.d.ts.map +1 -0
- package/dist/init/nestjs/CoreModule.d.ts +63 -0
- package/dist/init/nestjs/CoreModule.d.ts.map +1 -0
- package/dist/init/nestjs/index.d.ts +5 -0
- package/dist/init/nestjs/index.d.ts.map +1 -0
- package/dist/init/nestjs/index.js +9059 -0
- package/dist/init/nestjs/index.js.map +1 -0
- package/dist/init/nestjs/index.mjs +9055 -0
- package/dist/init/nestjs/index.mjs.map +1 -0
- package/dist/init/react.d.ts +33 -0
- package/dist/init/react.d.ts.map +1 -0
- package/dist/models/example/ExampleRepository.d.ts +124 -0
- package/dist/models/example/ExampleRepository.d.ts.map +1 -0
- package/dist/models/example/index.d.ts +7 -0
- package/dist/models/example/index.d.ts.map +1 -0
- package/dist/{backend/featureFlags/database/repository.d.ts → models/featureFlags/FeatureFlagRepository.d.ts} +47 -5
- package/dist/models/featureFlags/FeatureFlagRepository.d.ts.map +1 -0
- package/dist/models/featureFlags/index.d.ts +7 -0
- package/dist/models/featureFlags/index.d.ts.map +1 -0
- package/dist/models/index.d.ts +9 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/services/ApiClientService.d.ts +92 -4
- package/dist/services/ApiClientService.d.ts.map +1 -1
- package/dist/services/CacheService.d.ts +176 -0
- package/dist/services/CacheService.d.ts.map +1 -0
- package/dist/services/DbService.d.ts +391 -0
- package/dist/services/DbService.d.ts.map +1 -0
- package/dist/services/NotificationService.d.ts +151 -0
- package/dist/services/NotificationService.d.ts.map +1 -0
- package/dist/services/StorageService.d.ts +144 -0
- package/dist/services/StorageService.d.ts.map +1 -0
- package/dist/services/index.d.ts +4 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/utils/common/id.d.ts +83 -0
- package/dist/utils/common/id.d.ts.map +1 -0
- package/dist/utils/common/index.d.ts +2 -0
- package/dist/utils/common/index.d.ts.map +1 -1
- package/dist/utils/common/object.d.ts +70 -0
- package/dist/utils/common/object.d.ts.map +1 -0
- package/dist/utils/featureFlags/conditions.d.ts.map +1 -1
- package/dist/utils/featureFlags/context.d.ts +0 -1
- package/dist/utils/featureFlags/context.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/mapperUtils.d.ts +38 -0
- package/dist/utils/mapperUtils.d.ts.map +1 -0
- package/dist/utils/runtime.d.ts +15 -0
- package/dist/utils/runtime.d.ts.map +1 -0
- package/dist/version.d.ts +24 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/web_app/auth/add_user.d.ts +2 -2
- package/dist/web_app/auth/add_user.d.ts.map +1 -1
- package/dist/web_app/auth/update_user.d.ts +1 -1
- package/dist/web_app/auth/update_user.d.ts.map +1 -1
- package/package.json +89 -15
- package/dist/backend/featureFlags/database/connection.d.ts +0 -321
- package/dist/backend/featureFlags/database/connection.d.ts.map +0 -1
- package/dist/backend/featureFlags/database/repository.d.ts.map +0 -1
- package/dist/backend/featureFlags/feature-flag.repository.d.ts +0 -85
- package/dist/backend/featureFlags/feature-flag.repository.d.ts.map +0 -1
- package/dist/backend/featureFlags/feature-flag.service.d.ts +0 -264
- package/dist/backend/featureFlags/feature-flag.service.d.ts.map +0 -1
- package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts +0 -103
- package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts.map +0 -1
- package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts +0 -35
- package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts.map +0 -1
- package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts +0 -55
- package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts.map +0 -1
- package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts +0 -57
- package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts.map +0 -1
- package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts +0 -99
- package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts.map +0 -1
- package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts +0 -31
- package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts.map +0 -1
- package/dist/frontend/featureFlags/providers/types.d.ts +0 -21
- package/dist/frontend/featureFlags/providers/types.d.ts.map +0 -1
- package/dist/index.cjs +0 -6435
- package/dist/index.cjs.map +0 -1
- package/dist/utils/db/databaseService.d.ts +0 -6
- package/dist/utils/db/databaseService.d.ts.map +0 -1
- package/dist/utils/db/index.d.ts +0 -2
- package/dist/utils/db/index.d.ts.map +0 -1
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
import { type DatabaseServiceInterface, type Transaction } from '@plyaz/types/db';
|
|
2
|
-
/**
|
|
3
|
-
* DatabaseConnectionManager - Singleton manager for feature flag database connections
|
|
4
|
-
*
|
|
5
|
-
* @description Manages Supabase database connections for the feature flag system using a singleton pattern.
|
|
6
|
-
* Handles connection initialization, table registration, transactions, and cleanup. This is the core
|
|
7
|
-
* database layer that all feature flag operations depend on.
|
|
8
|
-
*
|
|
9
|
-
* **Initialization Flow:**
|
|
10
|
-
* 1. FeatureFlagService calls initialize() during onModuleInit()
|
|
11
|
-
* 2. Reads Supabase credentials from environment variables
|
|
12
|
-
* 3. Creates database service with @plyaz/db
|
|
13
|
-
* 4. Registers feature flag tables
|
|
14
|
-
* 5. Enables caching and other optimizations
|
|
15
|
-
*
|
|
16
|
-
* **Required Environment Variables:**
|
|
17
|
-
* - SUPABASE_URL: Your Supabase project URL
|
|
18
|
-
* - SUPABASE_SERVICE_ROLE_KEY: Service role key for admin operations
|
|
19
|
-
* - SUPABASE_ANON_PUBLIC_KEY: Anonymous key for public operations
|
|
20
|
-
*
|
|
21
|
-
* @example Environment Setup (.env.local)
|
|
22
|
-
* ```bash
|
|
23
|
-
* SUPABASE_URL=https://your-project.supabase.co
|
|
24
|
-
* SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
|
25
|
-
* SUPABASE_ANON_PUBLIC_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
|
26
|
-
* ```
|
|
27
|
-
*
|
|
28
|
-
* @example Basic Usage (Internal - called by FeatureFlagService)
|
|
29
|
-
* ```typescript
|
|
30
|
-
* // During system initialization:
|
|
31
|
-
* const manager = DatabaseConnectionManager.getInstance();
|
|
32
|
-
* await manager.initialize();
|
|
33
|
-
*
|
|
34
|
-
* // During runtime operations:
|
|
35
|
-
* const db = manager.getDatabase();
|
|
36
|
-
* const flags = await db.query('feature_flags', { limit: 100 });
|
|
37
|
-
* ```
|
|
38
|
-
*
|
|
39
|
-
* @example Transaction Usage
|
|
40
|
-
* ```typescript
|
|
41
|
-
* const manager = DatabaseConnectionManager.getInstance();
|
|
42
|
-
*
|
|
43
|
-
* // Atomic flag creation with rules
|
|
44
|
-
* const result = await manager.transaction(async (tx) => {
|
|
45
|
-
* // Create flag
|
|
46
|
-
* const flag = await tx.create('feature_flags', {
|
|
47
|
-
* key: 'NEW_FEATURE',
|
|
48
|
-
* value: true,
|
|
49
|
-
* is_enabled: true
|
|
50
|
-
* });
|
|
51
|
-
*
|
|
52
|
-
* // Create associated rule
|
|
53
|
-
* const rule = await tx.create('feature_flag_rules', {
|
|
54
|
-
* flag_key: 'NEW_FEATURE',
|
|
55
|
-
* name: 'Premium Users Only',
|
|
56
|
-
* conditions: [{ field: 'userRole', operator: 'equals', value: 'premium' }]
|
|
57
|
-
* });
|
|
58
|
-
*
|
|
59
|
-
* return { flag, rule };
|
|
60
|
-
* });
|
|
61
|
-
* ```
|
|
62
|
-
*
|
|
63
|
-
*/
|
|
64
|
-
export declare class DatabaseConnectionManager {
|
|
65
|
-
private static instance;
|
|
66
|
-
private databaseService;
|
|
67
|
-
private constructor();
|
|
68
|
-
/**
|
|
69
|
-
* Gets the singleton instance of DatabaseConnectionManager
|
|
70
|
-
*
|
|
71
|
-
* @description Returns the single instance of the connection manager, creating it if it doesn't exist.
|
|
72
|
-
* This ensures only one database connection pool is maintained across the application.
|
|
73
|
-
*
|
|
74
|
-
* @returns {DatabaseConnectionManager} The singleton instance
|
|
75
|
-
*
|
|
76
|
-
* @example Getting the Instance
|
|
77
|
-
* ```typescript
|
|
78
|
-
* // Always returns the same instance
|
|
79
|
-
* const manager1 = DatabaseConnectionManager.getInstance();
|
|
80
|
-
* const manager2 = DatabaseConnectionManager.getInstance();
|
|
81
|
-
* console.log(manager1 === manager2); // true
|
|
82
|
-
*
|
|
83
|
-
* // Use in services
|
|
84
|
-
* class FeatureFlagRepository {
|
|
85
|
-
* private connectionManager = DatabaseConnectionManager.getInstance();
|
|
86
|
-
*
|
|
87
|
-
* async getFlags() {
|
|
88
|
-
* const db = this.connectionManager.getDatabase();
|
|
89
|
-
* return db.query('feature_flags');
|
|
90
|
-
* }
|
|
91
|
-
* }
|
|
92
|
-
* ```
|
|
93
|
-
*/
|
|
94
|
-
static getInstance(): DatabaseConnectionManager;
|
|
95
|
-
/**
|
|
96
|
-
* Initializes the database connection and registers feature flag tables
|
|
97
|
-
*
|
|
98
|
-
* @description Sets up the Supabase connection using environment variables and registers
|
|
99
|
-
* all feature flag related tables. This method is idempotent - calling it multiple
|
|
100
|
-
* times won't create additional connections.
|
|
101
|
-
*
|
|
102
|
-
* **What it does:**
|
|
103
|
-
* 1. Validates required environment variables
|
|
104
|
-
* 2. Creates Supabase database service
|
|
105
|
-
* 3. Configures caching (5-minute TTL)
|
|
106
|
-
* 4. Registers feature flag tables with proper ID columns
|
|
107
|
-
* 5. Disables audit logging (until tables are created)
|
|
108
|
-
*
|
|
109
|
-
* @throws {DatabaseError} When environment variables are missing or connection fails
|
|
110
|
-
*
|
|
111
|
-
* @example Initialization Process
|
|
112
|
-
* ```typescript
|
|
113
|
-
* // Called automatically by FeatureFlagService.onModuleInit()
|
|
114
|
-
* const manager = DatabaseConnectionManager.getInstance();
|
|
115
|
-
*
|
|
116
|
-
* try {
|
|
117
|
-
* await manager.initialize();
|
|
118
|
-
* console.log('Database connection established');
|
|
119
|
-
* } catch (error) {
|
|
120
|
-
* console.error('Failed to connect to database:', error.message);
|
|
121
|
-
* // Error: Missing environment variables for Supabase connection
|
|
122
|
-
* }
|
|
123
|
-
* ```
|
|
124
|
-
*
|
|
125
|
-
* @example Environment Variable Validation
|
|
126
|
-
* ```typescript
|
|
127
|
-
* // If any of these are missing, initialization fails:
|
|
128
|
-
* // SUPABASE_URL=undefined
|
|
129
|
-
* // SUPABASE_SERVICE_ROLE_KEY=undefined
|
|
130
|
-
* // SUPABASE_ANON_PUBLIC_KEY=undefined
|
|
131
|
-
*
|
|
132
|
-
* // Throws: DatabaseError with code CONFIG_REQUIRED
|
|
133
|
-
* ```
|
|
134
|
-
*
|
|
135
|
-
* @example Registered Tables
|
|
136
|
-
* ```typescript
|
|
137
|
-
* // These tables are automatically registered:
|
|
138
|
-
* // - feature_flags (ID: key)
|
|
139
|
-
* // - feature_flag_rules (ID: id)
|
|
140
|
-
* // - feature_flag_overrides (ID: id)
|
|
141
|
-
* // - feature_flag_evaluations (ID: id)
|
|
142
|
-
* ```
|
|
143
|
-
*/
|
|
144
|
-
initialize(): Promise<void>;
|
|
145
|
-
/**
|
|
146
|
-
* Gets the initialized database service instance
|
|
147
|
-
*
|
|
148
|
-
* @description Returns the database service for performing queries. The database must be
|
|
149
|
-
* initialized first using initialize() method, otherwise this will throw an error.
|
|
150
|
-
*
|
|
151
|
-
* @returns {DatabaseServiceInterface} The database service instance
|
|
152
|
-
* @throws {DatabaseError} When database is not initialized
|
|
153
|
-
*
|
|
154
|
-
* @example Basic Usage
|
|
155
|
-
* ```typescript
|
|
156
|
-
* const manager = DatabaseConnectionManager.getInstance();
|
|
157
|
-
* await manager.initialize(); // Must initialize first
|
|
158
|
-
*
|
|
159
|
-
* const db = manager.getDatabase();
|
|
160
|
-
*
|
|
161
|
-
* // Query feature flags
|
|
162
|
-
* const result = await db.query('feature_flags', {
|
|
163
|
-
* filters: [{ field: 'is_enabled', operator: 'eq', value: true }],
|
|
164
|
-
* sort: [{ field: 'key', direction: 'asc' }]
|
|
165
|
-
* });
|
|
166
|
-
*
|
|
167
|
-
* if (result.success) {
|
|
168
|
-
* console.log('Found flags:', result.value.data);
|
|
169
|
-
* }
|
|
170
|
-
* ```
|
|
171
|
-
*
|
|
172
|
-
* @example Error Handling
|
|
173
|
-
* ```typescript
|
|
174
|
-
* const manager = DatabaseConnectionManager.getInstance();
|
|
175
|
-
* // Don't call initialize()
|
|
176
|
-
*
|
|
177
|
-
* try {
|
|
178
|
-
* const db = manager.getDatabase();
|
|
179
|
-
* } catch (error) {
|
|
180
|
-
* console.error(error.message);
|
|
181
|
-
* // "Database not initialized. Call initialize() first."
|
|
182
|
-
* }
|
|
183
|
-
* ```
|
|
184
|
-
*
|
|
185
|
-
* @example CRUD Operations
|
|
186
|
-
* ```typescript
|
|
187
|
-
* const db = manager.getDatabase();
|
|
188
|
-
*
|
|
189
|
-
* // Create a flag
|
|
190
|
-
* const createResult = await db.create('feature_flags', {
|
|
191
|
-
* key: 'NEW_FEATURE',
|
|
192
|
-
* value: true,
|
|
193
|
-
* is_enabled: true
|
|
194
|
-
* });
|
|
195
|
-
*
|
|
196
|
-
* // Update a flag
|
|
197
|
-
* const updateResult = await db.update('feature_flags', 'NEW_FEATURE', {
|
|
198
|
-
* value: false
|
|
199
|
-
* });
|
|
200
|
-
*
|
|
201
|
-
* // Delete a flag
|
|
202
|
-
* const deleteResult = await db.delete('feature_flags', 'NEW_FEATURE');
|
|
203
|
-
* ```
|
|
204
|
-
*/
|
|
205
|
-
getDatabase(): DatabaseServiceInterface;
|
|
206
|
-
/**
|
|
207
|
-
* Executes a database transaction with automatic rollback on failure
|
|
208
|
-
*
|
|
209
|
-
* @description Provides atomic database operations by wrapping multiple queries in a transaction.
|
|
210
|
-
* If any operation fails, all changes are rolled back automatically. This is essential for
|
|
211
|
-
* maintaining data consistency when creating flags with rules or performing bulk operations.
|
|
212
|
-
*
|
|
213
|
-
* @template T The return type of the transaction callback
|
|
214
|
-
* @param {Function} callback - Function that receives transaction object and performs operations
|
|
215
|
-
* @returns {Promise<T>} The result of the transaction callback
|
|
216
|
-
* @throws {DatabaseError} When transaction fails or returns no value
|
|
217
|
-
*
|
|
218
|
-
* @example Atomic Flag Creation with Rules
|
|
219
|
-
* ```typescript
|
|
220
|
-
* const manager = DatabaseConnectionManager.getInstance();
|
|
221
|
-
*
|
|
222
|
-
* const result = await manager.transaction(async (tx) => {
|
|
223
|
-
* // Create the flag
|
|
224
|
-
* const flag = await tx.create('feature_flags', {
|
|
225
|
-
* key: 'PREMIUM_CHECKOUT',
|
|
226
|
-
* value: true,
|
|
227
|
-
* is_enabled: true,
|
|
228
|
-
* description: 'Premium checkout flow'
|
|
229
|
-
* });
|
|
230
|
-
*
|
|
231
|
-
* // Create targeting rule
|
|
232
|
-
* const rule = await tx.create('feature_flag_rules', {
|
|
233
|
-
* flag_key: 'PREMIUM_CHECKOUT',
|
|
234
|
-
* name: 'Premium Users Only',
|
|
235
|
-
* conditions: [
|
|
236
|
-
* { field: 'userRole', operator: 'equals', value: 'premium' },
|
|
237
|
-
* { field: 'subscriptionActive', operator: 'equals', value: true }
|
|
238
|
-
* ],
|
|
239
|
-
* value: true,
|
|
240
|
-
* priority: 100
|
|
241
|
-
* });
|
|
242
|
-
*
|
|
243
|
-
* return { flag, rule };
|
|
244
|
-
* });
|
|
245
|
-
*
|
|
246
|
-
* console.log('Created flag and rule:', result);
|
|
247
|
-
* ```
|
|
248
|
-
*
|
|
249
|
-
* @example Bulk Flag Updates
|
|
250
|
-
* ```typescript
|
|
251
|
-
* const flagsToUpdate = ['FEATURE_A', 'FEATURE_B', 'FEATURE_C'];
|
|
252
|
-
*
|
|
253
|
-
* await manager.transaction(async (tx) => {
|
|
254
|
-
* for (const flagKey of flagsToUpdate) {
|
|
255
|
-
* await tx.update('feature_flags', flagKey, {
|
|
256
|
-
* is_enabled: false,
|
|
257
|
-
* updated_at: new Date().toISOString()
|
|
258
|
-
* });
|
|
259
|
-
* }
|
|
260
|
-
*
|
|
261
|
-
* // Log the bulk update
|
|
262
|
-
* await tx.create('feature_flag_evaluations', {
|
|
263
|
-
* flag_key: 'BULK_UPDATE',
|
|
264
|
-
* result: { updatedFlags: flagsToUpdate },
|
|
265
|
-
* reason: 'bulk_disable',
|
|
266
|
-
* evaluated_at: new Date().toISOString()
|
|
267
|
-
* });
|
|
268
|
-
* });
|
|
269
|
-
* ```
|
|
270
|
-
*
|
|
271
|
-
* @example Error Handling and Rollback
|
|
272
|
-
* ```typescript
|
|
273
|
-
* try {
|
|
274
|
-
* await manager.transaction(async (tx) => {
|
|
275
|
-
* await tx.create('feature_flags', { key: 'TEST_FLAG', value: true });
|
|
276
|
-
*
|
|
277
|
-
* // This will cause the entire transaction to rollback
|
|
278
|
-
* throw new Error('Something went wrong');
|
|
279
|
-
*
|
|
280
|
-
* // This won't execute, and the flag creation above will be rolled back
|
|
281
|
-
* await tx.create('feature_flag_rules', { flag_key: 'TEST_FLAG' });
|
|
282
|
-
* });
|
|
283
|
-
* } catch (error) {
|
|
284
|
-
* console.log('Transaction failed, all changes rolled back');
|
|
285
|
-
* }
|
|
286
|
-
* ```
|
|
287
|
-
*/
|
|
288
|
-
transaction<T>(callback: (tx: Transaction) => Promise<T>): Promise<T>;
|
|
289
|
-
/**
|
|
290
|
-
* Closes the database connection and cleans up resources
|
|
291
|
-
*
|
|
292
|
-
* @description Properly closes the database connection and resets the singleton instance.
|
|
293
|
-
* This is typically called during application shutdown or in tests that need to reset
|
|
294
|
-
* the connection state.
|
|
295
|
-
*
|
|
296
|
-
* @example Application Shutdown
|
|
297
|
-
* ```typescript
|
|
298
|
-
* // In your NestJS module's onModuleDestroy
|
|
299
|
-
* export class FeatureFlagModule implements OnModuleDestroy {
|
|
300
|
-
* async onModuleDestroy() {
|
|
301
|
-
* const manager = DatabaseConnectionManager.getInstance();
|
|
302
|
-
* await manager.close();
|
|
303
|
-
* console.log('Database connection closed');
|
|
304
|
-
* }
|
|
305
|
-
* }
|
|
306
|
-
* ```
|
|
307
|
-
*
|
|
308
|
-
* @example Test Cleanup
|
|
309
|
-
* ```typescript
|
|
310
|
-
* describe('Feature Flag Tests', () => {
|
|
311
|
-
* afterEach(async () => {
|
|
312
|
-
* // Clean up connection between tests
|
|
313
|
-
* const manager = DatabaseConnectionManager.getInstance();
|
|
314
|
-
* await manager.close();
|
|
315
|
-
* });
|
|
316
|
-
* });
|
|
317
|
-
* ```
|
|
318
|
-
*/
|
|
319
|
-
close(): Promise<void>;
|
|
320
|
-
}
|
|
321
|
-
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../src/backend/featureFlags/database/connection.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,wBAAwB,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEjG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4B;IACnD,OAAO,CAAC,eAAe,CAAyC;IAEhE,OAAO;IAEP;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,MAAM,CAAC,WAAW,IAAI,yBAAyB;IAO/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgDG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA4DjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2DG;IACH,WAAW,IAAI,wBAAwB;IAUvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiFG;IACG,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAe3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../src/backend/featureFlags/database/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Feature Flag Repository
|
|
3
|
-
*
|
|
4
|
-
* NestJS repository for feature flag data persistence.
|
|
5
|
-
* Handles database operations and data mapping.
|
|
6
|
-
*
|
|
7
|
-
* @fileoverview NestJS repository for feature flags
|
|
8
|
-
* @version 1.0.0
|
|
9
|
-
*/
|
|
10
|
-
import type { FeatureFlag, FeatureFlagRule, CreateFlagRequest } from '@plyaz/types';
|
|
11
|
-
/**
|
|
12
|
-
* Feature Flag Repository
|
|
13
|
-
*
|
|
14
|
-
* Handles all database operations for feature flags.
|
|
15
|
-
* This is a stub implementation that provides the interface
|
|
16
|
-
* for integration with @plyaz/db when available.
|
|
17
|
-
*/
|
|
18
|
-
export declare class FeatureFlagRepository<FeatureFlagKey extends string> {
|
|
19
|
-
private readonly logger;
|
|
20
|
-
private static readonly ONE_DAY_MS;
|
|
21
|
-
/**
|
|
22
|
-
* Creates a new feature flag in the database.
|
|
23
|
-
*
|
|
24
|
-
* @param createData - Flag creation data
|
|
25
|
-
* @returns Created feature flag
|
|
26
|
-
*/
|
|
27
|
-
createFlag(createData: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>>;
|
|
28
|
-
/**
|
|
29
|
-
* Updates an existing feature flag.
|
|
30
|
-
*
|
|
31
|
-
* @param key - Feature flag key
|
|
32
|
-
* @param updateData - Flag update data
|
|
33
|
-
* @returns Updated feature flag
|
|
34
|
-
*/
|
|
35
|
-
updateFlag(key: FeatureFlagKey, updateData: Partial<CreateFlagRequest<FeatureFlagKey>>): Promise<FeatureFlag<FeatureFlagKey>>;
|
|
36
|
-
/**
|
|
37
|
-
* Deletes a feature flag from the database.
|
|
38
|
-
*
|
|
39
|
-
* @param key - Feature flag key
|
|
40
|
-
*/
|
|
41
|
-
deleteFlag(key: FeatureFlagKey): Promise<void>;
|
|
42
|
-
/**
|
|
43
|
-
* Gets all feature flags from the database.
|
|
44
|
-
*
|
|
45
|
-
* @param environment - Filter by environment
|
|
46
|
-
* @returns List of feature flags
|
|
47
|
-
*/
|
|
48
|
-
getAllFlags(environment?: string): Promise<FeatureFlag<FeatureFlagKey>[]>;
|
|
49
|
-
/**
|
|
50
|
-
* Creates sample flags for stub implementation.
|
|
51
|
-
*
|
|
52
|
-
* @returns Array of sample feature flags
|
|
53
|
-
*/
|
|
54
|
-
private createSampleFlags;
|
|
55
|
-
/**
|
|
56
|
-
* Filters flags by environment.
|
|
57
|
-
*
|
|
58
|
-
* @param flags - Array of flags to filter
|
|
59
|
-
* @param environment - Environment to filter by
|
|
60
|
-
* @returns Filtered flags
|
|
61
|
-
*/
|
|
62
|
-
private filterFlagsByEnvironment;
|
|
63
|
-
/**
|
|
64
|
-
* Gets all rules for a specific flag.
|
|
65
|
-
*
|
|
66
|
-
* @param key - Feature flag key
|
|
67
|
-
* @returns List of rules for the flag
|
|
68
|
-
*/
|
|
69
|
-
getFlagRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]>;
|
|
70
|
-
/**
|
|
71
|
-
* Gets a single feature flag by key.
|
|
72
|
-
*
|
|
73
|
-
* @param key - Feature flag key
|
|
74
|
-
* @returns Feature flag or null if not found
|
|
75
|
-
*/
|
|
76
|
-
getFlagByKey(key: FeatureFlagKey): Promise<FeatureFlag<FeatureFlagKey> | null>;
|
|
77
|
-
/**
|
|
78
|
-
* Infers the type of a feature flag value.
|
|
79
|
-
*
|
|
80
|
-
* @param value - The flag value
|
|
81
|
-
* @returns Inferred type string
|
|
82
|
-
*/
|
|
83
|
-
private inferFlagType;
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=feature-flag.repository.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"feature-flag.repository.d.ts","sourceRoot":"","sources":["../../../src/backend/featureFlags/feature-flag.repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAEV,WAAW,EACX,eAAe,EACf,iBAAiB,EAClB,MAAM,cAAc,CAAC;AAEtB;;;;;;GAMG;AACH,qBACa,qBAAqB,CAAC,cAAc,SAAS,MAAM;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IAGjE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAc;IAKhD;;;;;OAKG;IACG,UAAU,CACd,UAAU,EAAE,iBAAiB,CAAC,cAAc,CAAC,GAC5C,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAgCvC;;;;;;OAMG;IACG,UAAU,CACd,GAAG,EAAE,cAAc,EACnB,UAAU,EAAE,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,GACrD,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IA0CvC;;;;OAIG;IACG,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpD;;;;;OAKG;IACG,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC;IAW/E;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAiCzB;;;;;;OAMG;IACH,OAAO,CAAC,wBAAwB;IAShC;;;;;OAKG;IACG,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC;IAmBnF;;;;;OAKG;IACG,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IAepF;;;;;OAKG;IACH,OAAO,CAAC,aAAa;CAwDtB"}
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Feature Flag Service
|
|
3
|
-
*
|
|
4
|
-
* NestJS service for feature flag business logic.
|
|
5
|
-
* Orchestrates between providers, repositories, and external systems.
|
|
6
|
-
*
|
|
7
|
-
* @fileoverview NestJS service for feature flags
|
|
8
|
-
*/
|
|
9
|
-
import type { OnModuleInit, OnModuleDestroy } from '@nestjs/common';
|
|
10
|
-
import { type FeatureFlagValue, type FeatureFlagContext, type FeatureFlagEvaluation, type FeatureFlag, type FeatureFlagRule, type CreateFlagRequest, type ProviderHealthStatus } from '@plyaz/types';
|
|
11
|
-
import type { FeatureFlagRepository } from './feature-flag.repository';
|
|
12
|
-
import type { FeatureFlagKey } from '@domain/types';
|
|
13
|
-
/**
|
|
14
|
-
* Feature Flag Service
|
|
15
|
-
*
|
|
16
|
-
* **MAIN ORCHESTRATOR** - This service coordinates the entire feature flag system.
|
|
17
|
-
*
|
|
18
|
-
* **EXECUTION FLOW:**
|
|
19
|
-
* 1. NestJS Module System → Instantiates this service
|
|
20
|
-
* 2. **onModuleInit()** ← ENTRY POINT - Called automatically by NestJS
|
|
21
|
-
* 3. initializeProvider() → Loads configuration and creates provider
|
|
22
|
-
* 4. Provider.initialize() → Establishes database connection
|
|
23
|
-
* 5. System ready to serve requests
|
|
24
|
-
*
|
|
25
|
-
* **RUNTIME FLOW:**
|
|
26
|
-
* Client Request → Controller → **This Service** → Provider → Database/Cache
|
|
27
|
-
*
|
|
28
|
-
* @example Basic Usage in Controller
|
|
29
|
-
* ```typescript
|
|
30
|
-
* @Controller('features')
|
|
31
|
-
* export class FeatureController {
|
|
32
|
-
* constructor(private readonly featureFlagService: FeatureFlagService) {}
|
|
33
|
-
*
|
|
34
|
-
* @Get(':key')
|
|
35
|
-
* async getFeature(@Param('key') key: string) {
|
|
36
|
-
* // This calls the service which orchestrates the entire evaluation
|
|
37
|
-
* return this.featureFlagService.evaluateFlag(key);
|
|
38
|
-
* }
|
|
39
|
-
* }
|
|
40
|
-
* ```
|
|
41
|
-
*
|
|
42
|
-
* @example Advanced Usage with Context
|
|
43
|
-
* ```typescript
|
|
44
|
-
* // Evaluate flag with user context for targeting rules
|
|
45
|
-
* const evaluation = await this.featureFlagService.evaluateFlag('PREMIUM_FEATURE', {
|
|
46
|
-
* userId: 'user123',
|
|
47
|
-
* userRole: 'premium',
|
|
48
|
-
* environment: 'production'
|
|
49
|
-
* });
|
|
50
|
-
*
|
|
51
|
-
* if (evaluation.isEnabled) {
|
|
52
|
-
* // Execute premium feature logic
|
|
53
|
-
* }
|
|
54
|
-
* ```
|
|
55
|
-
*
|
|
56
|
-
* Provides business logic for feature flag operations.
|
|
57
|
-
* Manages provider lifecycle, caching, and data persistence.
|
|
58
|
-
*/
|
|
59
|
-
export declare class FeatureFlagService implements OnModuleInit, OnModuleDestroy {
|
|
60
|
-
private readonly featureFlagRepository;
|
|
61
|
-
[x: string]: unknown;
|
|
62
|
-
private readonly logger;
|
|
63
|
-
private provider;
|
|
64
|
-
constructor(featureFlagRepository: FeatureFlagRepository<FeatureFlagKey>);
|
|
65
|
-
/**
|
|
66
|
-
* **FIRST METHOD CALLED** - NestJS lifecycle hook for module initialization
|
|
67
|
-
*
|
|
68
|
-
* **EXECUTION ORDER:**
|
|
69
|
-
* 1. NestJS creates FeatureFlagModule
|
|
70
|
-
* 2. NestJS instantiates FeatureFlagService
|
|
71
|
-
* 3. **THIS METHOD CALLED AUTOMATICALLY** ← YOU ARE HERE
|
|
72
|
-
* 4. → initializeProvider() called
|
|
73
|
-
* 5. → Configuration loaded from .env.local
|
|
74
|
-
* 6. → Database provider created and initialized
|
|
75
|
-
* 7. → Database connection established
|
|
76
|
-
* 8. → Initial data loaded from database
|
|
77
|
-
* 9. System ready to serve requests
|
|
78
|
-
*
|
|
79
|
-
* @throws {Error} If provider initialization fails
|
|
80
|
-
*
|
|
81
|
-
* @example What happens during initialization:
|
|
82
|
-
* ```typescript
|
|
83
|
-
* // 1. Load config from environment
|
|
84
|
-
* const config = FeatureFlagConfigFactory.fromEnvironment();
|
|
85
|
-
*
|
|
86
|
-
* // 2. Create database provider
|
|
87
|
-
* this.provider = FeatureFlagProviderFactory.create(config, FEATURES);
|
|
88
|
-
*
|
|
89
|
-
* // 3. Initialize database connection
|
|
90
|
-
* await this.provider.initialize();
|
|
91
|
-
*
|
|
92
|
-
* // 4. Load flags and rules from database
|
|
93
|
-
* const { flags, rules } = await this.provider.fetchData();
|
|
94
|
-
* ```
|
|
95
|
-
*/
|
|
96
|
-
onModuleInit(): Promise<void>;
|
|
97
|
-
/**
|
|
98
|
-
* Cleans up resources on module shutdown.
|
|
99
|
-
*/
|
|
100
|
-
onModuleDestroy(): Promise<void>;
|
|
101
|
-
/**
|
|
102
|
-
* **SECOND METHOD CALLED** - Initializes the feature flag provider
|
|
103
|
-
*
|
|
104
|
-
* **EXECUTION FLOW:**
|
|
105
|
-
* 1. onModuleInit() called by NestJS
|
|
106
|
-
* 2. **THIS METHOD CALLED** ← YOU ARE HERE
|
|
107
|
-
* 3. → FeatureFlagConfigFactory.fromEnvironment() - Loads .env.local
|
|
108
|
-
* 4. → FeatureFlagProviderFactory.create() - Creates database provider
|
|
109
|
-
* 5. → provider.initialize() - Establishes database connection
|
|
110
|
-
*
|
|
111
|
-
* @private
|
|
112
|
-
* @throws {Error} If configuration is invalid or database connection fails
|
|
113
|
-
*
|
|
114
|
-
* @example Configuration Loading Process:
|
|
115
|
-
* ```typescript
|
|
116
|
-
* // Reads from .env.local:
|
|
117
|
-
* // SUPABASE_URL=https://your-project.supabase.co
|
|
118
|
-
* // FEATURE_FLAG_PROVIDER=database
|
|
119
|
-
* // FEATURE_FLAG_CACHE_ENABLED=true
|
|
120
|
-
*
|
|
121
|
-
* const config = {
|
|
122
|
-
* provider: 'database',
|
|
123
|
-
* isCacheEnabled: true,
|
|
124
|
-
* databaseConfig: {
|
|
125
|
-
* connectionString: 'https://your-project.supabase.co',
|
|
126
|
-
* tableName: 'feature_flags'
|
|
127
|
-
* }
|
|
128
|
-
* };
|
|
129
|
-
* ```
|
|
130
|
-
*/
|
|
131
|
-
private initializeProvider;
|
|
132
|
-
/**
|
|
133
|
-
* Gets the current provider instance.
|
|
134
|
-
*/
|
|
135
|
-
private getProvider;
|
|
136
|
-
/**
|
|
137
|
-
* **MAIN RUNTIME METHOD** - Evaluates a feature flag for the given context
|
|
138
|
-
*
|
|
139
|
-
* **RUNTIME EXECUTION FLOW:**
|
|
140
|
-
* 1. Client makes HTTP request to controller
|
|
141
|
-
* 2. Controller calls **THIS METHOD** ← RUNTIME ENTRY POINT
|
|
142
|
-
* 3. → getProvider() - Gets initialized provider
|
|
143
|
-
* 4. → provider.getFlag() - Evaluates flag with context
|
|
144
|
-
* 5. → Provider checks cache, rules, overrides
|
|
145
|
-
* 6. → Database query if needed
|
|
146
|
-
* 7. ← Returns evaluation result
|
|
147
|
-
*
|
|
148
|
-
* @param key - Feature flag key (e.g., 'PREMIUM_FEATURE', 'NEW_UI')
|
|
149
|
-
* @param context - Evaluation context for targeting rules
|
|
150
|
-
* @returns Feature flag evaluation result with value, reason, and metadata
|
|
151
|
-
*
|
|
152
|
-
* @example Simple Usage:
|
|
153
|
-
* ```typescript
|
|
154
|
-
* const evaluation = await this.featureFlagService.evaluateFlag('NEW_CHECKOUT');
|
|
155
|
-
* console.log(evaluation.isEnabled); // true/false
|
|
156
|
-
* console.log(evaluation.reason); // 'default_value' | 'rule_match' | 'override'
|
|
157
|
-
* ```
|
|
158
|
-
*
|
|
159
|
-
* @example With User Context (for targeting rules):
|
|
160
|
-
* ```typescript
|
|
161
|
-
* const evaluation = await this.featureFlagService.evaluateFlag('BETA_FEATURE', {
|
|
162
|
-
* userId: 'user123',
|
|
163
|
-
* userRole: 'premium',
|
|
164
|
-
* environment: 'production',
|
|
165
|
-
* customAttributes: {
|
|
166
|
-
* subscriptionTier: 'pro',
|
|
167
|
-
* region: 'us-east'
|
|
168
|
-
* }
|
|
169
|
-
* });
|
|
170
|
-
*
|
|
171
|
-
* // Provider will:
|
|
172
|
-
* // 1. Check for user-specific overrides
|
|
173
|
-
* // 2. Evaluate targeting rules against context
|
|
174
|
-
* // 3. Return appropriate value with reason
|
|
175
|
-
* ```
|
|
176
|
-
*
|
|
177
|
-
* @example Evaluation Result:
|
|
178
|
-
* ```typescript
|
|
179
|
-
* {
|
|
180
|
-
* key: 'BETA_FEATURE',
|
|
181
|
-
* isEnabled: true,
|
|
182
|
-
* value: { enabled: true, variant: 'blue' },
|
|
183
|
-
* reason: 'rule_match',
|
|
184
|
-
* ruleId: 'premium-users-rule',
|
|
185
|
-
* evaluatedAt: '2024-01-15T10:30:00Z'
|
|
186
|
-
* }
|
|
187
|
-
* ```
|
|
188
|
-
*/
|
|
189
|
-
evaluateFlag(key: FeatureFlagKey, context?: FeatureFlagContext): Promise<FeatureFlagEvaluation<FeatureFlagKey>>;
|
|
190
|
-
/**
|
|
191
|
-
* Checks if a feature flag is enabled.
|
|
192
|
-
*
|
|
193
|
-
* @param key - Feature flag key
|
|
194
|
-
* @param context - Evaluation context
|
|
195
|
-
* @returns Boolean indicating if flag is enabled
|
|
196
|
-
*/
|
|
197
|
-
isEnabled(key: FeatureFlagKey, context?: FeatureFlagContext): Promise<boolean>;
|
|
198
|
-
/**
|
|
199
|
-
* Gets all feature flags with their evaluations.
|
|
200
|
-
*
|
|
201
|
-
* @param context - Evaluation context
|
|
202
|
-
* @returns All feature flag evaluations
|
|
203
|
-
*/
|
|
204
|
-
getAllFlags(context?: FeatureFlagContext): Promise<Record<string, FeatureFlagEvaluation<FeatureFlagKey>>>;
|
|
205
|
-
/**
|
|
206
|
-
* Creates a new feature flag.
|
|
207
|
-
*
|
|
208
|
-
* @param createData - Flag creation data
|
|
209
|
-
* @returns Created feature flag
|
|
210
|
-
*/
|
|
211
|
-
createFlag(createData: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>>;
|
|
212
|
-
/**
|
|
213
|
-
* Updates an existing feature flag.
|
|
214
|
-
*
|
|
215
|
-
* @param key - Feature flag key
|
|
216
|
-
* @param updateData - Flag update data
|
|
217
|
-
* @returns Updated feature flag
|
|
218
|
-
*/
|
|
219
|
-
updateFlag(key: FeatureFlagKey, updateData: Partial<CreateFlagRequest<FeatureFlagKey>>): Promise<FeatureFlag<FeatureFlagKey>>;
|
|
220
|
-
/**
|
|
221
|
-
* Deletes a feature flag.
|
|
222
|
-
*
|
|
223
|
-
* @param key - Feature flag key
|
|
224
|
-
*/
|
|
225
|
-
deleteFlag(key: FeatureFlagKey): Promise<void>;
|
|
226
|
-
/**
|
|
227
|
-
* Sets a manual override for a flag.
|
|
228
|
-
*
|
|
229
|
-
* @param key - Feature flag key
|
|
230
|
-
* @param value - Override value
|
|
231
|
-
*/
|
|
232
|
-
setOverride(key: FeatureFlagKey, value: FeatureFlagValue): Promise<void>;
|
|
233
|
-
/**
|
|
234
|
-
* Removes a manual override for a flag.
|
|
235
|
-
*
|
|
236
|
-
* @param key - Feature flag key
|
|
237
|
-
*/
|
|
238
|
-
removeOverride(key: FeatureFlagKey): Promise<void>;
|
|
239
|
-
/**
|
|
240
|
-
* Gets all available feature flags.
|
|
241
|
-
*
|
|
242
|
-
* @param environment - Filter by environment
|
|
243
|
-
* @returns List of feature flags
|
|
244
|
-
*/
|
|
245
|
-
getAllFeatureFlags(environment?: string): Promise<FeatureFlag<FeatureFlagKey>[]>;
|
|
246
|
-
/**
|
|
247
|
-
* Gets all rules for a specific flag.
|
|
248
|
-
*
|
|
249
|
-
* @param key - Feature flag key
|
|
250
|
-
* @returns List of rules for the flag
|
|
251
|
-
*/
|
|
252
|
-
getFlagRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]>;
|
|
253
|
-
/**
|
|
254
|
-
* Forces a refresh of the feature flag cache.
|
|
255
|
-
*/
|
|
256
|
-
refreshCache(): Promise<void>;
|
|
257
|
-
/**
|
|
258
|
-
* Gets provider health status.
|
|
259
|
-
*
|
|
260
|
-
* @returns Provider health information
|
|
261
|
-
*/
|
|
262
|
-
getHealthStatus(): Promise<ProviderHealthStatus>;
|
|
263
|
-
}
|
|
264
|
-
//# sourceMappingURL=feature-flag.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"feature-flag.service.d.ts","sourceRoot":"","sources":["../../../src/backend/featureFlags/feature-flag.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,eAAe,EAEpB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAI1B,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,qBACa,kBAAmB,YAAW,YAAY,EAAE,eAAe;IAK1D,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAJlD,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAuC;gBAE1B,qBAAqB,EAAE,qBAAqB,CAAC,cAAc,CAAC;IAEzF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAUnC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;YACW,kBAAkB;IAkBhC;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoDG;IACG,YAAY,CAChB,GAAG,EAAE,cAAc,EACnB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAmBjD;;;;;;OAMG;IACG,SAAS,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpF;;;;;OAKG;IACG,WAAW,CACf,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC;IAiBjE;;;;;OAKG;IACG,UAAU,CACd,UAAU,EAAE,iBAAiB,CAAC,cAAc,CAAC,GAC5C,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAevC;;;;;;OAMG;IACG,UAAU,CACd,GAAG,EAAE,cAAc,EACnB,UAAU,EAAE,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,GACrD,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAevC;;;;OAIG;IACG,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpD;;;;;OAKG;IACG,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9E;;;;OAIG;IACG,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxD;;;;;OAKG;IACG,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC;IAStF;;;;;OAKG;IACG,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC;IASnF;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAYnC;;;;OAIG;IACG,eAAe,IAAI,OAAO,CAAC,oBAAoB,CAAC;CAOvD"}
|