Skip to content

Commit 737fb9b

Browse files
committed
improve repo view
1 parent f70d413 commit 737fb9b

File tree

1 file changed

+71
-61
lines changed

1 file changed

+71
-61
lines changed

src/commands/analytics.ts

Lines changed: 71 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
// @ts-ignore
22
import blessed from 'blessed'
33
import contrib from 'blessed-contrib'
4-
import chalk from 'chalk'
5-
// @ts-ignore
6-
import chalkTable from 'chalk-table'
74
import meow from 'meow'
85
import ora from 'ora'
96

@@ -123,7 +120,6 @@ async function fetchOrgAnalyticsData (time: string, spinner: Ora, apiKey: string
123120
acc[formattedDate].total_high_prevented += current.total_high_prevented
124121
acc[formattedDate].total_medium_prevented += current.total_medium_prevented
125122
acc[formattedDate].total_low_prevented += current.total_low_prevented
126-
// acc[formattedDate].top_five_alert_types += current.top_five_alert_types
127123
} else {
128124
acc[formattedDate] = current
129125
acc[formattedDate].created_at = formattedDate
@@ -132,39 +128,21 @@ async function fetchOrgAnalyticsData (time: string, spinner: Ora, apiKey: string
132128
return acc
133129
}, {})
134130

135-
// console.log(data)
136-
137-
// const options = {
138-
// columns: [
139-
// { field: 'created_at', name: chalk.cyan('Date') },
140-
// { field: 'total_critical_alerts', name: chalk.cyan('Critical alerts') },
141-
// { field: 'total_high_alerts', name: chalk.cyan('High alerts') },
142-
// { field: 'total_critical_added', name: chalk.cyan('Critical alerts added') },
143-
// { field: 'total_high_added', name: chalk.cyan('High alerts added') },
144-
// { field: 'total_critical_prevented', name: chalk.cyan('Critical alerts prevented') },
145-
// { field: 'total_medium_prevented', name: chalk.cyan('Medium alerts prevented') },
146-
// { field: 'total_low_prevented', name: chalk.cyan('Low alerts prevented') },
147-
// ]
148-
// }
149-
150-
// console.log(chalk.bgMagenta.white.bold(`\n Analytics data at the organization level over the last ${time} days (indicated in total amount): \n`))
151-
// console.log(`${chalkTable(options, Object.values(data))}\n`)
152-
153131
const screen = blessed.screen()
154132
// eslint-disable-next-line
155133
const grid = new contrib.grid({rows: 4, cols: 4, screen})
156134

157-
renderLineCharts(grid, screen, 'Critical alerts', [0,0,1,1.5], data, 'total_critical_alerts')
158-
renderLineCharts(grid, screen, 'High alerts', [0,1.5,1,1.5], data, 'total_high_alerts')
159-
renderLineCharts(grid, screen, 'Critical alerts added to main', [1,0,1,2], data, 'total_critical_added')
160-
renderLineCharts(grid, screen, 'High alerts added to main', [1,2,1,2], data, 'total_high_added')
161-
renderLineCharts(grid, screen, 'Critical alerts prevented from main', [2,0,1,2], data, 'total_critical_prevented')
162-
renderLineCharts(grid, screen, 'High alerts prevented to main', [2,2,1,2], data, 'total_high_prevented')
135+
renderLineCharts(grid, screen, 'Total critical alerts', [0,0,1,2], data, 'total_critical_alerts')
136+
renderLineCharts(grid, screen, 'Total high alerts', [0,2,1,2], data, 'total_high_alerts')
137+
renderLineCharts(grid, screen, 'Total critical alerts added to main', [1,0,1,2], data, 'total_critical_added')
138+
renderLineCharts(grid, screen, 'Total high alerts added to main', [1,2,1,2], data, 'total_high_added')
139+
renderLineCharts(grid, screen, 'Total critical alerts prevented from main', [2,0,1,2], data, 'total_critical_prevented')
140+
renderLineCharts(grid, screen, 'Total high alerts prevented from main', [2,2,1,2], data, 'total_high_prevented')
163141

164142
const bar = grid.set(3, 0, 1, 2, contrib.bar,
165143
{ label: 'Top 5 alert types'
166144
, barWidth: 10
167-
, barSpacing: 20
145+
, barSpacing: 17
168146
, xOffset: 0
169147
, maxHeight: 9, barBgColor: 'magenta' })
170148

@@ -192,48 +170,80 @@ async function fetchRepoAnalyticsData (repo: string, time: string, spinner: Ora,
192170
}
193171
spinner.stop()
194172

195-
const formattedData = result.data.map(d => {
196-
const formattedDate = new Date(d.created_at).toLocaleDateString()
197-
return {
198-
...d,
199-
created_at: formattedDate,
173+
const data = result.data.reduce((acc: { [key: string]: any }, current) => {
174+
const formattedDate = new Date(current.created_at).toLocaleDateString()
175+
176+
if (acc[formattedDate]) {
177+
acc[formattedDate].total_critical_alerts += current.total_critical_alerts
178+
acc[formattedDate].total_high_alerts += current.total_high_alerts
179+
acc[formattedDate].total_critical_added += current.total_critical_added
180+
acc[formattedDate].total_high_added += current.total_high_added
181+
acc[formattedDate].total_critical_prevented += current.total_critical_prevented
182+
acc[formattedDate].total_high_prevented += current.total_high_prevented
183+
acc[formattedDate].total_medium_prevented += current.total_medium_prevented
184+
acc[formattedDate].total_low_prevented += current.total_low_prevented
185+
} else {
186+
acc[formattedDate] = current
187+
acc[formattedDate].created_at = formattedDate
200188
}
201-
})
202-
const data = { ...formattedData.flat(1) }
203-
204-
const options = {
205-
columns: [
206-
{ field: 'created_at', name: chalk.cyan('Date') },
207-
{ field: 'total_critical_alerts', name: chalk.cyan('Critical alerts') },
208-
{ field: 'total_high_alerts', name: chalk.cyan('High alerts') },
209-
{ field: 'total_critical_added', name: chalk.cyan('Critical alerts added') },
210-
{ field: 'total_high_added', name: chalk.cyan('High alerts added') },
211-
{ field: 'total_critical_prevented', name: chalk.cyan('Critical alerts prevented') },
212-
{ field: 'total_medium_prevented', name: chalk.cyan('Medium alerts prevented') },
213-
{ field: 'total_low_prevented', name: chalk.cyan('Low alerts prevented') },
214-
]
215-
}
216189

217-
console.log(chalk.bgMagenta.white.bold(`\n Analytics data for ${repo} over the last ${time} days: \n`))
218-
console.log(`${chalkTable(options, Object.values(data))}\n`)
219-
}
190+
return acc
191+
}, {})
192+
193+
const screen = blessed.screen()
194+
// eslint-disable-next-line
195+
const grid = new contrib.grid({rows: 4, cols: 4, screen})
220196

197+
renderLineCharts(grid, screen, 'Total critical alerts', [0,0,1,2], data, 'total_critical_alerts')
198+
renderLineCharts(grid, screen, 'Total high alerts', [0,2,1,2], data, 'total_high_alerts')
199+
renderLineCharts(grid, screen, 'Total critical alerts added to main', [1,0,1,2], data, 'total_critical_added')
200+
renderLineCharts(grid, screen, 'Total high alerts added to main', [1,2,1,2], data, 'total_high_added')
201+
renderLineCharts(grid, screen, 'Total critical alerts prevented from main', [2,0,1,2], data, 'total_critical_prevented')
202+
renderLineCharts(grid, screen, 'Total high alerts prevented from main', [2,2,1,2], data, 'total_high_prevented')
221203

222-
const renderLineCharts = (grid: any, screen: any, title: string, coords: number[], data: {[key: string]: {[key: string]: number | {}}}, label: string) => {
204+
const bar = grid.set(3, 0, 1, 2, contrib.bar,
205+
{ label: 'Top 5 alert types'
206+
, barWidth: 10
207+
, barSpacing: 17
208+
, xOffset: 0
209+
, maxHeight: 9, barBgColor: 'magenta' })
210+
211+
screen.append(bar) //must append before setting data
212+
213+
const top5AlertTypes = Object.values(data)[0].top_five_alert_types
214+
215+
bar.setData(
216+
{ titles: Object.keys(top5AlertTypes)
217+
, data: Object.values(top5AlertTypes)})
218+
219+
screen.render()
220+
221+
screen.key(['escape', 'q', 'C-c'], function() {
222+
return process.exit(0);
223+
})
224+
}
225+
226+
const renderLineCharts = (grid: any, screen: any, title: string, coords: number[], data: {[key: string]: {[key: string]: number}}, label: string) => {
223227
const formattedDates = Object.keys(data).map(d => `${new Date(d).getMonth()+1}/${new Date(d).getDate()}`)
224228

225229
const alertsCounts = Object.values(data).map(d => d[label])
226230

227231
const line = grid.set(...coords, contrib.line,
228232
{ style:
229-
{ line: "cyan"
230-
, text: "cyan"
231-
, baseline: "black"}
232-
, xLabelPadding: 0
233-
, xPadding: 0,
234-
xOffset: 0,
235-
legend: {width: 1}
236-
, label: title})
233+
{ line: "cyan",
234+
text: "cyan",
235+
baseline: "black"
236+
},
237+
xLabelPadding: 0,
238+
xPadding: 0,
239+
xOffset: 0,
240+
wholeNumbersOnly: true,
241+
legend: {
242+
width: 1
243+
},
244+
label: title
245+
}
246+
)
237247

238248
screen.append(line)
239249

0 commit comments

Comments
 (0)