import logging from urllib.parse import urlparse from fastapi import APIRouter from app.api.deps import SessionDep from app.tasks.triggers import create_ticket_to_kb_issue_case_task router = APIRouter() logger = logging.getLogger(__name__) @router.post("/webhook") def receive_events( session: SessionDep, user_id: str, user_key: str, payload: dict, ): try: event_type = payload["webhookEvent"] if event_type == "jira:issue_updated": create_kb_issue_case_when_issue_resolved(payload) else: logger.info(f"Received event {event_type} from {user_id}({user_key})") return {"detail": "success"} except Exception as e: raise e # Notice: Only handle self-hosted Jira. def create_kb_issue_case_when_issue_resolved(payload): try: issue = payload["issue"] issue_key = issue["key"] issue_self_url = urlparse(issue["self"]) # Check if issue to be resolved. if 'changelog' not in payload: logger.info(f"Issue {issue_key} has no changelog, skip.") return changelog = payload["changelog"] issue_be_resolved = any( item.get("toString") == "Resolved" for item in changelog.get("items", []) ) if not issue_be_resolved: logger.info(f"Issue {issue_key} has not been resolved, skip.") return create_ticket_to_kb_issue_case_task( issue_self_url.hostname, issue_key, async_task=True, check_issue=True ) except Exception as e: raise e