zm-ruby-client 0.18.3 → 2.0.2

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 (250) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/Gemfile +2 -2
  4. data/README.md +7 -0
  5. data/lib/zm/client/account/account.rb +31 -319
  6. data/lib/zm/client/account/account_aliases_collection.rb +52 -0
  7. data/lib/zm/client/account/account_dls_membership_collection.rb +4 -1
  8. data/lib/zm/client/account/account_dls_owner_collection.rb +8 -1
  9. data/lib/zm/client/account/account_jsns_builder.rb +77 -0
  10. data/lib/zm/client/account/account_jsns_initializer.rb +9 -24
  11. data/lib/zm/client/account/accounts_builder.rb +0 -1
  12. data/lib/zm/client/account/accounts_collection.rb +32 -8
  13. data/lib/zm/client/account.rb +1 -0
  14. data/lib/zm/client/ace/ace.rb +6 -22
  15. data/lib/zm/client/ace/ace_jsns_builder.rb +15 -16
  16. data/lib/zm/client/ace/ace_jsns_initializer.rb +0 -1
  17. data/lib/zm/client/ace/aces_builder.rb +0 -1
  18. data/lib/zm/client/ace/aces_collection.rb +2 -18
  19. data/lib/zm/client/appointment/appointment.rb +38 -30
  20. data/lib/zm/client/appointment/appointment_jsns_builder.rb +22 -34
  21. data/lib/zm/client/appointment/appointment_jsns_initializer.rb +6 -3
  22. data/lib/zm/client/appointment/appointments_builder.rb +6 -18
  23. data/lib/zm/client/appointment/appointments_collection.rb +25 -4
  24. data/lib/zm/client/backup/backup.rb +4 -32
  25. data/lib/zm/client/backup/backup_jsns_initializer.rb +26 -0
  26. data/lib/zm/client/backup/backups_builder.rb +8 -13
  27. data/lib/zm/client/backup/backups_collection.rb +2 -1
  28. data/lib/zm/client/backup.rb +1 -0
  29. data/lib/zm/client/base/account_search_objects_collection.rb +34 -13
  30. data/lib/zm/client/base/admin_objects_collection.rb +82 -17
  31. data/lib/zm/client/base/base_account_jsns_builder.rb +98 -0
  32. data/lib/zm/client/base/base_jsns_builder.rb +47 -0
  33. data/lib/zm/client/base/base_jsns_initializer.rb +43 -12
  34. data/lib/zm/client/base/ldap_filter.rb +20 -5
  35. data/lib/zm/client/base/mailbox_infos_collection.rb +88 -0
  36. data/lib/zm/client/base/mailbox_object.rb +299 -0
  37. data/lib/zm/client/base/mailbox_prefs_collection.rb +75 -0
  38. data/lib/zm/client/base/object.rb +28 -62
  39. data/lib/zm/client/base/objects_builder.rb +4 -10
  40. data/lib/zm/client/base/objects_collection.rb +13 -10
  41. data/lib/zm/client/base/zimbra_attribute.rb +10 -8
  42. data/lib/zm/client/base/zimbra_attributes_collection.rb +154 -10
  43. data/lib/zm/client/base.rb +5 -5
  44. data/lib/zm/client/cluster/cluster.rb +43 -39
  45. data/lib/zm/client/cluster/cluster_config.rb +5 -5
  46. data/lib/zm/client/common/recipients.rb +3 -3
  47. data/lib/zm/client/common/token_metadata.rb +4 -1
  48. data/lib/zm/client/common/utils.rb +57 -0
  49. data/lib/zm/client/common.rb +2 -1
  50. data/lib/zm/client/connector/rest_account.rb +14 -4
  51. data/lib/zm/client/connector/soap_account.rb +38 -441
  52. data/lib/zm/client/connector/soap_admin.rb +16 -552
  53. data/lib/zm/client/connector/soap_base.rb +25 -5
  54. data/lib/zm/client/connector/soap_error.rb +1 -3
  55. data/lib/zm/client/constant.rb +21 -11
  56. data/lib/zm/client/contact/contact.rb +42 -83
  57. data/lib/zm/client/contact/contact_jsns_builder.rb +60 -0
  58. data/lib/zm/client/contact/contact_jsns_initializer.rb +78 -0
  59. data/lib/zm/client/contact/contact_member.rb +29 -28
  60. data/lib/zm/client/contact/contact_members_collection.rb +44 -0
  61. data/lib/zm/client/contact/contacts_builder.rb +8 -1
  62. data/lib/zm/client/contact/contacts_collection.rb +17 -1
  63. data/lib/zm/client/contact/group_contact_jsns_builder.rb +51 -0
  64. data/lib/zm/client/contact/mod_group_contact.rb +4 -67
  65. data/lib/zm/client/contact.rb +5 -1
  66. data/lib/zm/client/cos/cos.rb +35 -40
  67. data/lib/zm/client/cos/cos_accounts_collection.rb +19 -0
  68. data/lib/zm/client/cos/cos_domains_collection.rb +20 -0
  69. data/lib/zm/client/cos/cos_jsns_builder.rb +72 -0
  70. data/lib/zm/client/cos/cos_jsns_initializer.rb +29 -0
  71. data/lib/zm/client/cos/cos_servers_collection.rb +60 -0
  72. data/lib/zm/client/cos/coses_builder.rb +8 -1
  73. data/lib/zm/client/cos/coses_collection.rb +8 -5
  74. data/lib/zm/client/cos.rb +5 -0
  75. data/lib/zm/client/datasource/datasource.rb +69 -0
  76. data/lib/zm/client/datasource/datasource_jsns_builder.rb +32 -0
  77. data/lib/zm/client/datasource/datasource_jsns_initializer.rb +27 -0
  78. data/lib/zm/client/datasource/datasources_builder.rb +29 -0
  79. data/lib/zm/client/datasource/datasources_collection.rb +21 -0
  80. data/lib/zm/client/datasource.rb +7 -0
  81. data/lib/zm/client/distributionlist/distributionlist.rb +52 -118
  82. data/lib/zm/client/distributionlist/distributionlist_aces_collection.rb +31 -0
  83. data/lib/zm/client/distributionlist/distributionlist_aliases_collection.rb +53 -0
  84. data/lib/zm/client/distributionlist/distributionlist_jsns_builder.rb +82 -0
  85. data/lib/zm/client/distributionlist/distributionlist_jsns_initializer.rb +32 -0
  86. data/lib/zm/client/distributionlist/distributionlist_members_collection.rb +47 -0
  87. data/lib/zm/client/distributionlist/distributionlist_owners_collection.rb +52 -0
  88. data/lib/zm/client/distributionlist/distributionlists_builder.rb +8 -1
  89. data/lib/zm/client/distributionlist/distributionlists_collection.rb +8 -9
  90. data/lib/zm/client/distributionlist/dls_membership_collection.rb +4 -1
  91. data/lib/zm/client/distributionlist.rb +2 -0
  92. data/lib/zm/client/document/document.rb +27 -24
  93. data/lib/zm/client/document/document_jsns_builder.rb +18 -0
  94. data/lib/zm/client/document/document_jsns_initializer.rb +44 -0
  95. data/lib/zm/client/document/documents_builder.rb +6 -16
  96. data/lib/zm/client/document/documents_collection.rb +17 -67
  97. data/lib/zm/client/document.rb +2 -0
  98. data/lib/zm/client/domain/domain.rb +45 -68
  99. data/lib/zm/client/domain/domain_accounts_collection.rb +1 -1
  100. data/lib/zm/client/domain/domain_distributionlists_collection.rb +13 -0
  101. data/lib/zm/client/domain/domain_jsns_builder.rb +69 -0
  102. data/lib/zm/client/domain/domain_jsns_initializer.rb +25 -0
  103. data/lib/zm/client/domain/domain_resources_collection.rb +13 -0
  104. data/lib/zm/client/domain/domains_builder.rb +8 -1
  105. data/lib/zm/client/domain/domains_collection.rb +7 -7
  106. data/lib/zm/client/domain.rb +4 -0
  107. data/lib/zm/client/filter_rule.rb +7 -0
  108. data/lib/zm/client/filter_rules/filter_rule.rb +10 -0
  109. data/lib/zm/client/filter_rules/filter_rule_jsns_initializer.rb +24 -0
  110. data/lib/zm/client/filter_rules/filter_rules_builder.rb +21 -0
  111. data/lib/zm/client/filter_rules/filter_rules_collection.rb +21 -0
  112. data/lib/zm/client/filter_rules/outgoing_filter_rules_collection.rb +15 -0
  113. data/lib/zm/client/folder/folder.rb +77 -61
  114. data/lib/zm/client/folder/folder_grant.rb +34 -14
  115. data/lib/zm/client/folder/folder_grant_jsns_builder.rb +15 -4
  116. data/lib/zm/client/folder/folder_grants_collection.rb +36 -2
  117. data/lib/zm/client/folder/folder_jsns_builder.rb +22 -48
  118. data/lib/zm/client/folder/folder_jsns_initializer.rb +34 -17
  119. data/lib/zm/client/folder/folder_retention_policies_collection.rb +2 -3
  120. data/lib/zm/client/folder/folder_retention_policy.rb +0 -1
  121. data/lib/zm/client/folder/folders_builder.rb +7 -10
  122. data/lib/zm/client/folder/folders_collection.rb +5 -2
  123. data/lib/zm/client/folder/folders_jsns_builder.rb +3 -1
  124. data/lib/zm/client/folder/mod_document_folder.rb +10 -6
  125. data/lib/zm/client/folder.rb +1 -1
  126. data/lib/zm/client/identity/identities_builder.rb +8 -1
  127. data/lib/zm/client/identity/identities_collection.rb +2 -1
  128. data/lib/zm/client/identity/identity.rb +34 -42
  129. data/lib/zm/client/identity/identity_jsns_builder.rb +57 -0
  130. data/lib/zm/client/identity/identity_jsns_initializer.rb +29 -0
  131. data/lib/zm/client/identity.rb +3 -1
  132. data/lib/zm/client/license/license.rb +9 -22
  133. data/lib/zm/client/license/license_jsns_initializer.rb +20 -0
  134. data/lib/zm/client/license/licenses_collection.rb +3 -13
  135. data/lib/zm/client/license.rb +2 -1
  136. data/lib/zm/client/message/attachments_collection.rb +55 -0
  137. data/lib/zm/client/message/message.rb +36 -264
  138. data/lib/zm/client/message/message_flags.rb +107 -0
  139. data/lib/zm/client/message/message_jsns_builder.rb +85 -0
  140. data/lib/zm/client/message/message_jsns_initializer.rb +71 -0
  141. data/lib/zm/client/message/message_recipients.rb +59 -0
  142. data/lib/zm/client/message/messages_builder.rb +7 -18
  143. data/lib/zm/client/message/messages_collection.rb +17 -2
  144. data/lib/zm/client/message.rb +5 -0
  145. data/lib/zm/client/mountpoint/mountpoint.rb +43 -21
  146. data/lib/zm/client/mountpoint/mountpoint_jsns_builder.rb +8 -53
  147. data/lib/zm/client/mountpoint/mountpoint_jsns_initializer.rb +22 -13
  148. data/lib/zm/client/mountpoint/mountpoints_builder.rb +4 -5
  149. data/lib/zm/client/mountpoint/mountpoints_collection.rb +1 -2
  150. data/lib/zm/client/mta_queue/mta_queue.rb +13 -28
  151. data/lib/zm/client/mta_queue/mta_queue_jsns_builder.rb +41 -0
  152. data/lib/zm/client/mta_queue/mta_queue_jsns_initializer.rb +23 -0
  153. data/lib/zm/client/mta_queue/mta_queues_builder.rb +4 -8
  154. data/lib/zm/client/mta_queue/mta_queues_collection.rb +8 -27
  155. data/lib/zm/client/mta_queue.rb +2 -0
  156. data/lib/zm/client/mta_queue_item/mta_queue_item.rb +4 -31
  157. data/lib/zm/client/mta_queue_item/mta_queue_item_jsns_initializer.rb +33 -0
  158. data/lib/zm/client/mta_queue_item/mta_queue_items_builder.rb +4 -9
  159. data/lib/zm/client/mta_queue_item/mta_queue_items_collection.rb +7 -42
  160. data/lib/zm/client/mta_queue_item.rb +2 -1
  161. data/lib/zm/client/resource/resource.rb +24 -91
  162. data/lib/zm/client/resource/resource_jsns_builder.rb +79 -0
  163. data/lib/zm/client/resource/resource_jsns_initializer.rb +29 -0
  164. data/lib/zm/client/resource/resources_builder.rb +8 -1
  165. data/lib/zm/client/resource/resources_collection.rb +9 -7
  166. data/lib/zm/client/resource.rb +2 -0
  167. data/lib/zm/client/search_folder/search_folder.rb +38 -16
  168. data/lib/zm/client/search_folder/search_folder_jsns_builder.rb +38 -19
  169. data/lib/zm/client/search_folder/search_folder_jsns_initializer.rb +17 -13
  170. data/lib/zm/client/search_folder/search_folders_builder.rb +0 -1
  171. data/lib/zm/client/search_folder/search_folders_collection.rb +2 -1
  172. data/lib/zm/client/server/server.rb +16 -488
  173. data/lib/zm/client/server/server_jsns_initializer.rb +16 -0
  174. data/lib/zm/client/server/servers_builder.rb +8 -1
  175. data/lib/zm/client/server/servers_collection.rb +13 -5
  176. data/lib/zm/client/server.rb +1 -0
  177. data/lib/zm/client/share/share.rb +5 -43
  178. data/lib/zm/client/share/share_jsns_initializer.rb +32 -0
  179. data/lib/zm/client/share/share_mountpoints_collection.rb +38 -0
  180. data/lib/zm/client/share/shares_builder.rb +8 -1
  181. data/lib/zm/client/share/shares_collection.rb +11 -16
  182. data/lib/zm/client/share.rb +2 -0
  183. data/lib/zm/client/signature/signature.rb +25 -29
  184. data/lib/zm/client/signature/signature_jsns_builder.rb +31 -13
  185. data/lib/zm/client/signature/signature_jsns_initializer.rb +16 -12
  186. data/lib/zm/client/signature/signatures_builder.rb +1 -2
  187. data/lib/zm/client/signature/signatures_collection.rb +2 -1
  188. data/lib/zm/client/signature.rb +1 -1
  189. data/lib/zm/client/soap_request/account_soap_constants.rb +76 -0
  190. data/lib/zm/client/soap_request/admin_soap_constants.rb +214 -0
  191. data/lib/zm/client/soap_request/mail_soap_constants.rb +162 -0
  192. data/lib/zm/client/soap_request/soap_constants.rb +55 -0
  193. data/lib/zm/client/soap_request/soap_context.rb +38 -0
  194. data/lib/zm/client/soap_request/soap_element.rb +90 -0
  195. data/lib/zm/client/soap_request.rb +8 -0
  196. data/lib/zm/client/tag/account_object_tags_collection.rb +65 -0
  197. data/lib/zm/client/tag/tag.rb +34 -22
  198. data/lib/zm/client/tag/tag_jsns_builder.rb +14 -35
  199. data/lib/zm/client/tag/tag_jsns_initializer.rb +4 -6
  200. data/lib/zm/client/tag/tags_builder.rb +0 -1
  201. data/lib/zm/client/tag/tags_collection.rb +2 -1
  202. data/lib/zm/client/tag.rb +1 -0
  203. data/lib/zm/client/task/task.rb +18 -49
  204. data/lib/zm/client/task/task_jsns_initializer.rb +45 -0
  205. data/lib/zm/client/task/tasks_builder.rb +6 -16
  206. data/lib/zm/client/task/tasks_collection.rb +29 -0
  207. data/lib/zm/client/task.rb +1 -0
  208. data/lib/zm/client/upload/upload.rb +26 -30
  209. data/lib/zm/client/version.rb +3 -3
  210. data/lib/zm/client.rb +4 -1
  211. data/lib/zm/modules/base.rb +10 -0
  212. data/lib/zm/modules/belongs_to_folder.rb +37 -0
  213. data/lib/zm/modules/belongs_to_tag.rb +11 -0
  214. data/lib/zm/modules/common/zimbra-attrs.json +33 -1
  215. data/lib/zm/modules/has_soap_admin_connector.rb +12 -0
  216. data/lib/zm/modules/inspector.rb +24 -0
  217. data/lib/zm/modules/missing_method_static_collection.rb +13 -0
  218. data/lib/zm/modules/zm_logger.rb +3 -1
  219. data/lib/zm/modules/zm_model.rb +4 -2
  220. data/lib/zm/utils/thread_pool.rb +4 -2
  221. data/lib/zm-ruby-client.rb +2 -0
  222. data/zm-ruby-client.gemspec +12 -9
  223. metadata +93 -34
  224. data/lib/zm/client/base/account_object.rb +0 -51
  225. data/lib/zm/client/base/admin_object.rb +0 -51
  226. data/lib/zm/client/base/folder_object.rb +0 -41
  227. data/lib/zm/client/config.rb +0 -12
  228. data/lib/zm/client/data_source.rb +0 -5
  229. data/lib/zm/modules/common/account_common.rb +0 -71
  230. data/lib/zm/modules/common/cos_common.rb +0 -463
  231. data/lib/zm/modules/common/dl_common.rb +0 -38
  232. data/lib/zm/modules/common/identity_common.rb +0 -19
  233. data/lib/zm/modules/common/resource_common.rb +0 -59
  234. data/lib/zm/modules/common/signature_common.rb +0 -16
  235. data/lib/zm/modules/common/zimbra-attrs.json.bak +0 -1
  236. data/test/accounts.rb +0 -89
  237. data/test/ace.rb +0 -50
  238. data/test/cluster.rb +0 -41
  239. data/test/cluster_config.rb +0 -30
  240. data/test/cluster_zimbra_attributes.rb +0 -38
  241. data/test/coses.rb +0 -26
  242. data/test/domains.rb +0 -70
  243. data/test/folder.rb +0 -125
  244. data/test/folder_grant.rb +0 -51
  245. data/test/mountpoint.rb +0 -49
  246. data/test/retention_policies.rb +0 -40
  247. data/test/search_folder.rb +0 -67
  248. data/test/signature.rb +0 -53
  249. data/test/tag.rb +0 -65
  250. data/test/zimbra_attributes.rb +0 -35
@@ -4,22 +4,17 @@ module Zm
4
4
  module Client
5
5
  # class factory [Backup]
6
6
  class BackupsBuilder < Base::ObjectsBuilder
7
- def make
8
- records = []
9
- return records if json_items.nil?
10
-
11
- json_items.each do |entry|
12
- backup = Backup.new(@parent)
13
- backup.init_from_json(entry)
14
- records << backup
15
- end
16
- records
7
+ def initialize(parent, json)
8
+ super(parent, json)
9
+ @json_item_key = :backup
17
10
  end
18
11
 
19
- private
12
+ def make
13
+ return [] if json_items.nil?
20
14
 
21
- def json_items
22
- @json_items ||= @json[:Body][json_key][:backup]
15
+ json_items.map do |entry|
16
+ BackupJsnsInitializer.create(@parent, entry)
17
+ end
23
18
  end
24
19
  end
25
20
  end
@@ -11,7 +11,8 @@ module Zm
11
11
  private
12
12
 
13
13
  def make_query
14
- sac.backup_query(@parent.id)
14
+ soap_request = SoapElement.admin(SoapAdminConstants::BACKUP_QUERY_REQUEST).add_attribute(SoapConstants::QUERY, {})
15
+ sac.target_invoke(soap_request, @parent.id)
15
16
  end
16
17
 
17
18
  def build_response
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'zm/client/backup/backup'
4
+ require 'zm/client/backup/backup_jsns_initializer'
4
5
  require 'zm/client/backup/backups_builder'
5
6
  require 'zm/client/backup/backups_collection'
@@ -14,12 +14,13 @@ module Zm
14
14
  end
15
15
 
16
16
  def find(id)
17
- rep = @parent.sacc.get_msg(@parent.token, id, { html: 1 })
18
- entry = rep[:Body][:GetMsgResponse][:m].first
17
+ jsns = { m: { id: id, html: 1 } }
19
18
 
20
- msg = @child_class.new(@parent)
21
- msg.init_from_json(entry)
22
- msg
19
+ soap_request = SoapElement.mail(SoapMailConstants::GET_MSG_REQUEST).add_attributes(jsns)
20
+ rep = @parent.sacc.invoke(soap_request)
21
+ entry = rep[:GetMsgResponse][:m].first
22
+
23
+ MessageJsnsInitializer.create(@parent, entry)
23
24
  end
24
25
 
25
26
  def start_at(start_at)
@@ -32,13 +33,18 @@ module Zm
32
33
  self
33
34
  end
34
35
 
35
- def folders(folders)
36
+ def folders(*folders)
37
+ folders.select! { |folder| folder.is_a?(Zm::Client::Folder) }
38
+ return self if folders.empty?
39
+
36
40
  @folders = folders
37
- @folder_ids = @folders.map(&:id)
38
- self
41
+ folder_ids(*@folders.map(&:id))
39
42
  end
40
43
 
41
- def folder_ids(folder_ids)
44
+ def folder_ids(*folder_ids)
45
+ folder_ids.uniq!
46
+ return self if @folder_ids == folder_ids
47
+
42
48
  @folder_ids = folder_ids
43
49
  self
44
50
  end
@@ -68,7 +74,21 @@ module Zm
68
74
  private
69
75
 
70
76
  def make_query
71
- @parent.sacc.search(@parent.token, @type, @offset, @limit, @sort_by, query, build_options)
77
+ jsns = {
78
+ types: @type,
79
+ offset: @offset,
80
+ limit: @limit,
81
+ sortBy: @sort_by,
82
+ query: query,
83
+ header: @headers
84
+ }
85
+
86
+ jsns.merge!(build_options)
87
+
88
+ jsns.reject! { |_, v| v.nil? }
89
+
90
+ soap_request = SoapElement.mail(SoapMailConstants::SEARCH_REQUEST).add_attributes(jsns)
91
+ @parent.sacc.invoke(soap_request)
72
92
  end
73
93
 
74
94
  def search_builder
@@ -77,7 +97,7 @@ module Zm
77
97
 
78
98
  def search_response
79
99
  rep = make_query
80
- @more = rep[:Body][:SearchResponse][:more]
100
+ @more = rep[:SearchResponse][:more]
81
101
  rep
82
102
  end
83
103
 
@@ -96,7 +116,7 @@ module Zm
96
116
 
97
117
  return nil if @folder_ids.empty?
98
118
 
99
- @folder_ids.map { |id| %Q{inid:"#{id}"} }.join(' OR ')
119
+ @folder_ids.map { |id| %(inid:"#{id}") }.join(' OR ')
100
120
  end
101
121
 
102
122
  def build_options
@@ -106,7 +126,7 @@ module Zm
106
126
  {
107
127
  resultMode: @resultMode,
108
128
  calExpandInstStart: start_at_ts,
109
- calExpandInstEnd: end_at_ts,
129
+ calExpandInstEnd: end_at_ts
110
130
  }.delete_if { |_, v| v.nil? }
111
131
  end
112
132
 
@@ -118,6 +138,7 @@ module Zm
118
138
  @query = nil
119
139
  @folder_ids = []
120
140
  @folders = []
141
+ @headers = [{ n: 'messageIdHeader' }]
121
142
  end
122
143
  end
123
144
  end
@@ -7,22 +7,42 @@ module Zm
7
7
  class AdminObjectsCollection < ObjectsCollection
8
8
  def initialize(parent)
9
9
  @parent = parent
10
+ @persistent = false
10
11
  reset_query_params
11
12
  end
12
13
 
14
+ def find_by(hash)
15
+ item = find_in_cache(hash)
16
+ return item unless item.nil?
17
+
18
+ find_by!(hash)
19
+ end
20
+
21
+ def find_by_or_nil(hash, error_handler = SoapError)
22
+ find_by(hash)
23
+ rescue error_handler => _e
24
+ nil
25
+ end
26
+
13
27
  def ldap
14
- @apply_cos = 0
28
+ @all = nil
29
+ @apply_cos = SoapUtils::OFF
15
30
  self
16
31
  end
17
32
 
18
33
  def where(ldap_query)
19
- @all = nil
20
- ldap_filter.add(ldap_query)
34
+ @all = nil if ldap_filter.add(ldap_query)
21
35
 
22
36
  self
23
37
  end
24
38
 
25
39
  def attrs(*attrs)
40
+ attrs.map!(&:to_s)
41
+ attrs.map!(&:strip)
42
+ attrs.sort!
43
+ attrs.uniq!
44
+ attrs.delete_if { |attr| attr.nil? || attr.empty? }
45
+
26
46
  return self if @attrs == attrs
27
47
 
28
48
  @all = nil
@@ -31,33 +51,78 @@ module Zm
31
51
  end
32
52
 
33
53
  def count
54
+ reset_query_params
34
55
  @count_only = SoapUtils::ON
35
- make_query[:Body][:SearchDirectoryResponse][:num]
56
+ json = make_query
57
+ @count_only = SoapUtils::OFF
58
+ json[:SearchDirectoryResponse][:num]
59
+ end
60
+
61
+ def clear
62
+ @all = nil
63
+ ldap_filter.clear
64
+ reset_query_params
65
+ self
66
+ end
67
+
68
+ def find_each(step = 1_000)
69
+ previous_persistent = @persistent.dup
70
+ @persistent = true
71
+
72
+ total = count
73
+
74
+ @all = []
75
+ @offset = 0
76
+ @limit = step
77
+
78
+ while @offset < total
79
+ @all += build_response
80
+ @offset += @limit
81
+ end
82
+
83
+ ldap_filter.clear
84
+ reset_query_params
85
+
86
+ @persistent = previous_persistent
87
+
88
+ @all
36
89
  end
37
90
 
38
91
  private
39
92
 
40
93
  def make_query
41
- json = sac.search_directory(
42
- ldap_filter.join, @max_result, @limit, @offset,
43
- @domain_name, @apply_cos, @apply_config, @sort_by, @search_type,
44
- @sort_ascending, @count_only, attrs_comma
45
- )
46
- reset_query_params
47
- json
94
+ soap_request = SoapElement.admin(SoapAdminConstants::SEARCH_DIRECTORY_REQUEST)
95
+ soap_request.add_attributes(jsns)
96
+ response = sac.invoke(soap_request)
97
+ clear unless @persistent
98
+ response
48
99
  end
49
100
 
50
101
  def ldap_filter
51
102
  @ldap_filter ||= LdapFilter.new
52
103
  end
53
104
 
54
- # def build_response
55
- # @builder_class.new(@parent, make_query).make
56
- # end
105
+ def find_in_cache(hash)
106
+ return nil if @all.nil?
57
107
 
58
- def reset_query_params
59
- super
60
- ldap_filter.clear
108
+ @all.find { |item| item.send(hash.keys.first) == hash.values.first }
109
+ end
110
+
111
+ def jsns
112
+ {
113
+ query: ldap_filter.join,
114
+ maxResults: @max_result,
115
+ limit: @limit,
116
+ offset: @offset,
117
+ domain: @domain_name,
118
+ applyCos: @apply_cos,
119
+ applyConfig: @apply_config,
120
+ sortBy: @sort_by,
121
+ types: @search_type,
122
+ sortAscending: @sort_ascending,
123
+ countOnly: @count_only,
124
+ attrs: attrs_comma
125
+ }.reject { |_, v| v.nil? }
61
126
  end
62
127
  end
63
128
  end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ # class for account tag jsns builder
6
+ class BaseAccountJsnsBuilder
7
+ def initialize(item)
8
+ @item = item
9
+ end
10
+
11
+ def to_tag(tag_name = nil)
12
+ tag_name ||= @item.tn
13
+
14
+ attrs = {
15
+ op: :tag,
16
+ id: @item.id,
17
+ tn: tag_name
18
+ }
19
+
20
+ build(attrs)
21
+ end
22
+
23
+ def to_move(new_folder_id = nil)
24
+ new_folder_id ||= @item.l
25
+
26
+ attrs = {
27
+ op: :move,
28
+ id: @item.id,
29
+ l: new_folder_id
30
+ }
31
+
32
+ build(attrs)
33
+ end
34
+
35
+ def to_patch(hash)
36
+ attrs = {
37
+ op: :update,
38
+ id: @item.id
39
+ }.merge(hash)
40
+
41
+ attrs.reject! { |_, v| v.nil? }
42
+
43
+ build(attrs)
44
+ end
45
+
46
+ def to_delete
47
+ attrs = {
48
+ op: :delete,
49
+ id: @item.id
50
+ }
51
+
52
+ build(attrs)
53
+ end
54
+
55
+ def to_rename(new_name = nil)
56
+ new_name ||= @item.name
57
+
58
+ attrs = {
59
+ op: :rename,
60
+ id: @item.id,
61
+ name: new_name
62
+ }
63
+
64
+ build(attrs)
65
+ end
66
+
67
+ def to_color
68
+ attrs = {
69
+ op: :color,
70
+ id: @item.id,
71
+ rgb: @item.rgb,
72
+ color: @item.color
73
+ }
74
+
75
+ # attrs[:rgb] = @item.rgb if @item.rgb_changed?
76
+ # attrs[:color] = @item.color if @item.color_changed?
77
+
78
+ build(attrs)
79
+ end
80
+
81
+ def to_trash
82
+ attrs = {
83
+ op: :trash,
84
+ id: @item.id
85
+ }
86
+
87
+ build(attrs)
88
+ end
89
+
90
+ def build(attrs)
91
+ soap_request = SoapElement.mail(SoapMailConstants::ITEM_ACTION_REQUEST)
92
+ node_action = SoapElement.create(SoapConstants::ACTION).add_attributes(attrs)
93
+ soap_request.add_node(node_action)
94
+ soap_request
95
+ end
96
+ end
97
+ end
98
+ end
@@ -5,14 +5,61 @@ module Zm
5
5
  module Base
6
6
  # class for account object jsns builder
7
7
  class BaseJsnsBuilder
8
+ A_ARRAY_PROC = ->(i) { i.last.is_a?(Array) ? i.last.map { |j| [i.first, j] } : [i] }
9
+ A_NODE_PROC = ->(n) { { n: n.first, _content: n.last } }
8
10
 
9
11
  def initialize(item)
10
12
  @item = item
11
13
  end
12
14
 
15
+ def to_jsns
16
+ {
17
+ name: @item.name,
18
+ a: instance_variables_array.map(&A_ARRAY_PROC).flatten(1).map(&A_NODE_PROC)
19
+ }
20
+ end
21
+
22
+ alias to_create to_jsns
23
+
24
+ def to_update
25
+ {
26
+ id: @item.id,
27
+ a: instance_variables_array.map(&A_ARRAY_PROC).flatten(1).map(&A_NODE_PROC)
28
+ }
29
+ end
30
+
31
+ def to_patch(hash)
32
+ {
33
+ id: @item.id,
34
+ a: hash.map(&A_ARRAY_PROC).flatten(1).map(&A_NODE_PROC)
35
+ }
36
+ end
37
+
13
38
  def to_delete
14
39
  { id: @item.id }
15
40
  end
41
+
42
+ def instance_variables_array
43
+ selected_attrs = @item.attrs_write.map { |a| arrow_name(a).to_sym }
44
+ attrs_only_set = @item.instance_variables & selected_attrs
45
+
46
+ arr = attrs_only_set.map do |name|
47
+ n = name.to_s[1..]
48
+ value = @item.instance_variable_get(name)
49
+ [n, value]
50
+ end
51
+
52
+ multi_value = arr.select { |a| a.last.is_a?(Array) }
53
+ arr.reject! { |a| a.last.is_a?(Array) || a.last.nil? }
54
+ multi_value.each { |a| arr += a.last.map { |v| [a.first, v] } }
55
+ arr
56
+ end
57
+
58
+ def arrow_name(name)
59
+ return name if name.to_s.start_with?('@')
60
+
61
+ "@#{name}"
62
+ end
16
63
  end
17
64
  end
18
65
  end
@@ -5,23 +5,54 @@ module Zm
5
5
  module Base
6
6
  # class for account object jsns initializer
7
7
  class BaseJsnsInitializer
8
+ class << self
9
+ def update(item, json)
10
+ item.id = json[:id]
11
+ item.name = json[:name]
8
12
 
9
- def initialize(parent, json)
10
- @parent = parent
11
- @json = json
12
- end
13
+ formatted_json(json).each do |k, v|
14
+ valorise(item, k, v)
15
+ end
13
16
 
14
- def create
15
- @item ||= @child_class.new(@parent)
17
+ item
18
+ end
16
19
 
17
- @item.instance_variable_set(:@id, @json[:id])
18
- @item.instance_variable_set(:@name, @json[:name])
19
- end
20
+ def formatted_json(json)
21
+ return [] if json[:a].nil?
22
+
23
+ json[:a].reject! { |n| n[:n].nil? }
24
+ json_map = json[:a].map { |n| [n[:n], n[:_content]] }.freeze
25
+
26
+ hash_multivalued = json_map.each_with_object({}) do |(k, v), h|
27
+ h[k] ||= []
28
+ h[k].push(v)
29
+ end
30
+
31
+ hash_multivalued.transform_values do |v|
32
+ v.length == 1 ? v.first : v
33
+ end
34
+ end
35
+
36
+ def valorise(item, k, v)
37
+ setter_method_name = "#{k}="
38
+ return unless item.respond_to?(setter_method_name)
39
+
40
+ item.send(setter_method_name, convert_json_string_value(v))
41
+ end
42
+
43
+ def convert_json_string_value(value)
44
+ return value unless value.is_a?(String)
45
+ return 0 if value == '0'
20
46
 
21
- def arrow_name(name)
22
- return name if name.to_s.start_with?('@')
47
+ c = value.to_i
48
+ c.to_s == value ? c : value
49
+ end
23
50
 
24
- "@#{name}"
51
+ # def arrow_name(name)
52
+ # return name if name.to_s.start_with?('@')
53
+ #
54
+ # "@#{name}"
55
+ # end
25
56
  end
26
57
  end
27
58
  end
@@ -3,17 +3,19 @@
3
3
  module Zm
4
4
  module Client
5
5
  class LdapFilter
6
+ include Zm::Inspector
7
+
6
8
  def initialize(base_filter = nil)
7
9
  @base_filter = base_filter
8
10
  @parts = []
9
11
  end
10
12
 
11
13
  def add(filter)
12
- if filter.is_a?(String) && !filter.empty?
13
- @parts << filter
14
- elsif filter.is_a?(Hash)
15
- @parts += filter.map { |k, v| "(#{k}=#{v})" }
16
- end
14
+ new_filter = stringify_filter(filter)
15
+ return false if new_filter.nil? || @parts.include?(new_filter)
16
+
17
+ @parts << new_filter
18
+ true
17
19
  end
18
20
 
19
21
  def clear
@@ -28,6 +30,19 @@ module Zm
28
30
 
29
31
  "(&#{arr.join})"
30
32
  end
33
+
34
+ private
35
+
36
+ def stringify_filter(filter)
37
+ return nil if !filter.is_a?(String) && !filter.is_a?(Hash)
38
+
39
+ return filter.map { |k, v| "(#{k}=#{v})" }.join if filter.is_a?(Hash)
40
+
41
+ new_filter = filter.strip
42
+ return nil if new_filter.empty?
43
+
44
+ new_filter
45
+ end
31
46
  end
32
47
  end
33
48
  end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ class MailboxInfosCollection
6
+ def initialize(parent)
7
+ @parent = parent
8
+ @sections = []
9
+ @rights = []
10
+ end
11
+
12
+ def all
13
+ @all || all!
14
+ end
15
+
16
+ def all!
17
+ build_response
18
+ end
19
+
20
+ def clear
21
+ reset_query_params
22
+ @all.clear
23
+ end
24
+
25
+ def sections(*entries)
26
+ @sections += entries
27
+ self
28
+ end
29
+
30
+ def rights(*entries)
31
+ @rights += entries
32
+ self
33
+ end
34
+
35
+ def read
36
+ reset_query_params
37
+ @sections = ['mbox']
38
+ rep = build_response
39
+ @parent.id = rep[:id]
40
+ @parent.used = rep[:used]
41
+ @parent.public_url = rep[:publicURL]
42
+ @parent.zimbraCOSId = rep[:cos][:id]
43
+ @parent.home_url = rep[:rest]
44
+ rep
45
+ end
46
+
47
+ def zimbraMailHost
48
+ @zimbraMailHost || zimbraMailHost!
49
+ end
50
+
51
+ def zimbraMailHost!
52
+ return if @parent.name.nil? && @parent.id.nil?
53
+
54
+ soap_request = SoapElement.account(SoapAccountConstants::GET_ACCOUNT_INFO_REQUEST)
55
+
56
+ if @parent.id
57
+ node_entry = SoapElement.create(SoapConstants::ACCOUNT).add_attribute(SoapConstants::BY, SoapConstants::ID).add_content(@parent.id)
58
+ else
59
+ node_entry = SoapElement.create(SoapConstants::ACCOUNT).add_attribute(SoapConstants::BY, SoapConstants::NAME).add_content(@parent.name)
60
+ end
61
+
62
+ soap_request.add_node(node_entry)
63
+
64
+ @zimbraMailHost = @parent.sacc.invoke(soap_request).dig(:GetAccountInfoResponse, :_attrs, :zimbraMailHost)
65
+ end
66
+
67
+ private
68
+
69
+ def build_response
70
+ @all = make_query[:GetInfoResponse]
71
+ end
72
+
73
+ def make_query
74
+ soap_request = SoapElement.account(SoapAccountConstants::GET_INFO_REQUEST).add_attributes(jsns)
75
+ @parent.sacc.invoke(soap_request)
76
+ end
77
+
78
+ def jsns
79
+ { rights: @rights.join(','), sections: @sections.join(',') }.reject { |_, v| v.empty? }
80
+ end
81
+
82
+ def reset_query_params
83
+ @sections.clear
84
+ @rights.clear
85
+ end
86
+ end
87
+ end
88
+ end