@@ -27,11 +27,11 @@ function authenticatedGet(url) {
27
27
. then ( x => x . json ( ) ) ;
28
28
}
29
29
30
- async function getAlerts ( organization , projectName , repoId ) {
30
+ async function getAlerts ( organization , projectName , repoId ) {
31
31
consoleLog ( 'getAlerts' ) ;
32
32
33
33
try {
34
- // todo: add pagination
34
+ // no pagination option, so just get the first 5000 alerts
35
35
url = `https://advsec.dev.azure.com/${ organization } /${ projectName } /_apis/AdvancedSecurity/repositories/${ repoId } /alerts?top=5000&criteria.onlyDefaultBranchAlerts=truen&criteria.states=1&api-version=7.2-preview.1` ;
36
36
consoleLog ( `Calling url: [${ url } ]` ) ;
37
37
const alertResult = await authenticatedGet ( url ) ;
@@ -53,31 +53,56 @@ async function getAlerts (organization, projectName, repoId) {
53
53
}
54
54
}
55
55
56
-
57
- async function getAlertsTrend ( organization , projectName , repoId ) {
56
+ async function getAlertsTrendLines ( organization , projectName , repoId ) {
58
57
consoleLog ( `getAlertsTrend for organization [${ organization } ], project [${ projectName } ], repo [${ repoId } ]` ) ;
59
58
60
- try {
61
- // todo: add pagination
59
+ try {
62
60
url = `https://advsec.dev.azure.com/${ organization } /${ projectName } /_apis/AdvancedSecurity/repositories/${ repoId } /alerts?top=5000&criteria.onlyDefaultBranchAlerts=truen&api-version=7.2-preview.1` ;
63
61
consoleLog ( `Calling url: [${ url } ]` ) ;
64
62
const alertResult = await authenticatedGet ( url ) ;
65
63
//consoleLog('alertResult: ' + JSON.stringify(alertResult));
66
64
consoleLog ( 'alertResult count: ' + alertResult . count ) ;
67
65
68
- // load the secret alerts and create a trend line over the last 3 weeks
66
+ // load the Secret alerts and create a trend line over the last 3 weeks
69
67
const secretAlerts = alertResult . value . filter ( alert => alert . alertType === "secret" ) ;
70
- const secretAlertsTrend = getAlertsTrendLine ( secretAlerts ) ;
68
+ const secretAlertsTrend = getAlertsTrendLine ( secretAlerts , 'secret' ) ;
69
+ console . log ( '' ) ;
70
+ // load the Dependency alerts and create a trend line over the last 3 weeks
71
+ const dependencyAlerts = alertResult . value . filter ( alert => alert . alertType === "dependency" ) ;
72
+ const dependencyAlertsTrend = getAlertsTrendLine ( dependencyAlerts , 'dependency' ) ; console . log ( '' ) ;
73
+ console . log ( '' ) ;
74
+ // load the Code alerts and create a trend line over the last 3 weeks
75
+ const codeAlerts = alertResult . value . filter ( alert => alert . alertType === "code" ) ;
76
+ const codeAlertsTrend = getAlertsTrendLine ( codeAlerts , 'code' ) ;
71
77
72
- return secretAlertsTrend ;
78
+ return {
79
+ secretAlertsTrend : secretAlertsTrend ,
80
+ dependencyAlertsTrend : dependencyAlertsTrend ,
81
+ codeAlertsTrend : codeAlertsTrend
82
+ } ;
73
83
}
74
84
catch ( err ) {
75
85
consoleLog ( 'error in calling the advec api: ' + err ) ;
76
86
}
77
87
}
78
88
79
- function getAlertsTrendLine ( alerts ) {
80
- consoleLog ( 'getAlertsTrendLine' ) ;
89
+ function checkAlertActiveOnDate ( alert , dateStr ) {
90
+ // check if the alert.firstSeenDate is within the date range
91
+ // and if fixedDate is not set or is after the date range
92
+ const seenClosed = ( alert . firstSeenDate . split ( 'T' ) [ 0 ] <= dateStr && ( ! alert . fixedDate || alert . fixedDate . split ( 'T' ) [ 0 ] > dateStr ) ) ;
93
+ if ( seenClosed ) {
94
+ // check the dismissal.requestedOn date as well
95
+ if ( alert . dismissal && alert . dismissal . requestedOn ) {
96
+ const dismissed = ( alert . dismissal . requestedOn . split ( 'T' ) [ 0 ] <= dateStr ) ;
97
+ return ! dismissed ;
98
+ }
99
+ }
100
+
101
+ return seenClosed ;
102
+ }
103
+
104
+ function getAlertsTrendLine ( alerts , type ) {
105
+ consoleLog ( `getAlertsTrendLine for type ${ type } ` ) ;
81
106
82
107
const trendLine = [ ] ;
83
108
const trendLineSimple = [ ] ;
@@ -88,7 +113,9 @@ function getAlertsTrendLine(alerts) {
88
113
for ( let d = threeWeeksAgo ; d <= today ; d . setDate ( d . getDate ( ) + 1 ) ) {
89
114
const date = new Date ( d ) ;
90
115
const dateStr = date . toISOString ( ) . split ( 'T' ) [ 0 ] ;
91
- const alertsOnDate = alerts . filter ( alert => alert . createdDate . split ( 'T' ) [ 0 ] === dateStr ) ;
116
+
117
+ const alertsOnDate = alerts . filter ( alert => checkAlertActiveOnDate ( alert , dateStr ) ) ;
118
+ console . log ( `On [${ dateStr } ] there were [${ alertsOnDate . length } ] active ${ type } alerts` ) ;
92
119
trendLine . push ( {
93
120
date : dateStr ,
94
121
count : alertsOnDate . length
@@ -97,7 +124,21 @@ function getAlertsTrendLine(alerts) {
97
124
trendLineSimple . push ( alertsOnDate . length ) ;
98
125
}
99
126
100
- consoleLog ( 'trendLine: ' + JSON . stringify ( trendLine ) ) ;
101
- return trendLine ;
127
+ consoleLog ( 'trendLine: ' + JSON . stringify ( trendLineSimple ) ) ;
128
+ return trendLineSimple ;
129
+ }
130
+
131
+ function getDatePoints ( ) {
132
+ const trendDates = [ ] ;
133
+ const today = new Date ( ) ;
134
+ const threeWeeksAgo = new Date ( ) ;
135
+ threeWeeksAgo . setDate ( today . getDate ( ) - 21 ) ;
136
+
137
+ for ( let d = threeWeeksAgo ; d <= today ; d . setDate ( d . getDate ( ) + 1 ) ) {
138
+ const date = new Date ( d ) ;
139
+ const dateStr = date . toISOString ( ) . split ( 'T' ) [ 0 ] ;
140
+ trendDates . push ( dateStr ) ;
141
+ }
102
142
143
+ return trendDates ;
103
144
}
0 commit comments