85 lines
2.3 KiB
Ruby
85 lines
2.3 KiB
Ruby
class Integrations::Slack::SlackLinkUnfurlService
|
|
pattr_initialize [:params!, :integration_hook!]
|
|
|
|
def perform
|
|
event_links = params.dig(:event, :links)
|
|
return unless event_links
|
|
|
|
event_links.each do |link_info|
|
|
url = link_info[:url]
|
|
# Unfurl only if the account id is same as the integration hook account id
|
|
unfurl_link(url) if url && valid_account?(url)
|
|
end
|
|
end
|
|
|
|
def unfurl_link(url)
|
|
conversation = conversation_from_url(url)
|
|
return unless conversation
|
|
|
|
send_unfurls(url, conversation)
|
|
end
|
|
|
|
private
|
|
|
|
def contact_attributes(conversation)
|
|
contact = conversation.contact
|
|
{
|
|
user_name: contact.name.presence || '---',
|
|
email: contact.email.presence || '---',
|
|
phone_number: contact.phone_number.presence || '---',
|
|
company_name: contact.additional_attributes&.dig('company_name').presence || '---'
|
|
}
|
|
end
|
|
|
|
def generate_unfurls(url, user_info, inbox)
|
|
Integrations::Slack::LinkUnfurlFormatter.new(
|
|
url: url,
|
|
user_info: user_info,
|
|
inbox_name: inbox.name,
|
|
inbox_type: inbox.channel.name
|
|
).perform
|
|
end
|
|
|
|
def send_unfurls(url, conversation)
|
|
user_info = contact_attributes(conversation)
|
|
unfurls = generate_unfurls(url, user_info, conversation.inbox)
|
|
unfurl_params = {
|
|
unfurl_id: params.dig(:event, :unfurl_id),
|
|
source: params.dig(:event, :source),
|
|
unfurls: JSON.generate(unfurls)
|
|
}
|
|
|
|
slack_service = Integrations::Slack::SendOnSlackService.new(
|
|
message: nil,
|
|
hook: integration_hook
|
|
)
|
|
slack_service.link_unfurl(unfurl_params)
|
|
end
|
|
|
|
def conversation_from_url(url)
|
|
conversation_id = extract_conversation_id(url)
|
|
find_conversation_by_id(conversation_id) if conversation_id
|
|
end
|
|
|
|
def find_conversation_by_id(conversation_id)
|
|
Conversation.find_by(display_id: conversation_id, account_id: integration_hook.account_id)
|
|
end
|
|
|
|
def valid_account?(url)
|
|
account_id = extract_account_id(url)
|
|
account_id == integration_hook.account_id.to_s
|
|
end
|
|
|
|
def extract_account_id(url)
|
|
account_id_regex = %r{/accounts/(\d+)}
|
|
match_data = url.match(account_id_regex)
|
|
match_data[1] if match_data
|
|
end
|
|
|
|
def extract_conversation_id(url)
|
|
conversation_id_regex = %r{/conversations/(\d+)}
|
|
match_data = url.match(conversation_id_regex)
|
|
match_data[1] if match_data
|
|
end
|
|
end
|