zm-ruby-client 0.10.4

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 (147) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +58 -0
  3. data/Gemfile +8 -0
  4. data/LICENSE +674 -0
  5. data/README.md +47 -0
  6. data/SECURITY.md +21 -0
  7. data/lib/zm/client/account/account.rb +335 -0
  8. data/lib/zm/client/account/account_dls_membership_collection.rb +22 -0
  9. data/lib/zm/client/account/account_dls_owner_collection.rb +22 -0
  10. data/lib/zm/client/account/accounts_builder.rb +19 -0
  11. data/lib/zm/client/account/accounts_collection.rb +48 -0
  12. data/lib/zm/client/account.rb +7 -0
  13. data/lib/zm/client/ace/ace.rb +32 -0
  14. data/lib/zm/client/ace/aces_builder.rb +25 -0
  15. data/lib/zm/client/ace/aces_collection.rb +36 -0
  16. data/lib/zm/client/ace.rb +5 -0
  17. data/lib/zm/client/appointment/appointment.rb +143 -0
  18. data/lib/zm/client/appointment/appointment_jsns_builder.rb +125 -0
  19. data/lib/zm/client/appointment/appointment_jsns_initializer.rb +129 -0
  20. data/lib/zm/client/appointment/appointments_builder.rb +33 -0
  21. data/lib/zm/client/appointment/appointments_collection.rb +106 -0
  22. data/lib/zm/client/appointment.rb +7 -0
  23. data/lib/zm/client/backup/backup.rb +59 -0
  24. data/lib/zm/client/backup/backups_builder.rb +26 -0
  25. data/lib/zm/client/backup/backups_collection.rb +22 -0
  26. data/lib/zm/client/backup.rb +5 -0
  27. data/lib/zm/client/base/account_object.rb +17 -0
  28. data/lib/zm/client/base/admin_object.rb +45 -0
  29. data/lib/zm/client/base/object.rb +80 -0
  30. data/lib/zm/client/base/objects_builder.rb +31 -0
  31. data/lib/zm/client/base/objects_collection.rb +135 -0
  32. data/lib/zm/client/base.rb +7 -0
  33. data/lib/zm/client/cluster/cluster.rb +117 -0
  34. data/lib/zm/client/cluster/cluster_config.rb +100 -0
  35. data/lib/zm/client/cluster.rb +4 -0
  36. data/lib/zm/client/common/message.rb +10 -0
  37. data/lib/zm/client/common/recipients.rb +67 -0
  38. data/lib/zm/client/common.rb +4 -0
  39. data/lib/zm/client/config.rb +12 -0
  40. data/lib/zm/client/connector/rest_account.rb +74 -0
  41. data/lib/zm/client/connector/soap_account.rb +562 -0
  42. data/lib/zm/client/connector/soap_admin.rb +512 -0
  43. data/lib/zm/client/connector/soap_base.rb +65 -0
  44. data/lib/zm/client/connector/soap_error.rb +26 -0
  45. data/lib/zm/client/connector/soap_xml_builder.rb +68 -0
  46. data/lib/zm/client/constant.rb +217 -0
  47. data/lib/zm/client/contact/contact.rb +124 -0
  48. data/lib/zm/client/contact/contact_member.rb +73 -0
  49. data/lib/zm/client/contact/contacts_builder.rb +24 -0
  50. data/lib/zm/client/contact/contacts_collection.rb +26 -0
  51. data/lib/zm/client/contact/mod_group_contact.rb +74 -0
  52. data/lib/zm/client/contact.rb +7 -0
  53. data/lib/zm/client/cos/cos.rb +59 -0
  54. data/lib/zm/client/cos/coses_builder.rb +29 -0
  55. data/lib/zm/client/cos/coses_collection.rb +33 -0
  56. data/lib/zm/client/cos.rb +5 -0
  57. data/lib/zm/client/data_source.rb +5 -0
  58. data/lib/zm/client/distributionlist/distributionlist.rb +125 -0
  59. data/lib/zm/client/distributionlist/distributionlists_builder.rb +29 -0
  60. data/lib/zm/client/distributionlist/distributionlists_collection.rb +41 -0
  61. data/lib/zm/client/distributionlist.rb +5 -0
  62. data/lib/zm/client/document/document.rb +47 -0
  63. data/lib/zm/client/document/documents_builder.rb +31 -0
  64. data/lib/zm/client/document/documents_collection.rb +93 -0
  65. data/lib/zm/client/document.rb +5 -0
  66. data/lib/zm/client/domain/domain.rb +74 -0
  67. data/lib/zm/client/domain/domains_builder.rb +32 -0
  68. data/lib/zm/client/domain/domains_collection.rb +36 -0
  69. data/lib/zm/client/domain.rb +5 -0
  70. data/lib/zm/client/folder/folder.rb +215 -0
  71. data/lib/zm/client/folder/folder_grant.rb +58 -0
  72. data/lib/zm/client/folder/folder_retention_policy.rb +48 -0
  73. data/lib/zm/client/folder/folders_builder.rb +58 -0
  74. data/lib/zm/client/folder/folders_collection.rb +70 -0
  75. data/lib/zm/client/folder/mod_document_folder.rb +17 -0
  76. data/lib/zm/client/folder.rb +8 -0
  77. data/lib/zm/client/identity/identities_builder.rb +25 -0
  78. data/lib/zm/client/identity/identities_collection.rb +26 -0
  79. data/lib/zm/client/identity/identity.rb +75 -0
  80. data/lib/zm/client/identity.rb +5 -0
  81. data/lib/zm/client/license/license.rb +29 -0
  82. data/lib/zm/client/license/licenses_collection.rb +28 -0
  83. data/lib/zm/client/license.rb +4 -0
  84. data/lib/zm/client/message/message.rb +225 -0
  85. data/lib/zm/client/message/messages_builder.rb +31 -0
  86. data/lib/zm/client/message/messages_collection.rb +111 -0
  87. data/lib/zm/client/message.rb +5 -0
  88. data/lib/zm/client/mountpoint/mountpoint.rb +95 -0
  89. data/lib/zm/client/mountpoint/mountpoints_builder.rb +38 -0
  90. data/lib/zm/client/mountpoint/mountpoints_collection.rb +61 -0
  91. data/lib/zm/client/mountpoint.rb +5 -0
  92. data/lib/zm/client/mta_queue/mta_queue.rb +60 -0
  93. data/lib/zm/client/mta_queue/mta_queues_builder.rb +26 -0
  94. data/lib/zm/client/mta_queue/mta_queues_collection.rb +95 -0
  95. data/lib/zm/client/mta_queue.rb +5 -0
  96. data/lib/zm/client/mta_queue_item/mta_queue_item.rb +51 -0
  97. data/lib/zm/client/mta_queue_item/mta_queue_items_builder.rb +27 -0
  98. data/lib/zm/client/mta_queue_item/mta_queue_items_collection.rb +99 -0
  99. data/lib/zm/client/mta_queue_item.rb +5 -0
  100. data/lib/zm/client/resource/resource.rb +149 -0
  101. data/lib/zm/client/resource/resources_builder.rb +29 -0
  102. data/lib/zm/client/resource/resources_collection.rb +41 -0
  103. data/lib/zm/client/resource.rb +5 -0
  104. data/lib/zm/client/search_folder/search_folder.rb +63 -0
  105. data/lib/zm/client/search_folder/search_folders_builder.rb +26 -0
  106. data/lib/zm/client/search_folder/search_folders_collection.rb +28 -0
  107. data/lib/zm/client/search_folder.rb +5 -0
  108. data/lib/zm/client/server/server.rb +516 -0
  109. data/lib/zm/client/server/servers_builder.rb +26 -0
  110. data/lib/zm/client/server/servers_collection.rb +37 -0
  111. data/lib/zm/client/server.rb +5 -0
  112. data/lib/zm/client/share/share.rb +60 -0
  113. data/lib/zm/client/share/shares_builder.rb +23 -0
  114. data/lib/zm/client/share/shares_collection.rb +48 -0
  115. data/lib/zm/client/share.rb +5 -0
  116. data/lib/zm/client/signature/signature.rb +62 -0
  117. data/lib/zm/client/signature/signature_jsns_builder.rb +29 -0
  118. data/lib/zm/client/signature/signatures_builder.rb +26 -0
  119. data/lib/zm/client/signature/signatures_collection.rb +28 -0
  120. data/lib/zm/client/signature.rb +6 -0
  121. data/lib/zm/client/tag/tag.rb +45 -0
  122. data/lib/zm/client/tag/tags_builder.rb +25 -0
  123. data/lib/zm/client/tag/tags_collection.rb +26 -0
  124. data/lib/zm/client/tag.rb +5 -0
  125. data/lib/zm/client/task/task.rb +74 -0
  126. data/lib/zm/client/task/tasks_builder.rb +31 -0
  127. data/lib/zm/client/task/tasks_collection.rb +100 -0
  128. data/lib/zm/client/task.rb +5 -0
  129. data/lib/zm/client/upload/upload.rb +154 -0
  130. data/lib/zm/client/upload.rb +3 -0
  131. data/lib/zm/client/version.rb +18 -0
  132. data/lib/zm/client.rb +5 -0
  133. data/lib/zm/modules/common/account_common.rb +71 -0
  134. data/lib/zm/modules/common/cos_common.rb +463 -0
  135. data/lib/zm/modules/common/dl_common.rb +33 -0
  136. data/lib/zm/modules/common/identity_common.rb +19 -0
  137. data/lib/zm/modules/common/resource_common.rb +59 -0
  138. data/lib/zm/modules/common/signature_common.rb +16 -0
  139. data/lib/zm/modules/common/zimbra-attrs.json +1 -0
  140. data/lib/zm/utils/thread_pool.rb +72 -0
  141. data/lib/zm-ruby-client.rb +1 -0
  142. data/test/accounts.rb +62 -0
  143. data/test/cluster_config.rb +30 -0
  144. data/test/coses.rb +26 -0
  145. data/test/domains.rb +62 -0
  146. data/zm-ruby-client.gemspec +24 -0
  147. metadata +243 -0
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ # class for account appointment
6
+ class Appointment < Base::AccountObject
7
+
8
+ INSTANCE_VARIABLE_KEYS = %i[id uid name l desc start_at dur end_at tn allDay organizer timezone calItemId apptId invId rev fb transp]
9
+
10
+ attr_accessor *INSTANCE_VARIABLE_KEYS
11
+ attr_writer :folder
12
+ attr_reader :json
13
+ attr_reader :recipients, :attendees, :body
14
+
15
+ alias description desc
16
+ alias parent_id l
17
+
18
+ # def initialize(parent, json = nil)
19
+ def initialize(parent)
20
+ @parent = parent
21
+ @recipients = Recipients.new
22
+ @body = BodyMail.new
23
+ @attendees = Attendees.new
24
+ @allDay = false
25
+ @timezone = 'Europe/Berlin'
26
+ yield(self) if block_given?
27
+ end
28
+
29
+ def concat
30
+ INSTANCE_VARIABLE_KEYS.map { |key| instance_variable_get(arrow_name(key)) }
31
+ end
32
+
33
+ def folder
34
+ @folder ||= @parent.folders.all.find { |folder| folder.id == l }
35
+ end
36
+
37
+ def download(dest_file_path, fmt = 'ics')
38
+ # @parent.uploader.download_file(folder.absFolderPath, 'ics', ['appointment'], [id], dest_file_path)
39
+ uploader = Upload.new(@parent, RestAccountConnector.new)
40
+ uploader.download_file(folder.absFolderPath, fmt, ['appointment'], [id], dest_file_path)
41
+ end
42
+
43
+ def create!
44
+ jsns_builder = AppointmentJsnsBuilder.new(self)
45
+ rep = @parent.sacc.create_appointment(@parent.token, jsns_builder.to_jsns)
46
+ rep_h = rep[:Body][:CreateAppointmentResponse]
47
+
48
+ aji = AppointmentJsnsInitializer.new(@parent, rep_h)
49
+ aji.appointment = self
50
+ aji.update
51
+ end
52
+
53
+ def modify!
54
+ jsns_builder = AppointmentJsnsBuilder.new(self)
55
+ @parent.sacc.modify_appointment(@parent.token, jsns_builder.to_update)
56
+ end
57
+
58
+ def reload!
59
+ rep = @parent.sacc.get_msg(@parent.token, @id)
60
+ entry = rep[:Body][:GetMsgResponse][:m].first
61
+ aji = AppointmentJsnsInitializer.new(@parent, entry)
62
+ aji.appointment = self
63
+ aji.create
64
+ end
65
+
66
+ def delete!
67
+ jsns_builder = AppointmentJsnsBuilder.new(self)
68
+ @parent.sacc.cancel_appointment(@parent.token, jsns_builder.to_delete)
69
+ end
70
+
71
+ def free!
72
+ self.fb = 'F'
73
+ self.transp = 'O'
74
+ end
75
+
76
+ def busy!
77
+ self.fb = 'B'
78
+ self.transp = 'T'
79
+ end
80
+
81
+ def must_confirm!
82
+ self.fb = 'T'
83
+ self.transp = 'T'
84
+ end
85
+
86
+ def out_of_office!
87
+ self.fb = 'O'
88
+ self.transp = 'O'
89
+ end
90
+
91
+ class Organizer
92
+ attr_accessor :email, :display_name
93
+
94
+ def initialize(email, display_name = nil)
95
+ @email = email
96
+ @display_name = display_name
97
+ end
98
+ end
99
+
100
+ # Collection attendees
101
+ class Attendees
102
+ def initialize
103
+ @attendees = []
104
+ end
105
+
106
+ def map(&block)
107
+ @attendees.map(&block)
108
+ end
109
+
110
+ def add(attendee)
111
+ return unless attendee.is_a?(Attendee)
112
+
113
+ @attendees.push(attendee)
114
+ end
115
+
116
+ def del(attendee)
117
+ if attendee.is_a?(Attendee)
118
+ @attendees.delete(attendee)
119
+ elsif attendee.is_a?(String)
120
+ @attendees.delete_if { |at| at.email == attendee }
121
+ end
122
+ end
123
+
124
+ def clear
125
+ @attendees.clear
126
+ end
127
+ end
128
+
129
+ # Class one recipient for email
130
+ class Attendee
131
+ attr_accessor :email, :display_name, :role, :ptst, :rsvp
132
+
133
+ def initialize(email, display_name = nil, role = 'REQ', ptst = 'NE', rsvp = 1)
134
+ @email = email
135
+ @display_name = display_name
136
+ @role = role
137
+ @ptst = ptst
138
+ @rsvp = rsvp
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ # class for account appointment
6
+ class AppointmentJsnsBuilder
7
+
8
+ def initialize(appointment)
9
+ @appointment = appointment
10
+ end
11
+
12
+ def to_delete
13
+ {
14
+ comp: 0,
15
+ id: @appointment.id
16
+ }
17
+ end
18
+
19
+ def to_jsns
20
+ {
21
+ m: {
22
+ l: @appointment.l,
23
+ su: @appointment.name,
24
+ e: recipients_to_jsns,
25
+ mp: body_to_jsns,
26
+ inv: {
27
+ comp: comp_to_jsns
28
+ }
29
+ }
30
+ }
31
+ end
32
+
33
+ alias to_create to_jsns
34
+
35
+ def to_update
36
+ jsns = to_jsns
37
+ jsns[:comp] = 0
38
+ jsns[:id] = @appointment.id
39
+ jsns[:m][:inv][:uid] = @appointment.uid
40
+ jsns
41
+ end
42
+
43
+ def recipients_to_jsns
44
+ @appointment.recipients.map do |recipient|
45
+ {
46
+ t: recipient.field,
47
+ a: recipient.email,
48
+ p: recipient.display_name
49
+ }.reject { |_, v| v.nil? }
50
+ end
51
+ end
52
+
53
+ def body_to_jsns
54
+ [
55
+ {
56
+ ct: 'multipart/alternative',
57
+ mp: [body_text_jsns, body_html_jsns]
58
+ }
59
+ ]
60
+ end
61
+
62
+ def body_text_jsns
63
+ { ct: 'text/plain', content: { _content: @appointment.body.text } }
64
+ end
65
+
66
+ def body_html_jsns
67
+ { ct: 'text/html', content: { _content: @appointment.body.html } }
68
+ end
69
+
70
+ def comp_to_jsns
71
+ [
72
+ {
73
+ allDay: @appointment.allDay,
74
+ at: attendees_to_jsns,
75
+ e: end_at_jsns,
76
+ s: start_at_jsns,
77
+ or: organizer_to_jsns,
78
+ name: @appointment.name,
79
+ fb: @appointment.fb,
80
+ transp: @appointment.transp
81
+ }.reject { |_, v| v.nil? }
82
+ ]
83
+ end
84
+
85
+ def attendees_to_jsns
86
+ @appointment.attendees.map do |attendee|
87
+ {
88
+ a: attendee.email,
89
+ d: attendee.display_name,
90
+ role: attendee.role,
91
+ ptst: attendee.ptst,
92
+ rsvp: attendee.rsvp
93
+ }.reject { |_, v| v.nil? }
94
+ end
95
+ end
96
+
97
+ def end_at_jsns
98
+ {
99
+ d: @appointment.end_at.strftime(time_format),
100
+ tz: @appointment.timezone
101
+ }
102
+ end
103
+
104
+ def start_at_jsns
105
+ {
106
+ d: @appointment.start_at.strftime(time_format),
107
+ tz: @appointment.timezone
108
+ }
109
+ end
110
+
111
+ def organizer_to_jsns
112
+ return nil if @appointment.organizer.nil?
113
+
114
+ {
115
+ a: @appointment.organizer.email,
116
+ d: @appointment.organizer.display_name
117
+ }.reject { |_, v| v.nil? }
118
+ end
119
+
120
+ def time_format
121
+ @time_format ||= @appointment.allDay ? '%Y%m%d' : '%Y%m%dT%H%M00'
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ # class for account appointment
6
+ class AppointmentJsnsInitializer
7
+
8
+ attr_accessor :appointment
9
+
10
+ def initialize(parent, json)
11
+ @parent = parent
12
+ @json = json
13
+ end
14
+
15
+ def update
16
+ return false if @appointment.nil?
17
+
18
+ @appointment.calItemId = @json[:calItemId]
19
+ @appointment.apptId = @json[:apptId]
20
+ @appointment.invId = @json[:invId]
21
+ @appointment.id = @json[:invId]
22
+ @appointment.rev = @json[:rev]
23
+
24
+ true
25
+ end
26
+
27
+ def create
28
+ @appointment ||= Appointment.new(@parent)
29
+
30
+ @appointment.id = @json[:id]
31
+ @appointment.tn = @json[:tn]
32
+ @appointment.l = @json[:l].to_i
33
+ @appointment.uid = @json[:uid]
34
+
35
+ if inv.nil?
36
+ init_from_search
37
+ else
38
+ init_from_inv
39
+ end
40
+
41
+ @appointment
42
+ end
43
+
44
+ def inv
45
+ @inv ||= @json[:inv]&.first
46
+ end
47
+
48
+ def init_from_search
49
+ @appointment.organizer = Zm::Client::Appointment::Organizer.new(search_organizer_name) unless search_organizer_name.nil?
50
+ @appointment.name = @json[:name]
51
+ @appointment.id = @json[:invId]
52
+ @appointment.desc = @json[:fr]
53
+ @appointment.allDay = @json[:allDay] unless @json[:allDay].nil?
54
+ search_make_date
55
+ end
56
+
57
+ def init_from_inv
58
+ @appointment.uid = comp[:uid]
59
+ @appointment.fb = comp[:fb]
60
+ @appointment.transp = comp[:transp]
61
+ @appointment.timezone = tz[:id]
62
+ @appointment.name = comp[:name]
63
+ @appointment.desc = comp[:desc].first[:_content] unless comp[:desc].nil?
64
+ @appointment.apptId = comp[:apptId]
65
+ @appointment.allDay = comp[:allDay] unless comp[:allDay].nil?
66
+
67
+ @appointment.organizer = Zm::Client::Appointment::Organizer.new(comp_organizer_name) unless comp_organizer_name.nil?
68
+
69
+ attendees.each do |attendee|
70
+ @appointment.attendees.add(Zm::Client::Appointment::Attendee.new(attendee[:a]))
71
+ end
72
+
73
+ comp_make_date
74
+ end
75
+
76
+ def search_make_date
77
+ return if @json[:inst].nil? || @json[:inst].first.empty? || @json[:dur].nil?
78
+
79
+ @appointment.start_at = Time.at(@json[:inst].first[:s] / 1000)
80
+ @appointment.end_at = Time.at((@json[:inst].first[:s] + @json[:dur]) / 1000)
81
+ @appointment.dur = @json[:dur] / 1000
82
+ end
83
+
84
+ def comp_make_date
85
+ if comp_start_h[:u].nil?
86
+ @appointment.start_at = Time.parse(comp_start_h[:d])
87
+ @appointment.end_at = Time.parse(comp_end_h[:d])
88
+ else
89
+ @appointment.start_at = Time.at(comp_start_h[:u] / 1000)
90
+ @appointment.end_at = Time.at(comp_end_h[:u] / 1000)
91
+ end
92
+ end
93
+
94
+ def comp_start_h
95
+ @comp_start_h ||= comp[:s].first
96
+ end
97
+
98
+ def comp_end_h
99
+ @comp_end_h ||= comp[:e].first
100
+ end
101
+
102
+ def tz
103
+ @tz ||= inv[:tz]&.first || { id: 'Europe/Berlin' }
104
+ end
105
+
106
+ def comp
107
+ raise Zm::Client::ZmError, 'invalid appointment received' if inv[:comp].nil?
108
+
109
+ @comp ||= inv[:comp].first
110
+ end
111
+
112
+ def comp_organizer_name
113
+ return nil if comp[:or].nil?
114
+
115
+ @comp_organizer_name ||= comp[:or][:a]
116
+ end
117
+
118
+ def search_organizer_name
119
+ return nil if @json[:or].nil?
120
+
121
+ @search_organizer_name ||= @json[:or][:a]
122
+ end
123
+
124
+ def attendees
125
+ @attendees ||= comp[:at] || []
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ # class factory [appointments]
6
+ class AppointmentsBuilder < Base::ObjectsBuilder
7
+ def initialize(parent, json)
8
+ @parent = parent
9
+ @json = json
10
+ end
11
+
12
+ def make
13
+ root.map do |s|
14
+ # Appointment.new(@parent, s)
15
+ # Appointment.new(@parent)
16
+ AppointmentJsnsInitializer.new(@parent, s).create
17
+ end
18
+ end
19
+
20
+ def ids
21
+ root.map { |s| s[:id] }
22
+ end
23
+
24
+ def root
25
+ root = @json[:Body][:SearchResponse][:appt]
26
+ return [] if root.nil?
27
+
28
+ root = [root] unless root.is_a?(Array)
29
+ root
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ # collection of appointments
6
+ class AppointmentsCollection < Base::ObjectsCollection
7
+ attr_accessor :more
8
+
9
+ def initialize(parent)
10
+ @parent = parent
11
+ @more = true
12
+ reset_query_params
13
+ end
14
+
15
+ def find(id)
16
+ rep = @parent.sacc.get_msg(@parent.token, id)
17
+ entry = rep[:Body][:GetMsgResponse][:m].first
18
+ AppointmentJsnsInitializer.new(@parent, entry).create
19
+ end
20
+
21
+ def new
22
+ appointment = Appointment.new(@parent)
23
+ yield(appointment) if block_given?
24
+ appointment
25
+ end
26
+
27
+ def start_at(start_at)
28
+ @start_at = start_at
29
+ self
30
+ end
31
+
32
+ def end_at(end_at)
33
+ @end_at = end_at
34
+ self
35
+ end
36
+
37
+ def folders(folders)
38
+ @folders = folders
39
+ @folder_ids = @folders.map(&:id)
40
+ self
41
+ end
42
+
43
+ def folder_ids(folder_ids)
44
+ @folder_ids = folder_ids
45
+ self
46
+ end
47
+
48
+ def where(query)
49
+ @query = query
50
+ self
51
+ end
52
+
53
+ def ids
54
+ search_builder.ids
55
+ end
56
+
57
+ private
58
+
59
+ def search_response
60
+ rep = @parent.sacc.search(@parent.token, 'appointment', @offset, @limit, 'dateAsc', query, build_options)
61
+ @more = rep[:Body][:SearchResponse][:more]
62
+ rep
63
+ end
64
+
65
+ def search_builder
66
+ AppointmentsBuilder.new(@parent, search_response)
67
+ end
68
+
69
+ def build_response
70
+ appointments = search_builder.make
71
+ appointments.each { |appo| appo.folder = find_folder(appo) } unless @folders.empty?
72
+ appointments
73
+ end
74
+
75
+ def build_options
76
+ return {} if !@start_at.is_a?(Time) && !@end_at.is_a?(Time)
77
+
78
+ {
79
+ calExpandInstStart: (@start_at.to_f * 1000).to_i,
80
+ calExpandInstEnd: (@end_at.to_f * 1000).to_i,
81
+ }
82
+ end
83
+
84
+ def query
85
+ return @query unless @query.nil?
86
+
87
+ return nil if @folder_ids.empty?
88
+
89
+ @folder_ids.map { |id| %Q{inid:"#{id}"} }.join(' OR ')
90
+ end
91
+
92
+ def find_folder(appointment)
93
+ @folders.find { |folder| folder.id == appointment.l }
94
+ end
95
+
96
+ def reset_query_params
97
+ super
98
+ @start_at = nil
99
+ @end_at = nil
100
+ @query = nil
101
+ @folder_ids = []
102
+ @folders = []
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'zm/client/appointment/appointment'
4
+ require 'zm/client/appointment/appointment_jsns_builder'
5
+ require 'zm/client/appointment/appointment_jsns_initializer'
6
+ require 'zm/client/appointment/appointments_builder'
7
+ require 'zm/client/appointment/appointments_collection'
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ class Backup < Base::AdminObject
6
+ INSTANCE_VARIABLE_KEYS = %i[label type aborted start end minRedoSeq maxRedoSeq live accounts]
7
+
8
+ attr_reader *INSTANCE_VARIABLE_KEYS
9
+
10
+ alias name label
11
+
12
+ def server
13
+ parent
14
+ end
15
+
16
+ def to_h
17
+ hashmap = Hash[INSTANCE_VARIABLE_KEYS.map { |key| [key, instance_variable_get(arrow_name(key))] }]
18
+ hashmap.delete_if { |_, v| v.nil? }
19
+ hashmap
20
+ end
21
+
22
+ def to_s
23
+ to_h.to_s
24
+ end
25
+
26
+ def start_at
27
+ @start_at ||= Time.at(@start / 1000)
28
+ rescue StandardError => e
29
+ nil
30
+ end
31
+
32
+ def end_at
33
+ @end_at ||= Time.at(@end / 1000)
34
+ rescue StandardError => e
35
+ nil
36
+ end
37
+
38
+ def full?
39
+ @type == Zm::Client::BackupTypes::FULL
40
+ end
41
+
42
+ def incremental?
43
+ @type == Zm::Client::BackupTypes::INCREMENTAL
44
+ end
45
+
46
+ def init_from_json(json)
47
+ @label = json[:label]
48
+ @type = json[:type]
49
+ @aborted = json[:aborted]
50
+ @start = json[:start].to_i
51
+ @end = json[:end].to_i
52
+ @minRedoSeq = json[:minRedoSeq]
53
+ @maxRedoSeq = json[:maxRedoSeq]
54
+ @live = json[:live]
55
+ @accounts = json[:accounts]
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ # class factory [Backup]
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
17
+ end
18
+
19
+ private
20
+
21
+ def json_items
22
+ @json_items ||= @json[:Body][json_key][:backup]
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ # Collection Backups
6
+ class BackupsCollection < Base::ObjectsCollection
7
+ def initialize(parent)
8
+ @parent = parent
9
+ end
10
+
11
+ private
12
+
13
+ def make_query
14
+ sac.backup_query(@parent.id)
15
+ end
16
+
17
+ def build_response
18
+ BackupsBuilder.new(@parent, make_query).make
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'zm/client/backup/backup'
4
+ require 'zm/client/backup/backups_builder'
5
+ require 'zm/client/backup/backups_collection'
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zm
4
+ module Client
5
+ module Base
6
+ # Abstract Class Provisionning AccountObject
7
+ class AccountObject < Object
8
+
9
+ def soap_account_connector
10
+ @parent.soap_account_connector
11
+ end
12
+
13
+ alias sacc soap_account_connector
14
+ end
15
+ end
16
+ end
17
+ end