gitlab_support_readiness 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/lib/support_readiness/client.rb +108 -0
  3. data/lib/support_readiness/gitlab/client.rb +64 -0
  4. data/lib/support_readiness/gitlab/configuration.rb +46 -0
  5. data/lib/support_readiness/gitlab/groups.rb +180 -0
  6. data/lib/support_readiness/gitlab/issues.rb +410 -0
  7. data/lib/support_readiness/gitlab/namespaces.rb +190 -0
  8. data/lib/support_readiness/gitlab/projects.rb +510 -0
  9. data/lib/support_readiness/gitlab/repositories.rb +267 -0
  10. data/lib/support_readiness/gitlab/users.rb +488 -0
  11. data/lib/support_readiness/gitlab.rb +19 -0
  12. data/lib/support_readiness/pagerduty/client.rb +66 -0
  13. data/lib/support_readiness/pagerduty/configuration.rb +43 -0
  14. data/lib/support_readiness/pagerduty/escalation_policies.rb +123 -0
  15. data/lib/support_readiness/pagerduty/schedules.rb +223 -0
  16. data/lib/support_readiness/pagerduty/services.rb +132 -0
  17. data/lib/support_readiness/pagerduty.rb +16 -0
  18. data/lib/support_readiness/redis.rb +90 -0
  19. data/lib/support_readiness/zendesk/articles.rb +210 -0
  20. data/lib/support_readiness/zendesk/automations.rb +304 -0
  21. data/lib/support_readiness/zendesk/client.rb +84 -0
  22. data/lib/support_readiness/zendesk/configuration.rb +49 -0
  23. data/lib/support_readiness/zendesk/group_memberships.rb +256 -0
  24. data/lib/support_readiness/zendesk/groups.rb +249 -0
  25. data/lib/support_readiness/zendesk/job_statuses.rb +188 -0
  26. data/lib/support_readiness/zendesk/macros.rb +267 -0
  27. data/lib/support_readiness/zendesk/organization_fields.rb +233 -0
  28. data/lib/support_readiness/zendesk/organization_memberships.rb +257 -0
  29. data/lib/support_readiness/zendesk/organizations.rb +515 -0
  30. data/lib/support_readiness/zendesk/roles.rb +194 -0
  31. data/lib/support_readiness/zendesk/search.rb +159 -0
  32. data/lib/support_readiness/zendesk/sla_policies.rb +232 -0
  33. data/lib/support_readiness/zendesk/ticket_fields.rb +222 -0
  34. data/lib/support_readiness/zendesk/ticket_forms.rb +290 -0
  35. data/lib/support_readiness/zendesk/tickets.rb +854 -0
  36. data/lib/support_readiness/zendesk/triggers.rb +269 -0
  37. data/lib/support_readiness/zendesk/users.rb +946 -0
  38. data/lib/support_readiness/zendesk/views.rb +469 -0
  39. data/lib/support_readiness/zendesk.rb +31 -0
  40. data/lib/support_readiness.rb +29 -0
  41. metadata +215 -0
@@ -0,0 +1,854 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the module Readiness.
4
+ module Readiness
5
+ # Defines the module Zendesk
6
+ module Zendesk
7
+ ##
8
+ # Defines the class Tickets within the module {Readiness::Zendesk}.
9
+ #
10
+ # @author Jason Colyer
11
+ # @since 1.0.0
12
+ class Tickets < Readiness::Client
13
+ attr_accessor :assignee_id, :additional_tags, :brand_id, :collaborator_ids, :comment, :custom_fields, :custom_status_id, :description, :due_at, :email_cc_ids, :fields, :follower_ids, :followup_ids, :group_id, :has_incidents, :id, :is_public, :organization_id, :priority, :problem_id, :remove_tags, :requester_id, :satisfaction_rating, :status, :subject, :submitter_id, :tags, :ticket_form_id, :type, :via, :via_followup_source_id
14
+
15
+ ##
16
+ # Creates a new {Readiness::Zendesk::Tickets} instance
17
+ #
18
+ # @author Jason Colyer
19
+ # @since 1.0.0
20
+ # @param object [Object] An instance of {Readiness::Zendesk::Tickets}
21
+ # @example
22
+ # require 'support_readiness'
23
+ # Readiness::Zendesk::Tickets.new
24
+ def initialize(object = {})
25
+ @assignee_id = object['assignee_id']
26
+ @additional_tags = object['additional_tags']
27
+ @brand_id = object['brand_id']
28
+ @collaborator_ids = object['collaborator_ids']
29
+ @comment = object['comment']
30
+ @custom_fields = object['custom_fields']
31
+ @custom_status_id = object['custom_status_id']
32
+ @description = object['description']
33
+ @due_at = object['due_at']
34
+ @email_cc_ids = object['email_cc_ids']
35
+ @fields = object['fields']
36
+ @follower_ids = object['follower_ids']
37
+ @followup_ids = object['followup_ids']
38
+ @group_id = object['group_id']
39
+ @has_incidents = object['has_incidents']
40
+ @id = object['id']
41
+ @is_public = object['is_public']
42
+ @organization_id = object['organization_id']
43
+ @priority = object['priority']
44
+ @problem_id = object['problem_id']
45
+ @remove_tags = object['remove_tags']
46
+ @requester_id = object['request_id']
47
+ @satisfaction_rating = object['satisfaction_rating']
48
+ @status = object['status']
49
+ @subject = object['subject']
50
+ @submitter_id = object['submitter_id']
51
+ @tags = object['tags']
52
+ @ticket_form_id = object['ticket_form_id']
53
+ @type = object['type']
54
+ @via = object['via']
55
+ @via_followup_source_id = object['via_followup_source_id']
56
+ end
57
+
58
+ ##
59
+ # Lists the collaborators on a ticket
60
+ #
61
+ # @author Jason Colyer
62
+ # @since 1.0.0
63
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
64
+ # @param ticket [Object] An instance of {Readiness::Zendesk::Tickets}
65
+ # @return [Array]
66
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#list-collaborators-for-a-ticket Zendesk API > Tickets > List Collaborators for a Ticket
67
+ # @example
68
+ # require 'support_readiness'
69
+ # config = Readiness::Zendesk::Configuration.new
70
+ # config.username = 'alice@example.com'
71
+ # config.token = 'test123abc'
72
+ # config.url = 'https://example.zendesk.com/api/v2'
73
+ # client = Readiness::Zendesk::Client.new(config)
74
+ # ticket = Readiness::Zendesk::Tickets.find!(client, 123456)
75
+ # users = Readiness::Zendesk::Tickets.collaborators(client, ticket)
76
+ # pp users.first.name
77
+ # # => "Johnny Agent"
78
+ def self.collaborators(client, ticket)
79
+ response = client.connection.get("tickets/#{ticket.id}/collaborators")
80
+ handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
81
+ Oj.load(response.body)['users']
82
+ end
83
+
84
+ ##
85
+ # Lists the followers on a ticket
86
+ #
87
+ # @author Jason Colyer
88
+ # @since 1.0.0
89
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
90
+ # @param ticket [Object] An instance of {Readiness::Zendesk::Tickets}
91
+ # @return [Array]
92
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#list-followers-for-a-ticket Zendesk API > Tickets > List Followers for a Ticket
93
+ # @example
94
+ # require 'support_readiness'
95
+ # config = Readiness::Zendesk::Configuration.new
96
+ # config.username = 'alice@example.com'
97
+ # config.token = 'test123abc'
98
+ # config.url = 'https://example.zendesk.com/api/v2'
99
+ # client = Readiness::Zendesk::Client.new(config)
100
+ # ticket = Readiness::Zendesk::Tickets.find!(client, 123456)
101
+ # users = Readiness::Zendesk::Tickets.followers(client, ticket)
102
+ # pp users.last.name
103
+ # # => "Peter Admin"
104
+ def self.followers(client, ticket)
105
+ response = client.connection.get("tickets/#{ticket.id}/followers")
106
+ handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
107
+ Oj.load(response.body)['users']
108
+ end
109
+
110
+ ##
111
+ # Lists the CCs on a ticket
112
+ #
113
+ # @author Jason Colyer
114
+ # @since 1.0.0
115
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
116
+ # @param ticket [Object] An instance of {Readiness::Zendesk::Tickets}
117
+ # @return [Array]
118
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#list-email-ccs-for-a-ticket Zendesk API > Tickets > List Email CCs for a Ticket
119
+ # @example
120
+ # require 'support_readiness'
121
+ # config = Readiness::Zendesk::Configuration.new
122
+ # config.username = 'alice@example.com'
123
+ # config.token = 'test123abc'
124
+ # config.url = 'https://example.zendesk.com/api/v2'
125
+ # client = Readiness::Zendesk::Client.new(config)
126
+ # ticket = Readiness::Zendesk::Tickets.find!(client, 123456)
127
+ # users = Readiness::Zendesk::Tickets.ccs(client, ticket)
128
+ # pp users.last.name
129
+ # # => "Jane End User"
130
+ def self.ccs(client, ticket)
131
+ response = client.connection.get("tickets/#{ticket.id}/email_ccs")
132
+ handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
133
+ Oj.load(response.body)['users']
134
+ end
135
+
136
+ ##
137
+ # Deletes multiple tickets via a batch job
138
+ #
139
+ # @author Jason Colyer
140
+ # @since 1.0.0
141
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
142
+ # @param tids [Array] An array of ticket IDs
143
+ # @return [object] A {Readiness::Zendesk::JobStatuses} instance
144
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#bulk-delete-tickets Zendesk API > Tickets > Bulk Delete Tickets
145
+ # @example
146
+ # require 'support_readiness'
147
+ # config = Readiness::Zendesk::Configuration.new
148
+ # config.username = 'alice@example.com'
149
+ # config.token = 'test123abc'
150
+ # config.url = 'https://example.zendesk.com/api/v2'
151
+ # client = Readiness::Zendesk::Client.new(config)
152
+ # delete = Readiness::Zendesk::Tickets.delete_many!(client, [35436, 35437])
153
+ # pp delete.id
154
+ # # => "82de0b044094f0c67893ac9fe64f1a99"
155
+ def self.delete_many!(client, tids)
156
+ response = client.connection.delete("tickets/destroy_many?ids=#{tids.join(',')}")
157
+ handle_request_error(1, 'Zendesk', response.status, { action: 'Delete many tickets', message: Oj.load(response.body)}) unless response.status == 200
158
+ JobStatuses.new(Oj.load(response.body)['job_status'])
159
+ end
160
+
161
+ ##
162
+ # Updates multiple tickets via a batch job
163
+ #
164
+ # @author Jason Colyer
165
+ # @since 1.0.0
166
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
167
+ # @param tickets [Array] An array of {Readiness::Zendesk::Tickets} instances
168
+ # @return [object] A {Readiness::Zendesk::JobStatuses} instance
169
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#update-many-tickets Zendesk API > Tickets > Update Many Tickets
170
+ # @example
171
+ # require 'support_readiness'
172
+ # config = Readiness::Zendesk::Configuration.new
173
+ # config.username = 'alice@example.com'
174
+ # config.token = 'test123abc'
175
+ # config.url = 'https://example.zendesk.com/api/v2'
176
+ # client = Readiness::Zendesk::Client.new(config)
177
+ # ticket1 = Readiness::Zendesk::Tickets.find!(client, 1)
178
+ # ticket1.status = 'solved'
179
+ # ticket2 = Readiness::Zendesk::Tickets.find!(client, 2)
180
+ # ticket2.status = 'pending'
181
+ # tickets = [ticket1, ticket2]
182
+ # updates = Readiness::Zendesk::Tickets.update_many!(client, tickets)
183
+ # pp updates.id
184
+ # # => "82de0b044094f0c67893ac9fe64f1a99"
185
+ def self.update_many!(client, tickets)
186
+ data = { tickets: tickets.map { |t| to_hash(t).compact } }.to_json
187
+ response = client.connection.put('tickets/update_many', data)
188
+ handle_request_error(1, 'Zendesk', response.status, { action: 'Update many tickets', message: Oj.load(response.body)}) unless response.status == 200
189
+ JobStatuses.new(Oj.load(response.body)['job_status'])
190
+ end
191
+
192
+ ##
193
+ # Creates multiple tickets via a batch job
194
+ #
195
+ # @author Jason Colyer
196
+ # @since 1.0.0
197
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
198
+ # @param tickets [Array] An array of {Readiness::Zendesk::Tickets} instances
199
+ # @return [object] A {Readiness::Zendesk::JobStatuses} instance
200
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#create-many-tickets Zendesk API > Tickets > Create Many Tickets
201
+ # @example
202
+ # require 'support_readiness'
203
+ # config = Readiness::Zendesk::Configuration.new
204
+ # config.username = 'alice@example.com'
205
+ # config.token = 'test123abc'
206
+ # config.url = 'https://example.zendesk.com/api/v2'
207
+ # client = Readiness::Zendesk::Client.new(config)
208
+ # ticket1 = Readiness::Zendesk::Tickets.new
209
+ # ticket1.comment = { body: 'The smoke is very colorful'}
210
+ # ticket1.priority = 'urgent'
211
+ # ticket1.subject = 'My printer is on fire!'
212
+ # ticket2 = Readiness::Zendesk::Tickets.new
213
+ # ticket2.comment = { body: 'This is a comment'}
214
+ # ticket2.priority = 'normal'
215
+ # ticket2.subject = 'Help'
216
+ # tickets = [ticket1, ticket2]
217
+ # creates = Readiness::Zendesk::Tickets.create_many!(client, tickets)
218
+ # pp creates.id
219
+ # # => "82de0b044094f0c67893ac9fe64f1a99"
220
+ def self.create_many!(client, tickets)
221
+ data = { tickets: tickets.map { |t| to_hash(t).compact } }.to_json
222
+ response = client.connection.post('tickets/create_many', data)
223
+ handle_request_error(1, 'Zendesk', response.status, { action: 'Create many tickets', message: Oj.load(response.body)}) unless response.status == 200
224
+ JobStatuses.new(Oj.load(response.body)['job_status'])
225
+ end
226
+
227
+ ##
228
+ # Lists the comments on a ticket
229
+ #
230
+ # @author Jason Colyer
231
+ # @since 1.0.0
232
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
233
+ # @param sort [String] What sorting method to use
234
+ # - created_at => Sort by created_at ASC
235
+ # - -created_at => Sort by created_at DESC
236
+ # @return [Array]
237
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/ticket_comments/#list-comments Zendesk API > Ticket comments > List Comments
238
+ # @example
239
+ # require 'support_readiness'
240
+ # config = Readiness::Zendesk::Configuration.new
241
+ # config.username = 'alice@example.com'
242
+ # config.token = 'test123abc'
243
+ # config.url = 'https://example.zendesk.com/api/v2'
244
+ # client = Readiness::Zendesk::Client.new(config)
245
+ # ticket = Readiness::Zendesk::Tickets.find!(client, 123456)
246
+ # comments = Readiness::Zendesk::Tickets.find!(client, ticket)
247
+ # pp creates.select { |c| c['public'] == false }.count
248
+ # # => 12
249
+ def self.comments(client, ticket, sort = 'created_at')
250
+ array = []
251
+ opts = "page[size]=100&sort=#{sort}"
252
+ loop do
253
+ response = client.connection.get("tickets/#{ticket.id}/comments?#{opts}")
254
+ handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
255
+ body = Oj.load(response.body)
256
+ array += body['comments']
257
+ break unless body['meta']['has_more']
258
+
259
+ opts = body['links'] ['next'].split('?').last
260
+ end
261
+ array
262
+ end
263
+
264
+ ##
265
+ # Creates a ticket. Will exit if unsuccessful
266
+ #
267
+ # @author Jason Colyer
268
+ # @since 1.0.0
269
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
270
+ # @param ticket [Object] An instance of {Readiness::Zendesk::Tickets}
271
+ # @return [Object] An instance of {Readiness::Zendesk::Tickets}
272
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#create-ticket Zendesk API > Tickets > Create Ticket
273
+ # @example
274
+ # require 'support_readiness'
275
+ # config = Readiness::Zendesk::Configuration.new
276
+ # config.username = 'alice@example.com'
277
+ # config.token = 'test123abc'
278
+ # config.url = 'https://example.zendesk.com/api/v2'
279
+ # client = Readiness::Zendesk::Client.new(config)
280
+ # ticket = Readiness::Zendesk::Tickets.new
281
+ # ticket.comment = { body: 'The smoke is very colorful'}
282
+ # ticket.priority = 'urgent'
283
+ # ticket.subject = 'My printer is on fire!'
284
+ # create = Readiness::Zendesk::Tickets.create!(client, ticket)
285
+ # pp create.id
286
+ # # => 35436
287
+ def self.create!(client, ticket)
288
+ response = client.connection.post 'tickets', to_clean_json_with_key(ticket, 'ticket')
289
+ handle_request_error(1, 'Zendesk', response.status, { action: 'Create ticket', message: Oj.load(response.body)}) unless response.status == 201
290
+ Tickets.new(Oj.load(response.body)['ticket'])
291
+ end
292
+
293
+ ##
294
+ # Updates a ticket. Will exit if unsuccessful
295
+ #
296
+ # @author Jason Colyer
297
+ # @since 1.0.0
298
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
299
+ # @param ticket [Object] An instance of {Readiness::Zendesk::Tickets}
300
+ # @return [Object] An instance of {Readiness::Zendesk::Tickets}
301
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#update-ticket Zendesk API > Tickets > Update Ticket
302
+ # @example
303
+ # require 'support_readiness'
304
+ # config = Readiness::Zendesk::Configuration.new
305
+ # config.username = 'alice@example.com'
306
+ # config.token = 'test123abc'
307
+ # config.url = 'https://example.zendesk.com/api/v2'
308
+ # client = Readiness::Zendesk::Client.new(config)
309
+ # ticket = Readiness::Zendesk::Tickets.find!(client, 35436)
310
+ # ticket.status = 'open'
311
+ # ticket.custom_status_id = 123
312
+ # ticket.comment = { body: '"The smoke is very colorful', author_id: 494820284 }
313
+ # update = Readiness::Zendesk::Tickets.update!(client, ticket)
314
+ # pp update.status
315
+ # # => "open"
316
+ def self.update!(client, ticket)
317
+ response = client.connection.put "tickets/#{ticket.id}", to_clean_json_with_key(ticket, 'ticket')
318
+ handle_request_error(1, 'Zendesk', response.status, { action: 'Update ticket', id: ticket.id, message: Oj.load(response.body)}) unless response.status == 200
319
+ Tickets.new(Oj.load(response.body)['ticket'])
320
+ end
321
+
322
+ ##
323
+ # Marks a ticket as spam and suspends the user. Will exit if unsuccessful
324
+ #
325
+ # @author Jason Colyer
326
+ # @since 1.0.0
327
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
328
+ # @param ticket [Object] An instance of {Readiness::Zendesk::Tickets}
329
+ # @return [Boolean]
330
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#mark-ticket-as-spam-and-suspend-requester Zendesk API > Tickets > Mark Ticket as Spam and Suspend Requester
331
+ # @example
332
+ # require 'support_readiness'
333
+ # config = Readiness::Zendesk::Configuration.new
334
+ # config.username = 'alice@example.com'
335
+ # config.token = 'test123abc'
336
+ # config.url = 'https://example.zendesk.com/api/v2'
337
+ # client = Readiness::Zendesk::Client.new(config)
338
+ # ticket = Readiness::Zendesk::Tickets.find!(client, 123456)
339
+ # mark = Readiness::Zendesk::Tickets.mark_as_spam!(client, ticket)
340
+ # pp mark
341
+ # # => true
342
+ def self.mark_as_spam!(client, ticket)
343
+ response = client.connection.put "tickets/#{ticket.id}/mark_as_spam"
344
+ handle_request_error(1, 'Zendesk', response.status, { action: 'Mark ticket as spam', id: ticket.id, message: Oj.load(response.body)}) unless response.status == 200
345
+ true
346
+ end
347
+
348
+ ##
349
+ # Deletes a ticket. Will exit if unsuccessful
350
+ #
351
+ # @author Jason Colyer
352
+ # @since 1.0.0
353
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
354
+ # @param ticket [Object] An instance of {Readiness::Zendesk::Tickets}
355
+ # @return [Boolean]
356
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#delete-ticket Zendesk API > Tickets > Delete Ticket
357
+ # @example
358
+ # require 'support_readiness'
359
+ # config = Readiness::Zendesk::Configuration.new
360
+ # config.username = 'alice@example.com'
361
+ # config.token = 'test123abc'
362
+ # config.url = 'https://example.zendesk.com/api/v2'
363
+ # client = Readiness::Zendesk::Client.new(config)
364
+ # ticket = Readiness::Zendesk::Tickets.find!(client, 123456)
365
+ # delete = Readiness::Zendesk::Tickets.delete!(client, ticket)
366
+ # pp delete
367
+ # # => true
368
+ def self.delete!(client, ticket)
369
+ response = client.connection.delete "tickets/#{ticket.id}"
370
+ handle_request_error(1, 'Zendesk', response.status, { action: 'Delete a ticket', id: ticket.id, message: Oj.load(response.body)}) unless response.status == 204
371
+ true
372
+ end
373
+
374
+ ##
375
+ # Lists the first 100 deleted tickets
376
+ #
377
+ # @author Jason Colyer
378
+ # @since 1.0.0
379
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
380
+ # @param sort [String] What sorting method to use
381
+ # - updated_at => Sort by updated_at ASC
382
+ # - id => Sort by id ASC
383
+ # - status => Sort by status ASC
384
+ # - -updated_at => Sort by updated_at DESC
385
+ # - -id => Sort by id DESC
386
+ # - -status => Sort by status DESC
387
+ # @return [Array]
388
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#list-deleted-tickets Zendesk API > Tickets > List Deleted Tickets
389
+ # @example
390
+ # require 'support_readiness'
391
+ # config = Readiness::Zendesk::Configuration.new
392
+ # config.username = 'alice@example.com'
393
+ # config.token = 'test123abc'
394
+ # config.url = 'https://example.zendesk.com/api/v2'
395
+ # client = Readiness::Zendesk::Client.new(config)
396
+ # tickets = Readiness::Zendesk::Tickets.list_deleted(client)
397
+ # pp tickets.count
398
+ # # => 1
399
+ def self.list_deleted(client, sort = 'id')
400
+ response = client.connection.get("deleted_tickets?page[size]=100&sort=#{sort}")
401
+ handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
402
+ Oj.load(response.body)['deleted_tickets']
403
+ end
404
+
405
+ ##
406
+ # Lists many deleted tickets. Does not stop until it ends or the page limit is hit.
407
+ # This method can take a long time to run depending on the parameters used.
408
+ #
409
+ # @author Jason Colyer
410
+ # @since 1.0.0
411
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
412
+ # @param limit [Integer] The number of pages to stop at. Using 0 means to list all.
413
+ # @param sort [String] What sorting method to use
414
+ # - updated_at => Sort by updated_at ASC
415
+ # - id => Sort by id ASC
416
+ # - status => Sort by status ASC
417
+ # - -updated_at => Sort by updated_at DESC
418
+ # - -id => Sort by id DESC
419
+ # - -status => Sort by status DESC
420
+ # @return [Array]
421
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#list-deleted-tickets Zendesk API > Tickets > List Deleted Tickets
422
+ # @example
423
+ # require 'support_readiness'
424
+ # config = Readiness::Zendesk::Configuration.new
425
+ # config.username = 'alice@example.com'
426
+ # config.token = 'test123abc'
427
+ # config.url = 'https://example.zendesk.com/api/v2'
428
+ # client = Readiness::Zendesk::Client.new(config)
429
+ # tickets = Readiness::Zendesk::Tickets.list_many_deleted(client, 3)
430
+ # pp tickets.count
431
+ # # => 267
432
+ def self.list_many_deleted(client, limit = 0, sort = 'id')
433
+ array = []
434
+ opts = "page[size]=100&sort=#{sort}"
435
+ loop do
436
+ response = client.connection.get("deleted_tickets?#{opts}")
437
+ handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
438
+ body = Oj.load(response.body)
439
+ array += body['deleted_tickets']
440
+ break if limit != 0 && array.count >= (limit * 100)
441
+ break unless body['meta']['has_more']
442
+
443
+ opts = body['links'] ['next'].split('?').last
444
+ end
445
+ array
446
+ end
447
+
448
+ ##
449
+ # Restores a deleted ticket. This will exit if unsuccessful
450
+ #
451
+ # @author Jason Colyer
452
+ # @since 1.0.0
453
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
454
+ # @param tid [Integer] The deleted ticket's ID
455
+ # @return [Boolean]
456
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#restore-a-previously-deleted-ticket Zendesk API > Tickets > Restore a Previously Deleted Ticket
457
+ # @example
458
+ # require 'support_readiness'
459
+ # config = Readiness::Zendesk::Configuration.new
460
+ # config.username = 'alice@example.com'
461
+ # config.token = 'test123abc'
462
+ # config.url = 'https://example.zendesk.com/api/v2'
463
+ # client = Readiness::Zendesk::Client.new(config)
464
+ # ticket = Readiness::Zendesk::Tickets.restore!(client, 123456)
465
+ # pp ticket
466
+ # # => true
467
+ def self.restore!(client, tid)
468
+ response = client.connection.put "deleted_tickets/#{tid}/restore"
469
+ handle_request_error(1, 'Zendesk', response.status) unless response.status == 200
470
+ true
471
+ end
472
+
473
+ ##
474
+ # Deletes a deleted ticket. This will exit if unsuccessful
475
+ #
476
+ # @author Jason Colyer
477
+ # @since 1.0.0
478
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
479
+ # @param tid [Integer] The deleted ticket's ID
480
+ # @return [Object] A {Readiness::Zendesk::JobStatuses} instance
481
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#delete-ticket-permanentlyt Zendesk API > Tickets > Delete Ticket Permanently
482
+ # @example
483
+ # require 'support_readiness'
484
+ # config = Readiness::Zendesk::Configuration.new
485
+ # config.username = 'alice@example.com'
486
+ # config.token = 'test123abc'
487
+ # config.url = 'https://example.zendesk.com/api/v2'
488
+ # client = Readiness::Zendesk::Client.new(config)
489
+ # delete = Readiness::Zendesk::Tickets.delete_permanently!(client, 123456)
490
+ # pp delete.id
491
+ # # => "82de0b044094f0c67893ac9fe64f1a99"
492
+ def self.delete_permanently!(client, tid)
493
+ response = client.connection.delete "deleted_tickets/#{tid}"
494
+ handle_request_error(1, 'Zendesk', response.status) unless response.status == 200
495
+ JobStatuses.new(Oj.load(response.body['job_status']))
496
+ end
497
+
498
+ ##
499
+ # Lists the incident tickets connected to a specific ticket.
500
+ #
501
+ # @author Jason Colyer
502
+ # @since 1.0.0
503
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
504
+ # @param ticket [Object] an instance of {Readiness::Zendesk::Tickets}
505
+ # @return [Array]
506
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#list-ticket-incidents Zendesk API > Tickets > List Ticket Incidents
507
+ # @example
508
+ # require 'support_readiness'
509
+ # config = Readiness::Zendesk::Configuration.new
510
+ # config.username = 'alice@example.com'
511
+ # config.token = 'test123abc'
512
+ # config.url = 'https://example.zendesk.com/api/v2'
513
+ # client = Readiness::Zendesk::Client.new(config)
514
+ # ticket = Readiness::Zendesk::Tickets.find!(client, 123456)
515
+ # incidents = Readiness::Zendesk::Tickets.incidents(client, ticket)
516
+ # pp incidents.map { |i| i.id }
517
+ # # => [33, 34]
518
+ def self.incidents(client, ticket)
519
+ array = []
520
+ opts = "page[size]=100&sort=#{sort}"
521
+ loop do
522
+ response = client.connection.get("tickets/#{ticket.id}/incidents?#{opts}")
523
+ handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
524
+ body = Oj.load(response.body)
525
+ array += body['tickets'].map { |t| Tickets.new(t) }
526
+ break if limit != 0 && array.count >= (limit * 100)
527
+ break unless body['meta']['has_more']
528
+
529
+ opts = body['links'] ['next'].split('?').last
530
+ end
531
+ array
532
+ end
533
+
534
+ ##
535
+ # Lists all problem tickets
536
+ #
537
+ # @author Jason Colyer
538
+ # @since 1.0.0
539
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
540
+ # @return [Array]
541
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#list-ticket-problems Zendesk API > Tickets > List Ticket Problems
542
+ # @example
543
+ # require 'support_readiness'
544
+ # config = Readiness::Zendesk::Configuration.new
545
+ # config.username = 'alice@example.com'
546
+ # config.token = 'test123abc'
547
+ # config.url = 'https://example.zendesk.com/api/v2'
548
+ # client = Readiness::Zendesk::Client.new(config)
549
+ # problems = Readiness::Zendesk::Tickets.problems(client)
550
+ # pp problems.map { |p| p.id }
551
+ # # => [33, 34]
552
+ def self.problems(client)
553
+ array = []
554
+ opts = "page[size]=100&sort=#{sort}"
555
+ loop do
556
+ response = client.connection.get("tickets/problems?#{opts}")
557
+ handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
558
+ body = Oj.load(response.body)
559
+ array += body['tickets'].map { |t| Tickets.new(t) }
560
+ break if limit != 0 && array.count >= (limit * 100)
561
+ break unless body['meta']['has_more']
562
+
563
+ opts = body['links'] ['next'].split('?').last
564
+ end
565
+ array
566
+ end
567
+
568
+ ##
569
+ # Lists the first 100 non-archived tickets
570
+ #
571
+ # @author Jason Colyer
572
+ # @since 1.0.0
573
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
574
+ # @param sort [String] What sorting method to use
575
+ # - updated_at => Sort by updated_at ASC
576
+ # - id => Sort by id ASC
577
+ # - status => Sort by status ASC
578
+ # - -updated_at => Sort by updated_at DESC
579
+ # - -id => Sort by id DESC
580
+ # - -status => Sort by status DESC
581
+ # @return [Array]
582
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#list-tickets Zendesk API > Tickets > List Tickets
583
+ # @example
584
+ # require 'support_readiness'
585
+ # config = Readiness::Zendesk::Configuration.new
586
+ # config.username = 'alice@example.com'
587
+ # config.token = 'test123abc'
588
+ # config.url = 'https://example.zendesk.com/api/v2'
589
+ # client = Readiness::Zendesk::Client.new(config)
590
+ # tickets = Readiness::Zendesk::Tickets.list(client)
591
+ # pp tickets.first.id
592
+ # # => 35436
593
+ def self.list(client, sort = 'id')
594
+ response = client.connection.get("tickets?page[size]=100&sort=#{sort}")
595
+ handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
596
+ Oj.load(response.body)['tickets'].map { |t| Tickets.new(t) }
597
+ end
598
+
599
+ ##
600
+ # Lists many tickets. Does not stop until it ends or the page limit is hit.
601
+ # This method can take a long time to run depending on the parameters used.
602
+ #
603
+ # @author Jason Colyer
604
+ # @since 1.0.0
605
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
606
+ # @param limit [Integer] The number of pages to stop at. Using 0 means to list all.
607
+ # @param sort [String] What sorting method to use
608
+ # - updated_at => Sort by updated_at ASC
609
+ # - id => Sort by id ASC
610
+ # - status => Sort by status ASC
611
+ # - -updated_at => Sort by updated_at DESC
612
+ # - -id => Sort by id DESC
613
+ # - -status => Sort by status DESC
614
+ # @return [Array]
615
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#list-tickets Zendesk API > Tickets > List Tickets
616
+ # @example
617
+ # require 'support_readiness'
618
+ # config = Readiness::Zendesk::Configuration.new
619
+ # config.username = 'alice@example.com'
620
+ # config.token = 'test123abc'
621
+ # config.url = 'https://example.zendesk.com/api/v2'
622
+ # client = Readiness::Zendesk::Client.new(config)
623
+ # tickets = Readiness::Zendesk::Tickets.list_many(client, 5)
624
+ # pp tickets.count
625
+ # # => 500
626
+ def self.list_many(client, limit = 0, sort = 'id')
627
+ array = []
628
+ opts = "page[size]=100&sort=#{sort}"
629
+ loop do
630
+ response = client.connection.get("tickets?#{opts}")
631
+ handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
632
+ body = Oj.load(response.body)
633
+ array += body['tickets'].map { |t| Tickets.new(t) }
634
+ break if limit != 0 && array.count >= (limit * 100)
635
+ break unless body['meta']['has_more']
636
+
637
+ opts = body['links'] ['next'].split('?').last
638
+ end
639
+ array
640
+ end
641
+
642
+ ##
643
+ # Locates a ticket within Zendesk. This will not exit on error (except Authentication errors)
644
+ #
645
+ # @author Jason Colyer
646
+ # @since 1.0.0
647
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
648
+ # @param tid [Integer] The ticket ID to find
649
+ # @return [Hash]
650
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#show-ticket Zendesk API > Tickets > Show Ticket
651
+ # @example
652
+ # require 'support_readiness'
653
+ # config = Readiness::Zendesk::Configuration.new
654
+ # config.username = 'alice@example.com'
655
+ # config.token = 'test123abc'
656
+ # config.url = 'https://example.zendesk.com/api/v2'
657
+ # client = Readiness::Zendesk::Client.new(config)
658
+ # ticket = Readiness::Zendesk::Tickets.find(client, 35436)
659
+ # pp ticket.subject
660
+ # # => "Help, my printer is on fire!"
661
+ def self.find(client, tid)
662
+ response = client.connection.get("tickets/#{tid}")
663
+ handle_request_error(0, 'Zendesk', response.status, { action: 'get', id: tid }) unless response.status == 200
664
+ return Tickets.new(Oj.load(response.body)['ticket']) if response.status == 200
665
+
666
+ Oj.load(response.body)
667
+ end
668
+
669
+ ##
670
+ # Locates a ticket within Zendesk. This will exit on error
671
+ #
672
+ # @author Jason Colyer
673
+ # @since 1.0.0
674
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
675
+ # @param tid [Integer] The ticket ID to find
676
+ # @return [Hash]
677
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#show-ticket Zendesk API > Tickets > Show Ticket
678
+ # @example
679
+ # require 'support_readiness'
680
+ # config = Readiness::Zendesk::Configuration.new
681
+ # config.username = 'alice@example.com'
682
+ # config.token = 'test123abc'
683
+ # config.url = 'https://example.zendesk.com/api/v2'
684
+ # client = Readiness::Zendesk::Client.new(config)
685
+ # ticket = Readiness::Zendesk::Tickets.find!(client, 35436)
686
+ # pp ticket.subject
687
+ # # => "Help, my printer is on fire!"
688
+ def self.find!(client, tid)
689
+ response = client.connection.get("tickets/#{tid}")
690
+ handle_request_error(1, 'Zendesk', response.status, { action: 'Find ticket', id: tid }) unless response.status == 200
691
+ Tickets.new(Oj.load(response.body)['ticket'])
692
+ end
693
+
694
+ ##
695
+ # Locates up to 100 tickets within Zendesk.
696
+ #
697
+ # @author Jason Colyer
698
+ # @since 1.0.0
699
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
700
+ # @param tids [Array] The ticket IDs to find
701
+ # @return [Array]
702
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#show-multiple-tickets Zendesk API > Tickets > Show Multiple Tickets
703
+ # @example
704
+ # require 'support_readiness'
705
+ # config = Readiness::Zendesk::Configuration.new
706
+ # config.username = 'alice@example.com'
707
+ # config.token = 'test123abc'
708
+ # config.url = 'https://example.zendesk.com/api/v2'
709
+ # client = Readiness::Zendesk::Client.new(config)
710
+ # tickets = Readiness::Zendesk::Tickets.find!(client, [35436, 35437])
711
+ # pp ticket.count
712
+ # # => 2
713
+ def self.find_many(client, tids)
714
+ response = client.connection.get("tickets/show_many?ids=#{tids.join(',')}")
715
+ handle_request_error(0, 'Zendesk', response.status, { action: 'get', id: tids }) unless response.status == 200
716
+ Oj.load(response.body)['tickets'].map { |t| Tickets.new(t) }
717
+ end
718
+
719
+ ##
720
+ # Locates all suspended tickets within Zendesk.
721
+ #
722
+ # @author Jason Colyer
723
+ # @since 1.0.0
724
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
725
+ # @return [Array]
726
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/suspended_tickets/#list-suspended-tickets Zendesk API > Suspended Tickets > List Suspended Tickets
727
+ # @example
728
+ # require 'support_readiness'
729
+ # config = Readiness::Zendesk::Configuration.new
730
+ # config.username = 'alice@example.com'
731
+ # config.token = 'test123abc'
732
+ # config.url = 'https://example.zendesk.com/api/v2'
733
+ # client = Readiness::Zendesk::Client.new(config)
734
+ # tickets = Readiness::Zendesk::Tickets.list_suspended(client)
735
+ # pp ticket.count
736
+ # # => 18
737
+ def self.list_suspended(client)
738
+ array = []
739
+ opts = "page[size]=100&sort=#{sort}"
740
+ loop do
741
+ response = client.connection.get("suspended_tickets?#{opts}")
742
+ handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
743
+ body = Oj.load(response.body)
744
+ array += body['suspended_tickets']
745
+ break if limit != 0 && array.count >= (limit * 100)
746
+ break unless body['meta']['has_more']
747
+
748
+ opts = body['links'] ['next'].split('?').last
749
+ end
750
+ array
751
+ end
752
+
753
+ ##
754
+ # Recovers a suspended ticket within Zendesk.
755
+ #
756
+ # @author Jason Colyer
757
+ # @since 1.0.0
758
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
759
+ # @param sid [Integer] The ID of the suspended ticket
760
+ # @return [Object] An instance of {Readiness::Zendesk::Tickets}
761
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/suspended_tickets/#recover-suspended-ticket Zendesk API > Suspended Tickets > Recover Suspended Ticket
762
+ # @example
763
+ # require 'support_readiness'
764
+ # config = Readiness::Zendesk::Configuration.new
765
+ # config.username = 'alice@example.com'
766
+ # config.token = 'test123abc'
767
+ # config.url = 'https://example.zendesk.com/api/v2'
768
+ # client = Readiness::Zendesk::Client.new(config)
769
+ # ticket = Readiness::Zendesk::Tickets.recover_suspended!(client, 123)
770
+ # pp ticket.subject
771
+ # # => "Help, my printer is on fire!"
772
+ def self.recover_suspended!(client, sid)
773
+ response = client.connection.put("suspended_tickets/#{sid}/recover")
774
+ handle_request_error(1, 'Zendesk', response.status, { action: 'Recover suspended ticket', id: sid }) unless response.status == 200
775
+ Tickets.new(Oj.load(response.body)['ticket'])
776
+ end
777
+
778
+ ##
779
+ # Recover many suspended tickets within Zendesk
780
+ #
781
+ # @author Jason Colyer
782
+ # @since 1.0.0
783
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
784
+ # @param sids [Array] An Array of suspended ticket IDs to recover
785
+ # @return [Array] An Array of {Readiness::Zendesk::Tickets} instances
786
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/suspended_tickets/#recover-multiple-suspended-tickets Zendesk API > Suspended Tickets > Recover Multiple Suspended Tickets
787
+ # @example
788
+ # require 'support_readiness'
789
+ # config = Readiness::Zendesk::Configuration.new
790
+ # config.username = 'alice@example.com'
791
+ # config.token = 'test123abc'
792
+ # config.url = 'https://example.zendesk.com/api/v2'
793
+ # client = Readiness::Zendesk::Client.new(config)
794
+ # tickets = Readiness::Zendesk::Tickets.recover_many_suspended!(client, [123, 456, 789])
795
+ # pp tickets.first.subject
796
+ # # => "Help, my printer is on fire!"
797
+ def self.recover_many_suspended!(client, sids)
798
+ response = client.connection.put("suspended_tickets/recover_many?ids=#{sids.join(',')}")
799
+ handle_request_error(1, 'Zendesk', response.status, { action: 'Recover many suspended ticket', id: sids }) unless response.status == 200
800
+ Oj.load(response.body)['tickets'].map { |t| Tickets.new(t) }
801
+ end
802
+
803
+ ##
804
+ # Deletes a suspended ticket within Zendesk.
805
+ #
806
+ # @author Jason Colyer
807
+ # @since 1.0.0
808
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
809
+ # @param sid [Integer] The ID of the suspended ticket
810
+ # @return [Boolean]
811
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/suspended_tickets/#delete-suspended-ticket Zendesk API > Suspended Tickets > Delete Suspended Ticket
812
+ # @example
813
+ # require 'support_readiness'
814
+ # config = Readiness::Zendesk::Configuration.new
815
+ # config.username = 'alice@example.com'
816
+ # config.token = 'test123abc'
817
+ # config.url = 'https://example.zendesk.com/api/v2'
818
+ # client = Readiness::Zendesk::Client.new(config)
819
+ # delete = Readiness::Zendesk::Tickets.delete_suspended!(client, 123)
820
+ # pp delete
821
+ # # => true
822
+ def self.delete_suspended!(client, sid)
823
+ response = client.connection.delete("suspended_tickets/#{sid}")
824
+ handle_request_error(1, 'Zendesk', response.status, { action: 'Delete suspended ticket', id: sid }) unless response.status == 204
825
+ true
826
+ end
827
+
828
+ ##
829
+ # Deletes many suspended tickets within Zendesk.
830
+ #
831
+ # @author Jason Colyer
832
+ # @since 1.0.0
833
+ # @param client [Object] An instance of {Readiness::Zendesk::Client}
834
+ # @param sids [Array] An Array of suspended ticket IDs to delete
835
+ # @return [Boolean]
836
+ # @see https://developer.zendesk.com/api-reference/ticketing/tickets/suspended_tickets/#delete-multiple-suspended-tickets Zendesk API > Suspended Tickets > Delete Multiple Suspended Tickets
837
+ # @example
838
+ # require 'support_readiness'
839
+ # config = Readiness::Zendesk::Configuration.new
840
+ # config.username = 'alice@example.com'
841
+ # config.token = 'test123abc'
842
+ # config.url = 'https://example.zendesk.com/api/v2'
843
+ # client = Readiness::Zendesk::Client.new(config)
844
+ # deletes = Readiness::Zendesk::Tickets.delete_many_suspended!(client, [123, 456])
845
+ # pp deletes
846
+ # # => true
847
+ def self.delete_many_suspended!(client, sids)
848
+ response = client.connection.delete("suspended_tickets/destroy_many?ids=#{sids.join(',')}")
849
+ handle_request_error(1, 'Zendesk', response.status, { action: 'Delete many suspended ticket', id: sids }) unless response.status == 200
850
+ true
851
+ end
852
+ end
853
+ end
854
+ end