import * as fs from 'node:fs'; import * as path from 'node:path'; import { fileURLToPath } from 'node:url'; export async function uploadReports() { const baseUrl = (process.env.DEFECTDOJO_URL || "").replace(/\/$/, ""); const apiToken = process.env.DEFECTDOJO_API_TOKEN; const productName = process.env.DEFECTDOJO_PRODUCT_NAME || "agentguard-ci"; if (!baseUrl || !apiToken) { console.error("DEFECTDOJO_URL and DEFECTDOJO_API_TOKEN must be set."); process.exit(1); } const scanMap: Record = { ".sarif": "SARIF", ".json": "Generic Findings Import", }; const reportsDir = "/workspace/reports"; if (!fs.existsSync(reportsDir)) { console.log("No reports directory found."); return; } const files = fs.readdirSync(reportsDir).sort(); for (const file of files) { const fullPath = path.join(reportsDir, file); if (!fs.statSync(fullPath).isFile()) continue; const ext = path.extname(file); const scanType = scanMap[ext]; if (!scanType) continue; console.log(`Uploading ${file} as ${scanType}...`); try { const response = await fetch(`${baseUrl}/api/v2/import-scan/`, { method: "POST", headers: { "Authorization": `Token ${apiToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ scan_type: scanType, product_name: productName, file_name: file, }) }); if (!response.ok) { const text = await response.text(); console.error(`Failed to upload ${file}: ${response.status} ${response.statusText} - ${text}`); process.exitCode = 1; } else { console.log(`Successfully uploaded ${file}`); } } catch (e) { console.error(`Network error uploading ${file}:`, e); process.exitCode = 1; } } } if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) { uploadReports(); }