vonage 7.12.0 → 7.14.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 42d5bfc879e0b399da415f92a0f65313c3aa3f22760945c7832996290e7cbebb
4
- data.tar.gz: be7e53025cad9a1fa877d9749e82ff22fa4c6ec4cb2da63ecefef136269fc810
3
+ metadata.gz: c6681bf0608f283c8404c19838cae08679bed799b0d793622ba6863fbafddb2e
4
+ data.tar.gz: 7c60d5f1ae1207a1404f705ce20b38cfe3ccbc5f549151f8367f346bb823b9e8
5
5
  SHA512:
6
- metadata.gz: 29f033e6795e3d52bdef207656a7230925037b04dbdbd57bbdbce4cf74b91842cb9cfcd7e04b9061a5267210905d14b68961dc4daab26bf349dff0ece9a6e659
7
- data.tar.gz: 43c52d578923fd7a5a7b04b243b040df2ba1cef5dd0c38c37007820207a5ab411a9976a0b42a2dff653b19d6e856ade248163a8856ac93c88dd49209d4cd6b4f
6
+ metadata.gz: 5c6ac59f07a9a94979ceca1e170bec5e67a0706b66d6b45cffe027505bf0280f3bad83041e6b09e1fec70afafb3edc47ea4f40a01894d9927ee7c19cae023247
7
+ data.tar.gz: fbe93fa8fe2dd36b3ea498a5b48ad61ff9cfd6494435b1c3120cd47e3a0d9b1c3feffe2c847e619c716cbcb37688073bf5834cde1caf13b79c530d72661addf7
data/lib/vonage/client.rb CHANGED
@@ -61,6 +61,13 @@ module Vonage
61
61
  @files ||= T.let(Files.new(config), T.nilable(Vonage::Files))
62
62
  end
63
63
 
64
+ # @return [Meetings]
65
+ #
66
+ sig { returns(T.nilable(Vonage::Meetings)) }
67
+ def meetings
68
+ @meetings ||= T.let(Meetings.new(config), T.nilable(Vonage::Meetings))
69
+ end
70
+
64
71
  # @return [Messages]
65
72
  #
66
73
  sig { returns(T.nilable(Vonage::Messages)) }
@@ -96,6 +103,13 @@ module Vonage
96
103
  @pricing ||= T.let(PricingTypes.new(config), T.nilable(Vonage::PricingTypes))
97
104
  end
98
105
 
106
+ # @return [ProactiveConnect]
107
+ #
108
+ sig { returns(T.nilable(Vonage::ProactiveConnect)) }
109
+ def proactive_connect
110
+ @proactive_connect ||= T.let(ProactiveConnect.new(config), T.nilable(Vonage::ProactiveConnect))
111
+ end
112
+
99
113
  # @return [Redact]
100
114
  #
101
115
  sig { returns(T.nilable(Vonage::Redact)) }
data/lib/vonage/config.rb CHANGED
@@ -18,6 +18,7 @@ module Vonage
18
18
  self.signature_secret = ENV['VONAGE_SIGNATURE_SECRET']
19
19
  self.signature_method = ENV['VONAGE_SIGNATURE_METHOD'] || 'md5hash'
20
20
  self.token = T.let(nil, T.nilable(String))
21
+ self.vonage_host = 'api-eu.vonage.com'
21
22
  end
22
23
 
23
24
  # Merges the config with the given options hash.
@@ -198,6 +199,9 @@ module Vonage
198
199
  sig { params(token: T.nilable(String)).returns(T.nilable(String)) }
199
200
  attr_writer :token
200
201
 
202
+ sig { returns(String) }
203
+ attr_accessor :vonage_host
204
+
201
205
  protected
202
206
 
203
207
  sig { params(name: Symbol, value: T.untyped).void }
data/lib/vonage/errors.rb CHANGED
@@ -1,14 +1,25 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
- require 'json'
3
+ require "json"
4
4
 
5
5
  module Vonage
6
6
  module Errors
7
7
  extend T::Sig
8
8
 
9
- sig {params(response: T.any(Net::HTTPUnauthorized, Net::HTTPClientError, Net::HTTPServerError, T.untyped)).returns(Vonage::Error)}
9
+ sig do
10
+ params(
11
+ response:
12
+ T.any(
13
+ Net::HTTPUnauthorized,
14
+ Net::HTTPClientError,
15
+ Net::HTTPServerError,
16
+ T.untyped
17
+ )
18
+ ).returns(Vonage::Error)
19
+ end
10
20
  def self.parse(response)
11
- exception_class = case response
21
+ exception_class =
22
+ case response
12
23
  when Net::HTTPUnauthorized
13
24
  AuthenticationError
14
25
  when Net::HTTPClientError
@@ -19,31 +30,34 @@ module Vonage
19
30
  Error
20
31
  end
21
32
 
22
- message = if response.content_type == 'application/json'
23
- hash = ::JSON.parse(response.body)
24
-
25
- if hash.key?('error_title')
26
- hash['error_title']
27
- elsif hash.key?('error-code-label')
28
- hash['error-code-label']
29
- elsif hash.key?('description')
30
- hash['description']
31
- elsif problem_details?(hash)
32
- problem_details_message(hash)
33
+ message =
34
+ if response.content_type == "application/json"
35
+ hash = ::JSON.parse(response.body)
36
+
37
+ if hash.key?("error_title")
38
+ hash["error_title"]
39
+ elsif hash.key?("error-code-label")
40
+ hash["error-code-label"]
41
+ elsif hash.key?("description")
42
+ hash["description"]
43
+ elsif hash.key?("message")
44
+ hash["message"]
45
+ elsif problem_details?(hash)
46
+ problem_details_message(hash)
47
+ end
33
48
  end
34
- end
35
49
 
36
50
  exception_class.new(message)
37
51
  end
38
52
 
39
53
  sig { params(hash: T::Hash[String, T.untyped]).returns(T::Boolean) }
40
54
  def self.problem_details?(hash)
41
- hash.key?('title') && hash.key?('detail') && hash.key?('type')
55
+ hash.key?("title") && hash.key?("detail") && hash.key?("type")
42
56
  end
43
57
 
44
58
  sig { params(hash: T::Hash[String, T.untyped]).returns(String) }
45
59
  def self.problem_details_message(hash)
46
- "#{hash['title']}. #{hash['detail']} See #{hash['type']} for more info, or email support@nexmo.com if you have any questions."
60
+ "#{hash["title"]}. #{hash["detail"]} See #{hash["type"]} for more info, or email support@nexmo.com if you have any questions."
47
61
  end
48
62
  end
49
63
 
@@ -0,0 +1,25 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module Vonage
5
+ class Meetings::Applications < Namespace
6
+ extend T::Sig
7
+
8
+ self.authentication = BearerToken
9
+
10
+ self.request_body = JSON
11
+
12
+ self.host = :vonage_host
13
+
14
+ # Update an existing application.
15
+ #
16
+ # @param [required, String] :default_theme_id The id of the theme to set as application default theme
17
+ #
18
+ # @return [Response]
19
+ #
20
+ # @see https://developer.vonage.com/en/api/meetings#updateApplication
21
+ def update(default_theme_id:)
22
+ request("/meetings/applications", params: {update_details: {default_theme_id: default_theme_id}}, type: Patch)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ # typed: true
2
+
3
+ class Vonage::Meetings::DialInNumbers::ListResponse < Vonage::Response
4
+ include Enumerable
5
+
6
+ def each
7
+ return enum_for(:each) unless block_given?
8
+
9
+ @entity.each { |item| yield item }
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module Vonage
5
+ class Meetings::DialInNumbers < Namespace
6
+ extend T::Sig
7
+
8
+ self.authentication = BearerToken
9
+
10
+ self.request_body = JSON
11
+
12
+ self.host = :vonage_host
13
+
14
+ # Get numbers that can be used to dial into a meeting.
15
+ #
16
+ # @return [ListResponse]
17
+ #
18
+ # @see https://developer.vonage.com/en/api/meetings#getDialInNumbers
19
+ def list
20
+ request("/meetings/dial-in-numbers", response_class: ListResponse)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,36 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module Vonage
5
+ class Meetings::Recordings < Namespace
6
+ extend T::Sig
7
+
8
+ self.authentication = BearerToken
9
+
10
+ self.request_body = JSON
11
+
12
+ self.host = :vonage_host
13
+
14
+ # Return information for specified recording.
15
+ #
16
+ # @param [required, String] recording_id The id of the recoring for which the info should be returned
17
+ #
18
+ # @return [Response]
19
+ #
20
+ # @see https://developer.vonage.com/en/api/meetings#getRecording
21
+ def info(recording_id:)
22
+ request("/meetings/recordings/" + recording_id)
23
+ end
24
+
25
+ # Delete a specified recording.
26
+ #
27
+ # @param [required, String] recording_id The id of the recoring to be deleted
28
+ #
29
+ # @return [Response]
30
+ #
31
+ # @see https://developer.vonage.com/en/api/meetings#deleteRecording
32
+ def delete(recording_id:)
33
+ request("/meetings/recordings/" + recording_id, type: Delete)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,11 @@
1
+ # typed: true
2
+
3
+ class Vonage::Meetings::Rooms::ListResponse < Vonage::Response
4
+ include Enumerable
5
+
6
+ def each
7
+ return enum_for(:each) unless block_given?
8
+
9
+ @entity._embedded.each { |item| yield item }
10
+ end
11
+ end
@@ -0,0 +1,155 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module Vonage
5
+ class Meetings::Rooms < Namespace
6
+ extend T::Sig
7
+
8
+ self.authentication = BearerToken
9
+
10
+ self.request_body = JSON
11
+
12
+ self.host = :vonage_host
13
+
14
+ # Get a list of rooms associated with the Vonage application.
15
+ #
16
+ # @param [optional, Integer] :start_id
17
+ #
18
+ # @param [optional, Integer] :end_id
19
+ #
20
+ # @param [optional, Integer] :page_size
21
+ #
22
+ # @return [ListResponse]
23
+ #
24
+ # @see https://developer.vonage.com/en/api/meetings#getRooms
25
+ def list(**params)
26
+ path = "/meetings/rooms"
27
+ path += "?#{Params.encode(params)}" unless params.empty?
28
+
29
+ request(path, response_class: ListResponse)
30
+ end
31
+
32
+ # Return information for specified room.
33
+ #
34
+ # @param [required, String] room_id
35
+ # The id of the room for which the info should be returned
36
+ #
37
+ # @return [Response]
38
+ #
39
+ # @see https://developer.vonage.com/en/api/meetings#getRoom
40
+ def info(room_id:)
41
+ request("/meetings/rooms/" + room_id)
42
+ end
43
+
44
+ # Create a new room.
45
+ #
46
+ # @param [required, String] :display_name
47
+ #
48
+ # @param [optional, String] :metadata
49
+ # Free text that can be attached to a room. This will be passed in the form of a header in events related to this room.
50
+ #
51
+ # @param [optional, String] :type
52
+ # The type of room. Must be one of `instant` (the default) or `long_term`.
53
+ #
54
+ # @param [String(date)] :expires_at
55
+ # The time for when the room will be expired, expressed in ISO 8601 format.
56
+ # The value must be greater than 10 minutes from now.
57
+ # Must be set if `type` is `long_term`. Should not be set if `type` is `instant`
58
+ #
59
+ # @param [optional, Boolean] :expire_after_use
60
+ # Close the room after a session ends. Only relevant for rooms where the `type` is `long_term`
61
+ #
62
+ # @param [optional, string(uuid)] :theme_id
63
+ # When specified, the meeting room will use the theme indicated by the ID.
64
+ #
65
+ # @param [optional, String] :join_approval_level
66
+ # The level of approval needed to join the meeting in the room. Must be one of: `none`, `after_owner_only`, `explicit_approval`
67
+ #
68
+ # @param [optional, Hash] :recording_options
69
+ # @option :recording_options [Boolean] :auto_record Automatically record all sessions in this room. Recording cannot be stopped when this is set to `true`.
70
+ # @option :recording_options [Boolean] :record_only_owner Record only the owner screen or any share screen of the video.
71
+ #
72
+ # @param [optional, Hash] :initial_join_options
73
+ # @option :initial_join_options [String] :microphone_state
74
+ # Set the default microphone option for users in the pre-join screen of this room.
75
+ # Must be one of: `on`, `off`, `default`
76
+ #
77
+ # @param [optional, Hash] :callback_urls Provides callback URLs to listen to events. If specified, over-rides the callback URLs specified at Application-level
78
+ # @option :callback_urls [String] :rooms_callback_url Callback url for rooms events
79
+ # @option :callback_urls [String] :sessions_callback_url Callback url for sessions events
80
+ # @option :callback_urls [String] :recordings_callback_url Callback url for recordings events
81
+ #
82
+ # @param [optional, Hash] :available_features
83
+ # @option :available_features [Boolean] :is_recording_available Determine if recording feature is available in the UI (default `true`)
84
+ # @option :available_features [Boolean] :is_chat_available Determine if chat feature is available in the UI (default `true`)
85
+ # @option :available_features [Boolean] :is_whiteboard_available Determine if whiteboard feature is available in the UI (default `true`)
86
+ # @option :available_features [Boolean] :is_locale_switcher_available Determine if locale switche feature is available in the UI (default `true`)
87
+ # @option :available_features [Boolean] :is_captions_available Determine if captions feature is available in the UI
88
+ #
89
+ # @param [optional, Hash] :ui_settings Provides options to customize the user interface
90
+ # @option :ui_settings [String] :language
91
+ # The desired language of the UI. The default is `en` (English).
92
+ # Must be one of: `en`, `fr`, `de`, `es`, `pt`, `ca`, `he`
93
+ #
94
+ # @return [Response]
95
+ #
96
+ # @see https://developer.vonage.com/en/api/meetings#createRoom
97
+ def create(display_name:, **params)
98
+ request(
99
+ "/meetings/rooms",
100
+ params: params.merge({ display_name: display_name }),
101
+ type: Post
102
+ )
103
+ end
104
+
105
+ # Update an existing room.
106
+ # Although paramaters (other than `room_id`) are optional, at least one other parameter must be provided or an error
107
+ # response will be received.
108
+ #
109
+ # @param [required, String] room_id The ID of the Room to be updated
110
+ #
111
+ # @param [optional, String(date)] :expires_at
112
+ # The time for when the room will be expired, expressed in ISO 8601 format.
113
+ # Only relevant for rooms where the `type` is `long_term``
114
+ #
115
+ # @param [optional, Boolean] :expire_after_use
116
+ # Close the room after a session ends. Only relevant for rooms where the `type` is `long_term`
117
+ #
118
+ # @param [optional, string(uuid)] :theme_id
119
+ # When specified, the meeting room will use the theme indicated by the ID.
120
+ #
121
+ # @param [optional, String] :join_approval_level
122
+ # The level of approval needed to join the meeting in the room. Must be one of: `none`, `after_owner_only`, `explicit_approval`
123
+ #
124
+ # @param [optional, Hash] :initial_join_options
125
+ # @option :initial_join_options [String] :microphone_state
126
+ # Set the default microphone option for users in the pre-join screen of this room.
127
+ # Must be one of: `on`, `off`, `default`
128
+ #
129
+ # @param [optional, Hash] :callback_urls Provides callback URLs to listen to events. If specified, over-rides the callback URLs specified at Application-level
130
+ # @option :callback_urls [String] :rooms_callback_url Callback url for rooms events
131
+ # @option :callback_urls [String] :sessions_callback_url Callback url for sessions events
132
+ # @option :callback_urls [String] :recordings_callback_url Callback url for recordings events
133
+ #
134
+ # @param [optional, Hash] :available_features
135
+ # @option :available_features [Boolean] :is_recording_available Determine if recording feature is available in the UI (default `true`)
136
+ # @option :available_features [Boolean] :is_chat_available Determine if chat feature is available in the UI (default `true`)
137
+ # @option :available_features [Boolean] :is_whiteboard_available Determine if whiteboard feature is available in the UI (default `true`)
138
+ # @option :available_features [Boolean] :is_locale_switcher_available Determine if locale switche feature is available in the UI (default `true`)
139
+ # @option :available_features [Boolean] :is_captions_available Determine if captions feature is available in the UI
140
+ #
141
+ # @return [Response]
142
+ #
143
+ # @see https://developer.vonage.com/en/api/meetings#updateRoom
144
+ def update(room_id:, **params)
145
+ raise ArgumentError, 'must provide at least one other param in addition to :room_id' if params.empty?
146
+ request(
147
+ "/meetings/rooms/" + room_id,
148
+ params: {
149
+ update_details: params
150
+ },
151
+ type: Patch
152
+ )
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,11 @@
1
+ # typed: true
2
+
3
+ class Vonage::Meetings::Sessions::ListResponse < Vonage::Response
4
+ include Enumerable
5
+
6
+ def each
7
+ return enum_for(:each) unless block_given?
8
+
9
+ @entity._embedded.each { |item| yield item }
10
+ end
11
+ end
@@ -0,0 +1,28 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module Vonage
5
+ class Meetings::Sessions < Namespace
6
+ extend T::Sig
7
+
8
+ self.authentication = BearerToken
9
+
10
+ self.request_body = JSON
11
+
12
+ self.host = :vonage_host
13
+
14
+ # Return a list of recordings for a specified session.
15
+ #
16
+ # @param [required, String] session_id The id of the session for which the recordings list should be returned
17
+ #
18
+ # @return [ListResponse]
19
+ #
20
+ # @see https://developer.vonage.com/en/api/meetings#getSessionRecordings
21
+ def list_recordings(session_id:)
22
+ request(
23
+ "/meetings/sessions/" + session_id + "/recordings",
24
+ response_class: ListResponse
25
+ )
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ # typed: true
2
+
3
+ class Vonage::Meetings::Themes::ListResponse < Vonage::Response
4
+ include Enumerable
5
+
6
+ def each
7
+ return enum_for(:each) unless block_given?
8
+
9
+ @entity.each { |item| yield item }
10
+ end
11
+ end
@@ -0,0 +1,218 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module Vonage
5
+ class Meetings::Themes < Namespace
6
+ extend T::Sig
7
+
8
+ self.authentication = BearerToken
9
+
10
+ self.request_body = JSON
11
+
12
+ self.host = :vonage_host
13
+
14
+ # Get a list of themes associated with the Vonage application.
15
+ #
16
+ # @return [ListResponse]
17
+ #
18
+ # @see https://developer.vonage.com/en/api/meetings#getThemes
19
+ def list
20
+ request("/meetings/themes", response_class: ListResponse)
21
+ end
22
+
23
+ # Return information for specified theme.
24
+ #
25
+ # @param [required, String] theme_id The id of the theme for which the info should be returned
26
+ #
27
+ # @return [Response]
28
+ #
29
+ # @see https://developer.vonage.com/en/api/meetings#getThemeById
30
+ def info(theme_id:)
31
+ request("/meetings/themes/" + theme_id)
32
+ end
33
+
34
+ # Create a new theme.
35
+ #
36
+ # @param [required, String] :main_color
37
+ # The main color that will be used for the meeting room.
38
+ #
39
+ # @param [required, String] :brand_text
40
+ # The text that will appear on the meeting homepage, in the case that there is no brand image
41
+ #
42
+ # @param [optional, String] :theme_name
43
+ # The name of the theme (must be unique). If null, a UUID will automatically be generated
44
+ #
45
+ # @param [optional, String] :short_company_url
46
+ # The URL that will represent every meeting room with this theme. The value must be unique across Vonage
47
+ #
48
+ # @return [Response]
49
+ #
50
+ # @see https://developer.vonage.com/en/api/meetings#createTheme
51
+ def create(main_color:, brand_text:, **params)
52
+ request(
53
+ "/meetings/themes",
54
+ params: params.merge(main_color: main_color, brand_text: brand_text),
55
+ type: Post
56
+ )
57
+ end
58
+
59
+ # Update an existing theme.
60
+ #
61
+ # @param [required, String] theme_id The id of the theme to be updated
62
+ #
63
+ # @param [required, String] :main_color
64
+ # The main color that will be used for the meeting room.
65
+ #
66
+ # @param [required, String] :brand_text
67
+ # The text that will appear on the meeting homepage, in the case that there is no brand image
68
+ #
69
+ # @param [optional, String] :theme_name
70
+ # The name of the theme (must be unique). If null, a UUID will automatically be generated
71
+ #
72
+ # @param [optional, String] :short_company_url
73
+ # The URL that will represent every meeting room with this theme. The value must be unique across Vonage
74
+ #
75
+ # @return [Response]
76
+ #
77
+ # @see https://developer.vonage.com/en/api/meetings#updateTheme
78
+ def update(theme_id:, **params)
79
+ request(
80
+ "/meetings/themes/" + theme_id,
81
+ params: {
82
+ update_details: params
83
+ },
84
+ type: Patch
85
+ )
86
+ end
87
+
88
+ # Delete an existing theme.
89
+ #
90
+ # @param [required, String] :theme_id The id of the theme to be deleted
91
+ #
92
+ # @param [optional, Boolean] :force. Set to `true` to force delete a theme currently being used for a room, or as
93
+ # a default theme. (Defaults to `false`)
94
+ #
95
+ # @return [Response]
96
+ #
97
+ # @see https://developer.vonage.com/en/api/meetings#deleteTheme
98
+ def delete(theme_id:, force: false)
99
+ request(
100
+ "/meetings/themes/" + theme_id + "?force=#{force}",
101
+ type: Delete
102
+ )
103
+ end
104
+
105
+ # Get a list of rooms that are associated with a theme id.
106
+ #
107
+ # @param [required, String] theme_id THe ID of the theme to search for rooms associated with.
108
+ #
109
+ # @param [optional, Integer] :start_id
110
+ #
111
+ # @param [optional, Integer] :end_id
112
+ #
113
+ # @param [optional, Integer] :page_size
114
+ #
115
+ # @return [Response]
116
+ #
117
+ # @see https://developer.vonage.com/en/api/meetings#getRoomsByThemeId
118
+ def list_rooms(theme_id:, **params)
119
+ path = "/meetings/themes/" + theme_id + "/rooms"
120
+ path += "?#{Params.encode(params)}" unless params.empty?
121
+
122
+ request(path, response_class: Meetings::Rooms::ListResponse)
123
+ end
124
+
125
+ # Set a logo for a theme.
126
+ #
127
+ # @param [required, String] :theme_id The ID of the theme for which the logo should be set
128
+ #
129
+ # @param [required, String] :filepath
130
+ # The filepath of the logo file. Logo files must conform to the following requirements:
131
+ # - Format: PNG
132
+ # - Maximum size: 1MB
133
+ # - Background must be transparent
134
+ # - Dimensions:
135
+ # - 1 px - 300 px (`white` and `colored` logos)
136
+ # - 16 x 16 - 32 x 32 and must be square (favicon)
137
+ #
138
+ # @param [required, String] :logo_type
139
+ # The type of logo to be set. Must be one of `white`, `colored`, `favicon`
140
+ #
141
+ # @return [Response]
142
+ #
143
+ # @see https://developer.vonage.com/en/meetings/guides/theme-management#uploading-icons-and-logos
144
+ # @see https://developer.vonage.com/en/api/meetings#getUploadUrlsForTheme
145
+ # @see https://developer.vonage.com/en/api/meetings#finalizeLogosForTheme
146
+ #
147
+ # TODO: add type signature
148
+ def set_logo(theme_id:, filepath:, logo_type:)
149
+ pn = Pathname.new(filepath)
150
+ valid_logo_types = ['white', 'colored', 'favicon']
151
+ raise ArgumentError, ':filepath not for a file' unless pn.file?
152
+ raise ArgumentError, 'file at :filepath not readable' unless pn.readable?
153
+ raise ArgumentError, "logo_type: must be one of #{valid_logo_types}" unless valid_logo_types.include?(logo_type)
154
+
155
+ logo_upload_credentials = get_logo_upload_credentials
156
+
157
+ filtered_logo_upload_credentials = logo_upload_credentials.select {|cred| cred.fields.logo_type == logo_type }.first
158
+
159
+ upload_logo_file(filepath: filepath, credentials: filtered_logo_upload_credentials)
160
+
161
+ finalize_logos(theme_id: theme_id, keys: [filtered_logo_upload_credentials.fields.key])
162
+ end
163
+
164
+ private
165
+
166
+ def get_logo_upload_credentials
167
+ request("/meetings/themes/logos-upload-urls", response_class: ListResponse)
168
+ end
169
+
170
+ def upload_logo_file(filepath:, credentials:)
171
+ pn = Pathname.new(filepath)
172
+
173
+ params = format_s3_upload_credentials(credentials)
174
+
175
+ multipart_post_request(
176
+ nil,
177
+ filepath: filepath,
178
+ file_name: pn.basename,
179
+ mime_type: credentials.fields.content_type,
180
+ params: params,
181
+ override_uri: credentials.url,
182
+ no_auth: true
183
+ )
184
+ end
185
+
186
+ def finalize_logos(theme_id:, keys: [])
187
+ request(
188
+ "/meetings/themes/" + theme_id + "/finalizeLogos",
189
+ params: {
190
+ keys: keys
191
+ },
192
+ type: Put
193
+ )
194
+ end
195
+
196
+ def format_s3_upload_credentials(credentials)
197
+ credentials_key_map = {
198
+ content_type: "Content-Type",
199
+ logo_type: "logoType",
200
+ x_amz_algorithm: "X-Amz-Algorithm",
201
+ x_amz_credential: "X-Amz-Credential",
202
+ x_amz_date: "X-Amz-Date",
203
+ x_amz_security_token: "X-Amz-Security-Token",
204
+ policy: "Policy",
205
+ x_amz_signature: "X-Amz-Signature"
206
+ }
207
+
208
+ params = credentials.fields.attributes
209
+ params.transform_keys do |k|
210
+ if credentials_key_map.keys.include?(k)
211
+ credentials_key_map[k]
212
+ else
213
+ k.to_s
214
+ end
215
+ end
216
+ end
217
+ end
218
+ end