oncall-engine/engine/apps/chatops_proxy/events/handlers.py
2024-06-14 07:46:14 +00:00

82 lines
2.5 KiB
Python

import logging
import typing
from abc import ABC, abstractmethod
from apps.chatops_proxy.client import PROVIDER_TYPE_SLACK
from apps.slack.installation import SlackInstallationExc, install_slack_integration, uninstall_slack_integration
from apps.user_management.models import Organization
from .types import (
INTEGRATION_INSTALLED_EVENT_TYPE,
INTEGRATION_UNINSTALLED_EVENT_TYPE,
Event,
IntegrationInstalledData,
IntegrationUninstalledData,
)
logger = logging.getLogger(__name__)
class Handler(ABC):
@classmethod
@abstractmethod
def match(cls, event: Event) -> bool:
pass
@classmethod
@abstractmethod
def handle(cls, event_data: dict) -> None:
pass
class SlackInstallHandler(Handler):
@classmethod
def match(cls, event: Event) -> bool:
return (
event.get("event_type") == INTEGRATION_INSTALLED_EVENT_TYPE
and event.get("data", {}).get("provider_type") == PROVIDER_TYPE_SLACK
)
@classmethod
def handle(cls, data: dict) -> None:
data = typing.cast(IntegrationInstalledData, data)
stack_id = data.get("stack_id")
user_id = data.get("grafana_user_id")
payload = data.get("payload")
organization = Organization.objects.get(stack_id=stack_id)
user = organization.users.get(user_id=user_id)
try:
install_slack_integration(organization, user, payload)
except SlackInstallationExc as e:
logger.exception(
f'msg="SlackInstallationHandler: Failed to install Slack integration: %s" org_id={organization.id} stack_id={stack_id}',
e,
)
class SlackUninstallHandler(Handler):
@classmethod
def match(cls, event: Event) -> bool:
return (
event.get("event_type") == INTEGRATION_UNINSTALLED_EVENT_TYPE
and event.get("data", {}).get("provider_type") == PROVIDER_TYPE_SLACK
)
@classmethod
def handle(cls, data: dict) -> None:
data = typing.cast(IntegrationUninstalledData, data)
stack_id = data.get("stack_id")
user_id = data.get("grafana_user_id")
organization = Organization.objects.get(stack_id=stack_id)
user = organization.users.get(user_id=user_id)
try:
uninstall_slack_integration(organization, user)
except SlackInstallationExc as e:
logger.exception(
f'msg="SlackInstallationHandler: Failed to uninstall Slack integration: %s" org_id={organization.id} stack_id={stack_id}',
e,
)