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
@@ -6,9 +6,9 @@ module Zm
6
6
  DOUBLEPOINT = ' :: '
7
7
 
8
8
  module Regex
9
- UUID_REGEX = %r{[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 = %r{^uid=}
11
- SHARED_CONTACT = %r{[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]+}
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
12
12
  end
13
13
 
14
14
  module FolderDefault
@@ -83,7 +83,7 @@ module Zm
83
83
  COS = :coses
84
84
 
85
85
  module Attributes
86
- ACCOUNT = %i[
86
+ ACCOUNT = %w[
87
87
  displayName
88
88
  zimbraId
89
89
  cn
@@ -102,7 +102,7 @@ module Zm
102
102
  zimbraIsExternalVirtualAccount
103
103
  ].freeze
104
104
 
105
- DL = %i[
105
+ DL = %w[
106
106
  displayName
107
107
  zimbraId
108
108
  zimbraMailHost
@@ -112,7 +112,7 @@ module Zm
112
112
  zimbraMailAlias
113
113
  ].freeze
114
114
 
115
- ALIAS = %i[
115
+ ALIAS = %w[
116
116
  zimbraAliasTargetId
117
117
  zimbraId
118
118
  targetName
@@ -126,7 +126,7 @@ module Zm
126
126
  zimbraIsExternalVirtualAccount
127
127
  ].freeze
128
128
 
129
- RESOURCE = %i[
129
+ RESOURCE = %w[
130
130
  displayName
131
131
  zimbraId
132
132
  zimbraMailHost
@@ -141,7 +141,7 @@ module Zm
141
141
  zimbraIsExternalVirtualAccount
142
142
  ].freeze
143
143
 
144
- DOMAIN = %i[
144
+ DOMAIN = %w[
145
145
  description
146
146
  zimbraDomainName
147
147
  zimbraDomainStatus
@@ -150,7 +150,7 @@ module Zm
150
150
  zimbraDomainDefaultCOSId
151
151
  ].freeze
152
152
 
153
- COS = %i[
153
+ COS = %w[
154
154
  cn
155
155
  description
156
156
  zimbraMailHostPool
@@ -186,7 +186,7 @@ module Zm
186
186
  CORRUPT = 'corrupt'
187
187
  ACTIVE = 'active'
188
188
  HOLD = 'hold'
189
- ALL = [INCOMING, DEFERRED, CORRUPT, ACTIVE, HOLD]
189
+ ALL = [INCOMING, DEFERRED, CORRUPT, ACTIVE, HOLD].freeze
190
190
  end
191
191
 
192
192
  module MtaQueueAction
@@ -211,7 +211,17 @@ module Zm
211
211
  SERVER = 'server'
212
212
  RESOURCE = 'calresource'
213
213
  INTERNAL_USER_ACCOUNT = 'internalUserAccount'
214
- ALL = [USER_ACCOUNT, ACCOUNT, ALIAS, DL, DOMAIN, COS, SERVER, RESOURCE, INTERNAL_USER_ACCOUNT]
214
+ ALL = [USER_ACCOUNT, ACCOUNT, ALIAS, DL, DOMAIN, COS, SERVER, RESOURCE, INTERNAL_USER_ACCOUNT].freeze
215
+ end
216
+
217
+ module ContentType
218
+ TEXT = 'text/plain'
219
+ HTML = 'text/html'
220
+ ALL = [TEXT, HTML].freeze
221
+ end
222
+
223
+ module ContentPart
224
+ ALTERNATIVE = 'multipart/alternative'
215
225
  end
216
226
  end
217
227
  end
@@ -3,31 +3,23 @@
3
3
  module Zm
4
4
  module Client
5
5
  # class account tag
6
- class Contact < Base::AccountObject
6
+ class Contact < Base::Object
7
+ include BelongsToFolder
8
+ include BelongsToTag
9
+
7
10
  GROUP_PATTERN = 'group'
8
11
 
9
- INSTANCE_VARIABLE_KEYS = %i[
10
- anniversary assistantPhone birthday callbackPhone carPhone company companyPhone custom1 department email email2
11
- email3 email4 email5 email6 email7 firstName fullName homeCity homeCountry homeFax homePhone homePostalCode
12
- homeState homeStreet homeURL imAddress1 imAddress2 imAddress3 imAddress4 imAddress5 jobTitle lastName maidenName
13
- middleName mobilePhone namePrefix nameSuffix nickname notes otherCity otherCountry otherFax otherPhone
14
- otherPostalCode otherState otherStreet otherURL pager workCity workCountry workFax workPhone workPostalCode
15
- workState workStreet workURL image
16
- ].freeze
17
-
18
- attr_accessor *INSTANCE_VARIABLE_KEYS
19
- attr_accessor :id, :name, :l, :type, :members, :old_members, :tn
20
-
21
- def initialize(parent, json = nil)
22
- @parent = parent
23
- @members = []
24
- @custom_keys = []
25
- init_from_json(json) if json.is_a?(Hash)
26
- yield(self) if block_given?
27
- @old_members = @members.clone
12
+ attr_accessor :anniversary, :assistantPhone, :birthday, :callbackPhone, :carPhone, :company, :companyPhone,
13
+ :custom1, :department, :email, :email2, :email3, :email4, :email5, :email6, :email7, :firstName, :fullName, :homeCity, :homeCountry, :homeFax, :homePhone, :homePostalCode, :homeState, :homeStreet, :homeURL, :imAddress1, :imAddress2, :imAddress3, :imAddress4, :imAddress5, :jobTitle, :lastName, :maidenName, :middleName, :mobilePhone, :namePrefix, :nameSuffix, :nickname, :notes, :otherCity, :otherCountry, :otherFax, :otherPhone, :otherPostalCode, :otherState, :otherStreet, :otherURL, :pager, :workCity, :workCountry, :workFax, :workPhone, :workPostalCode, :workState, :workStreet, :workURL, :image, :id, :name, :l, :type, :tn, :shared_account_id, :shared_folder_account_id
14
+
15
+ def initialize(parent)
16
+ @l = FolderDefault::CONTACTS[:id]
17
+ @shared_account_id = nil
18
+ @shared_folder_account_id = nil
19
+ super(parent)
28
20
  end
29
21
 
30
- def is_group?
22
+ def group?
31
23
  @type == GROUP_PATTERN
32
24
  end
33
25
 
@@ -35,90 +27,57 @@ module Zm
35
27
  [email, email2, email3, email4, email5, email6, email7].compact
36
28
  end
37
29
 
38
- def emails_h
39
- {
40
- 'email' => email,
41
- 'email2' => email2,
42
- 'email3' => email3,
43
- 'email4' => email4,
44
- 'email5' => email5,
45
- 'email6' => email6,
46
- 'email7' => email7
47
- }.compact
30
+ def add_custom_property(key, value)
31
+ instance_variable_set(Utils.arrow_name(key), value)
48
32
  end
49
33
 
50
- def concat
51
- [id, name, l] + all_instance_variable_keys.map { |key| instance_variable_get(arrow_name(key)) }
52
- end
34
+ def create!
35
+ rep = @parent.sacc.invoke(jsns_builder.to_jsns)
36
+ ContactJsnsInitializer.update(self, rep[:CreateContactResponse][:cn].first)
53
37
 
54
- def to_h
55
- hashmap = Hash[all_instance_variable_keys.map { |key| [key, instance_variable_get(arrow_name(key))] }]
56
- hashmap.delete_if { |_, v| v.nil? }
57
- hashmap
38
+ @id
58
39
  end
59
40
 
60
- def init_from_json(json)
61
- @id = json[:id]
62
- @name = json[:fileAsStr]
63
- @l = json[:l]
64
- @tn = json[:tn]
65
-
66
- init_instance_variable_from_json(json[:_attrs])
67
-
68
- return unless is_group?
69
-
70
- extend(GroupContact)
71
- init_members_from_json(json[:m])
41
+ def modify!
42
+ @parent.sacc.invoke(jsns_builder.to_update)
43
+ true
72
44
  end
73
45
 
74
- def init_instance_variable_from_json(json_attrs)
75
- return if json_attrs.nil?
76
-
77
- @type = json_attrs[:type]
46
+ def update!(hash)
47
+ return false if hash.delete_if { |k, v| v.nil? || !respond_to?(k) }.empty?
78
48
 
79
- make_custom_keys(json_attrs)
49
+ do_update!(hash)
80
50
 
81
- all_instance_variable_keys.each do |key|
82
- instance_variable_set(arrow_name(key), json_attrs[key])
51
+ hash.each do |key, value|
52
+ update_attribute(key, value)
83
53
  end
84
- end
85
-
86
- def make_custom_keys(json_attrs)
87
- @custom_keys = json_attrs.keys - INSTANCE_VARIABLE_KEYS - %i[type fileAs]
88
- return if @custom_keys.empty?
89
54
 
90
- self.class.attr_accessor(*@custom_keys)
91
- rescue StandardError => _
92
- @custom_keys.clear
93
- nil
55
+ true
94
56
  end
95
57
 
96
- def all_instance_variable_keys
97
- INSTANCE_VARIABLE_KEYS + @custom_keys
58
+ def rename!(*args)
59
+ raise NotImplementedError
98
60
  end
99
61
 
100
- def add_custom_property(key, value)
101
- instance_variable_set(arrow_name(key), value)
102
- @custom_keys << key unless all_instance_variable_keys.include?(key)
103
- end
62
+ def delete!
63
+ return false if @id.nil?
104
64
 
105
- def create!
106
- rep = @parent.sacc.create_contact(@parent.token, l, instance_variables_array(all_instance_variable_keys))
107
- init_from_json(rep[:Body][:CreateContactResponse][:cn].first)
65
+ @parent.sacc.invoke(jsns_builder.to_delete)
66
+ @id = nil
108
67
  end
109
68
 
110
- def delete!
111
- @parent.sacc.contact_action(@parent.token, :delete, @id)
112
- super
69
+ def reload!
70
+ raise NotImplementedError
113
71
  end
114
72
 
115
- def update!(hash)
116
- @parent.sacc.modify_contact(@parent.token, id, hash)
117
- hash.each { |k, v| send "#{k}=", v }
73
+ private
74
+
75
+ def do_update!(hash)
76
+ @parent.sacc.invoke(jsns_builder.to_patch(hash))
118
77
  end
119
78
 
120
- def modify!
121
- @parent.sacc.modify_contact(@parent.token, id, instance_variables_array(all_instance_variable_keys))
79
+ def jsns_builder
80
+ @jsns_builder ||= ContactJsnsBuilder.new(self)
122
81
  end
123
82
  end
124
83
  end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ # class for account contact jsns builder
6
+ class ContactJsnsBuilder < BaseAccountJsnsBuilder
7
+ EXCLUDE_INSTANCE_VARIABLE_KEYS = %i[@id @name @parent @l @type @tn @jsns_builder].freeze
8
+
9
+ def to_jsns
10
+ jsns = {
11
+ cn: {
12
+ a: instance_variables_array(all_instance_variables).map(&Utils::A_NODE_PROC),
13
+ l: @item.folder_id || Zm::Client::FolderDefault::CONTACTS[:id]
14
+ }
15
+ }
16
+
17
+ SoapElement.mail(SoapMailConstants::CREATE_CONTACT_REQUEST).add_attributes(jsns)
18
+ end
19
+
20
+ def to_update
21
+ jsns = {
22
+ cn: {
23
+ a: instance_variables_array(all_instance_variables).map(&Utils::A_NODE_PROC),
24
+ id: @item.id
25
+ }
26
+ }
27
+
28
+ SoapElement.mail(SoapMailConstants::MODIFY_CONTACT_REQUEST).add_attributes(jsns)
29
+ end
30
+
31
+ def to_patch(hash)
32
+ jsns = {
33
+ cn: {
34
+ id: @item.id,
35
+ a: hash.map(&Utils::A_ARRAY_PROC).flatten(1).map(&Utils::A_NODE_PROC)
36
+ }
37
+ }
38
+
39
+ SoapElement.mail(SoapMailConstants::MODIFY_CONTACT_REQUEST).add_attributes(jsns)
40
+ end
41
+
42
+ def instance_variables_array(zcs_attrs)
43
+ arr = zcs_attrs.map do |name|
44
+ n = name.to_s[1..]
45
+ value = @item.instance_variable_get(name)
46
+ [n, value]
47
+ end
48
+
49
+ multi_value = arr.select { |a| a.last.is_a?(Array) }
50
+ arr.reject! { |a| a.last.is_a?(Array) || a.last.nil? }
51
+ multi_value.each { |a| arr += a.last.map { |v| [a.first, v] } }
52
+ arr
53
+ end
54
+
55
+ def all_instance_variables
56
+ @item.instance_variables - EXCLUDE_INSTANCE_VARIABLE_KEYS
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ # class for account contact
6
+ class ContactJsnsInitializer
7
+ class << self
8
+ def create(parent, json)
9
+ item = Contact.new(parent)
10
+ update(item, json)
11
+ end
12
+
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]
40
+
41
+ if json[:_attrs].is_a?(Hash)
42
+ make_custom_keys(json[:_attrs], item)
43
+ init_by_attrs(json[:_attrs], item)
44
+ end
45
+
46
+ if item.group?
47
+ item.extend(GroupContact)
48
+ init_members_from_json(json[:m], item)
49
+ end
50
+
51
+ item
52
+ end
53
+
54
+ def make_custom_keys(attrs, item)
55
+ custom_keys = attrs.keys - item.all_instance_variable_keys
56
+ return if custom_keys.empty?
57
+
58
+ item.class.attr_accessor(*custom_keys)
59
+ rescue StandardError => _e
60
+ nil
61
+ end
62
+
63
+ def init_by_attrs(attrs, item)
64
+ attrs.each do |k, v|
65
+ m = Utils.equals_name(k)
66
+ item.send(m, v) if item.respond_to?(m)
67
+ end
68
+ end
69
+
70
+ def init_members_from_json(m, item)
71
+ return if m.nil?
72
+
73
+ item.members.all = m.map { |m| Zm::Client::ConcatMember.new(m[:type], m[:value]) }
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -3,48 +3,40 @@
3
3
  module Zm
4
4
  module Client
5
5
  class ConcatMember
6
+ include Zm::Inspector
7
+
6
8
  INTERNAL = 'C'
7
9
  FREE = 'I'
8
10
  LDAP = 'G'
9
11
  ADD = '+'
10
12
  DEL = '-'
11
13
 
12
- class << self
13
- def find_type_by_value(value)
14
- return INTERNAL if !value.to_i.zero? || Zm::Client::Regex::SHARED_CONTACT.match(value)
15
- return LDAP if Zm::Client::Regex::BASEDN_REGEX.match(value)
16
-
17
- FREE
18
- end
19
-
20
- def init_by_value(value)
21
- type_v = find_type_by_value(value)
22
- new(type_v, value)
23
- end
24
- end
25
-
26
- attr_reader :type, :value, :op
14
+ attr_reader :type, :value, :op, :shared_account_id
27
15
 
28
16
  def initialize(type, value, op = nil)
17
+ @shared_account_id = nil
29
18
  @op = op
30
19
  @type = type
31
- @value = value
32
- end
33
20
 
34
- def concat
35
- [@value, @type, @op]
36
- end
21
+ value_int = value.to_i
37
22
 
38
- def to_s
39
- concat.join(' :: ')
23
+ if !value_int.zero?
24
+ @value = value_int
25
+ elsif Zm::Client::Regex::SHARED_CONTACT.match(value)
26
+ part_value = value.split(':')
27
+ @shared_account_id = part_value.first
28
+ @value = part_value.last.to_i
29
+ else
30
+ @value = value
31
+ end
40
32
  end
41
33
 
42
34
  def internal?
43
- @type == INTERNAL && !Zm::Client::Regex::SHARED_CONTACT.match(value)
35
+ @type == INTERNAL && @value.is_a?(Integer)
44
36
  end
45
37
 
46
38
  def shared?
47
- @type == INTERNAL && Zm::Client::Regex::SHARED_CONTACT.match(value)
39
+ @type == INTERNAL && !@shared_account_id.nil?
48
40
  end
49
41
 
50
42
  def free?
@@ -55,6 +47,10 @@ module Zm
55
47
  @type == LDAP
56
48
  end
57
49
 
50
+ def current?
51
+ @op.nil?
52
+ end
53
+
58
54
  def add!
59
55
  @op = ADD
60
56
  end
@@ -63,10 +59,15 @@ module Zm
63
59
  @op = DEL
64
60
  end
65
61
 
66
- def construct_soap_node
67
- node = { type: @type, value: @value }
68
- node[:op] = @op unless @op.nil?
69
- node
62
+ def email_address
63
+ return unless ldap?
64
+
65
+ @email_address ||= @value.sub('uid=', '').sub(',ou=people,dc=', '@').gsub(',dc=', '.')
66
+ end
67
+
68
+ def instance_variables_map
69
+ email_address
70
+ super
70
71
  end
71
72
  end
72
73
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ class ContactMembersCollection
6
+ attr_accessor :all
7
+
8
+ def initialize(parent)
9
+ @parent = parent
10
+ @all = []
11
+ end
12
+
13
+ def add(new_member)
14
+ return false unless new_member.is_a?(Zm::Client::ConcatMember)
15
+
16
+ current_member = @all.find { |m| m.type == new_member.type && m.value == new_member.value }
17
+
18
+ if current_member.nil?
19
+ new_member.add!
20
+ @all << new_member
21
+ return true
22
+ end
23
+
24
+ if current_member.op == Zm::Client::ConcatMember::DEL
25
+ current_member.add!
26
+ return true
27
+ end
28
+
29
+ false
30
+ end
31
+
32
+ def remove(new_member)
33
+ return false unless new_member.is_a?(Zm::Client::ConcatMember)
34
+
35
+ current_member = @all.find { |m| m.type == new_member.type && m.value == new_member.value }
36
+ return false if current_member.nil?
37
+
38
+ current_member.remove!
39
+
40
+ true
41
+ end
42
+ end
43
+ end
44
+ end
@@ -6,9 +6,16 @@ module Zm
6
6
  class ContactBuilder < Base::ObjectsBuilder
7
7
  def initialize(parent, json)
8
8
  super(parent, json)
9
- @child_class = Contact
10
9
  @json_item_key = :cn
11
10
  end
11
+
12
+ def make
13
+ return [] if json_items.nil?
14
+
15
+ json_items.map do |entry|
16
+ ContactJsnsInitializer.create(@parent, entry)
17
+ end
18
+ end
12
19
  end
13
20
  end
14
21
  end
@@ -7,13 +7,29 @@ module Zm
7
7
  def initialize(parent)
8
8
  @child_class = Contact
9
9
  @builder_class = ContactBuilder
10
+ @folder_id = nil
10
11
  super(parent)
11
12
  end
12
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
+
13
27
  private
14
28
 
15
29
  def make_query
16
- @parent.sacc.get_all_contacts(@parent.token)
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)
17
33
  end
18
34
  end
19
35
  end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ # class for account contact jsns builder
6
+ class GroupContactJsnsBuilder < BaseAccountJsnsBuilder
7
+ EXCLUDE_INSTANCE_VARIABLE_KEYS = %i[@id @name @parent @l @type @tn @jsns_builder].freeze
8
+
9
+ def to_jsns
10
+ {
11
+ cn: {
12
+ a: instance_variables_array.map(&Utils::A_NODE_PROC),
13
+ l: @item.folder_id || Zm::Client::FolderDefault::CONTACTS[:id],
14
+ m: members_node
15
+ }
16
+ }
17
+ end
18
+
19
+ def to_update
20
+ {
21
+ cn: {
22
+ a: instance_variables_array.map(&Utils::A_NODE_PROC),
23
+ id: @item.id,
24
+ m: members_node
25
+ }
26
+ }
27
+ end
28
+
29
+ def to_patch(hash)
30
+ {
31
+ cn: {
32
+ id: @item.id,
33
+ a: hash.map(&Utils::A_ARRAY_PROC).flatten(1).map(&Utils::A_NODE_PROC)
34
+ }
35
+ }
36
+ end
37
+
38
+ alias to_create to_jsns
39
+
40
+ def members_node
41
+ @item.members.all.reject(&:current?).map do |m|
42
+ { type: m.type, value: m.value, op: m.op }
43
+ end
44
+ end
45
+
46
+ def instance_variables_array
47
+ [[:nickname, @item.name], [:fullname, @item.name], [:fileAs, "8:#{@item.name}"], %i[type group]]
48
+ end
49
+ end
50
+ end
51
+ end