1
- import { find } from 'lodash' ;
1
+ import { find , forEach } from 'lodash' ;
2
2
import { Injectable , Logger } from '@nestjs/common' ;
3
3
import { FeatureRepository } from 'src/modules/feature/repositories/feature.repository' ;
4
4
import { FeatureServerEvents , FeatureStorage } from 'src/modules/feature/constants' ;
@@ -7,6 +7,7 @@ import { FeatureFlagProvider } from 'src/modules/feature/providers/feature-flag/
7
7
import { EventEmitter2 , OnEvent } from '@nestjs/event-emitter' ;
8
8
import { FeatureAnalytics } from 'src/modules/feature/feature.analytics' ;
9
9
import { knownFeatures } from 'src/modules/feature/constants/known-features' ;
10
+ import { Feature } from 'src/modules/feature/model/feature' ;
10
11
11
12
@Injectable ( )
12
13
export class FeatureService {
@@ -38,14 +39,14 @@ export class FeatureService {
38
39
/**
39
40
* Returns list of features flags
40
41
*/
41
- async list ( ) {
42
+ async list ( ) : Promise < { features : Record < string , Feature > } > {
42
43
this . logger . log ( 'Getting features list' ) ;
43
44
44
45
const features = { } ;
45
46
46
47
const featuresFromDatabase = await this . repository . list ( ) ;
47
48
48
- knownFeatures . forEach ( ( feature ) => {
49
+ forEach ( knownFeatures , ( feature ) => {
49
50
// todo: implement various storage strategies support with next features
50
51
switch ( feature ?. storage ) {
51
52
case FeatureStorage . Database : {
@@ -54,6 +55,8 @@ export class FeatureService {
54
55
features [ feature . name ] = {
55
56
name : dbFeature . name ,
56
57
flag : dbFeature . flag ,
58
+ strategy : dbFeature . strategy || undefined ,
59
+ data : dbFeature . data || undefined ,
57
60
} ;
58
61
}
59
62
break ;
@@ -66,14 +69,6 @@ export class FeatureService {
66
69
}
67
70
} ) ;
68
71
69
- try {
70
- this . analytics . sendFeatureFlagRecalculated ( {
71
- configVersion : ( await this . featuresConfigRepository . getOrCreate ( ) ) ?. data ?. version ,
72
- features,
73
- } ) ;
74
- } catch ( e ) {
75
- // ignore telemetry error
76
- }
77
72
return { features } ;
78
73
}
79
74
@@ -97,10 +92,11 @@ export class FeatureService {
97
92
this . logger . debug ( 'Recalculating features flags for new config' , featuresConfig ) ;
98
93
99
94
await Promise . all ( Array . from ( featuresConfig ?. data ?. features || new Map ( ) , async ( [ name , feature ] ) => {
100
- actions . toUpsert . push ( {
101
- name,
102
- flag : await this . featureFlagProvider . calculate ( name , feature ) ,
103
- } ) ;
95
+ if ( knownFeatures [ name ] ) {
96
+ actions . toUpsert . push ( {
97
+ ...( await this . featureFlagProvider . calculate ( knownFeatures [ name ] , feature ) ) ,
98
+ } ) ;
99
+ }
104
100
} ) ) ;
105
101
106
102
// calculate to delete features
@@ -115,7 +111,17 @@ export class FeatureService {
115
111
`Features flags recalculated. Updated: ${ actions . toUpsert . length } deleted: ${ actions . toDelete . length } ` ,
116
112
) ;
117
113
118
- this . eventEmitter . emit ( FeatureServerEvents . FeaturesRecalculated , await this . list ( ) ) ;
114
+ const list = await this . list ( ) ;
115
+ this . eventEmitter . emit ( FeatureServerEvents . FeaturesRecalculated , list ) ;
116
+
117
+ try {
118
+ this . analytics . sendFeatureFlagRecalculated ( {
119
+ configVersion : ( await this . featuresConfigRepository . getOrCreate ( ) ) ?. data ?. version ,
120
+ features : list . features ,
121
+ } ) ;
122
+ } catch ( e ) {
123
+ // ignore telemetry error
124
+ }
119
125
} catch ( e ) {
120
126
this . logger . error ( 'Unable to recalculate features flags' , e ) ;
121
127
}
0 commit comments