1
1
import type { Request , Response } from 'express' ;
2
2
import Controller from '../../routes/controller' ;
3
- import { type IUnleashConfig , type IUnleashServices , NONE } from '../../types' ;
3
+ import {
4
+ type IFlagResolver ,
5
+ type IUnleashConfig ,
6
+ type IUnleashServices ,
7
+ type IUser ,
8
+ NONE ,
9
+ } from '../../types' ;
4
10
import type { Logger } from '../../logger' ;
5
- import type { IApiUser } from '../../types/api-user' ;
11
+ import ApiUser , { type IApiUser } from '../../types/api-user' ;
6
12
import {
7
13
type ClientMetricsSchema ,
8
14
createRequestSchema ,
9
15
createResponseSchema ,
10
16
emptyResponse ,
11
- getStandardResponses ,
12
17
type FrontendApiClientSchema ,
13
18
frontendApiFeaturesSchema ,
14
19
type FrontendApiFeaturesSchema ,
20
+ getStandardResponses ,
15
21
} from '../../openapi' ;
16
22
import type { Context } from 'unleash-client' ;
17
23
import { enrichContextWithIp } from './index' ;
@@ -34,7 +40,10 @@ interface ApiUserRequest<
34
40
35
41
type Services = Pick <
36
42
IUnleashServices ,
37
- 'settingService' | 'frontendApiService' | 'openApiService'
43
+ | 'settingService'
44
+ | 'frontendApiService'
45
+ | 'openApiService'
46
+ | 'clientInstanceService'
38
47
> ;
39
48
40
49
export default class FrontendAPIController extends Controller {
@@ -44,10 +53,13 @@ export default class FrontendAPIController extends Controller {
44
53
45
54
private timer : Function ;
46
55
56
+ private flagResolver : IFlagResolver ;
57
+
47
58
constructor ( config : IUnleashConfig , services : Services ) {
48
59
super ( config ) ;
49
60
this . logger = config . getLogger ( 'frontend-api-controller.ts' ) ;
50
61
this . services = services ;
62
+ this . flagResolver = config . flagResolver ;
51
63
52
64
this . timer = ( functionName : string ) =>
53
65
metricsHelper . wrapTimer ( config . eventBus , FUNCTION_TIME , {
@@ -216,6 +228,13 @@ export default class FrontendAPIController extends Controller {
216
228
) ;
217
229
}
218
230
231
+ private resolveProject ( user : IUser | IApiUser ) {
232
+ if ( user instanceof ApiUser ) {
233
+ return user . projects ;
234
+ }
235
+ return [ 'default' ] ;
236
+ }
237
+
219
238
private async registerFrontendApiMetrics (
220
239
req : ApiUserRequest < unknown , unknown , ClientMetricsSchema > ,
221
240
res : Response ,
@@ -229,11 +248,29 @@ export default class FrontendAPIController extends Controller {
229
248
return ;
230
249
}
231
250
232
- await this . services . frontendApiService . registerFrontendApiMetrics (
233
- req . user ,
234
- req . body ,
235
- req . ip ,
236
- ) ;
251
+ const environment =
252
+ await this . services . frontendApiService . registerFrontendApiMetrics (
253
+ req . user ,
254
+ req . body ,
255
+ req . ip ,
256
+ ) ;
257
+
258
+ if (
259
+ req . body . instanceId &&
260
+ req . headers [ 'unleash-sdk' ] &&
261
+ this . flagResolver . isEnabled ( 'registerFrontendClient' )
262
+ ) {
263
+ const client = {
264
+ appName : req . body . appName ,
265
+ instanceId : req . body . instanceId ,
266
+ sdkVersion : req . headers [ 'unleash-sdk' ] as string ,
267
+ sdkType : 'frontend' as const ,
268
+ environment : environment ,
269
+ projects : this . resolveProject ( req . user ) ,
270
+ } ;
271
+ this . services . clientInstanceService . registerFrontendClient ( client ) ;
272
+ }
273
+
237
274
res . sendStatus ( 200 ) ;
238
275
}
239
276
0 commit comments