debian-mirror-gitlab/app/services/integrations/slack_event_service.rb
2023-07-09 08:55:56 +05:30

61 lines
1.9 KiB
Ruby

# frozen_string_literal: true
# Performs the initial handling of event payloads sent from Slack to GitLab.
# See `API::Integrations::Slack::Events` which calls this service.
module Integrations
class SlackEventService
URL_VERIFICATION_EVENT = 'url_verification'
UnknownEventError = Class.new(StandardError)
def initialize(params)
# When receiving URL verification events, params[:type] is 'url_verification'.
# For all other events we subscribe to, params[:type] is 'event_callback' and
# the specific type of the event will be in params[:event][:type].
# Remove both of these from the params before they are passed to the services.
type = params.delete(:type)
type = params[:event].delete(:type) if type == 'event_callback'
@slack_event = type
@params = params
end
def execute
raise UnknownEventError, "Unable to handle event type: '#{slack_event}'" unless routable_event?
payload = route_event
ServiceResponse.success(payload: payload)
end
private
# The `url_verification` slack_event response must be returned to Slack in-request,
# so for this event we call the service directly instead of through a worker.
#
# All other events must be handled asynchronously in order to return a 2xx response
# immediately to Slack in the request. See https://api.slack.com/apis/connections/events-api.
def route_in_request?
slack_event == URL_VERIFICATION_EVENT
end
def routable_event?
route_in_request? || route_to_event_worker?
end
def route_to_event_worker?
SlackEventWorker.event?(slack_event)
end
# Returns a payload for the service response.
def route_event
return SlackEvents::UrlVerificationService.new(params).execute if route_in_request?
SlackEventWorker.perform_async(slack_event: slack_event, params: params)
{}
end
attr_reader :slack_event, :params
end
end