"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.OnFindingCreated = void 0; const SlackProvider_1 = require("../../infrastructure/providers/SlackProvider"); const GitHubIssuesProvider_1 = require("../../infrastructure/providers/GitHubIssuesProvider"); const JiraProvider_1 = require("../../infrastructure/providers/JiraProvider"); class OnFindingCreated { constructor(integrationRepo, webhookRepo, dispatcher, logger) { this.integrationRepo = integrationRepo; this.webhookRepo = webhookRepo; this.dispatcher = dispatcher; this.logger = logger; } async handle(event) { const payload = event.payload; const finding = { id: payload.findingId, title: `${payload.type} finding`, severity: payload.severity, type: payload.type, description: payload.description, sessionId: payload.sessionId, }; // Dispatch to custom webhooks await this.dispatcher.dispatchFinding(finding); // Dispatch to named integrations (Slack, GitHub, Jira) const integrations = await this.integrationRepo.findEnabled(); for (const integration of integrations) { try { const minSev = integration.config.minSeverity ?? 'low'; if (!severityMeetsThreshold(payload.severity, minSev)) continue; const type = integration.type.value; if (type === 'slack' && integration.config.webhookUrl) { const provider = new SlackProvider_1.SlackProvider(integration.config.webhookUrl); await provider.sendFinding(finding); } else if (type === 'github' && integration.config.token && integration.config.repo) { const provider = new GitHubIssuesProvider_1.GitHubIssuesProvider(integration.config.token, integration.config.repo); await provider.sendFinding(finding); } else if (type === 'jira' && integration.config.host && integration.config.token && integration.config.username && integration.config.projectKey) { const provider = new JiraProvider_1.JiraProvider(integration.config.host, integration.config.token, integration.config.username, integration.config.projectKey); await provider.sendFinding(finding); } } catch (err) { this.logger.warn({ integrationId: integration.id.toString(), err }, 'Integration dispatch failed'); } } } } exports.OnFindingCreated = OnFindingCreated; const SEVERITY_ORDER = ['low', 'medium', 'high', 'critical']; function severityMeetsThreshold(severity, min) { return SEVERITY_ORDER.indexOf(severity) >= SEVERITY_ORDER.indexOf(min); }