vonage 7.18.0 → 8.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -271
  3. data/lib/vonage/applications.rb +4 -12
  4. data/lib/vonage/client.rb +4 -32
  5. data/lib/vonage/client_error.rb +1 -1
  6. data/lib/vonage/config.rb +3 -7
  7. data/lib/vonage/errors.rb +20 -37
  8. data/lib/vonage/gsm7.rb +1 -1
  9. data/lib/vonage/jwt.rb +0 -17
  10. data/lib/vonage/keys.rb +7 -1
  11. data/lib/vonage/logger.rb +3 -5
  12. data/lib/vonage/messaging/channels/viber.rb +1 -8
  13. data/lib/vonage/messaging/channels/whats_app.rb +1 -3
  14. data/lib/vonage/messaging.rb +0 -11
  15. data/lib/vonage/namespace.rb +58 -128
  16. data/lib/vonage/numbers.rb +6 -29
  17. data/lib/vonage/server_error.rb +1 -1
  18. data/lib/vonage/signature.rb +5 -5
  19. data/lib/vonage/sms.rb +20 -20
  20. data/lib/vonage/version.rb +1 -1
  21. data/lib/vonage/video/archives.rb +187 -0
  22. data/lib/vonage/video/list_response.rb +11 -0
  23. data/lib/vonage/video/moderation.rb +73 -0
  24. data/lib/vonage/video/signals.rb +55 -0
  25. data/lib/vonage/video/streams.rb +76 -0
  26. data/lib/vonage/video.rb +91 -0
  27. data/lib/vonage/voice/actions/connect.rb +3 -27
  28. data/lib/vonage/voice/actions/pay.rb +107 -0
  29. data/lib/vonage/voice/actions/talk.rb +2 -11
  30. data/lib/vonage/voice/talk.rb +1 -11
  31. data/lib/vonage/voice.rb +0 -22
  32. data/lib/vonage.rb +0 -1
  33. data/vonage.gemspec +1 -2
  34. metadata +14 -59
  35. data/lib/vonage/api_error.rb +0 -33
  36. data/lib/vonage/meetings/applications.rb +0 -25
  37. data/lib/vonage/meetings/dial_in_numbers/list_response.rb +0 -11
  38. data/lib/vonage/meetings/dial_in_numbers.rb +0 -23
  39. data/lib/vonage/meetings/recordings.rb +0 -36
  40. data/lib/vonage/meetings/rooms/list_response.rb +0 -11
  41. data/lib/vonage/meetings/rooms.rb +0 -155
  42. data/lib/vonage/meetings/sessions/list_response.rb +0 -11
  43. data/lib/vonage/meetings/sessions.rb +0 -28
  44. data/lib/vonage/meetings/themes/list_response.rb +0 -11
  45. data/lib/vonage/meetings/themes.rb +0 -218
  46. data/lib/vonage/meetings.rb +0 -38
  47. data/lib/vonage/proactive_connect/events/list_response.rb +0 -11
  48. data/lib/vonage/proactive_connect/events.rb +0 -68
  49. data/lib/vonage/proactive_connect/item.rb +0 -104
  50. data/lib/vonage/proactive_connect/items/file_response.rb +0 -32
  51. data/lib/vonage/proactive_connect/items/list_response.rb +0 -11
  52. data/lib/vonage/proactive_connect/items.rb +0 -107
  53. data/lib/vonage/proactive_connect/list.rb +0 -168
  54. data/lib/vonage/proactive_connect/lists/list_response.rb +0 -11
  55. data/lib/vonage/proactive_connect/lists.rb +0 -35
  56. data/lib/vonage/proactive_connect.rb +0 -33
  57. data/lib/vonage/subaccounts/balance_transfers/list_response.rb +0 -11
  58. data/lib/vonage/subaccounts/credit_transfers/list_response.rb +0 -11
  59. data/lib/vonage/subaccounts/list_response.rb +0 -15
  60. data/lib/vonage/subaccounts.rb +0 -203
  61. data/lib/vonage/users/list_response.rb +0 -11
  62. data/lib/vonage/users.rb +0 -156
  63. data/lib/vonage/verify2/channels/email.rb +0 -38
  64. data/lib/vonage/verify2/channels/silent_auth.rb +0 -32
  65. data/lib/vonage/verify2/channels/sms.rb +0 -39
  66. data/lib/vonage/verify2/channels/voice.rb +0 -32
  67. data/lib/vonage/verify2/channels/whats_app.rb +0 -38
  68. data/lib/vonage/verify2/channels/whats_app_interactive.rb +0 -32
  69. data/lib/vonage/verify2/start_verification_options.rb +0 -62
  70. data/lib/vonage/verify2/workflow.rb +0 -39
  71. data/lib/vonage/verify2/workflow_builder.rb +0 -25
  72. data/lib/vonage/verify2.rb +0 -93
@@ -1,218 +0,0 @@
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("/v1/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("/v1/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
- "/v1/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
- "/v1/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
- "/v1/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 = "/v1/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("/v1/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
- "/v1/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
@@ -1,38 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module Vonage
5
- class Meetings < Namespace
6
- extend T::Sig
7
-
8
- sig { returns(T.nilable(Vonage::Meetings::Rooms)) }
9
- def rooms
10
- @rooms ||= Rooms.new(@config)
11
- end
12
-
13
- sig { returns(T.nilable(Vonage::Meetings::Recordings)) }
14
- def recordings
15
- @recordings ||= Recordings.new(@config)
16
- end
17
-
18
- sig { returns(T.nilable(Vonage::Meetings::Sessions)) }
19
- def sessions
20
- @sessions ||= Sessions.new(@config)
21
- end
22
-
23
- sig { returns(T.nilable(Vonage::Meetings::Themes)) }
24
- def themes
25
- @themes ||= Themes.new(@config)
26
- end
27
-
28
- sig { returns(T.nilable(Vonage::Meetings::Applications)) }
29
- def applications
30
- @applications ||= Applications.new(@config)
31
- end
32
-
33
- sig { returns(T.nilable(Vonage::Meetings::DialInNumbers)) }
34
- def dial_in_numbers
35
- @dial_in_numbers ||= DialInNumbers.new(@config)
36
- end
37
- end
38
- end
@@ -1,11 +0,0 @@
1
- # typed: true
2
-
3
- class Vonage::ProactiveConnect::Events::ListResponse < Vonage::Response
4
- include Enumerable
5
-
6
- def each
7
- return enum_for(:each) unless block_given?
8
-
9
- @entity._embedded.events.each { |item| yield item }
10
- end
11
- end
@@ -1,68 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- module Vonage
5
- class ProactiveConnect::Events < Namespace
6
- extend T::Sig
7
-
8
- self.authentication = BearerToken
9
-
10
- self.host = :vonage_host
11
-
12
- # Find all events
13
- #
14
- # @example
15
- # response = proactive_connect.events.list
16
- #
17
- # @param [optional, String] :page
18
- # Page of results to jump to
19
- #
20
- # @param [optional, String] :page_size
21
- # Number of results per page
22
- #
23
- # @param [optional, String] order
24
- # Sort in either ascending (asc, the default) or descending (desc) order
25
- #
26
- # @param [optional, String] :run_id
27
- # Run IDs to filter by, if not specified, returns events for any run id
28
- #
29
- # @param [optional, String] :type
30
- # Event types to filter by
31
- #
32
- # @param [optional, String] action_id
33
- # Action IDs to filter by.
34
- #
35
- # @param [optional, String] :invocation_id
36
- # Invocation IDs to filter by
37
- #
38
- # @param [optional, String] :recipient_id
39
- # Recipient IDs to filter by
40
- #
41
- # @param [optional, String] :run_item_id
42
- # Run item IDs to filter by
43
- #
44
- # @param [optional, String] src_ctx
45
- # The name of the segment / matcher the item / event to filter by (exact string)
46
- #
47
- # @param [optional, String] :src_type
48
- # Source types to filter by
49
- #
50
- # @param [optional, String] :trace_id
51
- # Trace IDs to filter events by
52
- #
53
- # @param [optional, String] date_start
54
- # ISO-8601 formatted date for when to begin events filter
55
- #
56
- # @param [optional, String] :date_end
57
- # ISO-8601 formatted date for when to end events filter
58
- #
59
- # @see https://developer.vonage.com/en/api/proactive-connect#eventsFindAll
60
- #
61
- def list(**params)
62
- path = "/v0.1/bulk/events"
63
- path += "?#{Params.encode(params)}" unless params.empty?
64
-
65
- request(path, response_class: ListResponse)
66
- end
67
- end
68
- end
@@ -1,104 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- module Vonage
5
- class ProactiveConnect::Item < Namespace
6
- extend T::Sig
7
-
8
- self.authentication = BearerToken
9
-
10
- self.host = :vonage_host
11
-
12
- self.request_body = JSON
13
-
14
- # Create a list item
15
- #
16
- # @example
17
- # response = proactive_connect.item.create(list_id: 'e546eebe-8e23-4e4d-bb7c-29d4700c9865', data: {name: 'Joe Bloggs', email: 'joe@email.com'})
18
- #
19
- # @param [required, String] :list_id
20
- # Unique identifier for the list
21
- #
22
- # @param [required, Hash] :data
23
- # A hash of data containing the item's data attributes and values
24
- #
25
- # @see https://developer.vonage.com/en/api/proactive-connect#itemsCreate
26
- #
27
- def create(list_id:, data:)
28
- raise ArgumentError.new(":data must be a Hash") unless data.is_a? Hash
29
- request(
30
- "/v0.1/bulk/lists/#{list_id}/items",
31
- params: { data: data },
32
- type: Post
33
- )
34
- end
35
-
36
- # Get list item by id
37
- #
38
- # @example
39
- # response = proactive_connect.item.find(list_id: 'e546eebe-8e23-4e4d-bb7c-29d4700c9865', item_id: 'd97ebf20-e4de-4e50-921a-7bb4dceb373a')
40
- #
41
- # @param [required, String] :list_id
42
- # Unique identifier for the list
43
- #
44
- # @param [required, String] :item_id
45
- # Unique identifier for the item
46
- #
47
- # @see https://developer.vonage.com/en/api/proactive-connect#itemsGet
48
- #
49
- def find(list_id:, item_id:)
50
- request("/v0.1/bulk/lists/#{list_id}/items/#{item_id}")
51
- end
52
-
53
- # Update list item
54
- #
55
- # @example
56
- # response = proactive_connect.item.create(
57
- # list_id: 'e546eebe-8e23-4e4d-bb7c-29d4700c9865',
58
- # item_id: 'd97ebf20-e4de-4e50-921a-7bb4dceb373a',
59
- # data: {name: 'Jane Bloggs', email: 'joe@email.com'}
60
- # )
61
- #
62
- # @param [required, String] :list_id
63
- # Unique identifier for the list
64
- #
65
- # @param [required, String] :item_id
66
- # Unique identifier for the item
67
- #
68
- # @param [required, Hash] :data
69
- # A hash of data containing the item's data attributes and values
70
- # All attributes for the item must be passed, even ones for which the value is not changing.
71
- # If an attribute is omitted, existing data for that attribute will be deleted.
72
- #
73
- # @see https://developer.vonage.com/en/api/proactive-connect#itemsUpdate
74
- #
75
- def update(list_id:, item_id:, data:)
76
- raise ArgumentError.new(":data must be a Hash") unless data.is_a? Hash
77
- request(
78
- "/v0.1/bulk/lists/#{list_id}/items/#{item_id}",
79
- params: { data: data },
80
- type: Put
81
- )
82
- end
83
-
84
- # Delete list item
85
- #
86
- # @example
87
- # response = proactive_connect.item.delete(list_id: 'e546eebe-8e23-4e4d-bb7c-29d4700c9865', item_id: 'd97ebf20-e4de-4e50-921a-7bb4dceb373a')
88
- #
89
- # @param [required, String] :list_id
90
- # Unique identifier for the list
91
- #
92
- # @param [required, String] :item_id
93
- # Unique identifier for the item
94
- #
95
- # @see https://developer.vonage.com/en/api/proactive-connect#itemsDelete
96
- #
97
- def delete(list_id:, item_id:)
98
- request(
99
- "/v0.1/bulk/lists/#{list_id}/items/#{item_id}",
100
- type: Delete
101
- )
102
- end
103
- end
104
- end
@@ -1,32 +0,0 @@
1
- # typed: true
2
-
3
- class Vonage::ProactiveConnect::Items::FileResponse < Vonage::Response
4
- DEFAULT_FILENAME = 'vonage-proactive-connect-list-items.csv'
5
-
6
- attr_accessor :filename
7
-
8
- def initialize(entity=nil, http_response=nil)
9
- super
10
- self.filename = initial_filename
11
- end
12
-
13
- def save(filepath:)
14
- pn = Pathname.new(filepath)
15
- raise ArgumentError, ':filepath not a directory' unless pn.directory?
16
- raise ArgumentError, ':filepath not absolute' unless pn.absolute?
17
- raise ArgumentError, ':filepath not writable' unless pn.writable?
18
-
19
- File.open("#{pn.cleanpath}/#{filename}", 'w') {|f| f.write(http_response.body) }
20
- end
21
-
22
- def data
23
- http_response ? http_response.body : nil
24
- end
25
-
26
- private
27
-
28
- def initial_filename
29
- match_data = http_response['Content-Disposition'].match(/filename=(\"?)(.+)\1/)
30
- match_data ? match_data[2] : DEFAULT_FILENAME
31
- end
32
- end
@@ -1,11 +0,0 @@
1
- # typed: true
2
-
3
- class Vonage::ProactiveConnect::Items::ListResponse < Vonage::Response
4
- include Enumerable
5
-
6
- def each
7
- return enum_for(:each) unless block_given?
8
-
9
- @entity._embedded.items.each { |item| yield item }
10
- end
11
- end
@@ -1,107 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- module Vonage
5
- class ProactiveConnect::Items < Namespace
6
- extend T::Sig
7
-
8
- self.authentication = BearerToken
9
-
10
- self.host = :vonage_host
11
-
12
- # Find all list items
13
- #
14
- # @example
15
- # response = proactive_connect.items.list(list_id: 'e546eebe-8e23-4e4d-bb7c-29d4700c9865')
16
- #
17
- # @param [required, String] :list_id
18
- # Unique identifier for the list
19
- #
20
- # @param [optional, String] :page
21
- # Page of results to jump to
22
- #
23
- # @param [optional, String] :page_size
24
- # Number of results per page
25
- #
26
- # @param [optional, String] order
27
- # Sort in either ascending (asc, the default) or descending (desc) order
28
- #
29
- # @see https://developer.vonage.com/en/api/proactive-connect#itemsFindAll
30
- #
31
- def list(list_id:, **params)
32
- path = "/v0.1/bulk/lists/#{list_id}/items"
33
- path += "?#{Params.encode(params)}" unless params.empty?
34
-
35
- request(path, response_class: ListResponse)
36
- end
37
-
38
- # Download list items as a CSV file format
39
- #
40
- # @example
41
- # response = proactive_connect.items.download_csv(list_id: 'e546eebe-8e23-4e4d-bb7c-29d4700c9865')
42
- #
43
- # @param [required, String] :list_id
44
- # ID for the list to download
45
- #
46
- # @param [optional, String] order
47
- # Sort in either ascending (asc, the default) or descending (desc) order
48
- #
49
- # @param [optional, String] :filename
50
- # A name to set for the returned File object. If not set, the File object will use the actual filename (if available)
51
- # or a default of `download.csv` if the actual filename is not available.
52
- #
53
- # @param [optional, String] :filepath
54
- # A filepath to a directory where the file should be written.
55
- # If not set, the file is not written, though the the file can be written at any time by calling `save` on the returned
56
- # object and passing in `:filepath` as an argument to the `save` method, for example:
57
- # response = proactive_connect.items.download_csv(list_id: 'e546eebe-8e23-4e4d-bb7c-29d4700c9865')
58
- # response.save('/files/downloads/')
59
- # If set, the filepath must be:
60
- # - An absolute path
61
- # - For a valid directory
62
- # - The directory must be writable
63
- #
64
- # @see https://developer.vonage.com/en/api/proactive-connect#itemsDownload
65
- #
66
- def download_csv(list_id:, order: 'asc', **params)
67
- response = request("/v0.1/bulk/lists/#{list_id}/items/download?order=#{order}", response_class: FileResponse)
68
-
69
- response.filename = params[:filename] if params[:filename]
70
- response.save(filepath: params[:filepath]) if params[:filepath]
71
-
72
- response
73
- end
74
-
75
- # Import list items from a CSV file
76
- #
77
- # @example
78
- # response = proactive_connect.items.upload_csv(list_id: 'e546eebe-8e23-4e4d-bb7c-29d4700c9865', filepath: '/files/import.csv')
79
- #
80
- # @param [required, String] :list_id
81
- # ID for the list to download
82
- #
83
- # @param [optional, String] order
84
- # Sort in either ascending (asc, the default) or descending (desc) order
85
- #
86
- # @param [optional, String] :filename
87
- # A name to set for the returned File object. If not set, the File object will use the actual filename (if available)
88
- # or a default of `download.csv` if the actual filename is not available.
89
- #
90
- # @param [required, String] :filepath
91
- # A filepath for the file to import. The file must be:
92
- # - A valid file
93
- # - Readable
94
- # - Must have a `.csv` extension
95
- #
96
- # @see https://developer.vonage.com/en/api/proactive-connect#itemsImport
97
- #
98
- def upload_csv(list_id:, filepath:)
99
- pn = Pathname.new(filepath)
100
- raise ArgumentError, ':filepath not for a file' unless pn.file?
101
- raise ArgumentError, 'file at :filepath not readable' unless pn.readable?
102
- raise ArgumentError, 'file at :filepath not csv' unless pn.extname == '.csv'
103
-
104
- multipart_post_request("/v0.1/bulk/lists/#{list_id}/items/import", filepath: filepath, file_name: pn.basename, mime_type: 'text/csv')
105
- end
106
- end
107
- end