/* eslint-disable @typescript-eslint/no-unnecessary-condition */ /* eslint-disable import/extensions */ import { cvssStringToCIA, cvssStringToScore, cvssStringToSeverity, } from '@/lib/utils'; import { Finding, getAuditById } from './audits'; export const exportToCSV = ( auditName: string, selectedDisplays: string[], auditId: string, ) => { const complexityData = { easy: 0, medium: 0, complex: 0 }; const priorityData = { low: 0, medium: 0, high: 0, urgent: 0 }; let findings: Finding[]; const csvRows: string[] = []; csvRows.push('title,label,value'); const fetchAuditData = async () => { if (!auditId) { return; } try { const dataAudit = await getAuditById(auditId); findings = dataAudit.datas.findings; } catch (error) { console.error('Error fetching audit data:', error); return; } }; if (auditId) { void fetchAuditData() .catch(err => { console.error(err); }) .then(() => { let RC = false; let RP = false; findings.forEach((finding: Finding) => { for (let i = 0; i < selectedDisplays.length; i++) { if ( selectedDisplays[i] === 'remediation-complexity' && finding.remediationComplexity && finding.remediationComplexity >= 1 && finding.remediationComplexity <= 3 ) { RC = true; switch (finding.remediationComplexity) { case 1: { complexityData.easy += 1; break; } case 2: { complexityData.medium += 1; break; } case 3: { complexityData.complex += 1; break; } } } else if ( selectedDisplays[i] === 'remediation-priority' && finding.priority && finding.priority >= 1 && finding.priority <= 4 ) { RP = true; switch (finding.priority) { case 1: { priorityData.low += 1; break; } case 2: { priorityData.medium += 1; break; } case 3: { priorityData.high += 1; break; } case 4: { priorityData.urgent += 1; break; } } } } }); if (selectedDisplays.find(item => item === 'average-cvss')) { const AVERAGE_CVSS = Math.round( (findings.reduce( (acc, finding) => acc + cvssStringToScore(finding.cvssv3 ?? ''), 0, ) / findings.length) * 10, ) / 10; const findingScores = findings.map(finding => ({ label: finding.title, value: cvssStringToScore(finding.cvssv3 ?? ''), })); csvRows.push(`average-cvss,average,${AVERAGE_CVSS}`); findingScores.map(fs => csvRows.push(`average-cvss,${fs.label},${fs.value}`), ); } if (selectedDisplays.find(item => item === 'cvss-score')) { const cvssScore = { C: findings.filter( finding => cvssStringToSeverity(finding.cvssv3 ?? '') === 'C', ).length, H: findings.filter( finding => cvssStringToSeverity(finding.cvssv3 ?? '') === 'H', ).length, M: findings.filter( finding => cvssStringToSeverity(finding.cvssv3 ?? '') === 'M', ).length, L: findings.filter( finding => cvssStringToSeverity(finding.cvssv3 ?? '') === 'L', ).length, I: findings.filter( finding => cvssStringToSeverity(finding.cvssv3 ?? '') === 'I', ).length, }; csvRows.push(`cvssScore,C,${cvssScore.C}`); csvRows.push(`cvssScore,H,${cvssScore.H}`); csvRows.push(`cvssScore,M,${cvssScore.M}`); csvRows.push(`cvssScore,L,${cvssScore.L}`); csvRows.push(`cvssScore,I,${cvssScore.I}`); } if (selectedDisplays.find(item => item === 'cia-triad')) { const data = findings.map(finding => ({ label: finding.title, C: cvssStringToCIA('confidentiality', finding.cvssv3 ?? ''), I: cvssStringToCIA('integrity', finding.cvssv3 ?? ''), A: cvssStringToCIA('availability', finding.cvssv3 ?? ''), })); data.map(cia => csvRows.push( `cia-triad,${cia.label},C${cia.C ?? 0} I${cia.I ?? 0} A${cia.A ?? 0}`, ), ); } if (RP) { csvRows.push(`remediationPriority,LOW,${priorityData.low}`); csvRows.push(`remediationPriority,MEDIUM,${priorityData.medium}`); csvRows.push(`remediationPriority,HIGH,${priorityData.high}`); csvRows.push(`remediationPriority,URGENT,${priorityData.urgent}`); } if (RC) { csvRows.push(`remediationComplexity,EASY,${complexityData.easy}`); csvRows.push(`remediationComplexity,MEDIUM,${complexityData.medium}`); csvRows.push( `remediationComplexity,COMPLEX,${complexityData.complex}`, ); } const csvString = csvRows.join('\n'); const blob = new Blob([csvString], { type: 'text/csv' }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = `${auditName}_dashboard.csv`; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); }); } };