@@ -34,10 +34,13 @@ import {
34
34
EnvironmentListHelmResponse ,
35
35
UserGroupApproverType ,
36
36
ImageApprovalPolicyUserGroupDataType ,
37
- ManualApprovalType ,
38
- UserApprovalConfigType ,
37
+ ImageApprovalPolicyType ,
38
+ ImageApprovalUsersInfoDTO ,
39
39
} from './Types'
40
40
import { ApiResourceType } from '../Pages'
41
+ import { getIsManualApprovalSpecific , sanitizeUserApprovalConfig , stringComparatorBySortOrder } from '@Shared/Helpers'
42
+ import { API_TOKEN_PREFIX } from '@Shared/constants'
43
+ import { DefaultUserKey } from '@Shared/types'
41
44
42
45
export const getTeamListMin = ( ) : Promise < TeamList > => {
43
46
// ignore active field
@@ -84,7 +87,13 @@ export function setImageTags(request, pipelineId: number, artifactId: number) {
84
87
return post ( `${ ROUTES . IMAGE_TAGGING } /${ pipelineId } /${ artifactId } ` , request )
85
88
}
86
89
87
- const cdMaterialListModal = ( artifacts : any [ ] , offset : number , artifactId ?: number , artifactStatus ?: string , disableDefaultSelection ?: boolean ) => {
90
+ const cdMaterialListModal = (
91
+ artifacts : any [ ] ,
92
+ offset : number ,
93
+ artifactId ?: number ,
94
+ artifactStatus ?: string ,
95
+ disableDefaultSelection ?: boolean ,
96
+ ) => {
88
97
if ( ! artifacts || ! artifacts . length ) return [ ]
89
98
90
99
const markFirstSelected = offset === 0
@@ -173,29 +182,91 @@ const cdMaterialListModal = (artifacts: any[], offset: number, artifactId?: numb
173
182
return materials
174
183
}
175
184
176
- const SPECIFIC_EMAILS = [
177
- 'specific-email-1@devtron.ai' ,
178
- 'specific-email-2@devtron.ai' ,
179
- 'specific-email-3@devtron.ai' ,
180
- 'specific-email-4@devtron.ai' ,
181
- ]
182
-
183
- const VALID_GROUPS = [
184
- 'managers' ,
185
- 'security' ,
186
- 'devops' ,
187
- 'developers' ,
188
- ]
189
-
190
- export const sanitizeUserApprovalConfig = ( userApprovalConfig : UserApprovalConfigType ) : UserApprovalConfigType => ( {
191
- requiredCount : userApprovalConfig ?. requiredCount ?? 0 ,
192
- type : userApprovalConfig ?. type ?? ManualApprovalType . notConfigured ,
193
- specificUsers : {
194
- identifiers : userApprovalConfig ?. specificUsers ?. identifiers ?? [ ] ,
195
- requiredCount : userApprovalConfig ?. specificUsers ?. identifiers ?. length ?? 0 ,
196
- } ,
197
- userGroups : userApprovalConfig ?. userGroups ?? [ ] ,
198
- } )
185
+ const getImageApprovalPolicyDetailsFromMaterialResult = ( cdMaterialsResult ) : ImageApprovalPolicyType => {
186
+ const approvalUsers : string [ ] = cdMaterialsResult . approvalUsers || [ ]
187
+ const userApprovalConfig = sanitizeUserApprovalConfig ( cdMaterialsResult . userApprovalConfig )
188
+ const isPolicyConfigured = getIsManualApprovalSpecific ( userApprovalConfig )
189
+ const imageApprovalUsersInfo : ImageApprovalUsersInfoDTO = cdMaterialsResult . imageApprovalUsersInfo || { }
190
+
191
+ const approvalUsersMap = approvalUsers . reduce (
192
+ ( acc , user ) => {
193
+ acc [ user ] = true
194
+ return acc
195
+ } ,
196
+ { } as Record < string , true > ,
197
+ )
198
+
199
+ const specificUsersAPIToken = userApprovalConfig . specificUsers . identifiers
200
+ . filter ( ( user ) => user . startsWith ( API_TOKEN_PREFIX ) )
201
+ . sort ( stringComparatorBySortOrder )
202
+ const specificUsersEmails = userApprovalConfig . specificUsers . identifiers
203
+ . filter ( ( user ) => ! user . startsWith ( API_TOKEN_PREFIX ) && user !== DefaultUserKey . system )
204
+ . sort ( stringComparatorBySortOrder )
205
+
206
+ const specificUsersData : ImageApprovalPolicyType [ 'specificUsersData' ] = {
207
+ dataStore : userApprovalConfig . specificUsers . identifiers . reduce (
208
+ ( acc , email ) => {
209
+ acc [ email ] = {
210
+ email,
211
+ hasAccess : approvalUsersMap [ email ] ?? false ,
212
+ }
213
+ return acc
214
+ } ,
215
+ { } as Record < string , UserGroupApproverType > ,
216
+ ) ,
217
+ requiredCount : userApprovalConfig . specificUsers . requiredCount ,
218
+ emails : specificUsersEmails . concat ( specificUsersAPIToken ) ,
219
+ }
220
+
221
+ const validGroups = userApprovalConfig . userGroups . map ( ( group ) => group . identifier )
222
+
223
+ const usersList = Object . keys ( imageApprovalUsersInfo ) . filter ( ( user ) => user !== DefaultUserKey . system )
224
+ const userToGroupMap = usersList . reduce (
225
+ ( acc , user ) => {
226
+ const userGroups = imageApprovalUsersInfo [ user ] || [ ]
227
+ userGroups . forEach ( ( group ) => {
228
+ if ( ! acc [ group . identifier ] ) {
229
+ acc [ group . identifier ] = { }
230
+ }
231
+ acc [ group . identifier ] [ user ] = true
232
+ } )
233
+ return acc
234
+ } ,
235
+ { } as Record < string , Record < string , true > > ,
236
+ )
237
+
238
+ return {
239
+ isPolicyConfigured,
240
+ specificUsersData,
241
+ userGroupData : userApprovalConfig . userGroups . reduce (
242
+ ( acc , group ) => {
243
+ const identifier = group . identifier
244
+ // No need of handling api tokens here since they are not part of user groups
245
+ const users = Object . keys ( userToGroupMap [ identifier ] || { } ) . sort ( stringComparatorBySortOrder )
246
+
247
+ acc [ identifier ] = {
248
+ dataStore : users . reduce (
249
+ ( acc , user ) => {
250
+ acc [ user ] = {
251
+ email : user ,
252
+ hasAccess : approvalUsersMap [ user ] ?? false ,
253
+ }
254
+ return acc
255
+ } ,
256
+ { } as Record < string , UserGroupApproverType > ,
257
+ ) ,
258
+ requiredCount : group . requiredCount ,
259
+ emails : users ,
260
+ }
261
+
262
+ return acc
263
+ } ,
264
+ { } as Record < string , ImageApprovalPolicyUserGroupDataType > ,
265
+ ) ,
266
+ // Not sorting since would change them in approval info modal to name
267
+ validGroups,
268
+ }
269
+ }
199
270
200
271
const processCDMaterialsApprovalInfo = ( enableApproval : boolean , cdMaterialsResult ) : CDMaterialsApprovalInfo => {
201
272
if ( ! enableApproval || ! cdMaterialsResult ) {
@@ -211,41 +282,7 @@ const processCDMaterialsApprovalInfo = (enableApproval: boolean, cdMaterialsResu
211
282
approvalUsers : cdMaterialsResult . approvalUsers ,
212
283
userApprovalConfig : sanitizeUserApprovalConfig ( cdMaterialsResult . userApprovalConfig ) ,
213
284
canApproverDeploy : cdMaterialsResult . canApproverDeploy ?? false ,
214
- imageApprovalPolicyDetails : {
215
- isPolicyConfigured : true ,
216
- specificUsersData : {
217
- dataStore : SPECIFIC_EMAILS . reduce ( ( acc , email , index ) => {
218
- acc [ email ] = {
219
- email,
220
- hasAccess : index % 2 === 0 ,
221
- }
222
- return acc
223
- } , { } as Record < string , UserGroupApproverType > ) ,
224
- requiredCount : SPECIFIC_EMAILS . length ,
225
- // TODO: Sort these arrays
226
- emails : SPECIFIC_EMAILS ,
227
- } ,
228
- userGroupData : VALID_GROUPS . reduce ( ( acc , userGroup ) => {
229
- // TODO: Sort these arrays
230
- const emails = [ `${ userGroup } -1@devtron.ai` , `${ userGroup } -2@devtron.ai` , `${ userGroup } -3@devtron.ai` ]
231
-
232
- acc [ userGroup ] = {
233
- dataStore : emails . reduce ( ( acc , email , index ) => {
234
- acc [ email ] = {
235
- email,
236
- hasAccess : index % 2 === 0 ,
237
- }
238
- return acc
239
- } , { } as Record < string , UserGroupApproverType > ) ,
240
- requiredCount : emails . length ,
241
- emails,
242
- }
243
- return acc
244
- } , { } as Record < string , ImageApprovalPolicyUserGroupDataType > ) ,
245
- // TODO: getUserGroupList
246
- // TODO: Sort these arrays
247
- validGroups : VALID_GROUPS ,
248
- }
285
+ imageApprovalPolicyDetails : getImageApprovalPolicyDetailsFromMaterialResult ( cdMaterialsResult ) ,
249
286
}
250
287
}
251
288
@@ -430,8 +467,8 @@ export const getResourceGroupListRaw = (clusterId: string): Promise<ResponseType
430
467
}
431
468
432
469
export function getNamespaceListMin ( clusterIdsCsv : string ) : Promise < EnvironmentListHelmResponse > {
433
- const URL = `${ ROUTES . NAMESPACE } /autocomplete?ids=${ clusterIdsCsv } `
434
- return get ( URL )
470
+ const URL = `${ ROUTES . NAMESPACE } /autocomplete?ids=${ clusterIdsCsv } `
471
+ return get ( URL )
435
472
}
436
473
export function getWebhookEventsForEventId ( eventId : string | number ) {
437
474
const URL = `${ ROUTES . GIT_HOST_EVENT } /${ eventId } `
0 commit comments