gitlab_support_readiness 1.0.0

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 (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