Module: Legion::Extensions::MicrosoftTeams::Runners::Meetings

Extended by:
Definitions
Includes:
Helpers::Lex, Helpers::Client
Included in:
Client
Defined in:
lib/legion/extensions/microsoft_teams/runners/meetings.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Helpers::Client

#bot_connection, #graph_connection, #oauth_connection, #user_path

Class Method Details

.trigger_wordsObject



13
14
15
# File 'lib/legion/extensions/microsoft_teams/runners/meetings.rb', line 13

def self.trigger_words
  %w[meeting meetings calendar schedule scheduled attendance attendee]
end

Instance Method Details

#create_meeting(subject:, start_time:, end_time:, user_id: 'me') ⇒ Object



88
89
90
91
92
93
94
95
96
# File 'lib/legion/extensions/microsoft_teams/runners/meetings.rb', line 88

def create_meeting(subject:, start_time:, end_time:, user_id: 'me', **)
  payload = {
    subject:       subject,
    startDateTime: start_time,
    endDateTime:   end_time
  }
  response = graph_connection(**).post("#{user_path(user_id)}/onlineMeetings", payload)
  { result: response.body }
end

#delete_meeting(meeting_id:, user_id: 'me') ⇒ Object



125
126
127
128
# File 'lib/legion/extensions/microsoft_teams/runners/meetings.rb', line 125

def delete_meeting(meeting_id:, user_id: 'me', **)
  response = graph_connection(**).delete("#{user_path(user_id)}/onlineMeetings/#{meeting_id}")
  { result: response.body }
end

#get_attendance_report(meeting_id:, report_id:, user_id: 'me') ⇒ Object



172
173
174
175
# File 'lib/legion/extensions/microsoft_teams/runners/meetings.rb', line 172

def get_attendance_report(meeting_id:, report_id:, user_id: 'me', **)
  response = graph_connection(**).get("#{user_path(user_id)}/onlineMeetings/#{meeting_id}/attendanceReports/#{report_id}")
  { result: response.body }
end

#get_meeting(meeting_id:, user_id: 'me') ⇒ Object



69
70
71
72
# File 'lib/legion/extensions/microsoft_teams/runners/meetings.rb', line 69

def get_meeting(meeting_id:, user_id: 'me', **)
  response = graph_connection(**).get("#{user_path(user_id)}/onlineMeetings/#{meeting_id}")
  { result: response.body }
end

#get_meeting_by_join_url(join_url:, user_id: 'me') ⇒ Object



141
142
143
144
145
# File 'lib/legion/extensions/microsoft_teams/runners/meetings.rb', line 141

def get_meeting_by_join_url(join_url:, user_id: 'me', **)
  params = { '$filter' => "joinWebUrl eq '#{join_url.gsub("'", "''")}'" }
  response = graph_connection(**).get("#{user_path(user_id)}/onlineMeetings", params)
  { result: response.body }
end

#list_attendance_reports(meeting_id:, user_id: 'me') ⇒ Object



156
157
158
159
# File 'lib/legion/extensions/microsoft_teams/runners/meetings.rb', line 156

def list_attendance_reports(meeting_id:, user_id: 'me', **)
  response = graph_connection(**).get("#{user_path(user_id)}/onlineMeetings/#{meeting_id}/attendanceReports")
  { result: response.body }
end

#list_meetings(user_id: 'me', top: 50, max_pages: 1, filter: nil) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/legion/extensions/microsoft_teams/runners/meetings.rb', line 32

def list_meetings(user_id: 'me', top: 50, max_pages: 1, filter: nil, **)
  params = { '$top' => top }
  params['$filter'] = filter if filter
  conn = graph_connection(**)
  response = conn.get("#{user_path(user_id)}/onlineMeetings", params)
  body = response.body

  return { result: body } if max_pages <= 1

  all_values = Array(body['value'] || body[:value])
  next_link = body['@odata.nextLink'] || body[:'@odata.nextLink']
  pages_fetched = 1

  while next_link && pages_fetched < max_pages
    response = conn.get(next_link)
    page_body = response.body
    items = page_body['value'] || page_body[:value]
    all_values.concat(Array(items)) if items
    next_link = page_body['@odata.nextLink'] || page_body[:'@odata.nextLink']
    pages_fetched += 1
  end

  result = { '@odata.context' => body['@odata.context'] || body[:'@odata.context'],
             'value'          => all_values }
  result['@odata.nextLink'] = next_link if next_link
  { result: result }
end

#resolve_meeting(chat_thread_id: nil, join_url: nil, user_id: 'me') ⇒ Object



185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/legion/extensions/microsoft_teams/runners/meetings.rb', line 185

def resolve_meeting(chat_thread_id: nil, join_url: nil, user_id: 'me', **)
  return { error: 'provide chat_thread_id or join_url' } unless chat_thread_id || join_url

  unless join_url
    chat_response = graph_connection(**).get("chats/#{chat_thread_id}")
    chat_body = chat_response.body
    return { error: 'chat not found', result: chat_body } unless chat_body.is_a?(Hash) && !chat_body.key?('error')

    join_url = chat_body.dig('onlineMeetingInfo', 'joinWebUrl')
    return { error: 'chat has no onlineMeetingInfo', result: chat_body } unless join_url
  end

  meeting_response = get_meeting_by_join_url(join_url: join_url, user_id: user_id, **)
  meeting_body = meeting_response[:result]
  items = meeting_body.is_a?(Hash) ? meeting_body['value'] : nil
  return { error: 'could not resolve meeting from join URL', result: meeting_body } unless items.is_a?(Array) && !items.empty?

  { result: items.first }
end

#update_meeting(meeting_id:, user_id: 'me', subject: nil, start_time: nil, end_time: nil) ⇒ Object



107
108
109
110
111
112
113
114
# File 'lib/legion/extensions/microsoft_teams/runners/meetings.rb', line 107

def update_meeting(meeting_id:, user_id: 'me', subject: nil, start_time: nil, end_time: nil, **)
  payload = {}
  payload[:subject] = subject if subject
  payload[:startDateTime] = start_time if start_time
  payload[:endDateTime] = end_time if end_time
  response = graph_connection(**).patch("#{user_path(user_id)}/onlineMeetings/#{meeting_id}", payload)
  { result: response.body }
end