alula-ruby 0.50.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +14 -0
  3. data/.env.example +8 -0
  4. data/.github/workflows/gem-push.yml +45 -0
  5. data/.gitignore +23 -0
  6. data/.rspec +3 -0
  7. data/.travis.yml +7 -0
  8. data/Dockerfile +6 -0
  9. data/Gemfile +12 -0
  10. data/Guardfile +42 -0
  11. data/README.md +423 -0
  12. data/Rakefile +6 -0
  13. data/VERSION.md +84 -0
  14. data/alula-docker-compose.yml +80 -0
  15. data/alula.gemspec +38 -0
  16. data/bin/console +15 -0
  17. data/bin/docparse +36 -0
  18. data/bin/genresource +79 -0
  19. data/bin/setup +8 -0
  20. data/bin/testauth +24 -0
  21. data/bin/testprep +9 -0
  22. data/data/docs/Alula_API_Documentation_2021-04-06.html +16240 -0
  23. data/docker-compose.yml +11 -0
  24. data/lib/alula/alula_response.rb +20 -0
  25. data/lib/alula/api_operations/delete.rb +52 -0
  26. data/lib/alula/api_operations/list.rb +45 -0
  27. data/lib/alula/api_operations/request.rb +44 -0
  28. data/lib/alula/api_operations/save.rb +81 -0
  29. data/lib/alula/api_resource.rb +196 -0
  30. data/lib/alula/client.rb +142 -0
  31. data/lib/alula/errors.rb +169 -0
  32. data/lib/alula/filter_builder.rb +271 -0
  33. data/lib/alula/helpers/device_attribute_translations.rb +68 -0
  34. data/lib/alula/list_object.rb +64 -0
  35. data/lib/alula/meta.rb +16 -0
  36. data/lib/alula/monkey_patches.rb +24 -0
  37. data/lib/alula/oauth.rb +118 -0
  38. data/lib/alula/pagination.rb +25 -0
  39. data/lib/alula/procedures/dealer_device_stats_proc.rb +16 -0
  40. data/lib/alula/procedures/dealer_restore_proc.rb +25 -0
  41. data/lib/alula/procedures/dealer_suspend_proc.rb +25 -0
  42. data/lib/alula/procedures/device_assign_proc.rb +23 -0
  43. data/lib/alula/procedures/device_cellular_history_proc.rb +33 -0
  44. data/lib/alula/procedures/device_rateplan_get_proc.rb +21 -0
  45. data/lib/alula/procedures/device_register_proc.rb +31 -0
  46. data/lib/alula/procedures/device_signal_add_proc.rb +42 -0
  47. data/lib/alula/procedures/device_signal_delivered_proc.rb +31 -0
  48. data/lib/alula/procedures/device_signal_update_proc.rb +32 -0
  49. data/lib/alula/procedures/device_unassign_proc.rb +16 -0
  50. data/lib/alula/procedures/device_unregister_proc.rb +21 -0
  51. data/lib/alula/procedures/upload_touchpad_branding_proc.rb +24 -0
  52. data/lib/alula/procedures/user_plansvideo_price_get.rb +21 -0
  53. data/lib/alula/procedures/user_transfer_accept.rb +19 -0
  54. data/lib/alula/procedures/user_transfer_authorize.rb +18 -0
  55. data/lib/alula/procedures/user_transfer_cancel.rb +18 -0
  56. data/lib/alula/procedures/user_transfer_deny.rb +19 -0
  57. data/lib/alula/procedures/user_transfer_reject.rb +19 -0
  58. data/lib/alula/procedures/user_transfer_request.rb +19 -0
  59. data/lib/alula/query_interface.rb +142 -0
  60. data/lib/alula/rate_limit.rb +11 -0
  61. data/lib/alula/relationship_attributes.rb +107 -0
  62. data/lib/alula/resource_attributes.rb +206 -0
  63. data/lib/alula/resources/admin_user.rb +207 -0
  64. data/lib/alula/resources/billing_program.rb +41 -0
  65. data/lib/alula/resources/dealer.rb +218 -0
  66. data/lib/alula/resources/dealer_account_transfer.rb +172 -0
  67. data/lib/alula/resources/dealer_address.rb +89 -0
  68. data/lib/alula/resources/dealer_branding.rb +226 -0
  69. data/lib/alula/resources/dealer_program.rb +75 -0
  70. data/lib/alula/resources/dealer_suspension_log.rb +49 -0
  71. data/lib/alula/resources/device.rb +716 -0
  72. data/lib/alula/resources/device_cellular_status.rb +134 -0
  73. data/lib/alula/resources/device_charge.rb +70 -0
  74. data/lib/alula/resources/device_event_log.rb +167 -0
  75. data/lib/alula/resources/device_program.rb +54 -0
  76. data/lib/alula/resources/event_trigger.rb +75 -0
  77. data/lib/alula/resources/event_webhook.rb +47 -0
  78. data/lib/alula/resources/feature_bysubject.rb +74 -0
  79. data/lib/alula/resources/feature_plan.rb +57 -0
  80. data/lib/alula/resources/feature_planvideo.rb +54 -0
  81. data/lib/alula/resources/feature_price.rb +46 -0
  82. data/lib/alula/resources/receiver_connection.rb +95 -0
  83. data/lib/alula/resources/receiver_group.rb +74 -0
  84. data/lib/alula/resources/revision.rb +91 -0
  85. data/lib/alula/resources/self.rb +61 -0
  86. data/lib/alula/resources/station.rb +130 -0
  87. data/lib/alula/resources/token_exchange.rb +34 -0
  88. data/lib/alula/resources/user.rb +229 -0
  89. data/lib/alula/resources/user_address.rb +121 -0
  90. data/lib/alula/resources/user_phone.rb +116 -0
  91. data/lib/alula/resources/user_preferences.rb +57 -0
  92. data/lib/alula/resources/user_pushtoken.rb +75 -0
  93. data/lib/alula/resources/user_videoprofile.rb +38 -0
  94. data/lib/alula/rest_resource.rb +17 -0
  95. data/lib/alula/rpc_resource.rb +40 -0
  96. data/lib/alula/rpc_response.rb +14 -0
  97. data/lib/alula/singleton_rest_resource.rb +26 -0
  98. data/lib/alula/util.rb +107 -0
  99. data/lib/alula/version.rb +5 -0
  100. data/lib/alula.rb +135 -0
  101. data/lib/parser.rb +199 -0
  102. metadata +282 -0
@@ -0,0 +1,118 @@
1
+ require 'httparty'
2
+
3
+ module Alula
4
+ class Oauth
5
+ include HTTParty
6
+
7
+ class << self
8
+ # Has pseudo attr readers :client_id, :client_secret, :api_url, :debug
9
+
10
+ def configure(**config)
11
+ self.api_url = config[:api_url]
12
+ self.client_id = config[:client_id]
13
+ self.client_secret = config[:client_secret]
14
+ self.debug = config[:debug] == true
15
+ nil
16
+ end
17
+
18
+ def authenticate(username: nil, password: nil, grant_type: :password, scopes: nil)
19
+ raise Alula::NotConfiguredError.new('did you forget to call Alula::Oauth.configure ?') unless api_url
20
+
21
+ raise Alula::NotConfiguredError.new('no scopes specified') if grant_type.to_sym == :client_credentials && (scopes.nil? || scopes == '')
22
+
23
+ opts = {
24
+ body: {
25
+ grant_type: grant_type.to_s,
26
+ client_id: client_id,
27
+ client_secret: client_secret,
28
+ }
29
+ }
30
+
31
+ if grant_type == :password
32
+ opts[:body][:username] = username if username
33
+ opts[:body][:password] = password if password
34
+ end
35
+
36
+ opts[:body][:scope] = scopes if grant_type.to_sym == :client_credentials
37
+
38
+ if self.debug
39
+ opts[:debug_output] = Alula.logger
40
+ # sets the HTTParty logger
41
+ logger Alula.logger, :info
42
+ end
43
+
44
+ response = post(api_url + '/oauth/token', opts)
45
+
46
+ if response.ok?
47
+ Response.new(response.parsed_response)
48
+ else
49
+ Error.new(response.parsed_response)
50
+ end
51
+ end
52
+
53
+ def refresh(refresh_token:, access_token:)
54
+ opts = {
55
+ body: {
56
+ grant_type: 'refresh_token',
57
+ client_id: client_id,
58
+ client_secret: client_secret,
59
+ refresh_token: refresh_token,
60
+ },
61
+ headers: {
62
+ 'Authorization:': "Bearer #{access_token}"
63
+ }
64
+ }
65
+
66
+ if self.debug == true
67
+ opts[:debug_output] = Alula.logger
68
+ end
69
+
70
+ response = post(api_url + '/oauth/token', opts)
71
+
72
+ if response.ok?
73
+ Response.new(response.parsed_response)
74
+ else
75
+ Error.new(response.parsed_response)
76
+ end
77
+ end
78
+
79
+ %i(api_url client_id client_secret debug).each do |prop|
80
+ define_method(prop) do
81
+ RequestStore.store["alula_#{prop}"]
82
+ end
83
+
84
+ define_method("#{prop}=") do |value|
85
+ RequestStore.store["alula_#{prop}"] = value
86
+ end
87
+ end
88
+ end
89
+
90
+ # Simple Oauth::Response reader object
91
+ class Response
92
+ attr_reader :token_type, :access_token, :expires_in, :expires_at, :refresh_token, :scope
93
+
94
+ def initialize(attributes)
95
+ @raw_response = attributes
96
+
97
+ @token_type = attributes['token_type']
98
+ @access_token = attributes['access_token']
99
+ @expires_in = attributes['expires_in']
100
+ @expires_at = Time.now + @expires_in
101
+ @refresh_token = attributes['refresh_token']
102
+ @scope = attributes['scope']
103
+ end
104
+ end
105
+
106
+ # Simple representation of an auth error
107
+ class Error
108
+ attr_reader :code, :error, :error_description, :raw_response
109
+
110
+ def initialize(attributes)
111
+ @raw_response = attributes
112
+ @code = attributes['code']
113
+ @error = attributes['error']
114
+ @error_description = attributes['error_description'] || attributes['message']
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,25 @@
1
+ module Alula
2
+ class Pagination
3
+ attr_reader :total, :number, :size
4
+
5
+ def initialize(meta_page_obj)
6
+ @total = meta_page_obj['total']
7
+ @number = meta_page_obj['number']
8
+ @size = meta_page_obj['size']
9
+ end
10
+
11
+ def has_next?
12
+ number < page_count
13
+ end
14
+
15
+ def has_prev?
16
+ number > 1
17
+ end
18
+
19
+ def page_count
20
+ (total.to_f / size.to_f).ceil
21
+ rescue ZeroDivisionError
22
+ 0
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,16 @@
1
+ module Alula
2
+ class DealerDeviceStatsProc < Alula::RpcResource
3
+
4
+ class Response < Alula::RpcResponse
5
+ end
6
+
7
+ def self.call(dealer_id:)
8
+ request(
9
+ http_method: :post,
10
+ path: '/rpc/v1/dealers/devices/stats/get',
11
+ payload: { dealerId: dealer_id },
12
+ handler: Response
13
+ )
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,25 @@
1
+ ##
2
+ # dealerId string GUID of the dealer to operate on
3
+ #
4
+
5
+ # Method: dealers.restore
6
+ module Alula
7
+ class DealerRestoreProc < Alula::RpcResource
8
+
9
+ class Response < Alula::RpcResponse
10
+ end
11
+
12
+ def self.call(dealer_id:)
13
+ payload = {
14
+ dealerId: dealer_id,
15
+ }
16
+
17
+ request(
18
+ http_method: :post,
19
+ path: '/rpc/v1/dealers/restore',
20
+ payload: payload,
21
+ handler: Response
22
+ )
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ ##
2
+ # dealerId string GUID of the dealer to operate on
3
+ #
4
+
5
+ # Method: dealers.suspend
6
+ module Alula
7
+ class DealerSuspendProc < Alula::RpcResource
8
+
9
+ class Response < Alula::RpcResponse
10
+ end
11
+
12
+ def self.call(dealer_id:)
13
+ payload = {
14
+ dealerId: dealer_id,
15
+ }
16
+
17
+ request(
18
+ http_method: :post,
19
+ path: '/rpc/v1/dealers/suspend',
20
+ payload: payload,
21
+ handler: Response
22
+ )
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ module Alula
2
+ class DeviceAssignProc < Alula::RpcResource
3
+
4
+ class Response < Alula::RpcResponse
5
+ end
6
+
7
+ def self.call(customer_id:, device_id:, pin: nil)
8
+ payload = {
9
+ customerId: customer_id,
10
+ deviceId: device_id,
11
+ }
12
+
13
+ payload[:pin] = pin unless pin.nil?
14
+
15
+ request(
16
+ http_method: :post,
17
+ path: '/rpc/v1/devices/assign',
18
+ payload: payload,
19
+ handler: Response
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,33 @@
1
+ #
2
+ # deviceId string Device ID (36-char UUID)
3
+ # startAt string The earliest date to include in the results. format: date-time
4
+ # stopAt string The latest date to include in the results. format: date-time
5
+ #
6
+
7
+ # Method: devices.register
8
+ module Alula
9
+ class DeviceCellularHistoryProc < Alula::RpcResource
10
+ ONE_DAY = 86_400
11
+ class Response < Alula::RpcResponse
12
+ end
13
+
14
+ def self.call(device_id:, start_at: nil, stop_at: nil)
15
+ # Helpers to set start/stop if only one is passed
16
+ seven_days_in_seconds = Alula::DeviceCellularHistoryProc::ONE_DAY * 7
17
+
18
+ stop_at = start_at + seven_days_in_seconds if stop_at.nil?
19
+ start_at = stop_at - seven_days_in_seconds if start_at.nil?
20
+
21
+ request(
22
+ http_method: :post,
23
+ path: '/rpc/v1/devices/cellular/history/get',
24
+ payload: {
25
+ deviceId: device_id,
26
+ startAt: start_at.utc.iso8601,
27
+ stopAt: stop_at.utc.iso8601
28
+ },
29
+ handler: Response
30
+ )
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ # Method: devices.rateplan.get
2
+ module Alula
3
+ class DeviceRatePlanGetProc < Alula::RpcResource
4
+
5
+ class Response < Alula::RpcResponse
6
+ end
7
+
8
+ def self.call(device_id:)
9
+ payload = {
10
+ deviceId: device_id
11
+ }
12
+
13
+ request(
14
+ http_method: :post,
15
+ path: '/rpc/v1/devices/rateplan/get',
16
+ payload: payload,
17
+ handler: Response
18
+ )
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ ##
2
+ # crc string 4 digit number; hexadecimal for Helix devices, decimal otherwise
3
+ # dealerId string Dealer ID (36-character UUID)
4
+ # mac string MAC address (hex, transmission order, colon/slash separated)
5
+ # skipPartnerClaim boolean Set to true to skip Helix partner configuration [true, false]
6
+ #
7
+
8
+ # Method: devices.register
9
+ module Alula
10
+ class DeviceRegisterProc < Alula::RpcResource
11
+
12
+ class Response < Alula::RpcResponse
13
+ end
14
+
15
+ def self.call(mac:, dealer_id:, crc:, skip_partner_claim: false)
16
+ payload = {
17
+ mac: mac,
18
+ crc: crc,
19
+ dealerId: dealer_id,
20
+ skipPartnerClaim: skip_partner_claim
21
+ }
22
+
23
+ request(
24
+ http_method: :post,
25
+ path: '/rpc/v1/devices/register',
26
+ payload: payload,
27
+ handler: Response
28
+ )
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,42 @@
1
+ module Alula
2
+ class DeviceSignalAddProc < Alula::RpcResource
3
+
4
+ class Response < Alula::RpcResponse
5
+ def initialize(response)
6
+ super(response)
7
+ #
8
+ # This RPC response gives a new EventLog item
9
+ data = response.data['result']['data'][0]
10
+ @data = Alula::DeviceEventLog.new(data['id'], data['attributes'])
11
+ end
12
+ end
13
+
14
+ def self.call(action:, customer_id:, dealer_id:, device_id:, group_id:, log_format:,
15
+ mac:, relay_status:, signal_account_number:, signal_event_code:, signal_event_qualifier:,
16
+ signal_partition:, signal_user_zone:, sn:)
17
+ payload = {
18
+ action: action,
19
+ customerId: customer_id,
20
+ dealerId: dealer_id,
21
+ deviceId: device_id,
22
+ groupId: group_id,
23
+ logFormat: log_format,
24
+ mac: mac,
25
+ relayStatus: relay_status,
26
+ signalAccountNumber: signal_account_number,
27
+ signalEventCode: signal_event_code,
28
+ signalEventQualifier: signal_event_qualifier,
29
+ signalPartition: signal_partition,
30
+ signalUserZone: signal_user_zone,
31
+ sn: sn,
32
+ }
33
+
34
+ request(
35
+ http_method: :post,
36
+ path: '/rpc/v1/devices/signal/add',
37
+ payload: payload,
38
+ handler: Response
39
+ )
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,31 @@
1
+ module Alula
2
+ class DeviceSignalDeliveredProc < Alula::RpcResource
3
+
4
+ class Response < Alula::RpcResponse
5
+ def initialize(response)
6
+ super(response)
7
+ #
8
+ # This RPC response gives an updated EventLog item
9
+ data = response.data['result']['data'][0]
10
+ @data = Alula::DeviceEventLog.new(data['id'], data['attributes'])
11
+ end
12
+ end
13
+
14
+ def self.call(dealer_id:, device_id:, group_id:, log_format:, mac:)
15
+ payload = {
16
+ dealerId: dealer_id,
17
+ deviceId: device_id,
18
+ groupId: group_id,
19
+ logFormat: log_format,
20
+ mac: mac,
21
+ }
22
+
23
+ request(
24
+ http_method: :post,
25
+ path: '/rpc/v1/devices/signal/delivered',
26
+ payload: payload,
27
+ handler: Response
28
+ )
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,32 @@
1
+ module Alula
2
+ class DeviceSignalUpdateProc < Alula::RpcResource
3
+
4
+ class Response < Alula::RpcResponse
5
+ def initialize(response)
6
+ super(response)
7
+ #
8
+ # This RPC response gives an updated EventLog item
9
+ data = response.data['result']['data'][0]
10
+ @data = Alula::DeviceEventLog.new(data['id'], data['attributes'])
11
+ end
12
+ end
13
+
14
+ def self.call(dealer_id:, device_id:, group_id:, log_format:, mac:, relay_status:)
15
+ payload = {
16
+ dealerId: dealer_id,
17
+ deviceId: device_id,
18
+ groupId: group_id,
19
+ logFormat: log_format,
20
+ mac: mac,
21
+ relayStatus: relay_status,
22
+ }
23
+
24
+ request(
25
+ http_method: :post,
26
+ path: '/rpc/v1/devices/signal/update',
27
+ payload: payload,
28
+ handler: Response
29
+ )
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,16 @@
1
+ module Alula
2
+ class DeviceUnassignProc < Alula::RpcResource
3
+
4
+ class Response < Alula::RpcResponse
5
+ end
6
+
7
+ def self.call(device_id:)
8
+ request(
9
+ http_method: :post,
10
+ path: '/rpc/v1/devices/unassign',
11
+ payload: { deviceId: device_id },
12
+ handler: Response
13
+ )
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ module Alula
2
+ class DeviceUnregisterProc < Alula::RpcResource
3
+
4
+ class Response < Alula::RpcResponse
5
+ end
6
+
7
+ def self.call(mac:, deactivate:)
8
+ payload = {
9
+ mac: mac,
10
+ deactivate: deactivate,
11
+ }
12
+
13
+ request(
14
+ http_method: :post,
15
+ path: '/rpc/v1/devices/unregister',
16
+ payload: payload,
17
+ handler: Response
18
+ )
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ module Alula
2
+ class UploadTouchpadBrandingProc < Alula::RpcResource
3
+ class Response < Alula::RpcResponse
4
+ end
5
+
6
+ def self.call(dealer_id:, branding_file:)
7
+ payload = {
8
+ dealerId: dealer_id,
9
+ brandingFile: branding_file
10
+ }
11
+
12
+ request(
13
+ http_method: :post,
14
+ path: '/upload/v1/dealers/branding/touchpad',
15
+ payload: payload,
16
+ handler: Response,
17
+ wrap: false,
18
+ opts: {
19
+ multipart: true
20
+ }
21
+ )
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ # Method: devices.rateplan.get
2
+ module Alula
3
+ class UserPlansVideoPriceGetProc < Alula::RpcResource
4
+
5
+ class Response < Alula::RpcResponse
6
+ end
7
+
8
+ def self.call(user_id:)
9
+ payload = {
10
+ userId: user_id
11
+ }
12
+
13
+ request(
14
+ http_method: :post,
15
+ path: '/rpc/v1/users/plansvideo/price/get',
16
+ payload: payload,
17
+ handler: Response
18
+ )
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module Alula
2
+ class UserTransferAccept < Alula::RpcResource
3
+
4
+ class Response < Alula::RpcResponse
5
+ end
6
+
7
+ def self.call(transfer_id:, description:)
8
+ request(
9
+ http_method: :post,
10
+ path: '/rpc/v1/users/transfer/accept',
11
+ payload: {
12
+ id: transfer_id,
13
+ description: description,
14
+ },
15
+ handler: Response
16
+ )
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ module Alula
2
+ class UserTransferAuthorize < Alula::RpcResource
3
+
4
+ class Response < Alula::RpcResponse
5
+ end
6
+
7
+ def self.call(transfer_id:)
8
+ request(
9
+ http_method: :post,
10
+ path: '/rpc/v1/users/transfer/authorize',
11
+ payload: {
12
+ id: transfer_id
13
+ },
14
+ handler: Response
15
+ )
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Alula
2
+ class UserTransferCancel < Alula::RpcResource
3
+
4
+ class Response < Alula::RpcResponse
5
+ end
6
+
7
+ def self.call(transfer_id:)
8
+ request(
9
+ http_method: :post,
10
+ path: '/rpc/v1/users/transfer/cancel',
11
+ payload: {
12
+ id: transfer_id
13
+ },
14
+ handler: Response
15
+ )
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ module Alula
2
+ class UserTransferDeny < Alula::RpcResource
3
+
4
+ class Response < Alula::RpcResponse
5
+ end
6
+
7
+ def self.call(transfer_id:, description:)
8
+ request(
9
+ http_method: :post,
10
+ path: '/rpc/v1/users/transfer/deny',
11
+ payload: {
12
+ id: transfer_id,
13
+ reason: description,
14
+ },
15
+ handler: Response
16
+ )
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Alula
2
+ class UserTransferReject < Alula::RpcResource
3
+
4
+ class Response < Alula::RpcResponse
5
+ end
6
+
7
+ def self.call(transfer_id:, description:)
8
+ request(
9
+ http_method: :post,
10
+ path: '/rpc/v1/users/transfer/reject',
11
+ payload: {
12
+ id: transfer_id,
13
+ reason: description,
14
+ },
15
+ handler: Response
16
+ )
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Alula
2
+ class UserTransferRequest < Alula::RpcResource
3
+
4
+ class Response < Alula::RpcResponse
5
+ end
6
+
7
+ def self.call(customer_id:, dealer_id:)
8
+ request(
9
+ http_method: :post,
10
+ path: '/rpc/v1/users/transfer/request',
11
+ payload: {
12
+ customerId: customer_id,
13
+ dealerId: dealer_id
14
+ },
15
+ handler: Response
16
+ )
17
+ end
18
+ end
19
+ end