zm-ruby-client 2.2.7 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +6 -0
  3. data/.ruby-version +1 -0
  4. data/CHANGELOG.md +10 -6
  5. data/Gemfile +1 -6
  6. data/README.md +10 -15
  7. data/VERSION +1 -1
  8. data/lib/zm/client/account/account.rb +35 -22
  9. data/lib/zm/client/account/account_aliases_collection.rb +14 -6
  10. data/lib/zm/client/account/account_dls_membership_collection.rb +10 -4
  11. data/lib/zm/client/account/account_dls_owner_collection.rb +8 -5
  12. data/lib/zm/client/account/account_jsns_builder.rb +31 -19
  13. data/lib/zm/client/account/account_jsns_initializer.rb +4 -14
  14. data/lib/zm/client/account/accounts_builder.rb +1 -1
  15. data/lib/zm/client/account/accounts_collection.rb +15 -8
  16. data/lib/zm/client/ace/ace.rb +5 -5
  17. data/lib/zm/client/ace/ace_jsns_builder.rb +8 -8
  18. data/lib/zm/client/ace/ace_jsns_initializer.rb +7 -7
  19. data/lib/zm/client/ace/aces_builder.rb +1 -1
  20. data/lib/zm/client/ace/aces_collection.rb +2 -2
  21. data/lib/zm/client/appointment/appointment.rb +27 -24
  22. data/lib/zm/client/appointment/appointment_jsns_builder.rb +29 -20
  23. data/lib/zm/client/appointment/appointment_jsns_initializer.rb +14 -13
  24. data/lib/zm/client/appointment/appointments_builder.rb +1 -1
  25. data/lib/zm/client/appointment/appointments_collection.rb +8 -7
  26. data/lib/zm/client/backup/backup.rb +6 -2
  27. data/lib/zm/client/backup/backup_jsns_initializer.rb +14 -12
  28. data/lib/zm/client/backup/backups_builder.rb +1 -1
  29. data/lib/zm/client/backup/backups_collection.rb +2 -1
  30. data/lib/zm/client/base/account_search_objects_collection.rb +46 -20
  31. data/lib/zm/client/base/admin_objects_collection.rb +22 -27
  32. data/lib/zm/client/base/base_account_jsns_builder.rb +1 -4
  33. data/lib/zm/client/base/base_jsns_initializer.rb +8 -8
  34. data/lib/zm/client/base/mailbox_infos_collection.rb +23 -15
  35. data/lib/zm/client/base/mailbox_object.rb +174 -69
  36. data/lib/zm/client/base/mailbox_prefs_collection.rb +4 -8
  37. data/lib/zm/client/base/object.rb +2 -2
  38. data/lib/zm/client/base/objects_builder.rb +7 -3
  39. data/lib/zm/client/base/objects_collection.rb +4 -13
  40. data/lib/zm/client/base/zimbra_attribute.rb +4 -17
  41. data/lib/zm/client/base/zimbra_attributes_collection.rb +16 -9
  42. data/lib/zm/client/base.rb +0 -1
  43. data/lib/zm/client/cluster/batch_request.rb +50 -0
  44. data/lib/zm/client/cluster/cluster.rb +49 -27
  45. data/lib/zm/client/cluster/cluster_config.rb +129 -40
  46. data/lib/zm/client/common/recipients.rb +2 -2
  47. data/lib/zm/client/common/utils.rb +1 -13
  48. data/lib/zm/client/common.rb +0 -1
  49. data/lib/zm/client/connector/{rest_account.rb → rest_connector.rb} +40 -50
  50. data/lib/zm/client/connector/soap_account.rb +19 -15
  51. data/lib/zm/client/connector/soap_admin.rb +9 -9
  52. data/lib/zm/client/connector/soap_base.rb +24 -17
  53. data/lib/zm/client/connector/soap_error.rb +3 -23
  54. data/lib/zm/client/constant.rb +18 -16
  55. data/lib/zm/client/contact/contact.rb +21 -40
  56. data/lib/zm/client/contact/contact_jsns_builder.rb +1 -1
  57. data/lib/zm/client/contact/contact_jsns_initializer.rb +4 -26
  58. data/lib/zm/client/contact/contacts_builder.rb +1 -1
  59. data/lib/zm/client/contact/contacts_collection.rb +4 -24
  60. data/lib/zm/client/contact/group_contact_jsns_builder.rb +18 -13
  61. data/lib/zm/client/contact/mod_group_contact.rb +6 -2
  62. data/lib/zm/client/cos/cos.rb +35 -11
  63. data/lib/zm/client/cos/cos_domains_collection.rb +1 -1
  64. data/lib/zm/client/cos/cos_jsns_builder.rb +22 -9
  65. data/lib/zm/client/cos/cos_jsns_initializer.rb +2 -6
  66. data/lib/zm/client/cos/cos_servers_collection.rb +5 -6
  67. data/lib/zm/client/cos/coses_builder.rb +1 -1
  68. data/lib/zm/client/cos/coses_collection.rb +6 -4
  69. data/lib/zm/client/datasource/datasource.rb +27 -34
  70. data/lib/zm/client/datasource/datasource_jsns_builder.rb +1 -1
  71. data/lib/zm/client/datasource/datasource_jsns_initializer.rb +5 -6
  72. data/lib/zm/client/datasource/datasources_builder.rb +6 -9
  73. data/lib/zm/client/datasource/datasources_collection.rb +6 -5
  74. data/lib/zm/client/distributionlist/distributionlist.rb +22 -42
  75. data/lib/zm/client/distributionlist/distributionlist_aliases_collection.rb +14 -6
  76. data/lib/zm/client/distributionlist/distributionlist_jsns_builder.rb +20 -16
  77. data/lib/zm/client/distributionlist/distributionlist_jsns_initializer.rb +2 -11
  78. data/lib/zm/client/distributionlist/distributionlist_members_collection.rb +20 -12
  79. data/lib/zm/client/distributionlist/distributionlist_owners_collection.rb +16 -5
  80. data/lib/zm/client/distributionlist/distributionlists_builder.rb +1 -1
  81. data/lib/zm/client/distributionlist/distributionlists_collection.rb +12 -6
  82. data/lib/zm/client/distributionlist/dls_membership_collection.rb +12 -6
  83. data/lib/zm/client/document/document.rb +16 -8
  84. data/lib/zm/client/document/document_jsns_builder.rb +1 -1
  85. data/lib/zm/client/document/document_jsns_initializer.rb +27 -26
  86. data/lib/zm/client/document/documents_builder.rb +1 -1
  87. data/lib/zm/client/document/documents_collection.rb +1 -1
  88. data/lib/zm/client/domain/domain.rb +18 -37
  89. data/lib/zm/client/domain/domain_accounts_collection.rb +1 -1
  90. data/lib/zm/client/domain/domain_distributionlists_collection.rb +1 -1
  91. data/lib/zm/client/domain/domain_jsns_builder.rb +18 -9
  92. data/lib/zm/client/domain/domain_jsns_initializer.rb +2 -6
  93. data/lib/zm/client/domain/domain_resources_collection.rb +1 -1
  94. data/lib/zm/client/domain/domains_builder.rb +1 -1
  95. data/lib/zm/client/domain/domains_collection.rb +12 -6
  96. data/lib/zm/client/filter_rules/filter_rule.rb +0 -9
  97. data/lib/zm/client/filter_rules/filter_rule_jsns_initializer.rb +7 -6
  98. data/lib/zm/client/filter_rules/filter_rules_builder.rb +1 -1
  99. data/lib/zm/client/filter_rules/filter_rules_collection.rb +5 -15
  100. data/lib/zm/client/filter_rules/outgoing_filter_rules_collection.rb +5 -2
  101. data/lib/zm/client/folder/folder.rb +73 -56
  102. data/lib/zm/client/folder/folder_grant.rb +7 -5
  103. data/lib/zm/client/folder/folder_grant_jsns_builder.rb +6 -3
  104. data/lib/zm/client/folder/folder_grants_collection.rb +2 -4
  105. data/lib/zm/client/folder/folder_jsns_builder.rb +14 -7
  106. data/lib/zm/client/folder/folder_jsns_initializer.rb +58 -40
  107. data/lib/zm/client/folder/folder_retention_policies_collection.rb +4 -2
  108. data/lib/zm/client/folder/folders_builder.rb +1 -1
  109. data/lib/zm/client/folder/folders_collection.rb +21 -18
  110. data/lib/zm/client/folder/folders_jsns_builder.rb +4 -2
  111. data/lib/zm/client/folder/mod_document_folder.rb +5 -4
  112. data/lib/zm/client/identity/identities_builder.rb +1 -1
  113. data/lib/zm/client/identity/identities_collection.rb +6 -5
  114. data/lib/zm/client/identity/identity.rb +9 -29
  115. data/lib/zm/client/identity/identity_jsns_builder.rb +8 -4
  116. data/lib/zm/client/identity/identity_jsns_initializer.rb +5 -4
  117. data/lib/zm/client/license/license.rb +7 -1
  118. data/lib/zm/client/license/license_jsns_initializer.rb +8 -5
  119. data/lib/zm/client/license/licenses_collection.rb +1 -1
  120. data/lib/zm/client/mailbox/mailbox_item_concern.rb +33 -0
  121. data/lib/zm/client/mailbox/mailbox_item_id.rb +7 -0
  122. data/lib/zm/client/message/attachments_collection.rb +2 -2
  123. data/lib/zm/client/message/message.rb +56 -52
  124. data/lib/zm/client/message/message_flags.rb +21 -13
  125. data/lib/zm/client/message/message_jsns_builder.rb +11 -6
  126. data/lib/zm/client/message/message_jsns_initializer.rb +24 -23
  127. data/lib/zm/client/message/messages_builder.rb +1 -1
  128. data/lib/zm/client/message/messages_collection.rb +1 -15
  129. data/lib/zm/client/mountpoint/mountpoint.rb +17 -25
  130. data/lib/zm/client/mountpoint/mountpoint_jsns_builder.rb +6 -3
  131. data/lib/zm/client/mountpoint/mountpoint_jsns_initializer.rb +25 -24
  132. data/lib/zm/client/mountpoint/mountpoints_builder.rb +1 -1
  133. data/lib/zm/client/mountpoint/mountpoints_collection.rb +13 -9
  134. data/lib/zm/client/mta_queue/mta_queue.rb +6 -2
  135. data/lib/zm/client/mta_queue/mta_queue_jsns_initializer.rb +3 -7
  136. data/lib/zm/client/mta_queue/mta_queues_builder.rb +3 -1
  137. data/lib/zm/client/mta_queue_item/mta_queue_item.rb +5 -3
  138. data/lib/zm/client/mta_queue_item/mta_queue_item_jsns_initializer.rb +1 -5
  139. data/lib/zm/client/mta_queue_item/mta_queue_items_builder.rb +3 -1
  140. data/lib/zm/client/mta_queue_item/mta_queue_items_collection.rb +3 -1
  141. data/lib/zm/client/resource/resource.rb +6 -18
  142. data/lib/zm/client/resource/resource_jsns_builder.rb +20 -13
  143. data/lib/zm/client/resource/resource_jsns_initializer.rb +4 -14
  144. data/lib/zm/client/resource/resources_builder.rb +1 -1
  145. data/lib/zm/client/resource/resources_collection.rb +12 -7
  146. data/lib/zm/client/search_folder/search_folder.rb +13 -29
  147. data/lib/zm/client/search_folder/search_folder_jsns_builder.rb +6 -6
  148. data/lib/zm/client/search_folder/search_folder_jsns_initializer.rb +19 -18
  149. data/lib/zm/client/search_folder/search_folders_builder.rb +1 -1
  150. data/lib/zm/client/search_folder/search_folders_collection.rb +6 -5
  151. data/lib/zm/client/server/server.rb +9 -3
  152. data/lib/zm/client/server/server_accounts_collection.rb +4 -2
  153. data/lib/zm/client/server/server_jsns_initializer.rb +1 -5
  154. data/lib/zm/client/server/servers_builder.rb +1 -1
  155. data/lib/zm/client/server/servers_collection.rb +17 -9
  156. data/lib/zm/client/share/share.rb +5 -3
  157. data/lib/zm/client/share/share_jsns_initializer.rb +15 -14
  158. data/lib/zm/client/share/share_mountpoints_collection.rb +3 -6
  159. data/lib/zm/client/share/shares_builder.rb +1 -1
  160. data/lib/zm/client/share/shares_collection.rb +6 -3
  161. data/lib/zm/client/signature/signature.rb +6 -21
  162. data/lib/zm/client/signature/signature_jsns_builder.rb +12 -7
  163. data/lib/zm/client/signature/signature_jsns_initializer.rb +5 -4
  164. data/lib/zm/client/signature/signatures_builder.rb +1 -1
  165. data/lib/zm/client/signature/signatures_collection.rb +6 -5
  166. data/lib/zm/client/soap_request/request_methods_admin.rb +56 -0
  167. data/lib/zm/client/soap_request/request_methods_mailbox.rb +60 -0
  168. data/lib/zm/client/soap_request/soap_constants.rb +7 -0
  169. data/lib/zm/client/soap_request/soap_context.rb +11 -2
  170. data/lib/zm/client/soap_request.rb +3 -0
  171. data/lib/zm/client/tag/account_object_tags_collection.rb +11 -9
  172. data/lib/zm/client/tag/tag.rb +8 -44
  173. data/lib/zm/client/tag/tag_jsns_builder.rb +4 -2
  174. data/lib/zm/client/tag/tag_jsns_initializer.rb +7 -6
  175. data/lib/zm/client/tag/tags_builder.rb +1 -1
  176. data/lib/zm/client/tag/tags_collection.rb +6 -5
  177. data/lib/zm/client/task/task.rb +6 -5
  178. data/lib/zm/client/task/task_jsns_initializer.rb +28 -27
  179. data/lib/zm/client/task/tasks_builder.rb +1 -1
  180. data/lib/zm/client/task/tasks_collection.rb +2 -2
  181. data/lib/zm/client/token.rb +52 -0
  182. data/lib/zm/client/upload/upload.rb +101 -95
  183. data/lib/zm/client/zm_logger.rb +83 -0
  184. data/lib/zm/client.rb +6 -1
  185. data/lib/zm/modules/base.rb +0 -1
  186. data/lib/zm/modules/belongs_to_folder.rb +6 -7
  187. data/lib/zm/modules/belongs_to_tag.rb +3 -1
  188. data/lib/zm/modules/common/zimbra-attrs.csv +3 -4
  189. data/lib/zm/modules/inspector.rb +2 -2
  190. data/lib/zm/modules/missing_method_static_collection.rb +2 -2
  191. data/lib/zm/support/cache/entry.rb +63 -0
  192. data/lib/zm/support/cache/file_store.rb +141 -0
  193. data/lib/zm/support/cache/null_store.rb +43 -0
  194. data/lib/zm/support/cache/request_strategy.rb +10 -0
  195. data/lib/zm/support/cache/store.rb +197 -0
  196. data/lib/zm/support/cache/strategy.rb +13 -0
  197. data/lib/zm/support/cache.rb +26 -0
  198. data/lib/zm-ruby-client.rb +2 -2
  199. data/zm-ruby-client.gemspec +10 -15
  200. metadata +37 -36
  201. data/lib/zm/client/common/token_metadata.rb +0 -44
  202. data/lib/zm/modules/zm_logger.rb +0 -26
@@ -8,13 +8,13 @@ module Zm
8
8
  class SoapAccountConnector < SoapBaseConnector
9
9
  class << self
10
10
  def create(config)
11
- trans = new(
12
- config.zimbra_public_scheme,
13
- config.zimbra_public_host,
14
- config.zimbra_public_port
15
- )
16
- trans.logger = config.logger
17
- trans
11
+ new(
12
+ config.zimbra_public_url
13
+ ).tap do |trans|
14
+ trans.logger = config.logger
15
+ trans.cache = config.cache
16
+ trans.timeout = config.timeout
17
+ end
18
18
  end
19
19
  end
20
20
 
@@ -26,8 +26,8 @@ module Zm
26
26
  context.token(value)
27
27
  end
28
28
 
29
- def initialize(scheme, host, port)
30
- super(scheme, host, port, SoapAccountConstants::ACCOUNT_SERVICE_URI)
29
+ def initialize(url)
30
+ super(url, SoapAccountConstants::ACCOUNT_SERVICE_URI)
31
31
  end
32
32
 
33
33
  def auth_preauth(content, by, expires, domainkey)
@@ -35,11 +35,14 @@ module Zm
35
35
  preauth = compute_preauth(content, by, ts, expires, domainkey)
36
36
 
37
37
  soap_request = SoapElement.account(SoapAccountConstants::AUTH_REQUEST)
38
- node_account = SoapElement.create(SoapConstants::ACCOUNT).add_attribute(SoapConstants::BY,
39
- by).add_content(content)
38
+ node_account = SoapElement.create(SoapConstants::ACCOUNT)
39
+ .add_attribute(SoapConstants::BY, by)
40
+ .add_content(content)
40
41
  soap_request.add_node(node_account)
41
- node_preauth = SoapElement.create(SoapConstants::PREAUTH).add_attribute(SoapConstants::TIMESTAMP,
42
- ts).add_content(preauth)
42
+ node_preauth = SoapElement.create(SoapConstants::PREAUTH)
43
+ .add_attribute(SoapConstants::TIMESTAMP, ts)
44
+ .add_attribute(SoapConstants::EXPIRES, expires)
45
+ .add_content(preauth)
43
46
  soap_request.add_node(node_preauth)
44
47
 
45
48
  do_login(soap_request)
@@ -47,8 +50,9 @@ module Zm
47
50
 
48
51
  def auth_password(content, by, password)
49
52
  soap_request = SoapElement.account(SoapAccountConstants::AUTH_REQUEST)
50
- node_account = SoapElement.create(SoapConstants::ACCOUNT).add_attribute(SoapConstants::BY,
51
- by).add_content(content)
53
+ node_account = SoapElement.create(SoapConstants::ACCOUNT)
54
+ .add_attribute(SoapConstants::BY, by)
55
+ .add_content(content)
52
56
  soap_request.add_node(node_account)
53
57
  soap_request.add_attribute('password', password)
54
58
 
@@ -8,13 +8,13 @@ module Zm
8
8
  class SoapAdminConnector < SoapBaseConnector
9
9
  class << self
10
10
  def create(config)
11
- trans = new(
12
- config.zimbra_admin_scheme,
13
- config.zimbra_admin_host,
14
- config.zimbra_admin_port
15
- )
16
- trans.logger = config.logger
17
- trans
11
+ new(
12
+ config.zimbra_admin_url
13
+ ).tap do |trans|
14
+ trans.logger = config.logger
15
+ trans.cache = config.cache
16
+ trans.timeout = config.timeout
17
+ end
18
18
  end
19
19
  end
20
20
 
@@ -26,8 +26,8 @@ module Zm
26
26
  context.token(value)
27
27
  end
28
28
 
29
- def initialize(scheme, host, port)
30
- super(scheme, host, port, SoapAdminConstants::ADMIN_SERVICE_URI)
29
+ def initialize(url)
30
+ super(url, SoapAdminConstants::ADMIN_SERVICE_URI)
31
31
  end
32
32
  end
33
33
  end
@@ -2,15 +2,12 @@
2
2
 
3
3
  require 'json'
4
4
  require 'openssl'
5
- require 'uri'
6
5
 
7
6
  require_relative 'soap_error'
8
7
 
9
8
  module Zm
10
9
  module Client
11
10
  class SoapBaseConnector
12
- include ZmLogger
13
-
14
11
  BASESPACE = 'urn:zimbra'
15
12
  HTTP_HEADERS = {
16
13
  'Content-Type' => 'application/json; charset=utf-8',
@@ -18,8 +15,9 @@ module Zm
18
15
  }.freeze
19
16
 
20
17
  attr_reader :context
18
+ attr_writer :logger, :cache, :timeout
21
19
 
22
- def initialize(scheme, host, port, soap_path)
20
+ def initialize(url, soap_path)
23
21
  @verbose = false
24
22
  @timeout = 300
25
23
 
@@ -29,8 +27,9 @@ module Zm
29
27
  verify_mode: OpenSSL::SSL::VERIFY_NONE
30
28
  }
31
29
 
30
+ @url = url
32
31
  @soap_path = soap_path
33
- @uri = URI::HTTP.new(scheme, nil, host, port, nil, nil, nil, nil, nil)
32
+
34
33
  @context = SoapContext.new
35
34
  end
36
35
 
@@ -51,7 +50,7 @@ module Zm
51
50
 
52
51
  def http_client!
53
52
  @http_client = Faraday.new(
54
- url: @uri.to_s,
53
+ url: @url,
55
54
  headers: HTTP_HEADERS,
56
55
  request: {
57
56
  timeout: @timeout
@@ -70,13 +69,28 @@ module Zm
70
69
  end
71
70
 
72
71
  def do_request(body, error_handler = SoapError)
73
- response = http_client.post(@soap_path, body)
72
+ json_body = body.to_json
73
+ @logger.debug json_body
74
+
75
+ # cache json response
76
+ # no cache if response raise
77
+ json_response = @cache.fetch(json_body) do
78
+ @logger.debug 'Load from remote'
79
+ response = http_client.post(@soap_path, json_body)
80
+ @logger.debug response.body
81
+
82
+ raise(error_handler, JSON.parse(response.body, symbolize_names: true)) if response.status >= 400
74
83
 
75
- if response.status >= 400
76
- raise(error_handler, response.body)
84
+ response.body
77
85
  end
78
86
 
79
- JSON.parse(response.body, symbolize_names: true)
87
+ JSON.parse(json_response, symbolize_names: true)
88
+
89
+ # rescue Faraday::ConnectionFailed, SocketError => error
90
+ # @logger.error "SoapConnectorError (#{error.class}): #{error.message}"
91
+ # # raise error
92
+ # {}
93
+ # nil
80
94
  end
81
95
 
82
96
  def envelope(soap_element)
@@ -85,13 +99,6 @@ module Zm
85
99
  Header: { context: context.to_hash, _jsns: BASESPACE }
86
100
  }
87
101
  end
88
-
89
- def hash_header(token, target_server = nil)
90
- h_context = { authToken: token, userAgent: { name: :zmsoap }, targetServer: target_server }.delete_if do |_, v|
91
- v.nil?
92
- end
93
- { Header: { context: h_context, _jsns: BASESPACE } }
94
- end
95
102
  end
96
103
  end
97
104
  end
@@ -9,29 +9,9 @@ module Zm
9
9
  attr_reader :reason, :code
10
10
 
11
11
  def initialize(soapbody)
12
- if soapbody.start_with?('{')
13
- init_from_json(soapbody)
14
- elsif soapbody.start_with?('<')
15
- init_from_xml(soapbody)
16
- end
17
-
18
- super "[#{@code}] [#{@reason}]"
19
- end
20
-
21
- private
22
-
23
- def init_from_json(soapbody)
24
- json = JSON.parse(soapbody, symbolize_names: true)
25
- @reason = json[:Body][:Fault][:Reason][:Text]
26
- @code = json[:Body][:Fault][:Detail][:Error][:Code]
27
- end
28
-
29
- def init_from_xml(soapbody)
30
- code_match = soapbody.match(%r{<Code>(.*?)</Code>})
31
- @code = code_match[1]
32
-
33
- text_match = soapbody.match(%r{<soap:Reason>.*?<soap:Text>(.*?)</soap:Text>}m)
34
- @reason = text_match[1]
12
+ @reason = soapbody.dig(:Body, :Fault, :Reason, :Text)
13
+ @code = soapbody.dig(:Body, :Fault, :Detail, :Error, :Code)
14
+ super("[#{@code}] [#{@reason}]")
35
15
  end
36
16
  end
37
17
 
@@ -6,24 +6,26 @@ module Zm
6
6
  DOUBLEPOINT = ' :: '
7
7
 
8
8
  module Regex
9
- UUID_REGEX = /[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/.freeze
10
- BASEDN_REGEX = /^uid=/.freeze
11
- SHARED_CONTACT = /[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}:[0-9]+/.freeze
9
+ UUID_REGEX = /[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/
10
+ BASEDN_REGEX = /^uid=/
11
+ SHARED_CONTACT = /[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}:[0-9]+/
12
12
  end
13
13
 
14
14
  module FolderDefault
15
- ROOT = { id: 1, name: '', path: '/', type: 'unknown' }.freeze
16
- BRIEFCASE = { id: 16, name: 'Briefcase', path: '/Briefcase', type: 'document' }.freeze
17
- CALENDAR = { id: 10, name: 'Calendar', path: '/Calendar', type: 'appointment' }.freeze
18
- CHATS = { id: 14, name: 'Chats', path: '/Chats', type: 'message' }.freeze
19
- CONTACTS = { id: 7, name: 'Contacts', path: '/Contacts', type: 'contact' }.freeze
20
- DRAFTS = { id: 6, name: 'Drafts', path: '/Drafts', type: 'message' }.freeze
21
- EMAILED = { id: 13, name: 'Emailed Contacts', path: '/Emailed Contacts', type: 'contact' }.freeze
22
- INBOX = { id: 2, name: 'Inbox', path: '/Inbox', type: 'message' }.freeze
23
- JUNK = { id: 4, name: 'Junk', path: '/Junk', type: 'message' }.freeze
24
- SENT = { id: 5, name: 'Sent', path: '/Sent', type: 'message' }.freeze
25
- TASKS = { id: 15, name: 'Tasks', path: '/Tasks', type: 'task' }.freeze
26
- TRASH = { id: 3, name: 'Trash', path: '/Trash', type: 'unknown' }.freeze
15
+ FolderData = Data.define(:id, :name, :path, :type)
16
+
17
+ ROOT = FolderData.new(1, '', '/', 'unknown')
18
+ INBOX = FolderData.new(2, 'Inbox', '/Inbox', 'message')
19
+ TRASH = FolderData.new(3, 'Trash', '/Trash', 'unknown')
20
+ JUNK = FolderData.new(4, 'Junk', '/Junk', 'message')
21
+ SENT = FolderData.new(5, 'Sent', '/Sent', 'message')
22
+ DRAFTS = FolderData.new(6, 'Drafts', '/Drafts', 'message')
23
+ CONTACTS = FolderData.new(7, 'Contacts', '/Contacts', 'contact')
24
+ CALENDAR = FolderData.new(10, 'Calendar', '/Calendar', 'appointment')
25
+ EMAILED = FolderData.new(13, 'Emailed Contacts', '/Emailed Contacts', 'contact')
26
+ CHATS = FolderData.new(14, 'Chats', '/Chats', 'message')
27
+ TASKS = FolderData.new(15, 'Tasks', '/Tasks', 'task')
28
+ BRIEFCASE = FolderData.new(16, 'Briefcase', '/Briefcase', 'document')
27
29
 
28
30
  ALL = [
29
31
  ROOT,
@@ -40,7 +42,7 @@ module Zm
40
42
  TRASH
41
43
  ].freeze
42
44
 
43
- IDS = ALL.map { |folder| folder[:id] }.freeze
45
+ IDS = ALL.map(&:id).freeze
44
46
  end
45
47
 
46
48
  module ShareType
@@ -6,24 +6,27 @@ module Zm
6
6
  class Contact < Base::Object
7
7
  include BelongsToFolder
8
8
  include BelongsToTag
9
+ include RequestMethodsMailbox
10
+ include MailboxItemConcern
9
11
 
10
12
  GROUP_PATTERN = 'group'
11
13
 
12
- attr_accessor :anniversary, :assistantPhone, :birthday, :callbackPhone, :carPhone, :company, :companyPhone,
13
- :custom1, :department, :email, :email2, :email3, :email4, :email5, :email6, :email7, :firstName,
14
- :fullName, :homeCity, :homeCountry, :homeFax, :homePhone, :homePostalCode, :homeState, :homeStreet,
15
- :homeURL, :imAddress1, :imAddress2, :imAddress3, :imAddress4, :imAddress5, :jobTitle, :lastName,
16
- :maidenName, :middleName, :mobilePhone, :namePrefix, :nameSuffix, :nickname, :notes, :otherCity,
17
- :otherCountry, :otherFax, :otherPhone, :otherPostalCode, :otherState, :otherStreet, :otherURL,
18
- :pager, :workCity, :workCountry, :workFax, :workPhone, :workPostalCode, :workState, :workStreet,
19
- :workURL, :image, :id, :name, :l, :type, :tn, :shared_account_id, :shared_folder_account_id,
20
- :fileAs
14
+ attr_accessor :anniversary, :assistantPhone, :birthday, :callbackPhone, :carPhone, :company,
15
+ :companyPhone, :custom1, :department, :email, :email2, :email3, :email4, :email5,
16
+ :email6, :email7, :firstName, :fullName, :homeCity, :homeCountry, :homeFax,
17
+ :homePhone, :homePostalCode, :homeState, :homeStreet, :homeURL, :imAddress1,
18
+ :imAddress2, :imAddress3, :imAddress4, :imAddress5, :jobTitle, :lastName,
19
+ :maidenName, :middleName, :mobilePhone, :namePrefix, :nameSuffix, :nickname, :notes,
20
+ :otherCity, :otherCountry, :otherFax, :otherPhone, :otherPostalCode, :otherState,
21
+ :otherStreet, :otherURL, :pager, :workCity, :workCountry, :workFax, :workPhone,
22
+ :workPostalCode, :workState, :workStreet, :workURL, :image, :name, :type,
23
+ :tn, :shared_account_id, :shared_folder_account_id
21
24
 
22
25
  def initialize(parent)
23
- @l = FolderDefault::CONTACTS[:id]
26
+ @l = FolderDefault::CONTACTS.id
24
27
  @shared_account_id = nil
25
28
  @shared_folder_account_id = nil
26
- super(parent)
29
+ super
27
30
  end
28
31
 
29
32
  def group?
@@ -39,38 +42,18 @@ module Zm
39
42
  end
40
43
 
41
44
  def create!
42
- rep = @parent.sacc.invoke(jsns_builder.to_jsns)
45
+ rep = @parent.soap_connector.invoke(build_create)
43
46
  ContactJsnsInitializer.update(self, rep[:CreateContactResponse][:cn].first)
44
47
 
45
- @id
46
- end
47
-
48
- def modify!
49
- @parent.sacc.invoke(jsns_builder.to_update)
50
- true
51
- end
52
-
53
- def update!(hash)
54
- return false if hash.delete_if { |k, v| v.nil? || !respond_to?(k) }.empty?
55
-
56
- do_update!(hash)
57
-
58
- hash.each do |key, value|
59
- update_attribute(key, value)
60
- end
61
-
62
- true
48
+ id
63
49
  end
64
50
 
65
51
  def rename!(*args)
66
52
  raise NotImplementedError
67
53
  end
68
54
 
69
- def delete!
70
- return false if @id.nil?
71
-
72
- @parent.sacc.invoke(jsns_builder.to_delete)
73
- @id = nil
55
+ def build_rename(*args)
56
+ raise NotImplementedError
74
57
  end
75
58
 
76
59
  def reload!
@@ -79,12 +62,10 @@ module Zm
79
62
 
80
63
  private
81
64
 
82
- def do_update!(hash)
83
- @parent.sacc.invoke(jsns_builder.to_patch(hash))
84
- end
85
-
86
65
  def jsns_builder
87
- @jsns_builder ||= ContactJsnsBuilder.new(self)
66
+ return @jsns_builder if defined? @jsns_builder
67
+
68
+ @jsns_builder = ContactJsnsBuilder.new(self)
88
69
  end
89
70
  end
90
71
  end
@@ -10,7 +10,7 @@ module Zm
10
10
  jsns = {
11
11
  cn: {
12
12
  a: instance_variables_array(all_instance_variables).map(&Utils::A_NODE_PROC),
13
- l: @item.folder_id || Zm::Client::FolderDefault::CONTACTS[:id]
13
+ l: @item.l || Zm::Client::FolderDefault::CONTACTS.id
14
14
  }
15
15
  }
16
16
 
@@ -11,32 +11,10 @@ module Zm
11
11
  end
12
12
 
13
13
  def update(item, json)
14
- part_id = json[:id].split(':')
15
-
16
- if part_id.length == 1
17
- item.id = json[:id].to_i
18
- elsif part_id.length == 2
19
- item.shared_account_id = part_id.first
20
- item.id = part_id.last.to_i
21
- else
22
- item.id = json[:id]
23
- end
24
-
25
- part_l = json[:l].split(':')
26
-
27
- if part_l.length == 1
28
- item.l = json[:l].to_i
29
- elsif part_l.length == 2
30
- item.shared_folder_account_id = part_l.first
31
- item.l = part_l.last.to_i
32
- else
33
- item.l = json[:l]
34
- end
35
-
36
- # item.id = json[:id]
37
- item.name = json[:fileAsStr]
38
- # item.l = json[:l].to_i
39
- item.tn = json[:tn]
14
+ item.id = json.delete(:id)
15
+ item.l = json.delete(:l)
16
+ item.name = json.delete(:fileAsStr)
17
+ item.tn = json.delete(:tn)
40
18
 
41
19
  if json[:_attrs].is_a?(Hash)
42
20
  make_custom_keys(json[:_attrs], item)
@@ -5,7 +5,7 @@ module Zm
5
5
  # class factory [contacts]
6
6
  class ContactBuilder < Base::ObjectsBuilder
7
7
  def initialize(parent, json)
8
- super(parent, json)
8
+ super
9
9
  @json_item_key = :cn
10
10
  end
11
11
 
@@ -3,33 +3,13 @@
3
3
  module Zm
4
4
  module Client
5
5
  # collection account contacts
6
- class ContactsCollection < Base::AccountObjectsCollection
6
+ class ContactsCollection < Base::AccountSearchObjectsCollection
7
7
  def initialize(parent)
8
+ super
8
9
  @child_class = Contact
9
10
  @builder_class = ContactBuilder
10
- @folder_id = nil
11
- super(parent)
12
- end
13
-
14
- def folder(folder)
15
- return self unless folder.is_a?(Zm::Client::Folder)
16
-
17
- folder_id(folder.id)
18
- end
19
-
20
- def folder_id(folder_id)
21
- return self if @folder_id == folder_id
22
-
23
- @folder_id = folder_id
24
- self
25
- end
26
-
27
- private
28
-
29
- def make_query
30
- jsns = @folder_id.nil? ? nil : { l: @folder_id }
31
- soap_request = SoapElement.mail(SoapMailConstants::GET_CONTACTS_REQUEST).add_attributes(jsns)
32
- @parent.sacc.invoke(soap_request)
11
+ @type = SoapConstants::CONTACT
12
+ @folder_ids = [FolderDefault::CONTACTS.id]
33
13
  end
34
14
  end
35
15
  end
@@ -7,17 +7,16 @@ module Zm
7
7
  EXCLUDE_INSTANCE_VARIABLE_KEYS = %i[@id @name @parent @l @type @tn @jsns_builder].freeze
8
8
 
9
9
  def to_jsns
10
- jsns = {
10
+ {
11
11
  cn: {
12
12
  a: instance_variables_array.map(&Utils::A_NODE_PROC),
13
- l: @item.folder_id || Zm::Client::FolderDefault::CONTACTS[:id],
14
- m: @item.members.all.map do |m|
15
- { type: m.type, value: m.value }
16
- end
13
+ l: @item.folder_id || Zm::Client::FolderDefault::CONTACTS.id,
14
+ m: members_node
17
15
  }
18
16
  }
19
17
 
20
- SoapElement.mail(SoapMailConstants::CREATE_CONTACT_REQUEST).add_attributes(jsns)
18
+ SoapElement.mail(SoapMailConstants::CREATE_CONTACT_REQUEST)
19
+ .add_attributes(jsns)
21
20
  end
22
21
 
23
22
  def to_update
@@ -25,30 +24,36 @@ module Zm
25
24
  cn: {
26
25
  a: instance_variables_array.map(&Utils::A_NODE_PROC),
27
26
  id: @item.id,
28
- m: @item.members.all.reject(&:current?).map do |m|
29
- { type: m.type, value: m.value, op: m.op }
30
- end
27
+ m: members_node
31
28
  }
32
29
  }
33
30
 
34
- SoapElement.mail(SoapMailConstants::MODIFY_CONTACT_REQUEST).add_attributes(jsns)
31
+ SoapElement.mail(SoapMailConstants::MODIFY_CONTACT_REQUEST)
32
+ .add_attributes(jsns)
35
33
  end
36
34
 
37
35
  def to_patch(hash)
38
- jsns = {
36
+ {
39
37
  cn: {
40
38
  id: @item.id,
41
39
  a: hash.map(&Utils::A_ARRAY_PROC).flatten(1).map(&Utils::A_NODE_PROC)
42
40
  }
43
41
  }
44
42
 
45
- SoapElement.mail(SoapMailConstants::MODIFY_CONTACT_REQUEST).add_attributes(jsns)
43
+ SoapElement.mail(SoapMailConstants::MODIFY_CONTACT_REQUEST)
44
+ .add_attributes(jsns)
46
45
  end
47
46
 
48
47
  alias to_create to_jsns
49
48
 
49
+ def members_node
50
+ @item.members.all.reject(&:current?).map do |m|
51
+ { type: m.type, value: m.value, op: m.op }
52
+ end
53
+ end
54
+
50
55
  def instance_variables_array
51
- [[:nickname, @item.name], [:fullName, @item.name], [:fileAs, "8:#{@item.name}"], %i[type group]]
56
+ [[:nickname, @item.name], [:fullname, @item.name], [:fileAs, "8:#{@item.name}"], %i[type group]]
52
57
  end
53
58
  end
54
59
  end
@@ -2,10 +2,14 @@
2
2
 
3
3
  module GroupContact
4
4
  def members
5
- @members ||= Zm::Client::ContactMembersCollection.new(self)
5
+ return @members if defined? @members
6
+
7
+ @members = Zm::Client::ContactMembersCollection.new(self)
6
8
  end
7
9
 
8
10
  def jsns_builder
9
- @jsns_builder ||= Zm::Client::GroupContactJsnsBuilder.new(self)
11
+ return @jsns_builder if defined? @jsns_builder
12
+
13
+ @jsns_builder = Zm::Client::GroupContactJsnsBuilder.new(self)
10
14
  end
11
15
  end
@@ -7,10 +7,14 @@ module Zm
7
7
  include HasSoapAdminConnector
8
8
 
9
9
  def modify!
10
- sac.invoke(jsns_builder.to_update)
10
+ sac.invoke(build_modify)
11
11
  true
12
12
  end
13
13
 
14
+ def build_modify
15
+ jsns_builder.to_update
16
+ end
17
+
14
18
  def update!(hash)
15
19
  return false if hash.delete_if { |k, v| v.nil? || !respond_to?(k) }.empty?
16
20
 
@@ -24,49 +28,69 @@ module Zm
24
28
  end
25
29
 
26
30
  def create!
27
- resp = sac.invoke(jsns_builder.to_create)
31
+ resp = sac.invoke(build_create)
28
32
 
29
33
  @id = resp[:CreateCosResponse][:cos].first[:id]
30
34
  end
31
35
 
36
+ def build_create
37
+ jsns_builder.to_create
38
+ end
39
+
32
40
  def delete!
33
- sac.invoke(jsns_builder.to_delete)
41
+ sac.invoke(build_delete)
42
+ end
43
+
44
+ def build_delete
45
+ jsns_builder.to_delete
34
46
  end
35
47
 
36
48
  def clone!(new_name)
37
- resp = sac.invoke(jsns_builder.to_copy(new_name))
49
+ resp = sac.invoke(build_clone(new_name))
38
50
  resp[:CopyCosResponse][:cos].first[:id]
39
51
  end
40
52
 
53
+ def build_clone(new_name)
54
+ jsns_builder.to_copy(new_name)
55
+ end
56
+
41
57
  def servers
42
- @servers ||= CosServersCollection.new(self)
58
+ return @servers if defined? @servers
59
+
60
+ @servers = CosServersCollection.new(self)
43
61
  end
44
62
 
45
63
  def domains
46
64
  return if @id.nil?
47
65
 
48
- @domains ||= CosDomainsCollection.new(self)
66
+ return @domains if defined? @domains
67
+
68
+ @domains = CosDomainsCollection.new(self)
49
69
  end
50
70
 
51
71
  def accounts
52
72
  return if @id.nil?
53
73
 
54
- @accounts ||= CosAccountsCollection.new(self)
74
+ return @accounts if defined? @accounts
75
+
76
+ @accounts = CosAccountsCollection.new(self)
55
77
  end
56
78
 
57
79
  def attrs_write
58
80
  @parent.zimbra_attributes.all_cos_attrs_writable_names
59
81
  end
60
82
 
83
+ def jsns_builder
84
+ return @jsns_builder if defined? @jsns_builder
85
+
86
+ @jsns_builder = CosJsnsBuilder.new(self)
87
+ end
88
+
61
89
  private
62
90
 
63
91
  def do_update!(hash)
64
92
  sac.invoke(jsns_builder.to_patch(hash))
65
93
  end
66
-
67
- def jsns_builder
68
- @jsns_builder ||= CosJsnsBuilder.new(self)
69
- end
70
94
  end
71
95
  end
72
96
  end
@@ -5,7 +5,7 @@ module Zm
5
5
  # Collection Domains for cos
6
6
  class CosDomainsCollection < DomainsCollection
7
7
  def initialize(parent)
8
- super(parent)
8
+ super
9
9
 
10
10
  @default_ldap_filter = "(zimbraDomainDefaultCOSId=#{@parent.id})"
11
11
  end