Nenhuma Descrição

mvp.py 3.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from __future__ import annotations
  2. from typing import Any, Awaitable, Callable
  3. from fastapi import APIRouter, Depends
  4. from app.models import ApiResponse, MvpIncidentIngestRequest, MvpIocEvaluateRequest, MvpVpnEvaluateRequest
  5. from app.services.mvp_service import MvpService
  6. def build_mvp_router(
  7. mvp_service: MvpService,
  8. require_internal_key: Callable[..., Awaitable[None]],
  9. ) -> APIRouter:
  10. router = APIRouter(prefix="/mvp", tags=["mvp"])
  11. @router.post(
  12. "/incidents/ingest",
  13. response_model=ApiResponse,
  14. dependencies=[Depends(require_internal_key)],
  15. summary="Ingest MVP incident",
  16. description="Ingest a normalized event into MVP correlation and incident workflow.",
  17. )
  18. async def ingest_incident(payload: MvpIncidentIngestRequest) -> ApiResponse:
  19. result = await mvp_service.ingest_incident(payload.model_dump(mode="json"))
  20. return ApiResponse(data=result)
  21. @router.post(
  22. "/ioc/evaluate",
  23. response_model=ApiResponse,
  24. dependencies=[Depends(require_internal_key)],
  25. summary="Evaluate IOC (MVP)",
  26. description="Evaluate IOC via configured workflow and create/update incident when matched.",
  27. )
  28. async def evaluate_ioc(payload: MvpIocEvaluateRequest) -> ApiResponse:
  29. result = await mvp_service.evaluate_ioc(payload.model_dump(mode="json"))
  30. return ApiResponse(data=result)
  31. @router.post(
  32. "/vpn/evaluate",
  33. response_model=ApiResponse,
  34. dependencies=[Depends(require_internal_key)],
  35. summary="Evaluate VPN anomaly (MVP)",
  36. description="Evaluate VPN login risk context and route to incident/escalation logic.",
  37. )
  38. async def evaluate_vpn(payload: MvpVpnEvaluateRequest) -> ApiResponse:
  39. result = await mvp_service.evaluate_vpn(payload.model_dump(mode="json"))
  40. return ApiResponse(data=result)
  41. @router.get(
  42. "/config/policies",
  43. response_model=ApiResponse,
  44. summary="Get MVP policy",
  45. description="Return active MVP policy configuration used for risk and escalation decisions.",
  46. )
  47. async def get_policies() -> ApiResponse:
  48. data = mvp_service.repo.get_policy()
  49. return ApiResponse(data={"policy": data})
  50. @router.put(
  51. "/config/policies",
  52. response_model=ApiResponse,
  53. dependencies=[Depends(require_internal_key)],
  54. summary="Update MVP policy",
  55. description="Replace MVP policy configuration used for incident scoring and escalation.",
  56. )
  57. async def update_policies(payload: dict[str, Any]) -> ApiResponse:
  58. data = mvp_service.repo.update_policy(payload)
  59. return ApiResponse(data={"policy": data})
  60. @router.get(
  61. "/health/dependencies",
  62. response_model=ApiResponse,
  63. summary="Dependency health (MVP)",
  64. description="Check connectivity and latency for Wazuh, Shuffle, IRIS, and PagerDuty stub.",
  65. )
  66. async def dependency_health() -> ApiResponse:
  67. data = await mvp_service.dependency_health()
  68. return ApiResponse(data={"dependencies": data})
  69. return router