fase(16): integrations module
This commit is contained in:
61
dist/modules/integrations/application/event-handlers/OnFindingCreated.js
vendored
Normal file
61
dist/modules/integrations/application/event-handlers/OnFindingCreated.js
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
"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);
|
||||
}
|
||||
Reference in New Issue
Block a user