feat(phases): implement webhooks (6.1), email (7.1), user preferences (7.2)
Some checks failed
Aegis CI / lint-and-test (push) Has been cancelled
Some checks failed
Aegis CI / lint-and-test (push) Has been cancelled
- Phase 6.1: WebhookConfig model, CRUD router (/api/v1/webhooks, admin-only), dispatch_webhook() with HMAC signing; integrated into test validation, campaign completion, and MITRE sync job - Phase 7.1: SMTP email service with send_test_validated_email, send_campaign_completed_email, send_new_mitre_techniques_email; notify_role_with_email() added to notification_service - Phase 7.2: notification_preferences and jira_account_id on User model; PATCH /users/me/preferences endpoint; Alembic migrations b031phase6 and b032phase7 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -45,6 +45,7 @@ from app.schemas.test_template import TestTemplateInstantiate
|
||||
from app.domain.unit_of_work import UnitOfWork
|
||||
from app.services.audit_service import log_action
|
||||
from app.services.status_service import recalculate_technique_status
|
||||
from app.services.webhook_service import dispatch_webhook
|
||||
from app.services.test_crud_service import (
|
||||
create_test as crud_create_test,
|
||||
create_test_from_template as crud_create_from_template,
|
||||
@@ -462,6 +463,10 @@ def validate_red(
|
||||
recalculate_technique_status(db, test.technique)
|
||||
uow.commit()
|
||||
db.refresh(test)
|
||||
if test.state == TestState.validated:
|
||||
dispatch_webhook("test.validated", {"test_id": str(test.id), "technique_id": str(test.technique_id), "result": test.result.value if test.result else None})
|
||||
elif test.state == TestState.rejected:
|
||||
dispatch_webhook("test.rejected", {"test_id": str(test.id), "technique_id": str(test.technique_id)})
|
||||
return test
|
||||
|
||||
|
||||
@@ -489,6 +494,10 @@ def validate_blue(
|
||||
recalculate_technique_status(db, test.technique)
|
||||
uow.commit()
|
||||
db.refresh(test)
|
||||
if test.state == TestState.validated:
|
||||
dispatch_webhook("test.validated", {"test_id": str(test.id), "technique_id": str(test.technique_id), "result": test.result.value if test.result else None})
|
||||
elif test.state == TestState.rejected:
|
||||
dispatch_webhook("test.rejected", {"test_id": str(test.id), "technique_id": str(test.technique_id)})
|
||||
return test
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user