@plyaz/core 1.1.1 → 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.
Files changed (243) hide show
  1. package/dist/adapters/index.d.ts +16 -0
  2. package/dist/adapters/index.d.ts.map +1 -0
  3. package/dist/adapters/nestjs.d.ts +79 -0
  4. package/dist/adapters/nestjs.d.ts.map +1 -0
  5. package/dist/adapters/nextjs.d.ts +28 -0
  6. package/dist/adapters/nextjs.d.ts.map +1 -0
  7. package/dist/backend/example/example.controller.d.ts +121 -0
  8. package/dist/backend/example/example.controller.d.ts.map +1 -0
  9. package/dist/backend/example/example.module.d.ts +29 -0
  10. package/dist/backend/example/example.module.d.ts.map +1 -0
  11. package/dist/backend/example/index.d.ts +8 -0
  12. package/dist/backend/example/index.d.ts.map +1 -0
  13. package/dist/backend/featureFlags/FeatureFlagDomainService.d.ts +150 -0
  14. package/dist/backend/featureFlags/FeatureFlagDomainService.d.ts.map +1 -0
  15. package/dist/backend/featureFlags/config/feature-flag.config.d.ts +89 -0
  16. package/dist/backend/featureFlags/config/feature-flag.config.d.ts.map +1 -0
  17. package/dist/backend/featureFlags/config/validation.d.ts +181 -0
  18. package/dist/backend/featureFlags/config/validation.d.ts.map +1 -0
  19. package/dist/backend/featureFlags/decorators/feature-disabled.decorator.d.ts +6 -0
  20. package/dist/backend/featureFlags/decorators/feature-disabled.decorator.d.ts.map +1 -0
  21. package/dist/backend/featureFlags/decorators/feature-enabled.decorator.d.ts +8 -0
  22. package/dist/backend/featureFlags/decorators/feature-enabled.decorator.d.ts.map +1 -0
  23. package/dist/backend/featureFlags/decorators/feature-flag.decorator.d.ts +11 -0
  24. package/dist/backend/featureFlags/decorators/feature-flag.decorator.d.ts.map +1 -0
  25. package/dist/backend/featureFlags/feature-flag.controller.d.ts +14 -56
  26. package/dist/backend/featureFlags/feature-flag.controller.d.ts.map +1 -1
  27. package/dist/backend/featureFlags/feature-flag.module.d.ts +36 -44
  28. package/dist/backend/featureFlags/feature-flag.module.d.ts.map +1 -1
  29. package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts +33 -0
  30. package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts.map +1 -0
  31. package/dist/backend/featureFlags/index.d.ts +14 -41
  32. package/dist/backend/featureFlags/index.d.ts.map +1 -1
  33. package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts +16 -0
  34. package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts.map +1 -0
  35. package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts +18 -0
  36. package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts.map +1 -0
  37. package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts +162 -0
  38. package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts.map +1 -0
  39. package/dist/backend/index.d.ts +5 -0
  40. package/dist/backend/index.d.ts.map +1 -1
  41. package/dist/base/cache/CacheKeyBuilder.d.ts +115 -0
  42. package/dist/base/cache/CacheKeyBuilder.d.ts.map +1 -0
  43. package/dist/base/cache/feature/caching.d.ts +16 -0
  44. package/dist/base/cache/feature/caching.d.ts.map +1 -0
  45. package/dist/base/cache/index.d.ts +2 -0
  46. package/dist/base/cache/index.d.ts.map +1 -1
  47. package/dist/base/cache/strategies/redis.d.ts.map +1 -1
  48. package/dist/base/observability/BaseAdapter.d.ts +79 -0
  49. package/dist/base/observability/BaseAdapter.d.ts.map +1 -0
  50. package/dist/base/observability/CompositeAdapter.d.ts +72 -0
  51. package/dist/base/observability/CompositeAdapter.d.ts.map +1 -0
  52. package/dist/base/observability/DatadogAdapter.d.ts +117 -0
  53. package/dist/base/observability/DatadogAdapter.d.ts.map +1 -0
  54. package/dist/base/observability/LoggerAdapter.d.ts +54 -0
  55. package/dist/base/observability/LoggerAdapter.d.ts.map +1 -0
  56. package/dist/base/observability/ObservabilityService.d.ts +160 -0
  57. package/dist/base/observability/ObservabilityService.d.ts.map +1 -0
  58. package/dist/base/observability/index.d.ts +17 -0
  59. package/dist/base/observability/index.d.ts.map +1 -0
  60. package/dist/domain/base/BaseBackendDomainService.d.ts +528 -0
  61. package/dist/domain/base/BaseBackendDomainService.d.ts.map +1 -0
  62. package/dist/domain/base/BaseDomainService.d.ts +284 -0
  63. package/dist/domain/base/BaseDomainService.d.ts.map +1 -0
  64. package/dist/domain/base/BaseFrontendDomainService.d.ts +493 -0
  65. package/dist/domain/base/BaseFrontendDomainService.d.ts.map +1 -0
  66. package/dist/domain/base/BaseMapper.d.ts +100 -0
  67. package/dist/domain/base/BaseMapper.d.ts.map +1 -0
  68. package/dist/domain/base/BaseValidator.d.ts +105 -0
  69. package/dist/domain/base/BaseValidator.d.ts.map +1 -0
  70. package/dist/domain/base/index.d.ts +10 -0
  71. package/dist/domain/base/index.d.ts.map +1 -0
  72. package/dist/domain/example/BackendExampleDomainService.d.ts +257 -0
  73. package/dist/domain/example/BackendExampleDomainService.d.ts.map +1 -0
  74. package/dist/domain/example/FrontendExampleDomainService.d.ts +164 -0
  75. package/dist/domain/example/FrontendExampleDomainService.d.ts.map +1 -0
  76. package/dist/domain/example/index.d.ts +10 -0
  77. package/dist/domain/example/index.d.ts.map +1 -0
  78. package/dist/domain/example/mappers/ExampleMapper.d.ts +67 -0
  79. package/dist/domain/example/mappers/ExampleMapper.d.ts.map +1 -0
  80. package/dist/domain/example/validators/ExampleValidator.d.ts +33 -0
  81. package/dist/domain/example/validators/ExampleValidator.d.ts.map +1 -0
  82. package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts +86 -0
  83. package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts.map +1 -0
  84. package/dist/domain/featureFlags/index.d.ts +10 -5
  85. package/dist/domain/featureFlags/index.d.ts.map +1 -1
  86. package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts +72 -0
  87. package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts.map +1 -0
  88. package/dist/domain/featureFlags/mappers/index.d.ts +8 -0
  89. package/dist/domain/featureFlags/mappers/index.d.ts.map +1 -0
  90. package/dist/domain/featureFlags/module.d.ts +20 -0
  91. package/dist/domain/featureFlags/module.d.ts.map +1 -0
  92. package/dist/domain/featureFlags/provider.d.ts +40 -1
  93. package/dist/domain/featureFlags/provider.d.ts.map +1 -1
  94. package/dist/domain/featureFlags/providers/api.d.ts +59 -34
  95. package/dist/domain/featureFlags/providers/api.d.ts.map +1 -1
  96. package/dist/domain/featureFlags/providers/database.d.ts +59 -52
  97. package/dist/domain/featureFlags/providers/database.d.ts.map +1 -1
  98. package/dist/domain/featureFlags/providers/factory.d.ts +50 -33
  99. package/dist/domain/featureFlags/providers/factory.d.ts.map +1 -1
  100. package/dist/domain/featureFlags/providers/file.d.ts +48 -1
  101. package/dist/domain/featureFlags/providers/file.d.ts.map +1 -1
  102. package/dist/domain/featureFlags/providers/memory.d.ts +32 -6
  103. package/dist/domain/featureFlags/providers/memory.d.ts.map +1 -1
  104. package/dist/domain/featureFlags/providers/redis.d.ts +6 -1
  105. package/dist/domain/featureFlags/providers/redis.d.ts.map +1 -1
  106. package/dist/domain/featureFlags/service.d.ts +112 -0
  107. package/dist/domain/featureFlags/service.d.ts.map +1 -0
  108. package/dist/domain/index.d.ts +2 -0
  109. package/dist/domain/index.d.ts.map +1 -1
  110. package/dist/engine/featureFlags/engine.d.ts +8 -0
  111. package/dist/engine/featureFlags/engine.d.ts.map +1 -1
  112. package/dist/entry-backend.d.ts +24 -0
  113. package/dist/entry-backend.d.ts.map +1 -0
  114. package/dist/entry-backend.js +15635 -0
  115. package/dist/entry-backend.js.map +1 -0
  116. package/dist/entry-backend.mjs +15506 -0
  117. package/dist/entry-backend.mjs.map +1 -0
  118. package/dist/entry-frontend.d.ts +23 -0
  119. package/dist/entry-frontend.d.ts.map +1 -0
  120. package/dist/entry-frontend.js +11152 -0
  121. package/dist/entry-frontend.js.map +1 -0
  122. package/dist/entry-frontend.mjs +11089 -0
  123. package/dist/entry-frontend.mjs.map +1 -0
  124. package/dist/events/CoreEventManager.d.ts +116 -0
  125. package/dist/events/CoreEventManager.d.ts.map +1 -0
  126. package/dist/events/index.d.ts +27 -0
  127. package/dist/events/index.d.ts.map +1 -0
  128. package/dist/frontend/base/index.d.ts +8 -0
  129. package/dist/frontend/base/index.d.ts.map +1 -0
  130. package/dist/frontend/components/InitializationError.d.ts +25 -0
  131. package/dist/frontend/components/InitializationError.d.ts.map +1 -0
  132. package/dist/frontend/components/InitializationLoading.d.ts +22 -0
  133. package/dist/frontend/components/InitializationLoading.d.ts.map +1 -0
  134. package/dist/frontend/components/index.d.ts +9 -0
  135. package/dist/frontend/components/index.d.ts.map +1 -0
  136. package/dist/frontend/example/index.d.ts +9 -0
  137. package/dist/frontend/example/index.d.ts.map +1 -0
  138. package/dist/frontend/featureFlags/index.d.ts +28 -7
  139. package/dist/frontend/featureFlags/index.d.ts.map +1 -1
  140. package/dist/frontend/index.d.ts +5 -0
  141. package/dist/frontend/index.d.ts.map +1 -1
  142. package/dist/frontend/providers/ApiProvider.d.ts +41 -0
  143. package/dist/frontend/providers/ApiProvider.d.ts.map +1 -0
  144. package/dist/frontend/providers/PlyazProvider.d.ts +305 -0
  145. package/dist/frontend/providers/PlyazProvider.d.ts.map +1 -0
  146. package/dist/frontend/providers/index.d.ts +8 -0
  147. package/dist/frontend/providers/index.d.ts.map +1 -0
  148. package/dist/frontend/store/feature-flags.d.ts +63 -0
  149. package/dist/frontend/store/feature-flags.d.ts.map +1 -0
  150. package/dist/frontend/store/index.d.ts +14 -0
  151. package/dist/frontend/store/index.d.ts.map +1 -0
  152. package/dist/frontend/store/integrations.d.ts +36 -0
  153. package/dist/frontend/store/integrations.d.ts.map +1 -0
  154. package/dist/frontend/store/service-accessors.d.ts +78 -0
  155. package/dist/frontend/store/service-accessors.d.ts.map +1 -0
  156. package/dist/index.d.ts +6 -2
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +15450 -0
  159. package/dist/index.js.map +1 -0
  160. package/dist/index.mjs +13461 -2440
  161. package/dist/index.mjs.map +1 -1
  162. package/dist/init/CoreInitializer.d.ts +582 -0
  163. package/dist/init/CoreInitializer.d.ts.map +1 -0
  164. package/dist/init/ServiceRegistry.d.ts +256 -0
  165. package/dist/init/ServiceRegistry.d.ts.map +1 -0
  166. package/dist/init/index.d.ts +14 -0
  167. package/dist/init/index.d.ts.map +1 -0
  168. package/dist/init/nestjs/CoreModule.d.ts +63 -0
  169. package/dist/init/nestjs/CoreModule.d.ts.map +1 -0
  170. package/dist/init/nestjs/index.d.ts +5 -0
  171. package/dist/init/nestjs/index.d.ts.map +1 -0
  172. package/dist/init/nestjs/index.js +9059 -0
  173. package/dist/init/nestjs/index.js.map +1 -0
  174. package/dist/init/nestjs/index.mjs +9055 -0
  175. package/dist/init/nestjs/index.mjs.map +1 -0
  176. package/dist/init/react.d.ts +33 -0
  177. package/dist/init/react.d.ts.map +1 -0
  178. package/dist/models/example/ExampleRepository.d.ts +124 -0
  179. package/dist/models/example/ExampleRepository.d.ts.map +1 -0
  180. package/dist/models/example/index.d.ts +7 -0
  181. package/dist/models/example/index.d.ts.map +1 -0
  182. package/dist/models/featureFlags/FeatureFlagRepository.d.ts +560 -0
  183. package/dist/models/featureFlags/FeatureFlagRepository.d.ts.map +1 -0
  184. package/dist/models/featureFlags/index.d.ts +7 -0
  185. package/dist/models/featureFlags/index.d.ts.map +1 -0
  186. package/dist/models/index.d.ts +9 -0
  187. package/dist/models/index.d.ts.map +1 -0
  188. package/dist/services/ApiClientService.d.ts +178 -0
  189. package/dist/services/ApiClientService.d.ts.map +1 -0
  190. package/dist/services/CacheService.d.ts +176 -0
  191. package/dist/services/CacheService.d.ts.map +1 -0
  192. package/dist/services/DbService.d.ts +391 -0
  193. package/dist/services/DbService.d.ts.map +1 -0
  194. package/dist/services/NotificationService.d.ts +151 -0
  195. package/dist/services/NotificationService.d.ts.map +1 -0
  196. package/dist/services/StorageService.d.ts +144 -0
  197. package/dist/services/StorageService.d.ts.map +1 -0
  198. package/dist/services/index.d.ts +12 -0
  199. package/dist/services/index.d.ts.map +1 -0
  200. package/dist/utils/common/id.d.ts +83 -0
  201. package/dist/utils/common/id.d.ts.map +1 -0
  202. package/dist/utils/common/index.d.ts +3 -1
  203. package/dist/utils/common/index.d.ts.map +1 -1
  204. package/dist/utils/common/object.d.ts +70 -0
  205. package/dist/utils/common/object.d.ts.map +1 -0
  206. package/dist/utils/common/validation.d.ts +20 -0
  207. package/dist/utils/common/validation.d.ts.map +1 -0
  208. package/dist/utils/featureFlags/conditions.d.ts.map +1 -1
  209. package/dist/utils/featureFlags/context.d.ts +0 -1
  210. package/dist/utils/featureFlags/context.d.ts.map +1 -1
  211. package/dist/utils/index.d.ts +1 -0
  212. package/dist/utils/index.d.ts.map +1 -1
  213. package/dist/utils/mapperUtils.d.ts +38 -0
  214. package/dist/utils/mapperUtils.d.ts.map +1 -0
  215. package/dist/utils/runtime.d.ts +15 -0
  216. package/dist/utils/runtime.d.ts.map +1 -0
  217. package/dist/version.d.ts +24 -0
  218. package/dist/version.d.ts.map +1 -0
  219. package/dist/web_app/auth/add_user.d.ts +3 -0
  220. package/dist/web_app/auth/add_user.d.ts.map +1 -0
  221. package/dist/web_app/auth/update_user.d.ts +2 -0
  222. package/dist/web_app/auth/update_user.d.ts.map +1 -0
  223. package/package.json +102 -15
  224. package/dist/backend/featureFlags/feature-flag.repository.d.ts +0 -85
  225. package/dist/backend/featureFlags/feature-flag.repository.d.ts.map +0 -1
  226. package/dist/backend/featureFlags/feature-flag.service.d.ts +0 -123
  227. package/dist/backend/featureFlags/feature-flag.service.d.ts.map +0 -1
  228. package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts +0 -103
  229. package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts.map +0 -1
  230. package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts +0 -35
  231. package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts.map +0 -1
  232. package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts +0 -55
  233. package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts.map +0 -1
  234. package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts +0 -57
  235. package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts.map +0 -1
  236. package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts +0 -99
  237. package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts.map +0 -1
  238. package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts +0 -31
  239. package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts.map +0 -1
  240. package/dist/frontend/featureFlags/providers/types.d.ts +0 -21
  241. package/dist/frontend/featureFlags/providers/types.d.ts.map +0 -1
  242. package/dist/index.cjs +0 -4383
  243. package/dist/index.cjs.map +0 -1
@@ -0,0 +1,560 @@
1
+ /**
2
+ * Database Repository Implementation
3
+ *
4
+ * Database adapter integration with @plyaz/db for feature flag storage.
5
+ * Provides optimized queries and transaction management.
6
+ *
7
+ * @fileoverview Database repository for feature flags
8
+ */
9
+ import { type FeatureFlag, type FeatureFlagRule, type FeatureFlagValue, type CreateFlagRequest, type FeatureFlagContext } from '@plyaz/types';
10
+ import type { FeatureFlagKey } from '@domain/types';
11
+ import { type CoreFeatureFlagTableConfig } from '@plyaz/types/core';
12
+ /**
13
+ * Database Repository for Feature Flags
14
+ *
15
+ * **FOURTH COMPONENT CALLED** - Handles all database operations for feature flags
16
+ *
17
+ * **EXECUTION ORDER:**
18
+ * 1. FeatureFlagService.onModuleInit()
19
+ * 2. → FeatureFlagConfigFactory.fromOptions()
20
+ * 3. → DbService.initialize()
21
+ * 4. → **THIS REPOSITORY USED** ← YOU ARE HERE
22
+ * 5. → Database queries executed via @plyaz/db
23
+ *
24
+ * **PURPOSE:**
25
+ * - Executes optimized SQL queries using Drizzle ORM
26
+ * - Maps database rows to TypeScript types
27
+ * - Handles CRUD operations for flags, rules, evaluations, and overrides
28
+ * - Provides audit logging and user override functionality
29
+ *
30
+ * **PERFORMANCE FEATURES:**
31
+ * - Uses database indexes for fast queries
32
+ * - Batch operations where possible
33
+ * - Connection pooling via DatabaseConnectionManager
34
+ * - Optimized queries with proper WHERE clauses and ordering
35
+ *
36
+ * @template TKey - Feature flag key type (extends string)
37
+ *
38
+ * @example Basic Usage (automatically called by provider):
39
+ * ```typescript
40
+ * const repository = new FeatureFlagDatabaseRepository();
41
+ *
42
+ * // Get all flags (called during system initialization)
43
+ * const flags = await repository.getAllFlags();
44
+ *
45
+ * // Get specific flag (called during runtime evaluation)
46
+ * const flag = await repository.getFlag('PREMIUM_FEATURE');
47
+ *
48
+ * // Create new flag (called via admin API)
49
+ * const newFlag = await repository.createFlag({
50
+ * key: 'NEW_FEATURE',
51
+ * value: true,
52
+ * isEnabled: true,
53
+ * description: 'New awesome feature'
54
+ * });
55
+ * ```
56
+ *
57
+ * @example Query Performance:
58
+ * ```sql
59
+ * -- Optimized queries with indexes:
60
+ * SELECT * FROM feature_flags WHERE key = 'PREMIUM_FEATURE'; -- Uses primary key index
61
+ * SELECT * FROM feature_flag_rules WHERE flag_key = 'PREMIUM_FEATURE' AND is_enabled = true ORDER BY priority DESC; -- Uses composite index
62
+ * ```
63
+ */
64
+ export declare class FeatureFlagDatabaseRepository<TKey extends string = FeatureFlagKey> {
65
+ private readonly tableConfig;
66
+ /**
67
+ * Creates a new repository with optional custom table names.
68
+ *
69
+ * @param tableConfig - Optional custom table configuration
70
+ *
71
+ * @example Default tables
72
+ * ```typescript
73
+ * const repo = new FeatureFlagDatabaseRepository();
74
+ * // Uses: feature_flags, feature_flag_rules, feature_flag_evaluations, feature_flag_overrides
75
+ * ```
76
+ *
77
+ * @example Custom test tables
78
+ * ```typescript
79
+ * const repo = new FeatureFlagDatabaseRepository({
80
+ * flagsTable: 'test_feature_flags',
81
+ * rulesTable: 'test_feature_flag_rules',
82
+ * evaluationsTable: 'test_feature_flag_evaluations',
83
+ * overridesTable: 'test_feature_flag_overrides',
84
+ * evaluationsSchema: 'audit',
85
+ * });
86
+ * ```
87
+ */
88
+ constructor(tableConfig?: Partial<CoreFeatureFlagTableConfig>);
89
+ /**
90
+ * Gets the current table configuration.
91
+ */
92
+ getTableConfig(): CoreFeatureFlagTableConfig;
93
+ /**
94
+ * Gets the full table name including schema if needed.
95
+ */
96
+ private getEvaluationsTableName;
97
+ /**
98
+ * Gets the database service from DbService singleton
99
+ */
100
+ private getDb;
101
+ /**
102
+ * Retrieves all feature flags from the database with optional environment filtering
103
+ *
104
+ * @description Fetches all feature flags from the database. This method is primarily called
105
+ * during system initialization to load flags into cache, but can also be used for
106
+ * administrative purposes or cache refresh operations.
107
+ *
108
+ * @param {string} [environment] - Optional environment filter (e.g., 'production', 'staging')
109
+ * @returns {Promise<FeatureFlag<TKey>[]>} Array of feature flags matching the criteria
110
+ *
111
+ * @throws {Error} When database query fails critically
112
+ *
113
+ * @example
114
+ * ```typescript
115
+ * // Get all flags for system initialization
116
+ * const repository = new FeatureFlagDatabaseRepository();
117
+ * const allFlags = await repository.getAllFlags();
118
+ * console.log(`Loaded ${allFlags.length} feature flags`);
119
+ *
120
+ * // Get only production flags
121
+ * const prodFlags = await repository.getAllFlags('production');
122
+ * console.log(`Production flags: ${prodFlags.length}`);
123
+ *
124
+ * // Handle empty results
125
+ * const flags = await repository.getAllFlags('nonexistent');
126
+ * if (flags.length === 0) {
127
+ * console.log('No flags found for environment');
128
+ * }
129
+ * ```
130
+ *
131
+ */
132
+ getAllFlags(environment?: string): Promise<FeatureFlag<TKey>[]>;
133
+ /**
134
+ * Retrieves a specific feature flag by its key
135
+ *
136
+ * @description Fetches a single feature flag from the database using its unique key.
137
+ * This method is optimized for runtime flag evaluation and uses the primary key index
138
+ * for O(1) lookup performance.
139
+ *
140
+ * @param {TKey} key - The unique identifier of the feature flag to retrieve
141
+ * @returns {Promise<FeatureFlag<TKey> | null>} The feature flag object or null if not found
142
+ *
143
+ * @throws {Error} When database operation fails
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * const repository = new FeatureFlagDatabaseRepository();
148
+ *
149
+ * // Get a specific flag for evaluation
150
+ * const premiumFlag = await repository.getFlag('PREMIUM_FEATURE');
151
+ * if (premiumFlag) {
152
+ * console.log(`Flag enabled: ${premiumFlag.isEnabled}`);
153
+ * console.log(`Flag value:`, premiumFlag.value);
154
+ * } else {
155
+ * console.log('Flag not found');
156
+ * }
157
+ *
158
+ * // Handle flag evaluation
159
+ * const checkoutFlag = await repository.getFlag('NEW_CHECKOUT');
160
+ * const isNewCheckoutEnabled = checkoutFlag?.isEnabled ?? false;
161
+ * ```
162
+ *
163
+ */
164
+ getFlag(key: TKey): Promise<FeatureFlag<TKey> | null>;
165
+ /**
166
+ * Creates a new feature flag in the database
167
+ *
168
+ * @description Creates a new feature flag record with the provided configuration.
169
+ * This method is typically called through administrative interfaces or during
170
+ * system setup and migration processes.
171
+ *
172
+ * @param {CreateFlagRequest<TKey>} data - The feature flag creation data
173
+ * @returns {Promise<FeatureFlag<TKey>>} The created feature flag object
174
+ *
175
+ * @throws {Error} When flag key already exists (primary key constraint violation)
176
+ * @throws {Error} When database operation fails
177
+ *
178
+ * @example
179
+ * ```typescript
180
+ * const repository = new FeatureFlagDatabaseRepository();
181
+ *
182
+ * // Create a simple boolean flag
183
+ * const simpleFlag = await repository.createFlag({
184
+ * key: 'ENABLE_DARK_MODE',
185
+ * value: true,
186
+ * isEnabled: true,
187
+ * environment: 'production',
188
+ * description: 'Enable dark mode theme'
189
+ * });
190
+ *
191
+ * // Create a complex flag with object value
192
+ * const complexFlag = await repository.createFlag({
193
+ * key: 'CHECKOUT_CONFIG',
194
+ * value: {
195
+ * variant: 'blue',
196
+ * showPromo: true,
197
+ * maxItems: 10
198
+ * },
199
+ * isEnabled: false,
200
+ * environment: 'staging',
201
+ * description: 'Checkout page configuration'
202
+ * });
203
+ *
204
+ * console.log(`Created flag: ${simpleFlag.key}`);
205
+ * ```
206
+ *
207
+ */
208
+ createFlag(data: CreateFlagRequest<TKey>): Promise<FeatureFlag<TKey>>;
209
+ /**
210
+ * Updates an existing feature flag in the database
211
+ *
212
+ * @description Updates specific fields of an existing feature flag. Only provided
213
+ * fields will be updated, leaving other fields unchanged. The updated_at timestamp
214
+ * is automatically set to the current time.
215
+ *
216
+ * @param {TKey} key - The unique identifier of the feature flag to update
217
+ * @param {Partial<CreateFlagRequest<TKey>>} data - Partial flag data to update
218
+ * @returns {Promise<FeatureFlag<TKey>>} The updated feature flag object
219
+ *
220
+ * @throws {Error} When flag with the specified key is not found
221
+ * @throws {Error} When database operation fails
222
+ *
223
+ * @example
224
+ * ```typescript
225
+ * const repository = new FeatureFlagDatabaseRepository();
226
+ *
227
+ * // Enable a flag
228
+ * const enabledFlag = await repository.updateFlag('BETA_FEATURE', {
229
+ * isEnabled: true
230
+ * });
231
+ *
232
+ * // Update flag value and description
233
+ * const updatedFlag = await repository.updateFlag('CHECKOUT_CONFIG', {
234
+ * value: { variant: 'green', showPromo: false },
235
+ * description: 'Updated checkout configuration'
236
+ * });
237
+ *
238
+ * // Change environment
239
+ * const prodFlag = await repository.updateFlag('NEW_FEATURE', {
240
+ * environment: 'production'
241
+ * });
242
+ *
243
+ * console.log(`Updated flag: ${updatedFlag.key}`);
244
+ * ```
245
+ *
246
+ */
247
+ updateFlag(key: TKey, data: Partial<CreateFlagRequest<TKey>>): Promise<FeatureFlag<TKey>>;
248
+ /**
249
+ * Infers the type of a given value as a string for the type field
250
+ * @param value Unknown value
251
+ * @returns Inferred type as string
252
+ */
253
+ private toTypeField;
254
+ /**
255
+ * Deletes a feature flag from the database
256
+ *
257
+ * @description Permanently removes a feature flag from the database. This operation
258
+ * cannot be undone. All associated rules, evaluations, and overrides should be
259
+ * cleaned up separately if needed.
260
+ *
261
+ * @param {TKey} key - The unique identifier of the feature flag to delete
262
+ * @returns {Promise<void>} Promise that resolves when deletion is complete
263
+ *
264
+ * @throws {Error} When flag with the specified key is not found
265
+ * @throws {Error} When database operation fails
266
+ *
267
+ * @example
268
+ * ```typescript
269
+ * const repository = new FeatureFlagDatabaseRepository();
270
+ *
271
+ * // Delete a flag
272
+ * try {
273
+ * await repository.deleteFlag('OLD_FEATURE');
274
+ * console.log('Flag deleted successfully');
275
+ * } catch (error) {
276
+ * console.error('Failed to delete flag:', error.message);
277
+ * }
278
+ *
279
+ * // Verify deletion
280
+ * const deletedFlag = await repository.getFlag('OLD_FEATURE');
281
+ * console.log(deletedFlag === null); // true
282
+ * ```
283
+ *
284
+ */
285
+ deleteFlag(key: TKey): Promise<void>;
286
+ /**
287
+ * Retrieves all rules associated with a specific feature flag
288
+ *
289
+ * @description Fetches all rules configured for a specific feature flag, ordered by
290
+ * priority in descending order. Rules are used for advanced flag evaluation logic
291
+ * based on user context and conditions.
292
+ *
293
+ * @param {TKey} key - The feature flag key to get rules for
294
+ * @returns {Promise<FeatureFlagRule<TKey>[]>} Array of rules for the specified flag
295
+ *
296
+ * @example
297
+ * ```typescript
298
+ * const repository = new FeatureFlagDatabaseRepository();
299
+ *
300
+ * // Get rules for a flag
301
+ * const rules = await repository.getFlagRules('PREMIUM_FEATURE');
302
+ * console.log(`Found ${rules.length} rules`);
303
+ *
304
+ * // Process rules by priority
305
+ * rules.forEach(rule => {
306
+ * console.log(`Rule: ${rule.name}, Priority: ${rule.priority}`);
307
+ * });
308
+ * ```
309
+ *
310
+ */
311
+ getFlagRules(key: TKey): Promise<FeatureFlagRule<TKey>[]>;
312
+ /**
313
+ * Retrieves all enabled feature flag rules from the database
314
+ *
315
+ * @description Fetches all enabled rules across all feature flags, sorted by flag key
316
+ * and then by priority. This method is used during system initialization to load
317
+ * all active rules into the evaluation engine.
318
+ *
319
+ * @returns {Promise<FeatureFlagRule<TKey>[]>} Array of all enabled rules
320
+ *
321
+ * @example
322
+ * ```typescript
323
+ * const repository = new FeatureFlagDatabaseRepository();
324
+ *
325
+ * // Load all rules for evaluation engine
326
+ * const allRules = await repository.getAllRules();
327
+ * console.log(`Loaded ${allRules.length} active rules`);
328
+ *
329
+ * // Group rules by flag
330
+ * const rulesByFlag = allRules.reduce((acc, rule) => {
331
+ * if (!acc[rule.flagKey]) acc[rule.flagKey] = [];
332
+ * acc[rule.flagKey].push(rule);
333
+ * return acc;
334
+ * }, {});
335
+ * ```
336
+ *
337
+ */
338
+ getAllRules(): Promise<FeatureFlagRule<TKey>[]>;
339
+ /**
340
+ * Logs a feature flag evaluation for audit and analytics purposes
341
+ *
342
+ * @description Records feature flag evaluation events for compliance tracking,
343
+ * debugging, and analytics. This method is called after each flag evaluation
344
+ * when audit logging is enabled.
345
+ *
346
+ * @param {Object} params - The evaluation parameters
347
+ * @param {TKey} params.flagKey - The feature flag key that was evaluated
348
+ * @param {string} [params.userId] - Optional user ID who triggered the evaluation
349
+ * @param {FeatureFlagContext} [params.context] - Optional evaluation context
350
+ * @param {FeatureFlagValue} params.result - The evaluation result
351
+ * @returns {Promise<void>} Promise that resolves when log entry is created
352
+ *
353
+ * @example
354
+ * ```typescript
355
+ * const repository = new FeatureFlagDatabaseRepository();
356
+ *
357
+ * // Log a user evaluation
358
+ * await repository.logEvaluation({
359
+ * flagKey: 'PREMIUM_FEATURE',
360
+ * userId: 'user123',
361
+ * context: {
362
+ * userRole: 'premium',
363
+ * environment: 'production',
364
+ * requestId: 'req-456'
365
+ * },
366
+ * result: true
367
+ * });
368
+ *
369
+ * // Log anonymous evaluation
370
+ * await repository.logEvaluation({
371
+ * flagKey: 'PUBLIC_FEATURE',
372
+ * result: { variant: 'blue', enabled: true }
373
+ * });
374
+ * ```
375
+ *
376
+ */
377
+ logEvaluation(params: {
378
+ flagKey: TKey;
379
+ userId?: string;
380
+ context?: FeatureFlagContext;
381
+ result: FeatureFlagValue;
382
+ }): Promise<void>;
383
+ /**
384
+ * Sets a user-specific override for a feature flag
385
+ *
386
+ * @description Creates a user-specific override that takes precedence over the
387
+ * default flag value and rules. Overrides can have optional expiration times
388
+ * and are useful for testing, gradual rollouts, or user-specific configurations.
389
+ *
390
+ * @param {TKey} flagKey - The feature flag key to override
391
+ * @param {string} userId - The user ID for whom to set the override
392
+ * @param {FeatureFlagValue} value - The override value
393
+ * @param {Date} [expiresAt] - Optional expiration date for the override
394
+ * @returns {Promise<void>} Promise that resolves when override is created
395
+ *
396
+ * @example
397
+ * ```typescript
398
+ * const repository = new FeatureFlagDatabaseRepository();
399
+ *
400
+ * // Set permanent override
401
+ * await repository.setOverride(
402
+ * 'BETA_FEATURE',
403
+ * 'user123',
404
+ * true
405
+ * );
406
+ *
407
+ * // Set temporary override (expires in 1 hour)
408
+ * const expiresAt = new Date(Date.now() + 60 * 60 * 1000);
409
+ * await repository.setOverride(
410
+ * 'PREMIUM_FEATURE',
411
+ * 'testuser456',
412
+ * { enabled: true, variant: 'premium' },
413
+ * expiresAt
414
+ * );
415
+ * ```
416
+ *
417
+ */
418
+ setOverride(flagKey: TKey, userId: string, value: FeatureFlagValue, expiresAt?: Date): Promise<void>;
419
+ /**
420
+ * Retrieves a user-specific override for a feature flag
421
+ *
422
+ * @description Fetches the override value for a specific user and flag combination.
423
+ * Automatically filters out expired overrides. Returns null if no valid override
424
+ * exists for the user.
425
+ *
426
+ * @param {TKey} flagKey - The feature flag key to check for overrides
427
+ * @param {string} userId - The user ID to get the override for
428
+ * @returns {Promise<FeatureFlagValue | null>} The override value or null if none exists
429
+ *
430
+ * @example
431
+ * ```typescript
432
+ * const repository = new FeatureFlagDatabaseRepository();
433
+ *
434
+ * // Check for user override
435
+ * const override = await repository.getOverride('BETA_FEATURE', 'user123');
436
+ * if (override !== null) {
437
+ * console.log('User has override:', override);
438
+ * } else {
439
+ * console.log('No override found, using default flag value');
440
+ * }
441
+ *
442
+ * // Use in flag evaluation
443
+ * const userOverride = await repository.getOverride('PREMIUM_FEATURE', userId);
444
+ * const flagValue = userOverride ?? defaultFlagValue;
445
+ * ```
446
+ *
447
+ */
448
+ getOverride(flagKey: TKey, userId: string): Promise<FeatureFlagValue | null>;
449
+ /**
450
+ * Removes user-specific overrides for a feature flag
451
+ *
452
+ * @description Deletes all override records for a specific user and flag combination.
453
+ * This operation cannot be undone and will cause the user to receive the default
454
+ * flag value or rule-based evaluation on subsequent requests.
455
+ *
456
+ * @param {TKey} flagKey - The feature flag key to remove overrides for
457
+ * @param {string} userId - The user ID to remove overrides for
458
+ * @returns {Promise<void>} Promise that resolves when overrides are removed
459
+ *
460
+ * @example
461
+ * ```typescript
462
+ * const repository = new FeatureFlagDatabaseRepository();
463
+ *
464
+ * // Remove user override
465
+ * await repository.removeOverride('BETA_FEATURE', 'user123');
466
+ * console.log('Override removed, user will get default flag value');
467
+ *
468
+ * // Verify removal
469
+ * const override = await repository.getOverride('BETA_FEATURE', 'user123');
470
+ * console.log(override === null); // true
471
+ *
472
+ * // Bulk cleanup - remove overrides for multiple users
473
+ * const userIds = ['user1', 'user2', 'user3'];
474
+ * for (const userId of userIds) {
475
+ * await repository.removeOverride('OLD_FEATURE', userId);
476
+ * }
477
+ * ```
478
+ *
479
+ */
480
+ removeOverride(flagKey: TKey, userId: string): Promise<void>;
481
+ /**
482
+ * Maps a database row to a FeatureFlag object
483
+ *
484
+ * @description Converts raw database row data to a properly typed FeatureFlag object.
485
+ * Handles field name variations between database schema and application types,
486
+ * provides default values for missing fields, and ensures type safety.
487
+ *
488
+ * @private
489
+ * @param {DatabaseFeatureFlagRow} row - Raw database row data
490
+ * @returns {FeatureFlag<TKey>} Typed FeatureFlag object
491
+ *
492
+ * @example
493
+ * ```typescript
494
+ * // Database row input:
495
+ * const dbRow = {
496
+ * key: 'PREMIUM_FEATURE',
497
+ * value: { enabled: true, variant: 'blue' },
498
+ * is_enabled: true,
499
+ * environments: ['production'],
500
+ * description: 'Premium feature toggle',
501
+ * created_at: '2024-01-15T10:30:00Z'
502
+ * };
503
+ *
504
+ * // Mapped output:
505
+ * const flag = this.mapToFeatureFlag(dbRow);
506
+ * // {
507
+ * // key: 'PREMIUM_FEATURE',
508
+ * // type: 'boolean',
509
+ * // name: 'PREMIUM_FEATURE',
510
+ * // value: { enabled: true, variant: 'blue' },
511
+ * // isEnabled: true,
512
+ * // environment: 'production',
513
+ * // description: 'Premium feature toggle',
514
+ * // createdAt: Date('2024-01-15T10:30:00Z'),
515
+ * // updatedAt: Date('2024-01-15T10:30:00Z'),
516
+ * // createdBy: 'system',
517
+ * // updatedBy: 'system'
518
+ * // }
519
+ * ```
520
+ *
521
+ */
522
+ private mapToFeatureFlag;
523
+ /**
524
+ * Extracts the enabled status from a database row
525
+ *
526
+ * @private
527
+ * @param {DatabaseFeatureFlagRow} row - Database row with enabled field variations
528
+ * @returns {boolean} The enabled status, defaulting to true if not specified
529
+ */
530
+ private getIsEnabled;
531
+ /**
532
+ * Extracts the creation date from a database row
533
+ *
534
+ * @private
535
+ * @param {DatabaseFeatureFlagRow} row - Database row with creation date field variations
536
+ * @returns {Date} The creation date, defaulting to current date if not specified
537
+ */
538
+ private getCreatedAt;
539
+ /**
540
+ * Extracts the update date from a database row
541
+ *
542
+ * @private
543
+ * @param {DatabaseFeatureFlagRow} row - Database row with update date field variations
544
+ * @returns {Date} The update date, defaulting to current date if not specified
545
+ */
546
+ private getUpdatedAt;
547
+ /**
548
+ * Maps a database row to a FeatureFlagRule object
549
+ *
550
+ * @description Converts raw database rule row data to a properly typed FeatureFlagRule object.
551
+ * Handles field name variations and ensures type safety for rule evaluation.
552
+ *
553
+ * @private
554
+ * @param {DatabaseFeatureFlagRuleRow} row - Raw database rule row data
555
+ * @returns {FeatureFlagRule<TKey>} Typed FeatureFlagRule object
556
+ *
557
+ */
558
+ private mapToFeatureFlagRule;
559
+ }
560
+ //# sourceMappingURL=FeatureFlagRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeatureFlagRepository.d.ts","sourceRoot":"","sources":["../../../src/models/featureFlags/FeatureFlagRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Feature Flags Models/Repositories
3
+ *
4
+ * Data access layer for feature flags.
5
+ */
6
+ export { FeatureFlagDatabaseRepository } from './FeatureFlagRepository';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/models/featureFlags/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Models/Repositories
3
+ *
4
+ * Centralized data access layer organized by domain.
5
+ * Repositories use DbService when initialized, fall back to dummy data otherwise.
6
+ */
7
+ export * from './example';
8
+ export * from './featureFlags';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC"}