gitlab-customer-support-operations_zendesk 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 (58) hide show
  1. checksums.yaml +7 -0
  2. data/lib/support_ops_zendesk/packages.rb +89 -0
  3. data/lib/support_ops_zendesk/zendesk/app_installations.rb +62 -0
  4. data/lib/support_ops_zendesk/zendesk/app_job_statuses.rb +157 -0
  5. data/lib/support_ops_zendesk/zendesk/apps.rb +476 -0
  6. data/lib/support_ops_zendesk/zendesk/articles.rb +362 -0
  7. data/lib/support_ops_zendesk/zendesk/audit_logs.rb +166 -0
  8. data/lib/support_ops_zendesk/zendesk/automations.rb +390 -0
  9. data/lib/support_ops_zendesk/zendesk/base.rb +472 -0
  10. data/lib/support_ops_zendesk/zendesk/brands.rb +172 -0
  11. data/lib/support_ops_zendesk/zendesk/client.rb +91 -0
  12. data/lib/support_ops_zendesk/zendesk/comments.rb +37 -0
  13. data/lib/support_ops_zendesk/zendesk/configuration.rb +138 -0
  14. data/lib/support_ops_zendesk/zendesk/custom_roles.rb +224 -0
  15. data/lib/support_ops_zendesk/zendesk/dynamic_content.rb +297 -0
  16. data/lib/support_ops_zendesk/zendesk/dynamic_content_variants.rb +309 -0
  17. data/lib/support_ops_zendesk/zendesk/group_memberships.rb +337 -0
  18. data/lib/support_ops_zendesk/zendesk/groups.rb +385 -0
  19. data/lib/support_ops_zendesk/zendesk/help_center_categories.rb +332 -0
  20. data/lib/support_ops_zendesk/zendesk/help_center_content_tags.rb +237 -0
  21. data/lib/support_ops_zendesk/zendesk/help_center_management_permission_groups.rb +271 -0
  22. data/lib/support_ops_zendesk/zendesk/help_center_sections.rb +378 -0
  23. data/lib/support_ops_zendesk/zendesk/help_center_topics.rb +274 -0
  24. data/lib/support_ops_zendesk/zendesk/help_center_user_segments.rb +279 -0
  25. data/lib/support_ops_zendesk/zendesk/job_statuses.rb +231 -0
  26. data/lib/support_ops_zendesk/zendesk/locales.rb +326 -0
  27. data/lib/support_ops_zendesk/zendesk/macros.rb +407 -0
  28. data/lib/support_ops_zendesk/zendesk/oauth_clients.rb +186 -0
  29. data/lib/support_ops_zendesk/zendesk/oauth_tokens.rb +114 -0
  30. data/lib/support_ops_zendesk/zendesk/organization_fields.rb +282 -0
  31. data/lib/support_ops_zendesk/zendesk/organization_memberships.rb +336 -0
  32. data/lib/support_ops_zendesk/zendesk/organizations.rb +568 -0
  33. data/lib/support_ops_zendesk/zendesk/requester_roles.rb +58 -0
  34. data/lib/support_ops_zendesk/zendesk/satisfaction_reasons.rb +161 -0
  35. data/lib/support_ops_zendesk/zendesk/schedule_holidays.rb +27 -0
  36. data/lib/support_ops_zendesk/zendesk/schedules.rb +192 -0
  37. data/lib/support_ops_zendesk/zendesk/search.rb +185 -0
  38. data/lib/support_ops_zendesk/zendesk/sla_policies.rb +302 -0
  39. data/lib/support_ops_zendesk/zendesk/targets.rb +96 -0
  40. data/lib/support_ops_zendesk/zendesk/theme_job_statuses.rb +154 -0
  41. data/lib/support_ops_zendesk/zendesk/themes.rb +328 -0
  42. data/lib/support_ops_zendesk/zendesk/ticket_field_options.rb +154 -0
  43. data/lib/support_ops_zendesk/zendesk/ticket_fields.rb +357 -0
  44. data/lib/support_ops_zendesk/zendesk/ticket_forms.rb +370 -0
  45. data/lib/support_ops_zendesk/zendesk/ticket_user_types.rb +67 -0
  46. data/lib/support_ops_zendesk/zendesk/tickets.rb +837 -0
  47. data/lib/support_ops_zendesk/zendesk/translations.rb +310 -0
  48. data/lib/support_ops_zendesk/zendesk/trigger_categories.rb +275 -0
  49. data/lib/support_ops_zendesk/zendesk/triggers.rb +427 -0
  50. data/lib/support_ops_zendesk/zendesk/user_field_options.rb +153 -0
  51. data/lib/support_ops_zendesk/zendesk/user_fields.rb +312 -0
  52. data/lib/support_ops_zendesk/zendesk/users.rb +889 -0
  53. data/lib/support_ops_zendesk/zendesk/via_types.rb +137 -0
  54. data/lib/support_ops_zendesk/zendesk/views.rb +636 -0
  55. data/lib/support_ops_zendesk/zendesk/webhooks.rb +206 -0
  56. data/lib/support_ops_zendesk/zendesk.rb +66 -0
  57. data/lib/support_ops_zendesk.rb +29 -0
  58. metadata +274 -0
@@ -0,0 +1,427 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the module SupportOps.
4
+ module SupportOps
5
+ # Defines the module Zendesk
6
+ module Zendesk
7
+ ##
8
+ # Defines the class Triggers within the module {SupportOps::Zendesk}.
9
+ #
10
+ # @author Jason Colyer
11
+ # @since 1.0.0
12
+ # @attr [Array] actions An array of actions describing what the ticket trigger will do
13
+ # @attr [Boolean] active Whether the ticket trigger is active
14
+ # @attr [String] category_id The ID of the category the ticket trigger belongs to
15
+ # @attr [Hash] conditions An object that describes the circumstances under which the trigger performs its actions
16
+ # @attr [String] created_at The time the ticket trigger was created
17
+ # @attr [Boolean] default If true, the ticket trigger is a standard trigger
18
+ # @attr [String] description The description of the ticket trigger
19
+ # @attr [Integer] id Automatically assigned when created
20
+ # @attr [Integer] position Position of the ticket trigger, determines the order they will execute in
21
+ # @attr [String] raw_title The raw format of the title of the ticket trigger
22
+ # @attr [String] title The title of the ticket trigger
23
+ # @attr [String] updated_at The time of the last update of the ticket trigger
24
+ # @todo Search Ticket Triggers => https://developer.zendesk.com/api-reference/ticketing/business-rules/triggers/#search-ticket-triggers
25
+ # @todo List Ticket Trigger Action and Condition Definitions => https://developer.zendesk.com/api-reference/ticketing/business-rules/triggers/#list-ticket-trigger-action-and-condition-definitions
26
+ # @todo List Ticket Trigger Revisions => https://developer.zendesk.com/api-reference/ticketing/business-rules/triggers/#list-ticket-trigger-revisions
27
+ # @todo Show Ticket Trigger Revision => https://developer.zendesk.com/api-reference/ticketing/business-rules/triggers/#show-ticket-trigger-revision
28
+ # @todo Reorder Ticket Triggers => https://developer.zendesk.com/api-reference/ticketing/business-rules/triggers/#reorder-ticket-triggers
29
+ class Triggers < SupportOps::Zendesk::Base
30
+ # @!parse
31
+ # # Creates/updates a trigger
32
+ # #
33
+ # # @author Jason Colyer
34
+ # # @since 1.0.0
35
+ # # @return [Object] Instance of {SupportOps::Zendesk::Triggers}
36
+ # # @note This is inherited from {SupportOps::Zendesk::Base#save!}
37
+ # # @see
38
+ # # https://developer.zendesk.com/api-reference/ticketing/business-rules/triggers/#create-trigger
39
+ # # Zendesk API > Triggers > Create Ticket Trigger
40
+ # # @see
41
+ # # https://developer.zendesk.com/api-reference/ticketing/business-rules/triggers/#update-ticket-trigger
42
+ # # Zendesk API > Triggers > Update Ticket Trigger
43
+ # # @example
44
+ # # require 'support_ops_zendesk'
45
+ # #
46
+ # # SupportOps::Zendesk::Configuration.configure do |config|
47
+ # # config.url = 'https://gitlab.zendesk.com/api/v2'
48
+ # # config.username = 'jason@example.com'
49
+ # # config.token = 'abc123'
50
+ # # end
51
+ # #
52
+ # # new_trigger = SupportOps::Zendesk::Triggers.new
53
+ # # new_trigger.title = 'Change priority to low for solved tickets'
54
+ # # new_trigger.conditions = {
55
+ # # all: [
56
+ # # {
57
+ # # field: 'status',
58
+ # # operator: 'is',
59
+ # # value: 'solved'
60
+ # # },
61
+ # # {
62
+ # # field: 'priority',
63
+ # # operator: 'is_not',
64
+ # # value: 'low'
65
+ # # }
66
+ # # ],
67
+ # # any: []
68
+ # # }
69
+ # # new_trigger.actions = [
70
+ # # {
71
+ # # field: 'priority',
72
+ # # value: 'low'
73
+ # # }
74
+ # # ]
75
+ # # new_trigger.catergory_id = '1234'
76
+ # #
77
+ # # new_trigger.save!
78
+ # #
79
+ # # pp new_trigger.id
80
+ # # # => 23409462
81
+ # # @example
82
+ # # require 'support_ops_zendesk'
83
+ # #
84
+ # # SupportOps::Zendesk::Configuration.configure do |config|
85
+ # # config.url = 'https://gitlab.zendesk.com/api/v2'
86
+ # # config.username = 'jason@example.com'
87
+ # # config.token = 'abc123'
88
+ # # end
89
+ # #
90
+ # # existing_trigger = SupportOps::Zendesk::Triggers.get!(23409462)
91
+ # # existing_trigger.title = 'Change ticket priority to low for solved tickets'
92
+ # #
93
+ # # existing_trigger.save!
94
+ # #
95
+ # # pp existing_trigger.title
96
+ # # # => "Change ticket priority to low for solved tickets"
97
+ # def save!; end
98
+ # @!parse
99
+ # # Deletes a trigger
100
+ # #
101
+ # # @author Jason Colyer
102
+ # # @since 1.0.0
103
+ # # @return [Boolean]
104
+ # # @note This is inherited from {SupportOps::Zendesk::Base#delete!}
105
+ # # @see
106
+ # # https://developer.zendesk.com/api-reference/ticketing/business-rules/triggers/#delete-ticket-trigger
107
+ # # Zendesk API > Triggers > Delete Ticket Trigger
108
+ # # @example
109
+ # # require 'support_ops_zendesk'
110
+ # #
111
+ # # SupportOps::Zendesk::Configuration.configure do |config|
112
+ # # config.url = 'https://gitlab.zendesk.com/api/v2'
113
+ # # config.username = 'jason@example.com'
114
+ # # config.token = 'abc123'
115
+ # # end
116
+ # #
117
+ # # existing_trigger = SupportOps::Zendesk::Triggers.get!(23409462)
118
+ # # existing_trigger.delete!
119
+ # def delete!; end
120
+ # @!parse
121
+ # # Gets a trigger's category
122
+ # #
123
+ # # @author Jason Colyer
124
+ # # @since 1.0.0
125
+ # # @return [Boolean]
126
+ # # @note This is inherited from {SupportOps::Zendesk::Base#category}
127
+ # # @example
128
+ # # require 'support_ops_zendesk'
129
+ # #
130
+ # # SupportOps::Zendesk::Configuration.configure do |config|
131
+ # # config.url = 'https://gitlab.zendesk.com/api/v2'
132
+ # # config.username = 'jason@example.com'
133
+ # # config.token = 'abc123'
134
+ # # end
135
+ # #
136
+ # # existing_trigger = SupportOps::Zendesk::Triggers.get!(23409462)
137
+ # # category = existing_trigger.category
138
+ # # pp category.name
139
+ # # # => "Ticket creation Stage"
140
+ # def delete!; end
141
+ define_attributes :actions, :active, :category_id, :conditions,
142
+ :created_at, :default, :description, :id, :position,
143
+ :raw_title, :title, :updated_at
144
+ readonly_attributes :created_at, :default, :id, :updated_at
145
+
146
+ ##
147
+ # Lists triggers in the Zendesk system
148
+ #
149
+ # @author Jason Colyer
150
+ # @since 1.0.0
151
+ # @overload list(key: value)
152
+ # @param active [Boolean optional] Only active triggers if true,
153
+ # inactive triggers if false, or all if not provided
154
+ # @param category_id [Integer optional] Filter triggers by category ID
155
+ # @param sort [String optional] Possible values are "alphabetical",
156
+ # "created_at", "updated_at", or "position".
157
+ # @param sort_order [String optiona] One of "asc" or "desc"; defaults to
158
+ # "asc" for alphabetical and position sort, "desc" for all others
159
+ # @param limit [Integer optional] The limit to the number of triggers
160
+ # returned. Default to 0 (i.e. no limit)
161
+ # @return [Array]
162
+ # @see
163
+ # https://developer.zendesk.com/api-reference/ticketing/business-rules/triggers/#list-ticket-triggers
164
+ # Zendesk API > Triggers > List Ticket Triggers
165
+ # @see SupportOps::Zendesk::Configuration Setting up a client
166
+ # @example
167
+ # require 'support_ops_zendesk'
168
+ #
169
+ # SupportOps::Zendesk::Configuration.configure do |config|
170
+ # config.url = 'https://gitlab.zendesk.com/api/v2'
171
+ # config.username = 'jason@example.com'
172
+ # config.token = 'abc123'
173
+ # end
174
+ #
175
+ # triggers = SupportOps::Zendesk::Triggers.list(limit: 10)
176
+ # pp triggers.count
177
+ # # => 10
178
+ # pp triggers.last.title
179
+ # # => "I'm the 10th trigger"
180
+ def self.list(**args)
181
+ args[:limit] = 0 unless args[:limit]
182
+ sort_order = (args[:sort_order] == 'desc' ? '-' : '')
183
+ array = []
184
+ opts = 'page[size]=100'
185
+ opts += "&sort=#{sort_order}#{args[:sort]}" if args[:sort]
186
+ opts += "&active=#{args[:active]}" if args[:active]
187
+ opts += "&category_id=#{args[:category_id]}" if args[:category_id]
188
+ loop do
189
+ response = client.connection.get("triggers?#{opts}")
190
+ body = Oj.load(response.body)
191
+ array += body['triggers'].map { |a| Triggers.new(a) }
192
+ break if args[:limit].to_i.positive? && array.count >= args[:limit].to_i
193
+ break unless body['meta']['has_more']
194
+
195
+ opts = body['links']['next'].split('?').last
196
+ end
197
+ return array if args[:limit].to_i.zero?
198
+
199
+ array.first(args[:limit].to_i)
200
+ end
201
+
202
+ ##
203
+ # Lists active triggers in the Zendesk system
204
+ #
205
+ # @author Jason Colyer
206
+ # @since 1.0.0
207
+ # @overload list_active(key: value)
208
+ # @param category_id [Integer optional] Filter triggers by category ID
209
+ # @param sort [String optional] Possible values are "alphabetical",
210
+ # "created_at", "updated_at", or "position".
211
+ # @param sort_order [String optiona] One of "asc" or "desc"; defaults to
212
+ # "asc" for alphabetical and position sort, "desc" for all others
213
+ # @param limit [Integer optional] The limit to the number of triggers
214
+ # returned. Default to 0 (i.e. no limit)
215
+ # @return [Array]
216
+ # @see
217
+ # https://developer.zendesk.com/api-reference/ticketing/business-rules/triggers/#list-active-ticket-triggers
218
+ # Zendesk API > Triggers > List Active Ticket Triggers
219
+ # @see SupportOps::Zendesk::Configuration Setting up a client
220
+ # @example
221
+ # require 'support_ops_zendesk'
222
+ #
223
+ # SupportOps::Zendesk::Configuration.configure do |config|
224
+ # config.url = 'https://gitlab.zendesk.com/api/v2'
225
+ # config.username = 'jason@example.com'
226
+ # config.token = 'abc123'
227
+ # end
228
+ #
229
+ # triggers = SupportOps::Zendesk::Triggers.list_active(limit: 10)
230
+ # pp triggers.count
231
+ # # => 10
232
+ # pp triggers.last.title
233
+ # # => "I'm the 10th trigger"
234
+ def self.list_active(**args)
235
+ args[:limit] = 0 unless args[:limit]
236
+ sort_order = (args[:sort_order] == 'desc' ? '-' : '')
237
+ array = []
238
+ opts = 'page[size]=100'
239
+ opts += "&sort=#{sort_order}#{args[:sort]}" if args[:sort]
240
+ opts += "&category_id=#{args[:category_id]}" if args[:category_id]
241
+ loop do
242
+ response = client.connection.get("triggers?#{opts}")
243
+ body = Oj.load(response.body)
244
+ array += body['triggers'].map { |a| Triggers.new(a) }
245
+ break if args[:limit].to_i.positive? && array.count >= args[:limit].to_i
246
+ break unless body['meta']['has_more']
247
+
248
+ opts = body['links']['next'].split('?').last
249
+ end
250
+ return array if args[:limit].to_i.zero?
251
+
252
+ array.first(args[:limit].to_i)
253
+ end
254
+
255
+ ##
256
+ # Locates a specific trigger in the Zendesk system
257
+ #
258
+ # @author Jason Colyer
259
+ # @since 1.0.0
260
+ # @see
261
+ # https://developer.zendesk.com/api-reference/ticketing/business-rules/triggers/#show-ticket-trigger
262
+ # Zendesk API > Triggers > Show Ticket Trigger
263
+ # @see SupportOps::Zendesk::Configuration Setting up a client
264
+ # @example
265
+ # require 'support_ops_zendesk'
266
+ #
267
+ # SupportOps::Zendesk::Configuration.configure do |config|
268
+ # config.url = 'https://gitlab.zendesk.com/api/v2'
269
+ # config.username = 'jason@example.com'
270
+ # config.token = 'abc123'
271
+ # end
272
+ #
273
+ # trigger = SupportOps::Zendesk::Triggers.get(25)
274
+ # pp trigger.title
275
+ # # => "I'm the 25th trigger"
276
+ def self.get(object)
277
+ if object.is_a? Triggers
278
+ Triggers.new(id: id).find
279
+ else
280
+ Triggers.new(id: object).find
281
+ end
282
+ end
283
+
284
+ ##
285
+ # Locates a specific trigger in the Zendesk system
286
+ #
287
+ # @author Jason Colyer
288
+ # @since 1.0.0
289
+ # @see
290
+ # https://developer.zendesk.com/api-reference/ticketing/business-rules/triggers/#show-ticket-trigger
291
+ # Zendesk API > Triggers > Show Ticket Trigger
292
+ # @see SupportOps::Zendesk::Configuration Setting up a client
293
+ # @example
294
+ # require 'support_ops_zendesk'
295
+ #
296
+ # SupportOps::Zendesk::Configuration.configure do |config|
297
+ # config.url = 'https://gitlab.zendesk.com/api/v2'
298
+ # config.username = 'jason@example.com'
299
+ # config.token = 'abc123'
300
+ # end
301
+ #
302
+ # trigger = SupportOps::Zendesk::Triggers.get!(25)
303
+ # pp trigger.title
304
+ # # => "I'm the 25th trigger"
305
+ def self.get!(object)
306
+ if object.is_a? Triggers
307
+ Triggers.new(id: id).find!
308
+ else
309
+ Triggers.new(id: object).find!
310
+ end
311
+ end
312
+
313
+ ##
314
+ # Updates multiple triggers via a batch job
315
+ #
316
+ # @author Jason Colyer
317
+ # @since 1.0.0
318
+ # @param triggers [Array] An array of {SupportOps::Zendesk::Triggers} instances
319
+ # @return [object] A {SupportOps::Zendesk::JobStatuses} instance
320
+ # @see
321
+ # https://developer.zendesk.com/api-reference/ticketing/business-rules/triggers/#update-many-ticket-triggers
322
+ # Zendesk API > Triggers > Update Many Ticket Triggers
323
+ # @example
324
+ # require 'support_ops_zendesk'
325
+ #
326
+ # SupportOps::Zendesk::Configuration.configure do |config|
327
+ # config.url = 'https://gitlab.zendesk.com/api/v2'
328
+ # config.username = 'jason@example.com'
329
+ # config.token = 'abc123'
330
+ # end
331
+ #
332
+ # trigger1 = SupportOps::Zendesk::Triggers.get!(123)
333
+ # trigger1.title = 'Set severity for low priority tickets non-solved tickets'
334
+ # trigger2 = SupportOps::Zendesk::Triggers.get!(456)
335
+ # trigger2.title = 'Set severity for medium priority tickets non-solved tickets'
336
+ #
337
+ # updates = SupportOps::Zendesk::Triggers.update_many!([trigger1, trigger2])
338
+ # pp updates.id
339
+ # # => "82de0b044094f0c67893ac9fe64f1a99"
340
+ def self.update_many!(triggers)
341
+ raise 'The parameter must be an Array' unless triggers.is_a? Array
342
+ raise 'You can only update a maximum of 100 triggers at a time' if triggers.count > 100
343
+ raise 'You can only use SupportOps::Zendesk::Triggers instances in the Array' unless triggers.reject { |o| o.is_a? SupportOps::Zendesk::Triggers }.count.zero?
344
+
345
+ data = { triggers: triggers.map { |a| to_hash(a).compact } }.to_json
346
+ response = client.connection.put('triggers/update_many', data)
347
+ raise "Failed to update triggers => #{body['details']}" if response.status != 200
348
+ JobStatuses.new(Oj.load(response.body)['job_status'])
349
+ end
350
+
351
+ ##
352
+ # Deletes multiple triggers via a batch job
353
+ #
354
+ # @author Jason Colyer
355
+ # @since 1.0.0
356
+ # @param trigger_ids [Array] An array of trigger IDs
357
+ # @return [object] A {SupportOps::Zendesk::JobStatuses} instance
358
+ # @see
359
+ # https://developer.zendesk.com/api-reference/ticketing/business-rules/triggers/#bulk-delete-ticket-triggers
360
+ # Zendesk API > Triggers > Bulk Delete Ticket Triggers
361
+ # @example
362
+ # require 'support_ops_zendesk'
363
+ #
364
+ # SupportOps::Zendesk::Configuration.configure do |config|
365
+ # config.url = 'https://gitlab.zendesk.com/api/v2'
366
+ # config.username = 'jason@example.com'
367
+ # config.token = 'abc123'
368
+ # end
369
+ #
370
+ # delete = SupportOps::Zendesk::Triggers.delete_many!([123, 456])
371
+ # pp delete.id
372
+ # # => "82de0b044094f0c67893ac9fe64f1a99"
373
+ def self.delete_many!(trigger_ids)
374
+ raise 'The parameter must be an Array' unless trigger_ids.is_a? Array
375
+ raise 'You can only delete a maximum of 100 triggers at a time' if trigger_ids.count > 100
376
+
377
+ response = client.connection.delete("triggers/destroy_many?ids=#{trigger_ids.join(',')}")
378
+ raise "Failed to delete triggers => #{body['details']}" if response.status != 200
379
+ JobStatuses.new(Oj.load(response.body)['job_status'])
380
+ end
381
+
382
+ private
383
+
384
+ ##
385
+ # @private
386
+ def get_record
387
+ response = self.client.connection.get("triggers/#{self.id}")
388
+ return nil if response.status != 200
389
+
390
+ Oj.load(response.body)['trigger']
391
+ end
392
+
393
+ ##
394
+ # @private
395
+ def create_record
396
+ response = self.client.connection.post("triggers", { trigger: attributes_for_save }.to_json)
397
+ body = Oj.load(response.body)
398
+ raise "Failed to create trigger => #{body}" if response.status != 201
399
+ body['trigger']
400
+ end
401
+
402
+ ##
403
+ # @private
404
+ def update_record
405
+ raise "Failed to update trigger => You didn't change anything in the object" if attributes_for_save.keys == [:id]
406
+ response = self.client.connection.put("triggers/#{self.id}", { trigger: attributes_for_save }.to_json)
407
+ body = Oj.load(response.body)
408
+ raise "Failed to update trigger #{self.id} => #{body}" if response.status != 200
409
+ body['trigger']
410
+ end
411
+
412
+ ##
413
+ # @private
414
+ def delete_record
415
+ response = self.client.connection.delete("triggers/#{self.id}")
416
+ raise "Failed to delete trigger => #{body}" if response.status != 204
417
+ true
418
+ end
419
+
420
+ ##
421
+ # @private
422
+ def category_record
423
+ TriggerCategories.get(self.category_id)
424
+ end
425
+ end
426
+ end
427
+ end
@@ -0,0 +1,153 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the module SupportOps.
4
+ module SupportOps
5
+ # Defines the module Zendesk
6
+ module Zendesk
7
+ ##
8
+ # Defines the class UserFieldOptions within the module {SupportOps::Zendesk}.
9
+ #
10
+ # @author Jason Colyer
11
+ # @since 1.0.0
12
+ # @attr [Integer] id Automatically assigned upon creation
13
+ # @attr [String] name The name of the custom field option
14
+ # @attr [Integer] position Ordering of the field relative to other field options
15
+ # @attr [String] raw_name The dynamic content placeholder, if present, or the name value, if not
16
+ # @attr [String] value The corresponding tag and backend value for the field option
17
+ # @todo Show a User Field Option => https://developer.zendesk.com/api-reference/ticketing/users/user_fields/#show-a-user-field-option
18
+ class UserFieldOptions < SupportOps::Zendesk::Base
19
+ # @!parse
20
+ # # Creates or updates a user field option
21
+ # #
22
+ # # @author Jason Colyer
23
+ # # @since 1.0.0
24
+ # # @return [Object]
25
+ # # @note This is inherited from {SupportOps::Zendesk::Base#create_or_update!}
26
+ # # @see
27
+ # # https://developer.zendesk.com/api-reference/ticketing/users/user_fields/#create-or-update-a-user-field-option
28
+ # # Zendesk API > User Fields > Create Or Update User Field Option
29
+ # # @example
30
+ # # require 'support_ops_zendesk'
31
+ # #
32
+ # # SupportOps::Zendesk::Configuration.configure do |config|
33
+ # # config.url = 'https://gitlab.zendesk.com/api/v2'
34
+ # # config.username = 'jason@example.com'
35
+ # # config.token = 'abc123'
36
+ # # end
37
+ # #
38
+ # # new_option = SupportOps::Zendesk::UserFieldOptions.new
39
+ # # new_option.name = 'Linux'
40
+ # # new_option.value = 'system_linux'
41
+ # # new_option.user_field_id = 123456
42
+ # #
43
+ # # new_option.create_or_update!
44
+ # #
45
+ # # pp new_option.name
46
+ # # # => "Linux"
47
+ # def create_or_update!; end
48
+ # @!parse
49
+ # # Deletes a user field option
50
+ # #
51
+ # # @author Jason Colyer
52
+ # # @since 1.0.0
53
+ # # @return [Boolean]
54
+ # # @note This is inherited from {SupportOps::Zendesk::Base#delete!}
55
+ # # @see
56
+ # # https://developer.zendesk.com/api-reference/ticketing/users/user_fields/#delete-user-field-option
57
+ # # Zendesk API > User Fields > Delete User Field Option
58
+ # # @example
59
+ # # require 'support_ops_zendesk'
60
+ # #
61
+ # # SupportOps::Zendesk::Configuration.configure do |config|
62
+ # # config.url = 'https://gitlab.zendesk.com/api/v2'
63
+ # # config.username = 'jason@example.com'
64
+ # # config.token = 'abc123'
65
+ # # end
66
+ # #
67
+ # # existing_field = SupportOps::Zendesk::UserFields.get!(23409462)
68
+ # # existing_option = existing_field.field_options.last
69
+ # # existing_option.delete!
70
+ # def delete!; end
71
+ define_attributes :id, :name, :position, :raw_name, :value, :user_field_id
72
+ readonly_attributes :id, :user_field_id
73
+
74
+ ##
75
+ # Lists user field options in the Zendesk system
76
+ #
77
+ # @author Jason Colyer
78
+ # @since 1.0.0
79
+ # @overload list(key: value)
80
+ # @param user_field_id [Integer required] The user field to find the options for
81
+ # @param limit [Integer optional] The limit to the number of user fields
82
+ # returned. Default to 0 (i.e. no limit)
83
+ # @return [Array]
84
+ # @see
85
+ # https://developer.zendesk.com/api-reference/ticketing/users/user_fields/#list-user-field-options
86
+ # Zendesk API > User Fields > List User Field Options
87
+ # @see SupportOps::Zendesk::Configuration Setting up a client
88
+ # @example
89
+ # require 'support_ops_zendesk'
90
+ #
91
+ # SupportOps::Zendesk::Configuration.configure do |config|
92
+ # config.url = 'https://gitlab.zendesk.com/api/v2'
93
+ # config.username = 'jason@example.com'
94
+ # config.token = 'abc123'
95
+ # end
96
+ #
97
+ # field = SupportOps::Zendesk::UserFields.get!(50)
98
+ # options = SupportOps::Zendesk::UserFieldOptions.list(user_field_id: field.id)
99
+ # pp options.count
100
+ # # => 5
101
+ # pp options.last.value
102
+ # # => "other_or_misc"
103
+ def self.list(**args)
104
+ raise 'You must provide a user_field_id value' unless args[:user_field_id]
105
+ args[:limit] = 0 unless args[:limit]
106
+ array = []
107
+ opts = 'page[size]=100'
108
+ loop do
109
+ response = client.connection.get("user_fields/#{args[:user_field_id]}/options?#{opts}")
110
+ body = Oj.load(response.body)
111
+ body['custom_field_options'].each do |c|
112
+ c['user_field_id'] = args[:user_field_id]
113
+ end
114
+ array += body['custom_field_options'].map { |c| UserFieldOptions.new(c) }
115
+ break if args[:limit].to_i.positive? && array.count >= args[:limit].to_i
116
+ break unless body['meta']['has_more']
117
+
118
+ opts = body['links']['next'].split('?').last
119
+ end
120
+ return array if args[:limit].to_i.zero?
121
+
122
+ array.first(args[:limit].to_i)
123
+ end
124
+
125
+ private
126
+
127
+ ##
128
+ # @private
129
+ def create_or_update_record
130
+ data = {
131
+ 'id' => self.id,
132
+ 'name' => self.name,
133
+ 'value' => self.value,
134
+ 'position' => self.position,
135
+ 'raw_name' => self.raw_name
136
+ }.compact
137
+ response = self.client.connection.post("user_fields/#{self.user_field_id}/options", { custom_field_option: data }.to_json)
138
+ body = Oj.load(response.body)
139
+ raise "Failed to create or update user field option => #{body}" unless [200, 201].include?(response.status)
140
+ body['custom_field_option']['user_field_id'] = self.user_field_id
141
+ body['custom_field_option']
142
+ end
143
+
144
+ ##
145
+ # @private
146
+ def delete_record
147
+ response = client.connection.delete("user_fields/#{self.user_field_id}/options/#{self.id}")
148
+ raise "Failed to delete user field option #{self.id} => #{body}" if response.status != 204
149
+ true
150
+ end
151
+ end
152
+ end
153
+ end