zm-ruby-client 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) 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 +345 -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 +121 -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/token_metadata.rb +44 -0
  39. data/lib/zm/client/common.rb +5 -0
  40. data/lib/zm/client/config.rb +12 -0
  41. data/lib/zm/client/connector/rest_account.rb +74 -0
  42. data/lib/zm/client/connector/soap_account.rb +563 -0
  43. data/lib/zm/client/connector/soap_admin.rb +532 -0
  44. data/lib/zm/client/connector/soap_base.rb +65 -0
  45. data/lib/zm/client/connector/soap_error.rb +26 -0
  46. data/lib/zm/client/connector/soap_xml_builder.rb +68 -0
  47. data/lib/zm/client/constant.rb +217 -0
  48. data/lib/zm/client/contact/contact.rb +124 -0
  49. data/lib/zm/client/contact/contact_member.rb +73 -0
  50. data/lib/zm/client/contact/contacts_builder.rb +24 -0
  51. data/lib/zm/client/contact/contacts_collection.rb +26 -0
  52. data/lib/zm/client/contact/mod_group_contact.rb +74 -0
  53. data/lib/zm/client/contact.rb +7 -0
  54. data/lib/zm/client/cos/cos.rb +59 -0
  55. data/lib/zm/client/cos/coses_builder.rb +29 -0
  56. data/lib/zm/client/cos/coses_collection.rb +33 -0
  57. data/lib/zm/client/cos.rb +5 -0
  58. data/lib/zm/client/data_source.rb +5 -0
  59. data/lib/zm/client/distributionlist/distributionlist.rb +125 -0
  60. data/lib/zm/client/distributionlist/distributionlists_builder.rb +29 -0
  61. data/lib/zm/client/distributionlist/distributionlists_collection.rb +41 -0
  62. data/lib/zm/client/distributionlist.rb +5 -0
  63. data/lib/zm/client/document/document.rb +51 -0
  64. data/lib/zm/client/document/documents_builder.rb +31 -0
  65. data/lib/zm/client/document/documents_collection.rb +93 -0
  66. data/lib/zm/client/document.rb +5 -0
  67. data/lib/zm/client/domain/domain.rb +85 -0
  68. data/lib/zm/client/domain/domains_builder.rb +32 -0
  69. data/lib/zm/client/domain/domains_collection.rb +36 -0
  70. data/lib/zm/client/domain.rb +5 -0
  71. data/lib/zm/client/folder/folder.rb +215 -0
  72. data/lib/zm/client/folder/folder_grant.rb +58 -0
  73. data/lib/zm/client/folder/folder_retention_policy.rb +48 -0
  74. data/lib/zm/client/folder/folders_builder.rb +58 -0
  75. data/lib/zm/client/folder/folders_collection.rb +95 -0
  76. data/lib/zm/client/folder/mod_document_folder.rb +17 -0
  77. data/lib/zm/client/folder.rb +8 -0
  78. data/lib/zm/client/identity/identities_builder.rb +25 -0
  79. data/lib/zm/client/identity/identities_collection.rb +26 -0
  80. data/lib/zm/client/identity/identity.rb +75 -0
  81. data/lib/zm/client/identity.rb +5 -0
  82. data/lib/zm/client/license/license.rb +29 -0
  83. data/lib/zm/client/license/licenses_collection.rb +28 -0
  84. data/lib/zm/client/license.rb +4 -0
  85. data/lib/zm/client/message/message.rb +225 -0
  86. data/lib/zm/client/message/messages_builder.rb +31 -0
  87. data/lib/zm/client/message/messages_collection.rb +111 -0
  88. data/lib/zm/client/message.rb +5 -0
  89. data/lib/zm/client/mountpoint/mountpoint.rb +95 -0
  90. data/lib/zm/client/mountpoint/mountpoints_builder.rb +38 -0
  91. data/lib/zm/client/mountpoint/mountpoints_collection.rb +61 -0
  92. data/lib/zm/client/mountpoint.rb +5 -0
  93. data/lib/zm/client/mta_queue/mta_queue.rb +60 -0
  94. data/lib/zm/client/mta_queue/mta_queues_builder.rb +26 -0
  95. data/lib/zm/client/mta_queue/mta_queues_collection.rb +95 -0
  96. data/lib/zm/client/mta_queue.rb +5 -0
  97. data/lib/zm/client/mta_queue_item/mta_queue_item.rb +51 -0
  98. data/lib/zm/client/mta_queue_item/mta_queue_items_builder.rb +27 -0
  99. data/lib/zm/client/mta_queue_item/mta_queue_items_collection.rb +99 -0
  100. data/lib/zm/client/mta_queue_item.rb +5 -0
  101. data/lib/zm/client/resource/resource.rb +149 -0
  102. data/lib/zm/client/resource/resources_builder.rb +29 -0
  103. data/lib/zm/client/resource/resources_collection.rb +41 -0
  104. data/lib/zm/client/resource.rb +5 -0
  105. data/lib/zm/client/search_folder/search_folder.rb +63 -0
  106. data/lib/zm/client/search_folder/search_folders_builder.rb +26 -0
  107. data/lib/zm/client/search_folder/search_folders_collection.rb +28 -0
  108. data/lib/zm/client/search_folder.rb +5 -0
  109. data/lib/zm/client/server/server.rb +516 -0
  110. data/lib/zm/client/server/servers_builder.rb +26 -0
  111. data/lib/zm/client/server/servers_collection.rb +37 -0
  112. data/lib/zm/client/server.rb +5 -0
  113. data/lib/zm/client/share/share.rb +60 -0
  114. data/lib/zm/client/share/shares_builder.rb +23 -0
  115. data/lib/zm/client/share/shares_collection.rb +48 -0
  116. data/lib/zm/client/share.rb +5 -0
  117. data/lib/zm/client/signature/signature.rb +62 -0
  118. data/lib/zm/client/signature/signature_jsns_builder.rb +29 -0
  119. data/lib/zm/client/signature/signatures_builder.rb +26 -0
  120. data/lib/zm/client/signature/signatures_collection.rb +28 -0
  121. data/lib/zm/client/signature.rb +6 -0
  122. data/lib/zm/client/tag/tag.rb +45 -0
  123. data/lib/zm/client/tag/tags_builder.rb +25 -0
  124. data/lib/zm/client/tag/tags_collection.rb +26 -0
  125. data/lib/zm/client/tag.rb +5 -0
  126. data/lib/zm/client/task/task.rb +74 -0
  127. data/lib/zm/client/task/tasks_builder.rb +31 -0
  128. data/lib/zm/client/task/tasks_collection.rb +100 -0
  129. data/lib/zm/client/task.rb +5 -0
  130. data/lib/zm/client/upload/upload.rb +154 -0
  131. data/lib/zm/client/upload.rb +3 -0
  132. data/lib/zm/client/version.rb +18 -0
  133. data/lib/zm/client.rb +5 -0
  134. data/lib/zm/modules/common/account_common.rb +71 -0
  135. data/lib/zm/modules/common/cos_common.rb +463 -0
  136. data/lib/zm/modules/common/dl_common.rb +36 -0
  137. data/lib/zm/modules/common/identity_common.rb +19 -0
  138. data/lib/zm/modules/common/resource_common.rb +59 -0
  139. data/lib/zm/modules/common/signature_common.rb +16 -0
  140. data/lib/zm/modules/common/zimbra-attrs.json +1 -0
  141. data/lib/zm/utils/thread_pool.rb +72 -0
  142. data/lib/zm-ruby-client.rb +1 -0
  143. data/test/accounts.rb +62 -0
  144. data/test/cluster_config.rb +30 -0
  145. data/test/coses.rb +26 -0
  146. data/test/domains.rb +70 -0
  147. data/zm-ruby-client.gemspec +24 -0
  148. metadata +244 -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