Class: CollavreSlack::SlackEventHandler

Inherits:
Object
  • Object
show all
Defined in:
app/services/collavre_slack/slack_event_handler.rb

Instance Method Summary collapse

Constructor Details

#initialize(payload:) ⇒ SlackEventHandler

Returns a new instance of SlackEventHandler.



3
4
5
# File 'app/services/collavre_slack/slack_event_handler.rb', line 3

def initialize(payload:)
  @payload = payload
end

Instance Method Details

#callObject



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'app/services/collavre_slack/slack_event_handler.rb', line 7

def call
  return handle_reaction_event if reaction_event?
  return handle_message_changed if message_changed_event?
  return handle_message_deleted if message_deleted_event?
  return unless message_event?

   = SlackAccount.find_by(team_id: team_id)
  return unless 

  channel_link = SlackChannelLink.find_by(
    slack_account: ,
    channel_id: channel_id
  )
  return unless channel_link

  user_result = find_or_map_user(, event_user_id)
  user = user_result[:user] || channel_link.created_by
  slack_display_name = user_result[:slack_display_name]
  slack_email = user_result[:slack_email]
  slack_user_id = user_result[:slack_user_id]

  normalized_content = MentionMapping.from_slack(formatted_content, )

  # Prepend Slack username if user is not mapped
  if user_result[:user].nil? && slack_display_name.present?
    prefix = I18n.t("collavre_slack.messages.slack_user_prefix", name: slack_display_name)
    normalized_content = "#{prefix} #{normalized_content}"
  end

  {
    type: :message,
    creative_id: channel_link.creative_id,
    user_id: user&.id,
    content: normalized_content,
    slack_channel_link_id: channel_link.id,
    slack_message_ts: event_ts,
    slack_display_name: slack_display_name,
    slack_email: slack_email,
    slack_user_id: slack_user_id
  }
end

#handle_message_changedObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'app/services/collavre_slack/slack_event_handler.rb', line 49

def handle_message_changed
   = SlackAccount.find_by(team_id: team_id)
  return unless 

  # For message_changed, the edited message is in event.message
  message = event_payload[:message] || {}
  message_ts = message[:ts]
  return unless message_ts

  # Skip bot messages
  return if message[:bot_id].present?

  # Find the comment link by Slack message
  comment_link = SlackCommentLink.find_by_slack_message(
    slack_account: ,
    channel_id: channel_id,
    message_ts: message_ts
  )
  return unless comment_link

  new_text = message[:text].to_s
  normalized_content = MentionMapping.from_slack(new_text, )

  {
    type: :message_updated,
    comment_id: comment_link.comment_id,
    content: normalized_content
  }
end

#handle_message_deletedObject



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'app/services/collavre_slack/slack_event_handler.rb', line 79

def handle_message_deleted
   = SlackAccount.find_by(team_id: team_id)
  return unless 

  # For message_deleted, the deleted message ts is in event.deleted_ts
  deleted_ts = event_payload[:deleted_ts]
  return unless deleted_ts

  # Find the comment link by Slack message
  comment_link = SlackCommentLink.find_by_slack_message(
    slack_account: ,
    channel_id: channel_id,
    message_ts: deleted_ts
  )
  return unless comment_link

  {
    type: :message_deleted,
    comment_id: comment_link.comment_id,
    slack_comment_link_id: comment_link.id
  }
end

#handle_reaction_eventObject



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'app/services/collavre_slack/slack_event_handler.rb', line 102

def handle_reaction_event
   = SlackAccount.find_by(team_id: team_id)
  return unless 

  # Reaction events have item.channel and item.ts
  item = event_payload[:item] || {}
  reaction_channel_id = item[:channel]
  reaction_message_ts = item[:ts]

  return unless reaction_channel_id && reaction_message_ts

  # Find the comment link by Slack message
  comment_link = SlackCommentLink.find_by_slack_message(
    slack_account: ,
    channel_id: reaction_channel_id,
    message_ts: reaction_message_ts
  )
  return unless comment_link

  # Map Slack user to Collavre user
  user_result = find_or_map_user(, event_user_id)
  user = user_result[:user]
  return unless user # Can't add reaction without a mapped user

  {
    type: reaction_action,
    comment_id: comment_link.comment_id,
    user_id: user.id,
    emoji: EmojiMapping.to_unicode(event_payload[:reaction])
  }
end