zm-ruby-client 0.18.5 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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 -308
  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 +68 -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 +15 -28
  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 +30 -21
  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 +39 -55
  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 -20
  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 +1 -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
@@ -3,312 +3,84 @@
3
3
  module Zm
4
4
  module Client
5
5
  # class message for account
6
- class Message < Base::AccountObject
7
- INSTANCE_VARIABLE_KEYS = %i[id date l su fr autoSendTime mid idnt]
8
- attr_accessor *INSTANCE_VARIABLE_KEYS
6
+ class Message < Base::Object
7
+ include BelongsToFolder
8
+ include BelongsToTag
9
9
 
10
- attr_accessor :subject
11
- attr_reader :recipients, :attachments, :body, :folder
10
+ attr_accessor :id, :d, :l, :f, :su, :fr, :autoSendTime, :mid, :idnt, :tn, :subject
11
+ attr_reader :recipients, :attachments, :body
12
12
 
13
- def initialize(parent, json = nil)
13
+ def initialize(parent)
14
14
  @parent = parent
15
- @recipients = Recipients.new
16
15
  @subject = ''
17
- @body = Body.new
18
- @attachments = Attachments.new
19
16
 
20
- init_from_json(json) if json.is_a?(Hash)
17
+ @recipients = Recipients.new
18
+ @body = Body.new
19
+ @attachments = AttachmentsCollection.new
21
20
 
22
21
  yield(self) if block_given?
23
22
  end
24
23
 
25
- def has_attachment?
26
- @has_attachment ||= @attachments.all.any?
24
+ def download(dest_file_path, fmt = 'eml')
25
+ uploader = Upload.new(@parent, RestAccountConnector.new)
26
+ uploader.download_file( Zm::Client::FolderDefault::ROOT[:path], fmt, [Zm::Client::FolderView::MESSAGE], [@id], dest_file_path)
27
27
  end
28
28
 
29
- def all_instance_variable_keys
30
- INSTANCE_VARIABLE_KEYS
29
+ def date
30
+ @date ||= Time.at(d.to_i / 1000)
31
31
  end
32
32
 
33
- def from
34
- @from ||= @recipients.find { |r| r.field == Recipient::FROM }
33
+ def flags
34
+ @flags ||= FlagsCollection.new(self)
35
35
  end
36
36
 
37
- def folder=(folder)
38
- @folder = folder
39
- @l = folder.id
37
+ def create!(*args)
38
+ raise NotImplementedError
40
39
  end
41
40
 
42
- def delete!
43
- msg_action('delete')
44
- end
45
-
46
- def move!(folder_id = l)
47
- msg_action('move', l: folder_id)
48
- l = folder_id if l != folder_id
41
+ def modify!(*args)
42
+ raise NotImplementedError
49
43
  end
50
44
 
51
- def unread!
52
- msg_action('!read')
45
+ def update!(*args)
46
+ raise NotImplementedError
53
47
  end
54
48
 
55
- def read!
56
- msg_action('read')
49
+ def rename!(*args)
50
+ raise NotImplementedError
57
51
  end
58
52
 
59
- def unflag!
60
- msg_action('!flag')
61
- end
62
-
63
- def flag!
64
- msg_action('flag')
65
- end
66
-
67
- def untag!(tag_name)
68
- msg_action('!tag', tn: tag_name)
69
- end
53
+ def delete!
54
+ return false if @id.nil?
70
55
 
71
- def tag!(tag_name)
72
- msg_action('tag', tn: tag_name)
56
+ @parent.sacc.invoke(jsns_builder.to_delete)
57
+ @id = nil
73
58
  end
74
59
 
75
60
  def unspam!
76
- msg_action('!spam')
61
+ @parent.sacc.invoke(jsns_builder.to_unspam)
77
62
  end
78
63
 
79
64
  def spam!
80
- msg_action('spam')
81
- end
82
-
83
- def trash!
84
- msg_action('trash')
65
+ @parent.sacc.invoke(jsns_builder.to_spam)
85
66
  end
86
67
 
87
68
  def send!
88
- @parent.sacc.send_msg(@parent.token, to_jsns)
89
- end
90
-
91
- def to_jsns
92
- h = {
93
- id: @id,
94
- attach: @attachments.to_jsns,
95
- e: @recipients.to_jsns,
96
- su: { _content: @su },
97
- mp: @body.to_jsns
98
- }.delete_if { |_, v| v.nil? }
99
-
100
- h[:did] = @id if l.to_i == FolderDefault::DRAFTS[:id]
101
-
102
- h
103
- end
104
-
105
- def init_from_json(json)
106
- # puts json
107
- @id = json[:id]
108
- @date = Time.at(json[:d]/1000)
109
- @l = json[:l]
110
- @su = json[:su]
111
- @fr = json[:fr]
112
- @autoSendTime = json[:autoSendTime]
113
- @mid = json[:mid]
114
- @idnt = json[:idnt]
115
- @has_attachment = json[:f].to_s.include?('a')
116
-
117
- json[:e].each do |e|
118
- recipient = Recipient.new(e[:t], e[:a], e[:p])
119
- @recipients.add(recipient)
120
- end
121
-
122
- init_part_from_json(json[:mp])
123
- end
124
-
125
- def init_part_from_json(json)
126
- return if json.nil?
127
- # puts json
128
- json = [json] unless json.is_a?(Array)
129
-
130
- json.each do |json_part|
131
- if ['text/plain', 'text/html'].include?(json_part[:ct])
132
- init_body_from_json(json_part)
133
- elsif json_part[:cd] == 'attachment'
134
- init_attachment_from_json(json_part)
135
- else
136
- init_part_from_json(json_part[:mp])
137
- end
138
- end
139
- end
140
-
141
- def init_body_from_json(json)
142
- # puts "\ninit_body_from_json #{json}\n"
143
- body.text = json[:content] if json[:ct] == 'text/plain'
144
- body.html = json[:content] if json[:ct] == 'text/html'
145
- end
146
-
147
- def init_attachment_from_json(json)
148
- # puts "\ninit_attachment_from_json #{json}\n"
149
- pj = Zm::Client::Message::Attachment.new(self)
150
- # pj.part = json[:part],
151
- pj.mid = json[:mid]
152
- pj.aid = json[:aid]
153
- pj.ct = json[:ct]
154
- pj.s = json[:s]
155
- pj.filename = json[:filename]
156
- pj.ci = json[:ci]
157
- pj.cd = json[:cd]
158
- pj.part = json[:part]
159
- attachments.add(pj)
160
- end
161
-
162
- def msg_action(action_name, options = {})
163
- @parent.sacc.msg_action(@parent.token, action_name, id, options)
164
- true
69
+ soap_request = SoapElement.mail(SoapMailConstants::SEND_MSG_REQUEST).add_attributes(jsns_builder.to_jsns)
70
+ @parent.sacc.invoke(soap_request)
165
71
  end
166
72
 
167
73
  # content fo an email
168
74
  class Body
169
75
  attr_accessor :text, :html
170
-
171
- def text_jsns
172
- @text.nil? ? nil : { ct: 'text/plain', content: { _content: @text } }
173
- end
174
-
175
- def html_jsns
176
- @html.nil? ? nil : { ct: 'text/html', content: { _content: @html } }
177
- end
178
-
179
- def to_jsns
180
- [
181
- {
182
- ct: 'multipart/alternative',
183
- mp: [text_jsns, html_jsns].compact
184
- }
185
- ]
186
- end
187
- end
188
-
189
- # collection attachments
190
- class Attachments
191
- attr_reader :all
192
- def initialize
193
- @all = []
194
- end
195
-
196
- def add(attachment)
197
- return unless attachment.is_a?(Attachment)
198
-
199
- @all.push(attachment)
200
- end
201
-
202
- def to_jsns
203
- @all.map(&:to_jsns)
204
- end
205
- end
206
-
207
- # class attachment for email
208
- class Attachment
209
- attr_accessor :aid, :part, :mid, :ct, :s, :filename, :ci, :cd
210
-
211
- def initialize(parent)
212
- @parent = parent
213
- yield(self) if block_given?
214
- end
215
-
216
- def download(dest_file_path)
217
- h = {
218
- id: @parent.id,
219
- part: part,
220
- auth: 'qp',
221
- zauthtoken: account.token,
222
- disp: 'a'
223
- }
224
-
225
- url = account.home_url
226
-
227
- uri = Addressable::URI.new
228
- uri.query_values = h
229
- url << '?' << uri.query
230
-
231
- uploader = Upload.new(@parent, RestAccountConnector.new)
232
- uploader.download_file_with_url(url, dest_file_path)
233
- end
234
-
235
- def to_jsns
236
- {
237
- part: part,
238
- mid: mid,
239
- aid: aid,
240
- ct: ct,
241
- s: s,
242
- filename: filename,
243
- ci: ci,
244
- cd: cd
245
- }.reject { |_, v| v.nil? }
246
- end
247
-
248
- def account
249
- @parent.parent
250
- end
251
76
  end
252
77
 
253
- # Collection recipients
254
- class Recipients
255
- def initialize
256
- @recipients = []
257
- end
258
-
259
- def to_jsns
260
- @recipients.map(&:to_jsns)
261
- end
262
-
263
- def add(recipient)
264
- return unless recipient.is_a?(Recipient)
265
-
266
- @recipients.push(recipient)
267
- end
268
-
269
- def to
270
- @recipients.select { |r| r.field == Recipient::TO }
271
- end
272
-
273
- def cc
274
- @recipients.select { |r| r.field == Recipient::CC }
275
- end
276
-
277
- def bcc
278
- @recipients.select { |r| r.field == Recipient::BCC }
279
- end
280
-
281
- def from
282
- @recipients.select { |r| r.field == Recipient::FROM }
283
- end
78
+ def sacc
79
+ @parent.sacc
284
80
  end
285
81
 
286
- # Class one recipient for email
287
- class Recipient
288
- FROM = :f
289
- TO = :t
290
- CC = :c
291
- BCC = :b
292
-
293
- attr_accessor :field, :email, :display_name
294
-
295
- def initialize(field, email, display_name = nil)
296
- @email = email
297
- @field = field.to_sym
298
- @display_name = display_name
299
- end
300
-
301
- def to_s
302
- "#{@email} (#{@display_name})"
303
- end
304
-
305
- def to_jsns
306
- {
307
- t: @field,
308
- a: @email,
309
- p: @display_name
310
- }.reject { |_, v| v.nil? }
311
- end
82
+ def jsns_builder
83
+ @jsns_builder ||= MessageJsnsBuilder.new(self)
312
84
  end
313
85
  end
314
86
  end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ # class message for account
6
+ class Message
7
+ class FlagsCollection
8
+ def initialize(parent)
9
+ @parent = parent
10
+ end
11
+
12
+ def all
13
+ @all || all!
14
+ end
15
+
16
+ def all!
17
+ @parent.f.to_s.chars
18
+ end
19
+
20
+ # properties
21
+
22
+ def unread?
23
+ all.include?('u')
24
+ end
25
+
26
+ def flagged?
27
+ all.include?('f')
28
+ end
29
+
30
+ def attachment?
31
+ all.include?('a')
32
+ end
33
+
34
+ def replied
35
+ all.include?('r')
36
+ end
37
+
38
+ def sent_by_me?
39
+ all.include?('s')
40
+ end
41
+
42
+ def forwarded?
43
+ all.include?('w')
44
+ end
45
+
46
+ def calendar_invite?
47
+ all.include?('v')
48
+ end
49
+
50
+ def draft?
51
+ all.include?('d')
52
+ end
53
+
54
+ def imap_deleted?
55
+ all.include?('x')
56
+ end
57
+
58
+ def notification?
59
+ all.include?('n')
60
+ end
61
+
62
+ def urgent?
63
+ all.include?('!')
64
+ end
65
+
66
+ def low_priority?
67
+ all.include?('?')
68
+ end
69
+
70
+ def priority?
71
+ all.include?('+')
72
+ end
73
+
74
+ # actions
75
+
76
+ def unread!
77
+ attrs = { op: '!read', id: @parent.id }
78
+ @parent.sacc.invoke(build(attrs))
79
+ end
80
+
81
+ def read!
82
+ attrs = { op: 'read', id: @parent.id }
83
+ @parent.sacc.invoke(build(attrs))
84
+ end
85
+
86
+ def unflag!
87
+ attrs = { op: '!flag', id: @parent.id }
88
+ @parent.sacc.invoke(build(attrs))
89
+ end
90
+
91
+ def flag!
92
+ attrs = { op: 'flag', id: @parent.id }
93
+ @parent.sacc.invoke(build(attrs))
94
+ end
95
+
96
+ private
97
+
98
+ def build(attrs)
99
+ soap_request = SoapElement.mail(SoapMailConstants::ITEM_ACTION_REQUEST)
100
+ node_action = SoapElement.create(SoapConstants::ACTION).add_attributes(attrs)
101
+ soap_request.add_node(node_action)
102
+ soap_request
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ # class for account message jsns builder
6
+ class MessageJsnsBuilder < BaseAccountJsnsBuilder
7
+ def initialize(item)
8
+ @item = item
9
+ end
10
+
11
+ def to_jsns
12
+ jsns = {
13
+ id: @item.id,
14
+ attach: attachments_jsns,
15
+ e: recipients_jsns,
16
+ su: { _content: @item.su },
17
+ mp: body_jsns
18
+ }.delete_if { |_, v| v.nil? }
19
+
20
+ jsns[:did] = @item.id if @item.l.to_i == FolderDefault::DRAFTS[:id]
21
+
22
+ jsns
23
+ end
24
+
25
+ def attachments_jsns
26
+ @item.attachments.all.map do |attachment|
27
+ {
28
+ part: attachment.part,
29
+ mid: attachment.mid,
30
+ aid: attachment.aid,
31
+ ct: attachment.ct,
32
+ s: attachment.s,
33
+ filename: attachment.filename,
34
+ ci: attachment.ci,
35
+ cd: attachment.cd
36
+ }.reject { |_, v| v.nil? }
37
+ end
38
+ end
39
+
40
+ def recipients_jsns
41
+ return nil if @item.recipients.all.empty?
42
+
43
+ @item.recipients.all.map do |recipient|
44
+ {
45
+ t: recipient.field,
46
+ a: recipient.email,
47
+ p: recipient.display_name
48
+ }.reject { |_, v| v.nil? }
49
+ end
50
+ end
51
+
52
+ def body_jsns
53
+ return nil if @item.body.text.nil? && @item.body.html.nil?
54
+
55
+ text_jsns = @item.body.text.nil? ? nil : { ct: ContentType::TEXT, content: { _content: @item.body.text } }
56
+ html_jsns = @item.body.html.nil? ? nil : { ct: ContentType::HTML, content: { _content: @item.body.html } }
57
+
58
+ [
59
+ {
60
+ ct: ContentPart::ALTERNATIVE,
61
+ mp: [text_jsns, html_jsns].compact
62
+ }
63
+ ]
64
+ end
65
+
66
+ def to_spam
67
+ attrs = {
68
+ op: :spam,
69
+ id: @item.id
70
+ }
71
+
72
+ build(attrs)
73
+ end
74
+
75
+ def to_unspam
76
+ attrs = {
77
+ op: '!spam',
78
+ id: @item.id
79
+ }
80
+
81
+ build(attrs)
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ # class for initialize account message
6
+ class MessageJsnsInitializer
7
+ class << self
8
+ def create(parent, json)
9
+ item = Message.new(parent)
10
+ update(item, json)
11
+ end
12
+
13
+ def update(item, json)
14
+ item.id = json[:id]
15
+ item.d = json[:d]
16
+ item.l = json[:l]
17
+ item.su = json[:su]
18
+ item.fr = json[:fr]
19
+ item.autoSendTime = json[:autoSendTime]
20
+ item.mid = json[:mid]
21
+ item.idnt = json[:idnt]
22
+ item.f = json[:f]
23
+ item.tn = json[:tn].to_s.split(',')
24
+
25
+ json[:e].each do |e|
26
+ recipient = Recipient.new(e[:t], e[:a], e[:p])
27
+ item.recipients.add(recipient)
28
+ end
29
+
30
+ update_mps(item, json[:mp])
31
+
32
+ item
33
+ end
34
+
35
+ def update_mps(item, mps)
36
+ return if mps.nil?
37
+
38
+ mps = [mps] unless mps.is_a?(Array)
39
+
40
+ mps.each do |mp|
41
+ if ContentType::ALL.include?(mp[:ct])
42
+ update_body(item, mp)
43
+ elsif mp[:cd] == 'attachment'
44
+ update_attachment(item, mp)
45
+ else
46
+ update_mps(item, mp[:mp])
47
+ end
48
+ end
49
+ end
50
+
51
+ def update_body(item, json)
52
+ item.body.text = json[:content] if json[:ct] == ContentType::TEXT
53
+ item.body.html = json[:content] if json[:ct] == ContentType::HTML
54
+ end
55
+
56
+ def update_attachment(item, json)
57
+ pj = Zm::Client::Message::Attachment.new(self)
58
+ pj.mid = json[:mid]
59
+ pj.aid = json[:aid]
60
+ pj.ct = json[:ct]
61
+ pj.s = json[:s]
62
+ pj.filename = json[:filename]
63
+ pj.ci = json[:ci]
64
+ pj.cd = json[:cd]
65
+ pj.part = json[:part]
66
+ item.attachments.add(pj)
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ class Message
6
+ # Collection recipients
7
+ class Recipients
8
+ attr_reader :all
9
+
10
+ def initialize
11
+ @all = []
12
+ end
13
+
14
+ def add(recipient)
15
+ return unless recipient.is_a?(Zm::Client::Recipient)
16
+
17
+ @all.push(recipient)
18
+ end
19
+
20
+ def to
21
+ @all.select { |r| r.field == Zm::Client::Recipient::TO }
22
+ end
23
+
24
+ def cc
25
+ @all.select { |r| r.field == Zm::Client::Recipient::CC }
26
+ end
27
+
28
+ def bcc
29
+ @all.select { |r| r.field == Zm::Client::Recipient::BCC }
30
+ end
31
+
32
+ def from
33
+ @all.select { |r| r.field == Zm::Client::Recipient::FROM }
34
+ end
35
+ end
36
+
37
+ # Class one recipient for email
38
+ class Recipient
39
+ FROM = :f
40
+ TO = :t
41
+ CC = :c
42
+ BCC = :b
43
+
44
+ attr_accessor :field, :email
45
+ attr_writer :display_name
46
+
47
+ def initialize(field, email, display_name = nil)
48
+ @email = email
49
+ @field = field.to_sym
50
+ @display_name = display_name
51
+ end
52
+
53
+ def display_name
54
+ @display_name || "#{@email} (#{@display_name})"
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -4,28 +4,17 @@ module Zm
4
4
  module Client
5
5
  # class factory [messages]
6
6
  class MessagesBuilder < Base::ObjectsBuilder
7
- def initialize(account, json)
8
- @account = account
9
- @json = json
7
+ def initialize(parent, json)
8
+ super(parent, json)
9
+ @json_item_key = :m
10
10
  end
11
11
 
12
12
  def make
13
- root.map do |s|
14
- Message.new(@account, s)
15
- end
16
- end
17
-
18
- def ids
19
- hits = @json.dig(:Body, :SearchResponse, :hit) || []
20
- hits.map { |s| s[:id] }
21
- end
22
-
23
- def root
24
- root = @json[:Body][:SearchResponse][:m]
25
- return [] if root.nil?
13
+ return [] if json_items.nil?
26
14
 
27
- root = [root] unless root.is_a?(Array)
28
- root
15
+ json_items.map do |entry|
16
+ MessageJsnsInitializer.create(@parent, entry)
17
+ end
29
18
  end
30
19
  end
31
20
  end