16
16
17
17
import { MutableRefObject } from 'react'
18
18
import moment from 'moment'
19
+ import { sanitizeApprovalConfigData , sanitizeUserApprovalList } from '@Shared/Helpers'
19
20
import { PolicyBlockInfo , RuntimeParamsAPIResponseType , RuntimePluginVariables } from '@Shared/types'
20
- import { getIsManualApprovalSpecific , sanitizeUserApprovalConfig , stringComparatorBySortOrder } from '@Shared/Helpers'
21
21
import { get , post } from './Api'
22
22
import { GitProviderType , ROUTES } from './Constants'
23
23
import { getUrlWithSearchParams , showError , sortCallback } from './Helper'
@@ -35,19 +35,13 @@ import {
35
35
CDMaterialFilterQuery ,
36
36
ImagePromotionMaterialInfo ,
37
37
EnvironmentListHelmResponse ,
38
- UserGroupApproverType ,
39
- ImageApprovalPolicyUserGroupDataType ,
40
- ImageApprovalPolicyType ,
41
- ImageApprovalUsersInfoDTO ,
42
38
UserApprovalMetadataType ,
43
- UserApprovalConfigType ,
44
39
CDMaterialListModalServiceUtilProps ,
40
+ CDMaterialType ,
45
41
GlobalVariableDTO ,
46
42
GlobalVariableOptionType ,
47
43
} from './Types'
48
44
import { ApiResourceType } from '../Pages'
49
- import { API_TOKEN_PREFIX } from '@Shared/constants'
50
- import { DefaultUserKey } from '@Shared/types'
51
45
import { RefVariableType } from './CIPipeline.Types'
52
46
53
47
export const getTeamListMin = ( ) : Promise < TeamList > => {
@@ -95,26 +89,12 @@ export function setImageTags(request, pipelineId: number, artifactId: number) {
95
89
return post ( `${ ROUTES . IMAGE_TAGGING } /${ pipelineId } /${ artifactId } ` , request )
96
90
}
97
91
98
- const sanitizeApprovalConfigFromApprovalMetadata = (
99
- approvalMetadata : UserApprovalMetadataType ,
100
- userApprovalConfig : UserApprovalConfigType ,
101
- ) : UserApprovalMetadataType => {
102
- if ( ! approvalMetadata ) {
103
- return null
104
- }
105
-
106
- const approvedUsersData = approvalMetadata . approvedUsersData || [ ]
107
- const unsanitizedApprovalConfig = approvalMetadata . approvalConfig || userApprovalConfig
108
-
109
- return {
110
- ...approvalMetadata ,
111
- approvedUsersData : approvedUsersData . map ( ( userData ) => ( {
112
- ...userData ,
113
- userGroups : userData . userGroups ?. filter ( ( group ) => ! ! group ?. identifier && ! ! group ?. name ) ?? [ ] ,
114
- } ) ) ,
115
- approvalConfig : sanitizeUserApprovalConfig ( unsanitizedApprovalConfig ) ,
116
- }
117
- }
92
+ export const sanitizeUserApprovalMetadata = ( userApprovalMetadata : UserApprovalMetadataType ) : UserApprovalMetadataType => ( {
93
+ ...userApprovalMetadata ,
94
+ hasCurrentUserApproved : userApprovalMetadata ?. hasCurrentUserApproved ?? false ,
95
+ canCurrentUserApprove : userApprovalMetadata ?. canCurrentUserApprove ?? false ,
96
+ approvalConfigData : sanitizeApprovalConfigData ( userApprovalMetadata ?. approvalConfigData ) ,
97
+ } )
118
98
119
99
const sanitizeDeploymentBlockedState = ( deploymentBlockedState : PolicyBlockInfo ) => {
120
100
if ( ! deploymentBlockedState ) {
@@ -137,15 +117,14 @@ const cdMaterialListModal = ({
137
117
artifactId,
138
118
artifactStatus,
139
119
disableDefaultSelection,
140
- userApprovalConfig,
141
120
} : CDMaterialListModalServiceUtilProps ) => {
142
121
if ( ! artifacts || ! artifacts . length ) return [ ]
143
122
144
123
const markFirstSelected = offset === 0
145
124
const startIndex = offset
146
125
let isImageMarked = disableDefaultSelection
147
126
148
- const materials = artifacts . map ( ( material , index ) => {
127
+ const materials = artifacts . map < CDMaterialType > ( ( material , index ) => {
149
128
let artifactStatusValue = ''
150
129
const filterState = material . filterState ?? FilterStates . ALLOWED
151
130
@@ -182,9 +161,8 @@ const cdMaterialListModal = ({
182
161
vulnerable : material . vulnerable ,
183
162
runningOnParentCd : material . runningOnParentCd ,
184
163
artifactStatus : artifactStatusValue ,
185
- userApprovalMetadata : sanitizeApprovalConfigFromApprovalMetadata (
164
+ userApprovalMetadata : sanitizeUserApprovalMetadata (
186
165
material . userApprovalMetadata ,
187
- userApprovalConfig ,
188
166
) ,
189
167
triggeredBy : material . triggeredBy ,
190
168
isVirtualEnvironment : material . isVirtualEnvironment ,
@@ -231,110 +209,38 @@ const cdMaterialListModal = ({
231
209
return materials
232
210
}
233
211
234
- const getImageApprovalPolicyDetailsFromMaterialResult = ( cdMaterialsResult ) : ImageApprovalPolicyType => {
235
- const approvalUsers : string [ ] = cdMaterialsResult . approvalUsers || [ ]
236
- const userApprovalConfig = sanitizeUserApprovalConfig ( cdMaterialsResult . userApprovalConfig )
237
- const isPolicyConfigured = getIsManualApprovalSpecific ( userApprovalConfig )
238
- const imageApprovalUsersInfo : ImageApprovalUsersInfoDTO = cdMaterialsResult . imageApprovalUsersInfo || { }
239
-
240
- const approvalUsersMap = approvalUsers . reduce (
241
- ( acc , user ) => {
242
- acc [ user ] = true
243
- return acc
212
+ const sanitizeDeploymentApprovalInfo = (
213
+ deploymentApprovalInfo : CDMaterialsApprovalInfo [ 'deploymentApprovalInfo' ] ,
214
+ ) : CDMaterialsApprovalInfo [ 'deploymentApprovalInfo' ] => ( {
215
+ eligibleApprovers : {
216
+ anyUsers : {
217
+ approverList : sanitizeUserApprovalList ( deploymentApprovalInfo ?. eligibleApprovers ?. anyUsers ?. approverList ) ,
244
218
} ,
245
- { } as Record < string , true > ,
246
- )
247
-
248
- const specificUsersAPIToken = userApprovalConfig . specificUsers . identifiers
249
- . filter ( ( user ) => user . startsWith ( API_TOKEN_PREFIX ) )
250
- . sort ( stringComparatorBySortOrder )
251
- const specificUsersEmails = userApprovalConfig . specificUsers . identifiers
252
- . filter ( ( user ) => ! user . startsWith ( API_TOKEN_PREFIX ) && user !== DefaultUserKey . system )
253
- . sort ( stringComparatorBySortOrder )
254
-
255
- const specificUsersData : ImageApprovalPolicyType [ 'specificUsersData' ] = {
256
- dataStore : userApprovalConfig . specificUsers . identifiers . reduce (
257
- ( acc , email ) => {
258
- acc [ email ] = {
259
- email,
260
- hasAccess : approvalUsersMap [ email ] ?? false ,
261
- }
262
- return acc
263
- } ,
264
- { } as Record < string , UserGroupApproverType > ,
265
- ) ,
266
- requiredCount : userApprovalConfig . specificUsers . requiredCount ,
267
- emails : specificUsersEmails . concat ( specificUsersAPIToken ) ,
268
- }
269
-
270
- const validGroups = userApprovalConfig . userGroups . map ( ( group ) => group . identifier )
271
-
272
- // Have moved from Object.keys(imageApprovalUsersInfo) to approvalUsers since backend is not filtering out the users without approval
273
- // TODO: This check should be on BE. Need to remove this once BE is updated
274
- const usersList = approvalUsers . filter ( ( user ) => user !== DefaultUserKey . system )
275
- const groupIdentifierToUsersMap = usersList . reduce (
276
- ( acc , user ) => {
277
- const userGroups = imageApprovalUsersInfo [ user ] || [ ]
278
- userGroups . forEach ( ( group ) => {
279
- if ( ! acc [ group . identifier ] ) {
280
- acc [ group . identifier ] = { }
281
- }
282
- acc [ group . identifier ] [ user ] = true
283
- } )
284
- return acc
219
+ specificUsers : {
220
+ approverList : sanitizeUserApprovalList ( deploymentApprovalInfo ?. eligibleApprovers ?. specificUsers ?. approverList ) ,
285
221
} ,
286
- { } as Record < string , Record < string , true > > ,
287
- )
288
-
289
- return {
290
- isPolicyConfigured,
291
- specificUsersData,
292
- userGroupData : userApprovalConfig . userGroups . reduce (
293
- ( acc , group ) => {
294
- const identifier = group . identifier
295
- // No need of handling api tokens here since they are not part of user groups
296
- const users = Object . keys ( groupIdentifierToUsersMap [ identifier ] || { } ) . sort ( stringComparatorBySortOrder )
297
-
298
- acc [ identifier ] = {
299
- dataStore : users . reduce (
300
- ( acc , user ) => {
301
- acc [ user ] = {
302
- email : user ,
303
- // As of now it will always be true, but UI has handled it in a way that can support false as well
304
- hasAccess : approvalUsersMap [ user ] ?? false ,
305
- }
306
- return acc
307
- } ,
308
- { } as Record < string , UserGroupApproverType > ,
309
- ) ,
310
- requiredCount : group . requiredCount ,
311
- emails : users ,
312
- }
313
-
314
- return acc
315
- } ,
316
- { } as Record < string , ImageApprovalPolicyUserGroupDataType > ,
222
+ userGroups : ( deploymentApprovalInfo ?. eligibleApprovers ?. userGroups ?? [ ] ) . map (
223
+ ( { groupName, groupIdentifier, approverList } ) => ( {
224
+ groupIdentifier,
225
+ groupName,
226
+ approverList : sanitizeUserApprovalList ( approverList ) ,
227
+ } ) ,
317
228
) ,
318
- // Not sorting since would change them in approval info modal to name
319
- validGroups,
320
- }
321
- }
229
+ } ,
230
+ approvalConfigData : sanitizeApprovalConfigData ( deploymentApprovalInfo ?. approvalConfigData ) ,
231
+ } )
322
232
323
233
const processCDMaterialsApprovalInfo = ( enableApproval : boolean , cdMaterialsResult ) : CDMaterialsApprovalInfo => {
324
234
if ( ! enableApproval || ! cdMaterialsResult ) {
325
235
return {
326
- approvalUsers : [ ] ,
327
- userApprovalConfig : null ,
328
236
canApproverDeploy : cdMaterialsResult ?. canApproverDeploy ?? false ,
329
- imageApprovalPolicyDetails : null ,
237
+ deploymentApprovalInfo : null ,
330
238
}
331
239
}
332
240
333
241
return {
334
- approvalUsers : cdMaterialsResult . approvalUsers ,
335
- userApprovalConfig : sanitizeUserApprovalConfig ( cdMaterialsResult . userApprovalConfig ) ,
336
242
canApproverDeploy : cdMaterialsResult . canApproverDeploy ?? false ,
337
- imageApprovalPolicyDetails : getImageApprovalPolicyDetailsFromMaterialResult ( cdMaterialsResult ) ,
243
+ deploymentApprovalInfo : sanitizeDeploymentApprovalInfo ( cdMaterialsResult . deploymentApprovalInfo ) ,
338
244
}
339
245
}
340
246
@@ -401,7 +307,6 @@ export const processCDMaterialServiceResponse = (
401
307
artifactId : cdMaterialsResult . latest_wf_artifact_id ,
402
308
artifactStatus : cdMaterialsResult . latest_wf_artifact_status ,
403
309
disableDefaultSelection,
404
- userApprovalConfig : cdMaterialsResult . userApprovalConfig ,
405
310
} )
406
311
const approvalInfo = processCDMaterialsApprovalInfo (
407
312
stage === DeploymentNodeType . CD || stage === DeploymentNodeType . APPROVAL ,
0 commit comments