Module: Motor::Alerts::SlackSender

Defined in:
lib/motor/alerts/slack_sender.rb

Constant Summary collapse

/\[(.+?)\]\((.+?)\)/.freeze
MARKDOWN_PATHS_TRANSFORM_REGEXP =
/\n\s*\#{1,5}\s*(.*)\n?/.freeze
MARKDOWN_HEADING_TRANSFORM_REGEXP =
/\n\s*\#{1,5}\s*(.*)\n?/.freeze
MARKDOWN_BOLD_TRANSFORM_REGEXP =
/[*_]{2}/.freeze
DEFAULT_FILENAME =
'data.csv'

Class Method Summary collapse

Class Method Details

.build_alert_message(alert) ⇒ Object



34
35
36
37
38
39
# File 'lib/motor/alerts/slack_sender.rb', line 34

def build_alert_message(alert)
  "    \#{build_query_link(alert)}\n    \#{alert.description}\n  MARKDOWN\nend\n"


41
42
43
44
45
# File 'lib/motor/alerts/slack_sender.rb', line 41

def build_query_link(alert)
  link = Motor::Admin.routes.url_helpers.motor_ui_query_url(alert.query_id, host: Motor.app_host)

  "*<#{link}|#{alert.name}>*"
end

.call(alert, conversation_id, slack_user: nil) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/motor/alerts/slack_sender.rb', line 15

def call(alert, conversation_id, slack_user: nil)
  query_result = load_data(alert, slack_user)

  if alert.query.preferences[:visualization] == 'markdown'
    text = [build_query_link(alert), render_markdown(alert, query_result)].join

    Slack::Client.send_message(channel: conversation_id,
                               as_user: slack_user.present?,
                               text: text)
  else
    Slack::Client.send_message(channel: conversation_id,
                               as_user: slack_user.present?,
                               text: build_alert_message(alert))
    Slack::Client.send_file(channels: conversation_id,
                            content: generate_csv(query_result),
                            filename: DEFAULT_FILENAME)
  end
end

.generate_csv(query_result) ⇒ Object



59
60
61
62
63
# File 'lib/motor/alerts/slack_sender.rb', line 59

def generate_csv(query_result)
  rows = [query_result.columns.pluck(:name)] + query_result.data

  rows.map(&:to_csv).join
end

.load_data(alert, slack_user = nil) ⇒ Object



65
66
67
68
69
70
71
# File 'lib/motor/alerts/slack_sender.rb', line 65

def load_data(alert, slack_user = nil)
  if slack_user
    Queries::RunQuery.call(alert.query, variables_hash: { current_user_email: slack_user['email'] })
  else
    Queries::RunQuery.call(alert.query)
  end
end

.render_markdown(alert, query_result) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
# File 'lib/motor/alerts/slack_sender.rb', line 47

def render_markdown(alert, query_result)
  params = query_result.columns.pluck(:name).zip(query_result.data[0]).to_h.symbolize_keys

  markdown =
    ["\n", Mustache.render(alert.query.preferences[:visualization_options][:markdown], **params)].join

  markdown.gsub(/\((.*)\)/, "(http://#{Motor.app_host}\\1)")
          .gsub(MARKDOWN_LINK_TRANSFORM_REGEXP, '<\2|\1>')
          .gsub(MARKDOWN_HEADING_TRANSFORM_REGEXP, "\n\n*\\1*")
          .gsub(MARKDOWN_BOLD_TRANSFORM_REGEXP, '*')
end