wavix-sdk-ruby 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +124 -0
  4. data/lib/middleware/follow_redirects_middleware.rb +15 -0
  5. data/lib/services/fields_validator.rb +26 -0
  6. data/lib/wavix-sdk-ruby.rb +5 -0
  7. data/lib/wavix_api/base_methods.rb +180 -0
  8. data/lib/wavix_api/v1/base_destroy.rb +31 -0
  9. data/lib/wavix_api/v1/base_find.rb +31 -0
  10. data/lib/wavix_api/v1/base_search.rb +31 -0
  11. data/lib/wavix_api/v1/billing/invoices/find.rb +44 -0
  12. data/lib/wavix_api/v1/billing/invoices/search.rb +21 -0
  13. data/lib/wavix_api/v1/billing/transactions/search.rb +39 -0
  14. data/lib/wavix_api/v1/buy/carts/checkout.rb +23 -0
  15. data/lib/wavix_api/v1/buy/carts/find.rb +23 -0
  16. data/lib/wavix_api/v1/buy/carts/update.rb +34 -0
  17. data/lib/wavix_api/v1/buy/cities/search.rb +47 -0
  18. data/lib/wavix_api/v1/buy/countries/search.rb +31 -0
  19. data/lib/wavix_api/v1/buy/dids/search.rb +41 -0
  20. data/lib/wavix_api/v1/buy/regions/search.rb +33 -0
  21. data/lib/wavix_api/v1/call/recordings/destroy.rb +23 -0
  22. data/lib/wavix_api/v1/call/recordings/month_statistics/details.rb +35 -0
  23. data/lib/wavix_api/v1/call/recordings/month_statistics/search.rb +35 -0
  24. data/lib/wavix_api/v1/call/recordings/recording_settings.rb +40 -0
  25. data/lib/wavix_api/v1/call/recordings/retention_policy.rb +23 -0
  26. data/lib/wavix_api/v1/call/recordings/search.rb +55 -0
  27. data/lib/wavix_api/v1/call/recordings/update_recording_settings.rb +48 -0
  28. data/lib/wavix_api/v1/call/recordings/update_retention_policy.rb +37 -0
  29. data/lib/wavix_api/v1/call/transcriptions/find.rb +31 -0
  30. data/lib/wavix_api/v1/call/transcriptions/retranscribe.rb +35 -0
  31. data/lib/wavix_api/v1/cdrs/advanced_search.rb +67 -0
  32. data/lib/wavix_api/v1/cdrs/common_vars.rb +22 -0
  33. data/lib/wavix_api/v1/cdrs/metrics.rb +29 -0
  34. data/lib/wavix_api/v1/cdrs/search.rb +35 -0
  35. data/lib/wavix_api/v1/e911_records/create.rb +47 -0
  36. data/lib/wavix_api/v1/e911_records/destroy.rb +31 -0
  37. data/lib/wavix_api/v1/e911_records/search.rb +33 -0
  38. data/lib/wavix_api/v1/e911_records/validate_address.rb +44 -0
  39. data/lib/wavix_api/v1/mydids/cities.rb +32 -0
  40. data/lib/wavix_api/v1/mydids/destroy.rb +55 -0
  41. data/lib/wavix_api/v1/mydids/find.rb +21 -0
  42. data/lib/wavix_api/v1/mydids/search.rb +35 -0
  43. data/lib/wavix_api/v1/mydids/update.rb +40 -0
  44. data/lib/wavix_api/v1/mydids/update_destinations.rb +73 -0
  45. data/lib/wavix_api/v1/mydids/update_sms_enabled.rb +32 -0
  46. data/lib/wavix_api/v1/papers/create.rb +65 -0
  47. data/lib/wavix_api/v1/papers/find.rb +42 -0
  48. data/lib/wavix_api/v1/profile/account_config.rb +21 -0
  49. data/lib/wavix_api/v1/profile/find.rb +21 -0
  50. data/lib/wavix_api/v1/profile/update.rb +58 -0
  51. data/lib/wavix_api/v1/sub_organizations/create.rb +36 -0
  52. data/lib/wavix_api/v1/sub_organizations/find.rb +19 -0
  53. data/lib/wavix_api/v1/sub_organizations/search.rb +31 -0
  54. data/lib/wavix_api/v1/sub_organizations/transactions.rb +39 -0
  55. data/lib/wavix_api/v1/sub_organizations/update.rb +40 -0
  56. data/lib/wavix_api/v1/trunks/create.rb +76 -0
  57. data/lib/wavix_api/v1/trunks/destroy.rb +19 -0
  58. data/lib/wavix_api/v1/trunks/find.rb +19 -0
  59. data/lib/wavix_api/v1/trunks/search.rb +30 -0
  60. data/lib/wavix_api/v1/trunks/update.rb +85 -0
  61. data/lib/wavix_api/v1/voice_campaigns/create.rb +39 -0
  62. data/lib/wavix_api/v1/voice_campaigns/find.rb +21 -0
  63. data/lib/wavix_api/v2/base_destroy.rb +10 -0
  64. data/lib/wavix_api/v2/base_find.rb +10 -0
  65. data/lib/wavix_api/v2/base_search.rb +10 -0
  66. data/lib/wavix_api/v2/messages/all.rb +23 -0
  67. data/lib/wavix_api/v2/messages/async_create.rb +23 -0
  68. data/lib/wavix_api/v2/messages/attachments/find.rb +59 -0
  69. data/lib/wavix_api/v2/messages/common_vars.rb +50 -0
  70. data/lib/wavix_api/v2/messages/create.rb +24 -0
  71. data/lib/wavix_api/v2/messages/find.rb +19 -0
  72. data/lib/wavix_api/v2/messages/opt_outs/create.rb +34 -0
  73. data/lib/wavix_api/v2/messages/search.rb +23 -0
  74. data/lib/wavix_api/v2/messages/sender_ids/create.rb +40 -0
  75. data/lib/wavix_api/v2/messages/sender_ids/destroy.rb +21 -0
  76. data/lib/wavix_api/v2/messages/sender_ids/find.rb +21 -0
  77. data/lib/wavix_api/v2/messages/sender_ids/restrictions.rb +32 -0
  78. data/lib/wavix_api/v2/messages/sender_ids/search.rb +21 -0
  79. data/lib/wavix_api/v3/messages/sender_ids/create.rb +51 -0
  80. data/lib/wavix_api/v3/messages/sender_ids/find.rb +21 -0
  81. data/lib/wavix_api/v3/messages/sender_ids/search.rb +21 -0
  82. data/lib/wavix_api.rb +155 -0
  83. data/wavix-sdk-ruby.gemspec +40 -0
  84. metadata +204 -0
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wavix_api'
4
+
5
+ module WavixApi
6
+ module V1
7
+ module E911Records
8
+ class Create
9
+ include WavixApi::BaseMethods
10
+
11
+ @params_schema = {
12
+ type: 'object',
13
+ properties: {
14
+ name: { type: 'string' }.freeze,
15
+ phone_number: { type: 'string' }.freeze,
16
+ address: {
17
+ type: 'object',
18
+ properties: {
19
+ street_number: { type: 'string' }.freeze,
20
+ street: { type: 'string' }.freeze,
21
+ location: { type: 'string' }.freeze,
22
+ city: { type: 'string' }.freeze,
23
+ state: { type: 'string' }.freeze,
24
+ zip_code: { type: 'string' }.freeze,
25
+ zip_plus_four: { type: 'string' }.freeze
26
+ }.freeze,
27
+ required: %i[
28
+ street_number street location city state zip_code zip_plus_four
29
+ ].freeze
30
+ }.freeze
31
+ }.freeze,
32
+ required: %i[name phone_number address].freeze
33
+ }.freeze
34
+
35
+ class << self
36
+ def call(params)
37
+ instance = new(params)
38
+
39
+ instance.validate!
40
+
41
+ instance.post('v1/e911-records')
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wavix_api'
4
+
5
+ module WavixApi
6
+ module V1
7
+ module E911Records
8
+ class Destroy
9
+ include WavixApi::BaseMethods
10
+
11
+ @params_schema = {
12
+ type: 'object',
13
+ properties: {
14
+ phone_number: { type: 'string' }.freeze
15
+ }.freeze,
16
+ required: %i[phone_number].freeze
17
+ }.freeze
18
+
19
+ class << self
20
+ def call(params = {})
21
+ instance = new(params)
22
+
23
+ instance.validate!
24
+
25
+ instance.delete('v1/e911-records')
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wavix_api'
4
+
5
+ module WavixApi
6
+ module V1
7
+ module E911Records
8
+ class Search
9
+ include WavixApi::BaseMethods
10
+
11
+ @params_schema = {
12
+ type: 'object',
13
+ properties: {
14
+ phone_number: {
15
+ type: 'string',
16
+ pattern: ::WavixApi::BaseMethods::ONLY_DIGITS_REGEXP
17
+ }.freeze
18
+ }.freeze
19
+ }.freeze
20
+
21
+ class << self
22
+ def call(params = {})
23
+ instance = new(params)
24
+
25
+ instance.validate!
26
+
27
+ instance.get('v1/e911-records')
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wavix_api'
4
+
5
+ module WavixApi
6
+ module V1
7
+ module E911Records
8
+ class ValidateAddress
9
+ include WavixApi::BaseMethods
10
+
11
+ @params_schema = {
12
+ type: 'object',
13
+ properties: {
14
+ name: { type: 'string' }.freeze,
15
+ phone_number: { type: 'string' }.freeze,
16
+ address: {
17
+ type: 'object',
18
+ properties: {
19
+ street_number: { type: 'string' }.freeze,
20
+ street: { type: 'string' }.freeze,
21
+ location: { type: 'string' }.freeze,
22
+ city: { type: 'string' }.freeze,
23
+ state: { type: 'string' }.freeze,
24
+ zip_code: { type: 'string' }.freeze
25
+ }.freeze,
26
+ required: %i[street_number street location city state zip_code].freeze
27
+ }.freeze
28
+ }.freeze,
29
+ required: %i[name phone_number address].freeze
30
+ }.freeze
31
+
32
+ class << self
33
+ def call(params)
34
+ instance = new(params)
35
+
36
+ instance.validate!
37
+
38
+ instance.post('v1/e911-records/validate-address')
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wavix_api'
4
+
5
+ module WavixApi
6
+ module V1
7
+ module Mydids
8
+ class Cities
9
+ include WavixApi::BaseMethods
10
+
11
+ @params_schema = {
12
+ type: 'object',
13
+ properties: {
14
+ name: { type: 'string' }.freeze,
15
+ **::WavixApi::BaseMethods::PAGINATION_SCHEMA
16
+ }.freeze,
17
+ required: %i[name].freeze
18
+ }.freeze
19
+
20
+ class << self
21
+ def call(params = {})
22
+ instance = new(params)
23
+
24
+ instance.validate!
25
+
26
+ instance.get('v1/mydids/cities')
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wavix_api'
4
+
5
+ module WavixApi
6
+ module V1
7
+ module Mydids
8
+ class Destroy
9
+ include WavixApi::BaseMethods
10
+
11
+ @params_schema = {
12
+ type: 'object',
13
+ properties: {
14
+ ids: {
15
+ anyOf: [
16
+ { type: 'array', items: { type: 'integer' }.freeze }.freeze,
17
+ { type: 'string', pattern: ::WavixApi::BaseMethods::LIST_OF_DIGITS_REGEXP }.freeze
18
+ ].freeze
19
+ },
20
+ dids: {
21
+ anyOf: [
22
+ {
23
+ type: 'array',
24
+ items: {
25
+ type: 'string',
26
+ pattern: ::WavixApi::BaseMethods::ONLY_DIGITS_REGEXP
27
+ }.freeze
28
+ }.freeze,
29
+ { type: 'string', pattern: ::WavixApi::BaseMethods::LIST_OF_DIGITS_REGEXP }.freeze
30
+ ].freeze
31
+ }.freeze
32
+ }.freeze
33
+ }.freeze
34
+
35
+ class << self
36
+ def call(params = {})
37
+ instance = new(params)
38
+
39
+ instance.validate!
40
+
41
+ if instance.params[:ids].nil? && instance.params[:dids].nil?
42
+ instance.raise_error('Either dids or ids is required')
43
+ end
44
+
45
+ if !instance.params[:ids].nil? && !instance.params[:dids].nil?
46
+ instance.raise_error('Either dids or ids is supported')
47
+ end
48
+
49
+ instance.delete('v1/mydids')
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wavix_api'
4
+
5
+ module WavixApi
6
+ module V1
7
+ module Mydids
8
+ class Find < ::WavixApi::V1::BaseFind
9
+ @params_schema = ::WavixApi::BaseMethods::ONLY_ID_SCHEMA
10
+
11
+ class << self
12
+ private
13
+
14
+ def path
15
+ 'v1/mydids'
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wavix_api'
4
+
5
+ module WavixApi
6
+ module V1
7
+ module Mydids
8
+ class Search
9
+ include WavixApi::BaseMethods
10
+
11
+ @params_schema = {
12
+ type: 'object',
13
+ properties: {
14
+ name: { type: 'string' }.freeze,
15
+ search: { type: 'string' }.freeze,
16
+ city_id: { type: 'integer' }.freeze,
17
+ label_present: { type: 'boolean' }.freeze,
18
+ label: { type: 'string' }.freeze,
19
+ **::WavixApi::BaseMethods::PAGINATION_SCHEMA
20
+ }.freeze
21
+ }.freeze
22
+
23
+ class << self
24
+ def call(params = {})
25
+ instance = new(params)
26
+
27
+ instance.validate!
28
+
29
+ instance.get('v1/mydids')
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wavix_api'
4
+
5
+ module WavixApi
6
+ module V1
7
+ module Mydids
8
+ class Update
9
+ include WavixApi::BaseMethods
10
+
11
+ @params_schema = {
12
+ type: 'object',
13
+ properties: {
14
+ call_recording_enabled: { type: 'boolean' }.freeze,
15
+ transcription_enabled: { type: 'boolean' }.freeze,
16
+ transcription_threshold: { type: 'integer' }.freeze,
17
+ sms_relay_url: { type: 'string' }.freeze,
18
+ id: { type: 'integer' }.freeze
19
+ }.freeze,
20
+ required: %i[
21
+ call_recording_enabled
22
+ transcription_enabled
23
+ transcription_threshold
24
+ id
25
+ ].freeze
26
+ }.freeze
27
+
28
+ class << self
29
+ def call(params = {})
30
+ instance = new(params)
31
+
32
+ instance.validate!
33
+
34
+ instance.patch(['v1/mydids', instance.id].join('/'))
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wavix_api'
4
+
5
+ module WavixApi
6
+ module V1
7
+ module Mydids
8
+ class UpdateDestinations
9
+ include WavixApi::BaseMethods
10
+
11
+ @params_schema = {
12
+ type: 'object',
13
+ properties: {
14
+ ids: {
15
+ anyOf: [
16
+ { type: 'array', items: { type: 'integer' }.freeze }.freeze,
17
+ { type: 'string', pattern: ::WavixApi::BaseMethods::LIST_OF_DIGITS_REGEXP }.freeze
18
+ ].freeze
19
+ },
20
+ dids: {
21
+ anyOf: [
22
+ { type: 'array',
23
+ items: {
24
+ type: 'string',
25
+ pattern: ::WavixApi::BaseMethods::ONLY_DIGITS_REGEXP
26
+ }.freeze }.freeze,
27
+ { type: 'string', pattern: ::WavixApi::BaseMethods::LIST_OF_DIGITS_REGEXP }.freeze
28
+ ].freeze
29
+ }.freeze,
30
+ sms_relay_url: { type: 'string' }.freeze,
31
+ destinations: {
32
+ type: 'array',
33
+ items: {
34
+ type: 'object',
35
+ properties: {
36
+ transport: { enum: [1, 4, 5].freeze }.freeze,
37
+ destination: { type: 'string' }.freeze,
38
+ priority: { type: 'integer' }.freeze,
39
+ trunk_id: { type: 'integer' }.freeze
40
+ }.freeze,
41
+ required: %i[transport destination priority].freeze
42
+ }.freeze
43
+ }.freeze
44
+ }.freeze
45
+ }.freeze
46
+
47
+ class << self
48
+ def call(params = {})
49
+ instance = new(params)
50
+
51
+ instance.validate!
52
+
53
+ if instance.params[:ids].nil? && instance.params[:dids].nil?
54
+ instance.raise_error('Either dids or ids is required')
55
+ end
56
+
57
+ if !instance.params[:ids].nil? && !instance.params[:dids].nil?
58
+ instance.raise_error('Either dids or ids is supported')
59
+ end
60
+
61
+ if instance.params[:destinations].nil? && instance.params[:sms_relay_url].nil?
62
+ instance.raise_error(
63
+ "Either 'destinations' or 'sms_relay_url' or both must be specified"
64
+ )
65
+ end
66
+
67
+ instance.post('v1/mydids/update-destinations')
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wavix_api'
4
+
5
+ module WavixApi
6
+ module V1
7
+ module Mydids
8
+ class UpdateSmsEnabled
9
+ include WavixApi::BaseMethods
10
+
11
+ @params_schema = {
12
+ type: 'object',
13
+ properties: {
14
+ sms_enabled: { type: 'boolean' }.freeze,
15
+ id: { type: 'integer' }.freeze
16
+ }.freeze,
17
+ required: %i[sms_enabled id].freeze
18
+ }.freeze
19
+
20
+ class << self
21
+ def call(params = {})
22
+ instance = new(params)
23
+
24
+ instance.validate!
25
+
26
+ instance.put('v1/mydids/update-sms-enabled')
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WavixApi
4
+ module V1
5
+ module Papers
6
+ class Create
7
+ include WavixApi::BaseMethods
8
+
9
+ CONTENT_TYPES = {
10
+ 'jpeg' => 'image/jpeg',
11
+ 'jpg' => 'image/jpeg',
12
+ 'gif' => 'image/gif',
13
+ 'png' => 'image/png',
14
+ 'pdf' => 'application/pdf',
15
+ 'bmp' => 'image/bmp',
16
+ 'tiff' => 'image/tiff',
17
+ 'doc' => 'application/msword',
18
+ 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
19
+ 'dib' => 'image/dib'
20
+ }.freeze
21
+
22
+ @params_schema = {
23
+ type: 'object',
24
+ properties: {
25
+ did_ids: {
26
+ type: 'string',
27
+ pattern: ::WavixApi::BaseMethods::LIST_OF_DIGITS_REGEXP
28
+ }.freeze,
29
+ doc_id: { type: 'integer' }.freeze
30
+ }.freeze,
31
+ required: %i[did_ids doc_id doc_attachment].freeze
32
+ }.freeze
33
+
34
+ class << self
35
+ def call(params = {})
36
+ instance = new(params)
37
+ instance.validate!
38
+
39
+ doc_attachment = instance.params[:doc_attachment]
40
+ unless doc_attachment.respond_to?(:path)
41
+ instance.raise_error('doc_attachment must respond to method "path"')
42
+ end
43
+
44
+ extention = instance.file_extention(doc_attachment)
45
+ unless CONTENT_TYPES.keys.include?(extention)
46
+ instance.raise_error(
47
+ "doc_attachment have invalid extention. Valid are #{CONTENT_TYPES.keys}"
48
+ )
49
+ end
50
+
51
+ instance.params[:doc_attachment] = instance.format_file(
52
+ doc_attachment,
53
+ content_type: CONTENT_TYPES[extention]
54
+ )
55
+ instance.post(
56
+ 'v1/mydids/papers',
57
+ with_file: true,
58
+ headers: { 'Content-Disposition' => 'form-data', 'Content-Type' => '' }
59
+ )
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WavixApi
4
+ module V1
5
+ module Papers
6
+ class Find
7
+ include WavixApi::BaseMethods
8
+
9
+ @params_schema = {
10
+ type: 'object',
11
+ properties: {
12
+ mydid_id: { type: 'integer' }.freeze,
13
+ doc_type_id: { type: 'integer' }.freeze
14
+ }.freeze,
15
+ required: %i[mydid_id doc_type_id].freeze
16
+ }.freeze
17
+
18
+ class << self
19
+ def call(params = {}, save_path: nil)
20
+ instance = new(params)
21
+
22
+ instance.validate!
23
+
24
+ instance.download(
25
+ "v1/mydids/#{instance.params[:mydid_id]}/papers/#{instance.params[:doc_type_id]}",
26
+ save_path: save_path
27
+ )
28
+ end
29
+ end
30
+
31
+ def initialize(params = nil)
32
+ super
33
+ @save_path = params[:save_path]
34
+ end
35
+
36
+ def call
37
+ self.class.call(params, save_path: @save_path)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WavixApi
4
+ module V1
5
+ module Profile
6
+ class AccountConfig
7
+ include WavixApi::BaseMethods
8
+
9
+ class << self
10
+ def call(params = {})
11
+ instance = new(params)
12
+
13
+ instance.validate!
14
+
15
+ instance.get('v1/profile/config')
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WavixApi
4
+ module V1
5
+ module Profile
6
+ class Find
7
+ include WavixApi::BaseMethods
8
+
9
+ class << self
10
+ def call(params = {})
11
+ instance = new(params)
12
+
13
+ instance.validate!
14
+
15
+ instance.get('v1/profile')
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wavix_api'
4
+
5
+ module WavixApi
6
+ module V1
7
+ module Profile
8
+ class Update
9
+ include WavixApi::BaseMethods
10
+
11
+ @params_schema = {
12
+ type: 'object',
13
+ properties: {
14
+ additional_info: { type: 'string' }.freeze,
15
+ attn_contact_name: { type: 'string' }.freeze,
16
+ billing_address: { type: 'string' }.freeze,
17
+ contact_email: { type: 'string' }.freeze,
18
+ default_short_link_endpoint: { type: 'string' }.freeze,
19
+ first_name: { type: 'string' }.freeze,
20
+ last_name: { type: 'string' }.freeze,
21
+ phone: { type: 'string' }.freeze,
22
+ sms_relay_url: { type: 'string' }.freeze,
23
+ dlr_relay_url: { type: 'string' }.freeze,
24
+ timezone: { type: 'string' }.freeze,
25
+ job_title: { type: 'string' }.freeze,
26
+ company_name: { type: 'string' }.freeze,
27
+ company_address: { type: 'string' }.freeze,
28
+ company_industry: { type: 'string' }.freeze,
29
+ company_vat_number: { type: 'string' }.freeze,
30
+ company_country_code: { type: 'string' }.freeze
31
+ }.freeze,
32
+ required: %i[
33
+ additional_info
34
+ attn_contact_name
35
+ billing_address
36
+ company_name
37
+ contact_email
38
+ first_name
39
+ last_name
40
+ phone
41
+ timezone
42
+ ].freeze,
43
+ additionalProperties: false
44
+ }.freeze
45
+
46
+ class << self
47
+ def call(params = {})
48
+ instance = new(params)
49
+
50
+ instance.validate!
51
+
52
+ instance.patch('v1/profile')
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end