82 lines
2.5 KiB
Python
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,
|
|
)
|