| 1 | from fastapi import APIRouter |
| 2 | from fastapi import Depends |
| 3 | from fastapi import Security |
| 4 | from loguru import logger |
| 5 | from sqlalchemy.ext.asyncio import AsyncSession |
| 6 | |
| 7 | from app.auth.utils import AuthHandler |
| 8 | from app.connectors.sublime.schema.alerts import AlertRequestBody |
| 9 | from app.connectors.sublime.schema.alerts import AlertResponseBody |
| 10 | from app.connectors.sublime.schema.alerts import SublimeAlertsResponse |
| 11 | from app.connectors.sublime.services.alerts import collect_alerts |
| 12 | from app.connectors.sublime.services.alerts import store_sublime_alert |
| 13 | from app.db.db_session import get_db |
| 14 | |
| 15 | sublime_alerts_router = APIRouter() |
| 16 | |
| 17 | |
| 18 | @sublime_alerts_router.post( |
| 19 | "/alert", |
| 20 | description="Receive alert from Sublime and store it in the database", |
| 21 | dependencies=[Security(AuthHandler().require_any_scope("admin", "analyst"))], |
| 22 | ) |
| 23 | async def receive_sublime_alert( |
| 24 | alert_request_body: AlertRequestBody, |
| 25 | session: AsyncSession = Depends(get_db), |
| 26 | ) -> AlertResponseBody: |
| 27 | """ |
| 28 | Endpoint to store alert in the `sublimealerts` table. |
| 29 | Invoked by the Sublime alert webhook which is configured in the Sublime UI. |
| 30 | |
| 31 | Returns: |
| 32 | jsonify: A JSON response containing if the alert was stored successfully. |
| 33 | """ |
| 34 | logger.info(f"Received alert from Sublime: {alert_request_body}") |
| 35 | return await store_sublime_alert(session, alert_request_body) |
| 36 | |
| 37 | |
| 38 | @sublime_alerts_router.get( |
| 39 | "/alerts", |
| 40 | response_model=SublimeAlertsResponse, |
| 41 | description="Get all alerts", |
| 42 | dependencies=[Security(AuthHandler().require_any_scope("admin", "analyst"))], |
| 43 | ) |
| 44 | async def get_sublime_alerts( |
| 45 | session: AsyncSession = Depends(get_db), |
| 46 | ) -> SublimeAlertsResponse: |
| 47 | """ |
| 48 | Endpoint to retrieve alerts from the `sublimealerts` table. |
| 49 | |
| 50 | Returns: |
| 51 | jsonify: A JSON response containing all the alerts stored in the `sublimealerts` table. |
| 52 | """ |
| 53 | logger.info("Fetching all alerts from Sublime") |
| 54 | return await collect_alerts(session) |