Skip to content

Commit d51d3bc

Browse files
committed
feat: merge calls for vulnerability card
1 parent 4866b80 commit d51d3bc

File tree

5 files changed

+110
-47
lines changed

5 files changed

+110
-47
lines changed

src/Shared/Components/Security/Vulnerabilities/Vulnerabilities.tsx

Lines changed: 29 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
import { useEffect } from 'react'
1818
import { EMPTY_STATE_STATUS, SCAN_TOOL_ID_TRIVY } from '@Shared/constants'
1919
import { SeverityCount } from '@Shared/types'
20-
import { Progressing, useAsync } from '../../../../Common'
20+
import { Progressing } from '../../../../Common'
2121
import { ScannedByToolModal } from '../../ScannedByToolModal'
22-
import { getLastExecutionByArtifactAppEnv } from './service'
2322
import { VulnerabilitiesProps } from './types'
2423
import { SecuritySummaryCard } from '../SecuritySummaryCard'
25-
import { getSecurityScan } from '../SecurityModal'
24+
import { getSeverityCountFromSummary, getTotalSeverityCount } from '../utils'
25+
import { useGetSecurityVulnerabilities } from './utils'
2626

2727
const Vulnerabilities = ({
2828
isScanned,
@@ -33,33 +33,25 @@ const Vulnerabilities = ({
3333
setVulnerabilityCount,
3434
isScanV2Enabled,
3535
}: VulnerabilitiesProps) => {
36-
const [areVulnerabilitiesLoading, vulnerabilitiesResponse, vulnerabilitiesError, reloadVulnerabilities] = useAsync(
37-
() => getLastExecutionByArtifactAppEnv(artifactId, applicationId, environmentId),
38-
[],
39-
isScanned && isScanEnabled && !isScanV2Enabled,
40-
{
41-
resetOnChange: false,
42-
},
43-
)
44-
45-
const [scanResultLoading, scanResultResponse, scanResultError, reloadScanResult] = useAsync(
46-
() => getSecurityScan({ artifactId, appId: applicationId, envId: environmentId }),
47-
[],
48-
isScanned && isScanEnabled && isScanV2Enabled,
49-
{
50-
resetOnChange: false,
51-
},
52-
)
36+
const { scanDetailsLoading, scanResultResponse, executionDetailsResponse, scanDetailsError, reloadScanDetails } =
37+
useGetSecurityVulnerabilities({
38+
appId: applicationId,
39+
envId: environmentId,
40+
artifactId,
41+
isScanEnabled,
42+
isScanned,
43+
isScanV2Enabled,
44+
})
5345

5446
useEffect(() => {
5547
if (scanResultResponse && isScanV2Enabled) {
5648
setVulnerabilityCount(scanResultResponse.result.imageScan.vulnerability?.list?.length)
5749
return
5850
}
59-
if (vulnerabilitiesResponse && !isScanV2Enabled) {
60-
setVulnerabilityCount(vulnerabilitiesResponse.result.vulnerabilities?.length)
51+
if (executionDetailsResponse && !isScanV2Enabled) {
52+
setVulnerabilityCount(executionDetailsResponse.result.vulnerabilities?.length)
6153
}
62-
}, [vulnerabilitiesResponse, scanResultResponse])
54+
}, [executionDetailsResponse, scanResultResponse])
6355

6456
if (!isScanEnabled) {
6557
return (
@@ -69,7 +61,7 @@ const Vulnerabilities = ({
6961
)
7062
}
7163

72-
if (areVulnerabilitiesLoading || scanResultLoading) {
64+
if (scanDetailsLoading) {
7365
return (
7466
<div className="security-tab-empty">
7567
<Progressing />
@@ -79,7 +71,7 @@ const Vulnerabilities = ({
7971

8072
if (
8173
!isScanned ||
82-
(vulnerabilitiesResponse && !vulnerabilitiesResponse.result.scanned) ||
74+
(executionDetailsResponse && !executionDetailsResponse.result.scanned) ||
8375
(scanResultResponse && !scanResultResponse?.result.scanned)
8476
) {
8577
return (
@@ -89,34 +81,23 @@ const Vulnerabilities = ({
8981
)
9082
}
9183

92-
if (vulnerabilitiesError || scanResultError) {
84+
if (scanDetailsError) {
9385
return (
9486
<div className="security-tab-empty">
9587
<p className="security-tab-empty__title">Failed to fetch vulnerabilities</p>
96-
<button
97-
className="cta secondary"
98-
type="button"
99-
onClick={isScanV2Enabled ? reloadScanResult : reloadVulnerabilities}
100-
>
88+
<button className="cta secondary" type="button" onClick={reloadScanDetails}>
10189
Reload
10290
</button>
10391
</div>
10492
)
10593
}
10694

107-
const imageScanSeverities = scanResultResponse?.result.imageScan.vulnerability?.summary.severities
95+
const scanResultSeverities = scanResultResponse?.result.imageScan.vulnerability?.summary.severities
10896
const severityCount: SeverityCount = isScanV2Enabled
109-
? {
110-
critical: imageScanSeverities?.CRITICAL || 0,
111-
high: imageScanSeverities?.HIGH || 0,
112-
medium: imageScanSeverities?.MEDIUM || 0,
113-
low: imageScanSeverities?.LOW || 0,
114-
unknown: imageScanSeverities?.UNKNOWN || 0,
115-
}
116-
: vulnerabilitiesResponse.result.severityCount
97+
? getSeverityCountFromSummary(scanResultSeverities)
98+
: executionDetailsResponse.result.severityCount ?? { critical: 0, high: 0, medium: 0, low: 0, unknown: 0 }
11799

118-
const totalCount =
119-
severityCount.critical + severityCount.high + severityCount.low + severityCount.medium + severityCount.unknown
100+
const totalCount = getTotalSeverityCount(severityCount)
120101

121102
if (!totalCount) {
122103
return (
@@ -126,11 +107,13 @@ const Vulnerabilities = ({
126107
</p>
127108
<p>{EMPTY_STATE_STATUS.CI_DEATILS_NO_VULNERABILITY_FOUND.SUBTITLE}</p>
128109
<p className="security-tab-empty__subtitle">
129-
{vulnerabilitiesResponse?.result.lastExecution ??
130-
scanResultResponse?.result.imageScan.vulnerability.list[0].StartedOn}
110+
{executionDetailsResponse?.result.lastExecution ??
111+
scanResultResponse?.result.imageScan.vulnerability?.list[0].StartedOn}
131112
</p>
132113
<div className="pt-8 pb-8 pl-16 pr-16 flexbox dc__align-items-center">
133-
<ScannedByToolModal scanToolId={vulnerabilitiesResponse?.result.scanToolId ?? SCAN_TOOL_ID_TRIVY} />
114+
<ScannedByToolModal
115+
scanToolId={executionDetailsResponse?.result.scanToolId ?? SCAN_TOOL_ID_TRIVY}
116+
/>
134117
</div>
135118
</div>
136119
)
@@ -140,7 +123,7 @@ const Vulnerabilities = ({
140123
<div className="p-12">
141124
<SecuritySummaryCard
142125
severityCount={severityCount}
143-
scanToolId={vulnerabilitiesResponse?.result.scanToolId ?? SCAN_TOOL_ID_TRIVY}
126+
scanToolId={executionDetailsResponse?.result.scanToolId ?? SCAN_TOOL_ID_TRIVY}
144127
{...(isScanV2Enabled
145128
? { appDetailsPayload: { appId: applicationId, envId: environmentId, artifactId } }
146129
: { executionDetailsPayload: { appId: applicationId, envId: environmentId, artifactId } })}

src/Shared/Components/Security/Vulnerabilities/types.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616

1717
import { MaterialSecurityInfoType } from '../../../types'
18+
import { getSecurityScan } from '../SecurityModal'
19+
import { getLastExecutionByArtifactAppEnv } from './service'
1820

1921
export interface VulnerabilitiesProps extends MaterialSecurityInfoType {
2022
artifactId: number
@@ -23,3 +25,20 @@ export interface VulnerabilitiesProps extends MaterialSecurityInfoType {
2325
setVulnerabilityCount: React.Dispatch<React.SetStateAction<number>>
2426
isScanV2Enabled: boolean
2527
}
28+
29+
export interface UseGetSecurityVulnerabilitiesProps {
30+
artifactId: string
31+
appId: string
32+
envId: string
33+
isScanned: boolean
34+
isScanEnabled: boolean
35+
isScanV2Enabled: boolean
36+
}
37+
38+
export interface UseGetSecurityVulnerabilitiesReturnType {
39+
scanDetailsLoading: boolean
40+
scanResultResponse: Awaited<ReturnType<typeof getSecurityScan>>
41+
executionDetailsResponse: Awaited<ReturnType<typeof getLastExecutionByArtifactAppEnv>>
42+
scanDetailsError: any
43+
reloadScanDetails: () => void
44+
}

src/Shared/Components/Security/Vulnerabilities/utils.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@
1717
import moment from 'moment'
1818
import { numberComparatorBySortOrder } from '@Shared/Helpers'
1919
import { DATE_TIME_FORMAT_STRING } from '../../../constants'
20-
import { SortingOrder, VULNERABILITIES_SORT_PRIORITY, ZERO_TIME_STRING } from '../../../../Common'
20+
import { SortingOrder, useAsync, VULNERABILITIES_SORT_PRIORITY, ZERO_TIME_STRING } from '../../../../Common'
2121
import { LastExecutionResponseType, LastExecutionResultType } from '../../../types'
22+
import { getLastExecutionByArtifactAppEnv } from './service'
23+
import { getSecurityScan } from '../SecurityModal'
24+
import { UseGetSecurityVulnerabilitiesReturnType } from './types'
2225

2326
export const getSortedVulnerabilities = (vulnerabilities) =>
2427
vulnerabilities.sort((a, b) =>
@@ -61,3 +64,38 @@ export const parseLastExecutionResponse = (response): LastExecutionResponseType
6164
...response,
6265
result: getParsedScanResult(response.result),
6366
})
67+
68+
export const useGetSecurityVulnerabilities = ({
69+
artifactId,
70+
appId,
71+
envId,
72+
isScanned,
73+
isScanEnabled,
74+
isScanV2Enabled,
75+
}): UseGetSecurityVulnerabilitiesReturnType => {
76+
const [executionDetailsLoading, executionDetailsResponse, executionDetailsError, reloadExecutionDetails] = useAsync(
77+
() => getLastExecutionByArtifactAppEnv(artifactId, appId, envId),
78+
[],
79+
isScanned && isScanEnabled && !isScanV2Enabled,
80+
{
81+
resetOnChange: false,
82+
},
83+
)
84+
85+
const [scanResultLoading, scanResultResponse, scanResultError, reloadScanResult] = useAsync(
86+
() => getSecurityScan({ artifactId, appId, envId }),
87+
[],
88+
isScanned && isScanEnabled && isScanV2Enabled,
89+
{
90+
resetOnChange: false,
91+
},
92+
)
93+
94+
return {
95+
scanDetailsLoading: scanResultLoading || executionDetailsLoading,
96+
scanResultResponse,
97+
executionDetailsResponse,
98+
scanDetailsError: scanResultError || executionDetailsError,
99+
reloadScanDetails: isScanV2Enabled ? reloadScanResult : reloadExecutionDetails,
100+
}
101+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export * from './SecuritySummaryCard'
22
export * from './Vulnerabilities'
33
export * from './SecurityModal'
4+
export * from './utils'
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { SeverityCount } from '@Shared/types'
2+
import { SeveritiesDTO } from './SecurityModal/types'
3+
4+
export const getTotalSeverityCount = (severityCount: SeverityCount): number => {
5+
const totalCount =
6+
(severityCount.critical || 0) +
7+
(severityCount.high || 0) +
8+
(severityCount.medium || 0) +
9+
(severityCount.low || 0) +
10+
(severityCount.unknown || 0)
11+
return totalCount
12+
}
13+
14+
export const getSeverityCountFromSummary = (
15+
scanResultSeverities: Partial<Record<SeveritiesDTO, number>>,
16+
): SeverityCount => ({
17+
critical: scanResultSeverities?.CRITICAL || 0,
18+
high: scanResultSeverities?.HIGH || 0,
19+
medium: scanResultSeverities?.MEDIUM || 0,
20+
low: scanResultSeverities?.LOW || 0,
21+
unknown: scanResultSeverities?.UNKNOWN || 0,
22+
})

0 commit comments

Comments
 (0)