mxhero-api 0.1.11 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. data/VERSION +1 -1
  2. data/lib/communication.rb +35 -0
  3. data/lib/groups.rb +178 -0
  4. data/lib/mxhero-api.rb +288 -312
  5. data/lib/urls.rb +19 -0
  6. data/mxhero-api.gemspec +4 -4
  7. data/test/fixtures/api/account_properties.yml +12 -13
  8. data/test/fixtures/api/account_properties_not_found.yml +9 -9
  9. data/test/fixtures/api/accounts.yml +39 -0
  10. data/test/fixtures/api/accounts_filtered.yml +57 -42
  11. data/test/fixtures/api/accounts_from_domain.yml +10 -10
  12. data/test/fixtures/api/accounts_from_domain_paginated.yml +10 -10
  13. data/test/fixtures/api/accounts_without_group.yml +75 -0
  14. data/test/fixtures/api/add_an_inexistent_account_to_group.yml +39 -0
  15. data/test/fixtures/api/add_and_remove_account.yml +219 -0
  16. data/test/fixtures/api/all_groups.yml +39 -0
  17. data/test/fixtures/api/create_rule_for_domain.yml +95 -21
  18. data/test/fixtures/api/delete_group.yml +75 -0
  19. data/test/fixtures/api/delete_rule.yml +21 -61
  20. data/test/fixtures/api/domain_by_id.yml +10 -10
  21. data/test/fixtures/api/domain_by_id_not_found.yml +9 -9
  22. data/test/fixtures/api/domain_rule.yml +62 -76
  23. data/test/fixtures/api/domains.yml +10 -10
  24. data/test/fixtures/api/remove_account_from_group_twice.yml +150 -0
  25. data/test/fixtures/api/remove_inexistente_account_from_group.yml +39 -0
  26. data/test/fixtures/api/rules_for_domain.yml +11 -57
  27. data/test/fixtures/api/rules_for_domain_by_component.yml +6 -8
  28. data/test/fixtures/api/save_group.yml +119 -0
  29. data/test/fixtures/api/update_account_properties.yml +35 -33
  30. data/test/fixtures/api/update_rule.yml +35 -76
  31. data/test/helper.rb +1 -1
  32. data/test/test_groups.rb +104 -0
  33. data/test/test_mxhero_api.rb +49 -27
  34. metadata +26 -7
  35. data/test/fixtures/api/create_rule_alredy_exist.yml +0 -81
  36. data/test/fixtures/api/create_rule_success.yml +0 -41
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.11
1
+ 0.1.12
@@ -0,0 +1,35 @@
1
+ module MxHero
2
+ module API
3
+ module Communication
4
+
5
+ # Make a HTTP call
6
+ # @param method [Symbol] indicate the HTTP verb (:get, :post, :put, etc)
7
+ # @param url [String]
8
+ # @param body [String] (default: nil)
9
+ # @param [Hash] more_options
10
+ # @option more_options [Boolean] :throw_exception (default: true) throw exception if the response status are between 500 and 600
11
+ def call(method, url, body = nil, more_options = {})
12
+ unless @client
13
+ @client ||= HTTPClient.new
14
+ end
15
+ @client.set_auth(url, @username, @password)
16
+ response = @client.request(method, url, nil, body, headers)
17
+ unless more_options[:throw_exception] == false
18
+ raise "An error ocurred when try to communicate with the API\nError: #{response.inspect}" if (500..600).include?(response.status)
19
+ end
20
+ response
21
+ end
22
+
23
+ # Default headers
24
+ def headers
25
+ @headers ||= { 'Accept' => 'application/json', 'Content-Type' => 'application/json' }
26
+ end
27
+
28
+ # @return [Hash]
29
+ def json_parse(json)
30
+ JSON.parse(json, symbolize_names: true)
31
+ end
32
+
33
+ end
34
+ end
35
+ end
data/lib/groups.rb ADDED
@@ -0,0 +1,178 @@
1
+ # encoding: utf-8
2
+ require_relative 'communication'
3
+ require_relative 'urls'
4
+
5
+ require 'delegate'
6
+
7
+ module MxHero::API
8
+
9
+ # A group instance
10
+ #
11
+ class Group < Struct.new(:name, :domain, :description)
12
+ def initialize(elements)
13
+ elements.each { |prop, value| send("#{prop}=", value) if respond_to?("#{prop}") }
14
+ end
15
+
16
+ def to_json
17
+ { name: name, domain: domain, description: description }.to_json
18
+ end
19
+ end
20
+
21
+
22
+ class Account < Struct.new(:account, :domain, :created_date, :updated_date, :group)
23
+ def initialize(elements)
24
+ elements.each { |prop, value| send("#{prop}=", value) if respond_to?("#{prop}") }
25
+ end
26
+
27
+ def to_json
28
+ { account: account, domain: domain, createdDate: created_date, updatedDate: updated_date, group: group }.to_json
29
+ end
30
+
31
+ def to_s
32
+ "account: #{account}, domain: #{domain}, group: #{group}"
33
+ end
34
+ end
35
+
36
+
37
+ class PaginatedElements < SimpleDelegator
38
+ attr_reader :total_elements, :total_pages, :actual_page
39
+ def initialize(paginable, total_elements, total_pages, actual_page)
40
+ super(paginable)
41
+ @total_elements = total_elements
42
+ @total_pages = total_pages
43
+ @actual_page = actual_page
44
+ end
45
+ end
46
+
47
+ class Groups
48
+ include Communication
49
+ include Urls
50
+
51
+ attr_reader :domain
52
+
53
+ def initialize(domain, config = {})
54
+ @domain = domain
55
+ @service_url = config[:api_url]
56
+ @username = config[:username]
57
+ @password = config[:password]
58
+ @verbose = config[:verbose] || false
59
+ end
60
+
61
+ # Retrieve all the groups
62
+ #
63
+ # @return [PaginatedElement] that contains an array of Group elements
64
+ # Basically its an Array with instances of [MxHero::API::Group] with the methods total_elements, total_pages and actual_page
65
+ def all(limit = nil, offset = nil)
66
+ response = call(:get, groups_url)
67
+ paginate_wrap(response) do |hash|
68
+ hash[:elements].map { |e| Group.new(e) }
69
+ end
70
+ end
71
+
72
+ # Save a new group
73
+ #
74
+ # @param group [MxHero::API::Group]
75
+ #
76
+ # @return [MxHero::API::Response]
77
+ def save(group)
78
+ group.domain = domain
79
+ wrap_response_from call(:post, groups_url, group.to_json)
80
+ end
81
+
82
+ # Delete the group
83
+ #
84
+ # @param group_name [String]
85
+ #
86
+ # @return [MxHero::API::Response] with content empty.
87
+ # In case on error, may be one of the following:
88
+ # + domain.group.not.found : Inexistent group
89
+ def delete(group_name)
90
+ response = call(:delete, group_url(group_name), nil, throw_exception: false)
91
+ wrap_response_from response
92
+ end
93
+
94
+ # Retrieve all the accounts for one group
95
+ #
96
+ # @param group_name [String]
97
+ #
98
+ # @return [MxHero::API::PaginatedElements] the list of accounts [MxHero::API::Account]
99
+ def accounts(group_name)
100
+ response = call(:get, group_accounts_url(group_name))
101
+ paginate_wrap response do |hash|
102
+ hash[:elements].map { |e| Account.new(e) }
103
+ end
104
+ end
105
+
106
+ # Add an account to a group
107
+ #
108
+ # @param group_name [String]
109
+ # @param account_name [String]
110
+ #
111
+ # @return [MxHero::API::Response] with content empty.
112
+ # In case on error, may be one of the following:
113
+ # + domain.account.not.found : Inexistent account
114
+ # + domain.group.account.already.has.group : Try to add an account to a group when already is in that
115
+ def add_account(group_name, account_name)
116
+ response = call(:post, group_add_accounts_url(group_name, account_name), nil, throw_exception: false)
117
+ wrap_response_from response
118
+ end
119
+
120
+ # @param group_name [String]
121
+ # @param account_name [String]
122
+ #
123
+ # @return [MxHero::API::Response] with content empty.
124
+ # In case on error, may be one of the following:
125
+ # + domain.account.not.found : Inexistent account
126
+ # + domain.group.account.not.in.group : Try to remove an account that is not in the group
127
+ #
128
+ def remove_account(group_name, account_name)
129
+ response = call(:delete, group_remove_accounts_url(group_name, account_name), nil, throw_exception: false)
130
+ wrap_response_from response
131
+ end
132
+
133
+ private
134
+
135
+ def paginate_wrap(response, &block)
136
+ raise 'an error ocurred when try to communicate with the API' if response.status != 200
137
+ hash = json_parse(response.content)
138
+ PaginatedElements.new(block ? block.call(hash) : hash[:elements], hash[:totalElements], hash[:totalPages], hash[:actualPage])
139
+ end
140
+
141
+ def wrap_response_from(response)
142
+ content = (200..299).include?(response.code) ? group_from(response) : json_parse(response.content)
143
+ Response.new(response.status, content)
144
+ end
145
+
146
+ def group_from(response)
147
+ return nil if response.content.nil? || response.content.empty?
148
+ hash = json_parse response.content
149
+ Group.new hash
150
+ end
151
+
152
+ def parse_elements(hash)
153
+ hash[:elements].map { |e| Group.new(e) }
154
+ end
155
+
156
+ def groups_url
157
+ domain_by_id_url(domain) + 'groups'
158
+ end
159
+
160
+ def group_url(group_name)
161
+ groups_url + "/#{group_name}"
162
+ end
163
+
164
+ def group_accounts_url(group_name)
165
+ group_url(group_name) + "/accounts"
166
+ end
167
+
168
+ def group_add_accounts_url(group_name, account_name)
169
+ group_accounts_url(group_name) + "/#{account_name}/add"
170
+ end
171
+
172
+ def group_remove_accounts_url(group_name, account_name)
173
+ group_accounts_url(group_name) + "/#{account_name}/remove"
174
+ end
175
+ end
176
+
177
+
178
+ end
data/lib/mxhero-api.rb CHANGED
@@ -1,347 +1,323 @@
1
+ # encoding: utf-8
1
2
  require 'httpclient'
2
3
  require 'json'
3
4
 
4
- module MxHero
5
-
6
- module API
7
-
8
- # The class that contains the response information
9
- #
10
- # The *code* represent the HTTP code of the response.
11
- #
12
- # The *msg* represent a hash with the response information. Example:
13
- #
14
- # { status: 500, code: 500, developerMessage: "rules.already.exists.for.component", moreInfoUrl: "mailto:support@mxhero.com" }
15
- #
16
- class Response < Struct.new(:code, :msg)
17
-
18
- # Response is successful? Based in HTTP status code
19
- def success?
20
- code.to_i == 200 || code.to_i == 201
21
- end
5
+ require_relative 'communication'
6
+ require_relative 'urls'
7
+
8
+ module MxHero::API
9
+ # The class that contains the response information
10
+ #
11
+ # The *code* represent the HTTP code of the response.
12
+ #
13
+ # The *msg* represent a hash with the response information. Example:
14
+ #
15
+ # { status: 500, code: 500,
16
+ # developerMessage: "rules.already.exists.for.component",
17
+ # moreInfoUrl: "mailto:support@mxhero.com" }
18
+ #
19
+ class Response < Struct.new(:code, :msg)
20
+
21
+ # Response is successful? Based in HTTP status code
22
+ def success?
23
+ code.to_i == 200 || code.to_i == 201
22
24
  end
23
-
24
-
25
- # A client to interact with mxhero engine API
26
- class Client
27
-
28
- # @param [Hash] config the options of configuration
29
- # @option config [String] :api_url The URL to consume the API
30
- # @option config [String] :username The username for access the API
31
- # @option config [String] :password The password for the user that access the API
32
- # @option config [Boolean] :verbose (false) If true puts information about http operations
33
- def initialize(config = {})
34
- @service_url = config[:api_url]
35
- @username = config[:username]
36
- @password = config[:password]
37
- @verbose = config[:verbose] || false
38
- end
39
25
 
40
- # Find a rule by domain and ID
41
- #
42
- # @param domain [String]
43
- # @param id [Integer] the rule id
44
- #
45
- # @return [Hash, nil] the Rule information or nil if not exist
46
- #
47
- # @raise an exception when the status code isn't 200
48
- def domain_rule(domain, id)
49
- url = domain_rule_url(domain, id)
50
- response = call(:get, url)
51
- raise 'an error ocurred when try to communicate with the API' if response.status != 200
52
- json_parse(response.content)
53
- end
54
-
55
- # Update a rule
56
- # @return [MxHero::API::Response] When the rule is update correctly then return MxHero::API::Response object without msg (msg nil)
57
- # In case of error, the message is completed with the cause of error
58
- def update_rule(rule)
59
- url = domain_rule_url(rule[:domain], rule[:id])
60
- response = call(:put, url, rule.to_json)
61
- parse_response(response)
62
- end
63
-
64
- # Retrive all the domains
65
- #
66
- # TODO: Improve the response. We really need manage pagination here?
67
- #
68
- # @return [Hash] with the list of domains
69
- # * :elements [Array<Hash>] the list of domains as a Hash, when any element contains:
70
- # * :domain [String]
71
- # * :server [String]
72
- # * :creationDate [Fixnum]
73
- # * :updateDate [Fixnum]
74
- # * :aliases
75
- # * :ldap
76
- # * :totalElements
77
- # * :totalPages
78
- # * :actualPage
79
- #
80
- # @raise an exception when the status code isn't 200
81
- def domains
82
- response = call(:get, domains_url)
83
- raise 'an error ocurred when try to communicate with the API' if response.status != 200
84
- response_as_a_hash = json_parse(response.content)
85
- response_as_a_hash
86
- end
87
-
88
- # Retrive the domain by id according to the parameter if exist
89
- #
90
- # @param id The domain name or id. For example: 'mydomain.com'
91
- # @return [Hash] with the domain attributes if exist
92
- # * :domain [String]
93
- # * :server [String]
94
- # * :creationDate [Fixnum]
95
- # * :updateDate [Fixnum]
96
- # * :aliases
97
- # * :ldap
98
- # @raise an exception when the status code is one of the 5xx status error
99
- # @raise an exception if @param id is nil
100
- def domain_by_id(id = nil)
101
- raise 'Id domain could not be nil' if id.nil?
102
- response = call(:get, domain_by_id_url(id))
103
- response_as_a_hash = json_parse(response.content)
104
- response_as_a_hash
105
- end
26
+ alias_method :content, :msg
27
+ alias_method :content=, :msg=
28
+ end
106
29
 
107
-
108
- def verbose?
109
- @verbose
110
- end
30
+ # A client to interact with mxhero engine API
31
+ class Client
32
+ include Communication
33
+ include Urls
34
+
35
+ # @param [Hash] config the options of configuration
36
+ # @option config [String] :api_url The URL to consume the API
37
+ # @option config [String] :username The username for access the API
38
+ # @option config [String] :password The password for the user that access the API
39
+ # @option config [Boolean] :verbose (false) If true puts information about http operations
40
+ def initialize(config = {})
41
+ @service_url = config[:api_url]
42
+ @username = config[:username]
43
+ @password = config[:password]
44
+ @verbose = config[:verbose] || false
45
+ end
111
46
 
112
- def verbose=(verbose)
113
- @verbose = verbose
114
- end
47
+ # Find a rule by domain and ID
48
+ #
49
+ # @param domain [String]
50
+ # @param id [Integer] the rule id
51
+ #
52
+ # @return [Hash, nil] the Rule information or nil if not exist
53
+ #
54
+ # @raise an exception when the status code isn't 200
55
+ def domain_rule(domain, id)
56
+ url = domain_rule_url(domain, id)
57
+ response = call(:get, url)
58
+ raise 'an error ocurred when try to communicate with the API' if response.status != 200
59
+ json_parse(response.content)
60
+ end
115
61
 
116
- # @param domain [String]
117
- # @param [Hash] msg
118
- # @option msg [String] :domain
119
- # @option msg [Boolean] :twoWays
120
- # @option msg [Boolean] :enabled
121
- # @option msg [String] :name
122
- # @option msg [Integer] :created in epoch format
123
- # @option msg [Hash] :fromDirection
124
- # @option msg [Hash] :toDirection
125
- # @option msg [Array<Hash>] :properties
126
- # @option msg [String] :component
127
- #
128
- # @return [MxHero::API::Response]
129
- def create_rule_for_domain(domain, msg)
130
- url = rules_for_domain_url(domain)
131
- response = call(:post, url, msg.to_json, throw_exception: false)
132
- parse_response(response)
133
- end
134
-
135
- # Create a rule
136
- #
137
- # @param [Hash] msg
138
- # @option msg [String] :domain
139
- # @option msg [Boolean] :twoWays
140
- # @option msg [Boolean] :enabled
141
- # @option msg [String] :name
142
- # @option msg [Integer] :created in epoch format
143
- # @option msg [Hash] :fromDirection
144
- # @option msg [Hash] :toDirection
145
- # @option msg [Array<Hash>] :properties
146
- # @option msg [String] :component
147
- #
148
- # @return [MxHero::API::Response]
149
- def create_rule(msg)
150
- response = call(:post, rules_url, msg.to_json, throw_exception: false)
151
- parse_response(response)
152
- end
62
+ # Update a rule
63
+ # @return [MxHero::API::Response] When the rule is update correctly then return MxHero::API::Response object without msg (msg nil)
64
+ # In case of error, the message is completed with the cause of error
65
+ def update_rule(rule)
66
+ url = domain_rule_url(rule[:domain], rule[:id])
67
+ response = call(:put, url, rule.to_json)
68
+ parse_response(response)
69
+ end
153
70
 
154
- # Retrieve all the rules for one domain
155
- #
156
- # @param [String] domain
157
- # @param [String] component Filter the list of rules by this component [optional]
158
- #
159
- # @return [MxHero::API::Response] reponse
160
- # the key :msg contains an array of rules for the domain.
161
- def rules_for_domain(domain, component = nil)
162
- url = rules_for_domain_url(domain)
163
- url << "?component=#{component}" if component
164
- response = call(:get, url)
165
- parse_response(response, on_empty: [])
166
- end
71
+ # Retrive all the domains
72
+ #
73
+ # TODO: Improve the response. We really need manage pagination here?
74
+ #
75
+ # @return [Hash] with the list of domains
76
+ # * :elements [Array<Hash>] the list of domains as a Hash, when any element contains:
77
+ # * :domain [String]
78
+ # * :server [String]
79
+ # * :creationDate [Fixnum]
80
+ # * :updateDate [Fixnum]
81
+ # * :aliases
82
+ # * :ldap
83
+ # * :totalElements
84
+ # * :totalPages
85
+ # * :actualPage
86
+ #
87
+ # @raise an exception when the status code isn't 200
88
+ def domains
89
+ response = call(:get, domains_url)
90
+ raise 'an error ocurred when try to communicate with the API' if response.status != 200
91
+ response_as_a_hash = json_parse(response.content)
92
+ response_as_a_hash
93
+ end
167
94
 
168
- #
169
- # Retrive all the account from one domain
170
- #
171
- # @params [String] domain
172
- # @params [String] filter_account the account to filter in the list. This can be a part of an account.
173
- # @param [Hash] refinement
174
- # @option refinement [Fixnum] :limit of elements per page
175
- # @option refinement [Fixnum] :offset number of page (start in 1)
176
- # @option refinement [String] :account filter accounts that start with this value
177
- #
178
- #
179
- # @return [Hash] with the following elements:
180
- # * :elements [Array<Hash>] the list of accounts as a Hash, when any element contains:
181
- # * :account [String] example: alex
182
- # * :domain [String] example: mxhero.com
183
- # * :createdDate [Fixnum] example: 1375909565000 (epoch format)
184
- # * :updatedDate [Fixnum]
185
- # * :group [String]
186
- # * :aliases [Array<Hash>] the list of aliases of one account
187
- # * :name [String]
188
- # * :domain [String]
189
- # * :dataSource [String]
190
- # * :dataSource [String]
191
- # * :totalElements [Fixnum]
192
- # * :totalPages [Fixnum]
193
- # * :actualPage [Fixnum]
194
- #
195
- # @raise an exception when the status code isn't 200
196
- def accounts_by_domain(domain, refinement = {}) #filter_account = nil, pagination = {})
197
- params = refinement.dup
198
- filter_account = params.delete(:account)
199
- limit, offset = params.values_at(:limit, :offset)
95
+ # Retrive the domain by id according to the parameter if exist
96
+ #
97
+ # @param id The domain name or id. For example: 'mydomain.com'
98
+ # @return [Hash] with the domain attributes if exist
99
+ # * :domain [String]
100
+ # * :server [String]
101
+ # * :creationDate [Fixnum]
102
+ # * :updateDate [Fixnum]
103
+ # * :aliases
104
+ # * :ldap
105
+ # @raise an exception when the status code is one of the 5xx status error
106
+ # @raise an exception if @param id is nil
107
+ def domain_by_id(id = nil)
108
+ raise 'Id domain could not be nil' if id.nil?
109
+ response = call(:get, domain_by_id_url(id))
110
+ response_as_a_hash = json_parse(response.content)
111
+ response_as_a_hash
112
+ end
200
113
 
114
+ #
115
+ # Retrive all the account from one domain
116
+ #
117
+ # @params [String] domain
118
+ # @params [String] filter_account the account to filter in the list. This can be a part of an account.
119
+ # @param [Hash] refinement
120
+ # @option refinement [Fixnum] :limit of elements per page
121
+ # @option refinement [Fixnum] :offset number of page (start in 1)
122
+ # @option refinement [String] :account filter accounts that start with this value
123
+ # @option refinement [Boolean] :without_group filter accounts without group
124
+ #
125
+ #
126
+ # @return [Hash] with the following elements:
127
+ # * :elements [Array<Hash>] the list of accounts as a Hash, when any element contains:
128
+ # * :account [String] example: alex
129
+ # * :domain [String] example: mxhero.com
130
+ # * :createdDate [Fixnum] example: 1375909565000 (epoch format)
131
+ # * :updatedDate [Fixnum]
132
+ # * :group [String]
133
+ # * :aliases [Array<Hash>] the list of aliases of one account
134
+ # * :name [String]
135
+ # * :domain [String]
136
+ # * :dataSource [String]
137
+ # * :dataSource [String]
138
+ # * :totalElements [Fixnum]
139
+ # * :totalPages [Fixnum]
140
+ # * :actualPage [Fixnum]
141
+ #
142
+ # @raise an exception when the status code isn't 200
143
+ def accounts_by_domain(domain, refinement = {}) #filter_account = nil, pagination = {})
144
+ params = refinement.dup
145
+ filter_account = params.delete(:account)
146
+ without_group = params.delete(:without_group) || false
147
+ limit, offset = params.values_at(:limit, :offset)
148
+
149
+ if without_group
150
+ url = accounts_without_group_url(domain, filter_account)
151
+ else
201
152
  url = paginate accounts_by_domain_url(domain, filter_account), { limit: limit, offset: offset }
202
- response = call(:get, url)
203
- json_parse(response.content)
204
- end
205
-
206
-
207
- # @return [Boolean] true when operation it's ok
208
- def delete_rule(domain, id)
209
- url = domain_rule_url(domain, id)
210
- response = call(:delete, url)
211
- return true if response.status == 200
212
- return false
213
153
  end
154
+ response = call(:get, url)
155
+ json_parse(response.content)
156
+ end
214
157
 
215
- # @param [String] domain
216
- # @param [String] account Ex.: test or mxhero (the user name)
217
- # @return [MxHero::API::Response] reponse
218
- # the key :msg contains a Hash with the key, value of any property.
219
- # Example:
220
- #
221
- # { 'email': 'test@mxhero.com', 'name': 'John', 'lastname': 'Doe', ... }
222
- #
223
- def account_properties(domain, account)
224
- url = account_properties_url(domain, account)
225
- response = call(:get, url)
226
- if response.status == 200
227
- props = {}
228
- json_parse(response.content).each { |property| props[property[:name]] = property[:value] }
229
- return Response.new(response.code, props)
230
- end
231
- parse_response(response)
232
- end
158
+ def accounts_without_group_url(domain, filter_account)
159
+ domain_by_id_url(domain) + "/groups/accounts/available?account=#{filter_account}"
160
+ end
161
+
162
+ def verbose?
163
+ @verbose
164
+ end
233
165
 
234
- # @param [String] domain
235
- # @param [String] account
236
- # @param [Hash] properties The properties of the account. Ex.: { 'email': 'test@mxhero.com', 'name': 'John', 'lastname': 'Doe', ... }
237
- #
238
- # @return [MxHero::API::Response]. On success not return msg.
239
- def update_account_properties(domain, account, properties)
240
- url = account_properties_url(domain, account)
241
- response = call(:put, url, account_properties_to_json(properties))
242
- parse_response(response)
243
- end
166
+ def verbose=(verbose)
167
+ @verbose = verbose
168
+ end
244
169
 
245
- private
246
-
170
+ # @param domain [String]
171
+ # @param [Hash] msg
172
+ # @option msg [String] :domain
173
+ # @option msg [Boolean] :twoWays
174
+ # @option msg [Boolean] :enabled
175
+ # @option msg [String] :name
176
+ # @option msg [Integer] :created in epoch format
177
+ # @option msg [Hash] :fromDirection
178
+ # @option msg [Hash] :toDirection
179
+ # @option msg [Array<Hash>] :properties
180
+ # @option msg [String] :component
181
+ #
182
+ # @return [MxHero::API::Response]
183
+ def create_rule_for_domain(domain, msg)
184
+ url = rules_for_domain_url(domain)
185
+ response = call(:post, url, msg.to_json, throw_exception: false)
186
+ parse_response(response)
187
+ end
188
+
189
+ ## Create a rule
190
+ ##
191
+ ## @param [Hash] msg
192
+ ## @option msg [String] :domain
193
+ ## @option msg [Boolean] :twoWays
194
+ ## @option msg [Boolean] :enabled
195
+ ## @option msg [String] :name
196
+ ## @option msg [Integer] :created in epoch format
197
+ ## @option msg [Hash] :fromDirection
198
+ ## @option msg [Hash] :toDirection
199
+ ## @option msg [Array<Hash>] :properties
200
+ ## @option msg [String] :component
201
+ ##
202
+ ## [MxHero::API::Response]
203
+ #def create_rule(msg)
204
+ # response = call(:post, rules_url, msg.to_json, throw_exception: false)
205
+ # parse_response(response)
206
+ #end
207
+
208
+ # Retrieve all the rules for one domain
209
+ #
210
+ # @param [String] domain
211
+ # @param [String] component Filter the list of rules by this component [optional]
212
+ #
213
+ # @return [MxHero::API::Response] reponse
214
+ # the key :msg contains an array of rules for the domain.
215
+ def rules_for_domain(domain, component = nil)
216
+ url = rules_for_domain_url(domain)
217
+ url << "?component=#{component}" if component
218
+ response = call(:get, url)
219
+ parse_response(response, on_empty: [])
220
+ end
247
221
 
248
- # Complete the URL with the pagination info (:limit and :offset)
249
- # @param [String] original URL. Ex.: http://www.example.com/api/accounts
250
- # @param [Hash] pagination
251
- # @option pagination [Fixnum] :limit of elements per page
252
- # @option pagination [Fixnum] :offset number of page (start in 1)
253
- #
254
- # @return [String] the URL with the pagination parameters.
255
- # Ex.: url: http://www.example.com/api/accounts
256
- # pagination: { limit: 4, offset: 2 }
257
- # return > http://www.example.com/api/accounts?limit=4&offset=2
258
- def paginate(url, pagination)
259
- paginated = url.dup
260
- connector = url.include?('?') ? '&' : '?'
261
- [ :limit, :offset ].map do |elem|
262
- if pagination[elem]
263
- paginated << "#{connector}#{elem.to_s}=#{pagination[elem]}"
264
- connector = '&'
265
- end
266
- end
267
- paginated
268
- end
222
+ # @return [Boolean] true when operation it's ok
223
+ def delete_rule(domain, id)
224
+ url = domain_rule_url(domain, id)
225
+ response = call(:delete, url)
226
+ return true if response.status == 200
227
+ return false
228
+ end
269
229
 
270
- def account_properties_to_json(properties)
271
- out = []
272
- properties.each do |key, value|
273
- out << { name: key, value: value }
274
- end
275
- out.to_json
230
+ # @param [String] domain
231
+ # @param [String] account Ex.: test or mxhero (the user name)
232
+ # @return [MxHero::API::Response] reponse
233
+ # the key :msg contains a Hash with the key, value of any property.
234
+ # Example:
235
+ #
236
+ # { 'email': 'test@mxhero.com', 'name': 'John', 'lastname': 'Doe', ... }
237
+ #
238
+ def account_properties(domain, account)
239
+ url = account_properties_url(domain, account)
240
+ response = call(:get, url)
241
+ if response.status == 200
242
+ props = {}
243
+ json_parse(response.content).each { |property| props[property[:name]] = property[:value] }
244
+ return Response.new(response.code, props)
276
245
  end
246
+ parse_response(response)
247
+ end
277
248
 
278
- # @return [MxHero::API::Response] a response object
279
- def parse_response(response, opts = { on_empty: nil })
280
- json = response.content
281
- hash = json.nil? || json.empty? ? opts[:on_empty] : json_parse(json)
282
- Response.new(response.code, hash)
283
- end
249
+ # @param [String] domain
250
+ # @param [String] account
251
+ # @param [Hash] properties The properties of the account. Ex.: { 'email': 'test@mxhero.com', 'name': 'John', 'lastname': 'Doe', ... }
252
+ #
253
+ # @return [MxHero::API::Response]. On success not return msg.
254
+ def update_account_properties(domain, account, properties)
255
+ url = account_properties_url(domain, account)
256
+ response = call(:put, url, account_properties_to_json(properties))
257
+ parse_response(response)
258
+ end
284
259
 
285
- # @return [Hash]
286
- def json_parse(json)
287
- JSON.parse(json, symbolize_names: true)
288
- end
260
+ private
261
+
289
262
 
290
- # Make a HTTP call
291
- # @param method [Symbol] indicate the HTTP verb (:get, :post, :put, etc)
292
- # @param url [String]
293
- # @param body [String] (default: nil)
294
- # @param [Hash] more_options
295
- # @option more_options [Boolean] :throw_exception (default: true) throw exception if the response status are between 500 and 600
296
- def call(method, url, body = nil, more_options = {})
297
- client = HTTPClient.new
298
- client.set_auth(url, @username, @password)
299
- response = client.request(method, url, nil, body, headers)
300
- unless more_options[:throw_exception] == false
301
- raise "An error ocurred when try to communicate with the API\nError: #{response}" if (500..600).include?(response.status)
263
+ # Complete the URL with the pagination info (:limit and :offset)
264
+ # @param [String] original URL. Ex.: http://www.example.com/api/accounts
265
+ # @param [Hash] pagination
266
+ # @option pagination [Fixnum] :limit of elements per page
267
+ # @option pagination [Fixnum] :offset number of page (start in 1)
268
+ #
269
+ # @return [String] the URL with the pagination parameters.
270
+ # Ex.: url: http://www.example.com/api/accounts
271
+ # pagination: { limit: 4, offset: 2 }
272
+ # return > http://www.example.com/api/accounts?limit=4&offset=2
273
+ def paginate(url, pagination)
274
+ paginated = url.dup
275
+ connector = url.include?('?') ? '&' : '?'
276
+ [ :limit, :offset ].map do |elem|
277
+ if pagination.key? elem
278
+ paginated << "#{connector}#{elem.to_s}=#{pagination[elem]}"
279
+ connector = '&'
302
280
  end
303
-
304
- response
305
- end
306
-
307
- # Default headers
308
- def headers
309
- @headers ||= { 'Accept' => 'application/json', 'Content-Type' => 'application/json' }
310
- end
311
-
312
- def rules_for_domain_url(domain)
313
- service_url + "/domains/#{domain}/rules"
314
- end
315
-
316
- def rules_url
317
- service_url + '/rules'
318
281
  end
282
+ paginated
283
+ end
319
284
 
320
- def domains_url
321
- service_url + '/domains'
285
+ def account_properties_to_json(properties)
286
+ out = []
287
+ properties.each do |key, value|
288
+ out << { name: key, value: value }
322
289
  end
290
+ out.to_json
291
+ end
323
292
 
324
- def accounts_by_domain_url(domain, filter_account = nil)
325
- filter = filter_account ? "?account=#{filter_account}" : ''
326
- domain_by_id_url(domain) + 'accounts' + filter
327
- end
293
+ # @return [MxHero::API::Response] a response object
294
+ def parse_response(response, opts = { on_empty: nil })
295
+ json = response.content
296
+ hash = json.nil? || json.empty? ? opts[:on_empty] : json_parse(json)
297
+ Response.new(response.code, hash)
298
+ end
299
+
300
+ def rules_for_domain_url(domain)
301
+ service_url + "/domains/#{domain}/rules"
302
+ end
328
303
 
329
- def domain_by_id_url(domain)
330
- domains_url + "/#{domain}/"
331
- end
304
+ def rules_url
305
+ service_url + '/rules'
306
+ end
332
307
 
333
- def domain_rule_url(domain, id)
334
- rules_for_domain_url(domain) + "/#{id}"
335
- end
308
+ def accounts_by_domain_url(domain, filter_account = nil)
309
+ filter = filter_account ? "?account=#{filter_account}" : ''
310
+ domain_by_id_url(domain) + 'accounts' + filter
311
+ end
336
312
 
337
- def account_properties_url(domain, account)
338
- accounts_by_domain_url(domain) + "/#{account}/properties"
339
- end
313
+ def domain_rule_url(domain, id)
314
+ rules_for_domain_url(domain) + "/#{id}"
315
+ end
340
316
 
341
- def service_url
342
- @service_url
343
- end
317
+ def account_properties_url(domain, account)
318
+ accounts_by_domain_url(domain) + "/#{account}/properties"
344
319
  end
345
320
 
346
321
  end
322
+
347
323
  end