gitlab_support_readiness 1.0.7 → 1.0.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ddc2737f4d4688e9c67b209109e783eddb68c3ff6744bc8cb58ee993cf18f12
4
- data.tar.gz: 879b0374f74b4316f8a3614719c3d8b161f84a94c465d557f99d27ebe6601e74
3
+ metadata.gz: 7b6172a8a41b139003edf771fe377bd8910f12d41c27d54456290c114cae08cb
4
+ data.tar.gz: 568efc6d2b6cd4bd7c014787a70cce19927415b14944ed4e4bb7dac4f682b03a
5
5
  SHA512:
6
- metadata.gz: 9895e37008578fa2f0d6c79503649e30da79dda41edf01056817ef43a12df22d7b82ed4c74221452bbea4463767f9752d6d51e6e78270516762551ddcdae7b9b
7
- data.tar.gz: a269f08b9e16158a9993e5a4d7a77ed331b63d7d570066d7870a87e4f2863829d06aa9e7e28a420252d775dd72ac570a2aba14b9ca067b8adf400d968a900d35
6
+ metadata.gz: 50e8b47c5a5eb3cc7b3e537c4d64c30ebc5f1461c1586b7890ca97b20783d285a8c060cf4c35dac4ad9a76e75b6645f8b1498e42c3162ca71f2d96197b4b3acb
7
+ data.tar.gz: 502bee0ca7781bd1469a7551f0a40239f940e7619b083e8c148b6e81f2ba58c277d6adf8ce18f35465864df2ce16e465e93f14ede1d6b367c882c38f14a18e90
@@ -36,6 +36,22 @@ module Readiness
36
36
  hash.to_json
37
37
  end
38
38
 
39
+ ##
40
+ # Converts an Object to a JSON String, removing nil values except for ones defined in an Array
41
+ #
42
+ # @author Jason Colyer
43
+ # @since 1.0.9
44
+ # @param object [Object]
45
+ # @param keep_nil [Array] An array of keys to keep as nil in the final return
46
+ # @return [String]
47
+ def self.to_nearly_clean_json(object, keep_nil)
48
+ hash = to_hash(object).compact
49
+ keep_nil.each do |k|
50
+ hash[key.to_sym][k] = nil unless hash[key.to_sym].keys.include? k
51
+ end
52
+ hash.to_json
53
+ end
54
+
39
55
  ##
40
56
  # Converts an Object to a JSON String with a leading key, removing nil values
41
57
  #
@@ -49,6 +65,23 @@ module Readiness
49
65
  hash.to_json
50
66
  end
51
67
 
68
+ ##
69
+ # Converts an Object to a JSON String with a leading key, removing nil values except for ones defined in an Array
70
+ #
71
+ # @author Jason Colyer
72
+ # @since 1.0.9
73
+ # @param object [Object]
74
+ # @param key [String]
75
+ # @param keep_nil [Array] An array of keys to keep as nil in the final return
76
+ # @return [String]
77
+ def self.to_nearly_clean_json_with_key(object, key, keep_nil)
78
+ hash = { "#{key}": to_hash(object).compact }
79
+ keep_nil.each do |k|
80
+ hash[key.to_sym][k] = nil unless hash[key.to_sym].keys.include? k
81
+ end
82
+ hash.to_json
83
+ end
84
+
52
85
  ##
53
86
  # Handles error occurred from making Faraday requests
54
87
  #
@@ -86,9 +119,15 @@ module Readiness
86
119
  exit 1
87
120
  end
88
121
 
122
+ ##
123
+ # Handles 400 bad request errors from making Faraday requests.
124
+ #
125
+ # @author Jason Colyer
126
+ # @since 1.0.0
127
+ # @param system [String] The system the error occurred on
128
+ # @param params [Hash] A Hash of information about the request
89
129
  def self.bad_request_error(system, params)
90
- pp system
91
- pp params
130
+ puts "Action '#{params[:action]}' to ID #{params[:id]} on #{system} returned a 404 error"
92
131
  exit 1
93
132
  end
94
133
 
@@ -68,41 +68,6 @@ module Readiness
68
68
  @weight = object['weight']
69
69
  end
70
70
 
71
- ##
72
- # Lists all issues. Does not stop until it ends or the page limit is hit.
73
- # This method can take a long time to run depending on the parameters used.
74
- #
75
- # @author Jason Colyer
76
- # @since 1.0.0
77
- # @param client [Object] An instance of {Readiness::GitLab::Client}
78
- # @param limit [Integer] The number of pages to stop at. Using 0 means to list all.
79
- # @param filters [Array] An array of filter Strings to use. Should be in the format of key=value
80
- # @return [Array]
81
- # @see https://docs.gitlab.com/ee/api/issues.html#list-issues GitLab API > Issues > List issues
82
- # @example
83
- # require 'support_readiness'
84
- # config = Readiness::GitLab::Configuration.new
85
- # config.token = 'test123abc'
86
- # client = Readiness::GitLab::Client.new(config)
87
- # issues = Readiness::GitLab::Issues.list_all(client, 2, ["assignee_id=5", "state=opened"])
88
- # puts issues.first.web_url
89
- # # => "https://gitlab.com/gitlab-com/support/support-team-meta/-/issues/1"
90
- def self.list_all(client, limit = 0, filters = [])
91
- array = []
92
- page = 1
93
- loop do
94
- response = client.connection.get "issues?per_page=100&page=#{page}&#{to_param_string(filters)}"
95
- handle_request_error(0, 'GitLab', response.status) unless response.status == 200
96
- body = Oj.load(response.body)
97
- array += body.map { |p| Issues.new(p) }
98
- break if body.count < 100
99
- break if limit != 0 && array.count >= (limit * 100)
100
-
101
- page += 1
102
- end
103
- array
104
- end
105
-
106
71
  ##
107
72
  # Lists all issues for an object. Does not stop until it ends or the page limit is hit.
108
73
  # This method can take a long time to run depending on the parameters used.
@@ -306,7 +271,7 @@ module Readiness
306
271
  array = []
307
272
  page = 0
308
273
  loop do
309
- response = client.connection.get "projects/#{project.id}/issues/#{issues.id}/notes?per_page=100&page=#{page}"
274
+ response = client.connection.get "projects/#{project.id}/issues/#{issues.iid}/notes?per_page=100&page=#{page}"
310
275
  handle_request_error(0, 'GitLab', response.status) unless response.status == 200
311
276
  body = Oj.load(response.body)
312
277
  array += body
@@ -343,7 +308,7 @@ module Readiness
343
308
  # pp comment['updated_at']
344
309
  # # => "2024-09-23T15:42:13Z"
345
310
  def self.create_comment!(client, project, issue, params)
346
- response = client.connection.post "projects/#{project.id}/issues/#{issue.id}/notes", params.to_json
311
+ response = client.connection.post "projects/#{project.id}/issues/#{issue.iid}/notes", params.to_json
347
312
  handle_request_error(1, 'GitLab', response.status, { action: 'Create issue comment', id: issue.id }) unless response.status == 200
348
313
  Oj.load(response.body)
349
314
  end
@@ -374,7 +339,7 @@ module Readiness
374
339
  # pp comment['updated_at']
375
340
  # # => "2024-09-23T16:47:36Z"
376
341
  def self.update_comment!(client, project, issue, cid, params)
377
- response = client.connection.put "projects/#{project.id}/issues/#{issue.id}/notes/#{cid}", to_clean_json(params)
342
+ response = client.connection.put "projects/#{project.id}/issues/#{issue.iid}/notes/#{cid}", params.to_json
378
343
  handle_request_error(1, 'GitLab', response.status, { action: 'Update issue comment', id: issue.id }) unless response.status == 200
379
344
  Oj.load(response.body)
380
345
  end
@@ -401,7 +366,7 @@ module Readiness
401
366
  # pp comment
402
367
  # # => true
403
368
  def self.delete_comment!(client, project, issue, cid)
404
- response = client.connection.delete "projects/#{project.id}/issues/#{issue.id}/notes/#{cid}"
369
+ response = client.connection.delete "projects/#{project.id}/issues/#{issue.iid}/notes/#{cid}"
405
370
  handle_request_error(1, 'GitLab', response.status, { action: 'Delete issue comment', id: issue.id }) unless response.status == 204
406
371
  true
407
372
  end
@@ -447,7 +447,7 @@ module Readiness
447
447
  # pp badge['id']
448
448
  # # => 7
449
449
  def self.create_badge!(client, project, params)
450
- response = client.connection.post "projects/#{project.id}/badges", to_clean_json(params)
450
+ response = client.connection.post "projects/#{project.id}/badges", params.to_json
451
451
  handle_request_error(1, 'GitLab', response.status, { action: 'Create badge', id: project.id }) unless response.status == 200
452
452
  Oj.load(response.body)
453
453
  end
@@ -472,11 +472,11 @@ module Readiness
472
472
  # bdge_params = {
473
473
  # image_url: 'https://shields.io/my/badge'
474
474
  # }
475
- # badge = Readiness::GitLab::Projects.create_badge!(client, project, 7, bdge_params)
475
+ # badge = Readiness::GitLab::Projects.update_badge!(client, project, 7, bdge_params)
476
476
  # pp badge['name']
477
477
  # # => "mybadge"
478
478
  def self.update_badge!(client, project, bid, params)
479
- response = client.connection.put "projects/#{project.id}/badges/#{bid}", to_clean_json(params)
479
+ response = client.connection.put "projects/#{project.id}/badges/#{bid}", params.to_json
480
480
  handle_request_error(1, 'GitLab', response.status, { action: 'Update badge', id: project.id }) unless response.status == 200
481
481
  Oj.load(response.body)
482
482
  end
@@ -497,7 +497,7 @@ module Readiness
497
497
  # config.token = 'test123abc'
498
498
  # client = Readiness::GitLab::Client.new(config)
499
499
  # project = Readiness::GitLab::Projects.find!(client, 1083469)
500
- # badge = Readiness::GitLab::Projects.create_badge!(client, project, 7)
500
+ # badge = Readiness::GitLab::Projects.delete_badge!(client, project, 7)
501
501
  # pp badge
502
502
  # # => true
503
503
  def self.delete_badge!(client, project, bid)
@@ -81,7 +81,7 @@ module Readiness
81
81
  # @param project [Object] An instance of {Readiness::GitLab::Projects}
82
82
  # @param path [String] The full file path. Ex: lib/support_readiness/gitlab/repositories.rb
83
83
  # @param ref [String] The name of branch, tag or commit
84
- # @return [Array]
84
+ # @return [String]
85
85
  # @see https://docs.gitlab.com/ee/api/repository_files.html#get-raw-file-from-repository GitLab API > Repository files > Get raw file from repository
86
86
  # @example
87
87
  # require 'support_readiness'
@@ -90,12 +90,12 @@ module Readiness
90
90
  # client = Readiness::GitLab::Client.new(config)
91
91
  # project = Readiness::GitLab::Projects.find!(client, 1083469)
92
92
  # file = Readiness::GitLab::Repositories.raw_file(client, project, ".gitlab/CODEOWNERS", "main")
93
- # pp file['size']
94
- # # => 88
93
+ # pp file
94
+ # # => "Hello World!"
95
95
  def self.raw_file(client, project, path, ref)
96
96
  response = client.connection.get "projects/#{project.id}/repository/files/#{CGI.escape(path)}/raw?ref=#{ref}"
97
97
  handle_request_error(0, 'GitLab', response.status) unless response.status == 200
98
- Oj.load(response.body)
98
+ response.body
99
99
  end
100
100
 
101
101
  ##
@@ -126,7 +126,7 @@ module Readiness
126
126
  # pp file['path']
127
127
  # # => "spec/test.file"
128
128
  def self.create_file!(client, project, path, params)
129
- response = client.connection.post "projects/#{project.id}/repository/files/#{CGI.escape(path)}", to_clean_json(params)
129
+ response = client.connection.post "projects/#{project.id}/repository/files/#{CGI.escape(path)}", params.to_json
130
130
  handle_request_error(1, 'GitLab', response.status, { action: 'Create file in repo', id: "#{project.id}" }) unless response.status == 200
131
131
  Oj.load(response.body)
132
132
  end
@@ -159,7 +159,7 @@ module Readiness
159
159
  # pp file['path']
160
160
  # # => "spec/test.file"
161
161
  def self.update_file!(client, project, path, params)
162
- response = client.connection.put "projects/#{project.id}/repository/files/#{CGI.escape(path)}", to_clean_json(params)
162
+ response = client.connection.put "projects/#{project.id}/repository/files/#{CGI.escape(path)}", params.to_json
163
163
  handle_request_error(1, 'GitLab', response.status, { action: 'Update file in repo', id: "#{project.id}" }) unless response.status == 200
164
164
  Oj.load(response.body)
165
165
  end
@@ -190,7 +190,7 @@ module Readiness
190
190
  # pp file
191
191
  # # => true
192
192
  def self.delete_file!(client, project, path, params)
193
- response = client.connection.delete "projects/#{project.id}/repository/files/#{CGI.escape(path)}", to_clean_json(params)
193
+ response = client.connection.delete "projects/#{project.id}/repository/files/#{CGI.escape(path)}", params.to_json
194
194
  handle_request_error(1, 'GitLab', response.status, { action: 'Delete file in repo', id: "#{project.id}" }) unless response.status == 204
195
195
  true
196
196
  end
@@ -227,7 +227,7 @@ module Readiness
227
227
  # pp commit['title']
228
228
  # # => "Notify via slack for failed pipelines"
229
229
  def self.create_commit!(client, project, params)
230
- response = client.connection.post "projects/#{project.id}/repository/commits", to_clean_json(params)
230
+ response = client.connection.post "projects/#{project.id}/repository/commits", params.to_json
231
231
  handle_request_error(1, 'GitLab', response.status, { action: 'Create commit', id: "#{project.id}" }) unless response.status == 200
232
232
  Oj.load(response.body)
233
233
  end
@@ -258,7 +258,7 @@ module Readiness
258
258
  # pp update['parent_ids']
259
259
  # # => ["ae1d9fb46aa2b07ee9836d49862ec4e2c46fbbba"]
260
260
  def self.update_submodule!(client, project, path, params)
261
- response = clinet.connection.put "projects/#{project.id}/repository/submodules/#{CGI.escape(path)}", to_clean_json(params)
261
+ response = clinet.connection.put "projects/#{project.id}/repository/submodules/#{CGI.escape(path)}", params.to_json
262
262
  handle_request_error(1, 'GitLab', response.status, { action: 'Update submodule in repo', id: "#{project.id}" }) unless response.status == 200
263
263
  Oj.load(response.body)
264
264
  end
@@ -248,7 +248,7 @@ module Readiness
248
248
  # @param user [Object] An instance of {Readiness::GitLab::Users}
249
249
  # @param filters [Array] An array of filter Strings to use. Should be in the format of key=value
250
250
  # @return [Array]
251
- # @see https://docs.gitlab.com/ee/api/projects.html#list-user-projects GitLab API > Projects > List user projects
251
+ # @see https://docs.gitlab.com/ee/api/projects.html#list-a-users-projects GitLab API > Projects > List user projects
252
252
  # @example
253
253
  # require 'support_readiness'
254
254
  # config = Readiness::GitLab::Configuration.new
@@ -383,7 +383,7 @@ module Readiness
383
383
  # pp token['token']
384
384
  # # => "s3cr3t1"
385
385
  def self.create_token!(client, user, params)
386
- response = client.connection.post "users/#{user.id}/personal_access_tokens", to_clean_json(params)
386
+ response = client.connection.post "users/#{user.id}/personal_access_tokens", params.to_json
387
387
  handle_request_error(1, 'GitLab', response.status, { action: 'Create PAT for a user', id: "#{user.id}" }) unless response.status == 200
388
388
  Oj.load(response.body)
389
389
  end
@@ -54,6 +54,8 @@ module Readiness
54
54
  # # => bar
55
55
  def self.get(client, key)
56
56
  Marshal.load client.connection.get(key)
57
+ rescue TypeError
58
+ nil
57
59
  end
58
60
 
59
61
  ##
@@ -69,7 +71,7 @@ module Readiness
69
71
  # redis = Readiness::Redis.new('domain.com', 6379, 'p@assw0rd!')
70
72
  # Readiness::Redis.set(redis, 'foo', 'bar2')
71
73
  def self.set(client, key, value)
72
- client.connection.set(key, Marhsal.dump(value))
74
+ client.connection.set(key, Marshal.dump(value))
73
75
  end
74
76
 
75
77
  ##
@@ -79,12 +81,16 @@ module Readiness
79
81
  # @since 1.0.0
80
82
  # @param client [Object] A {Readiness::Redis} instance
81
83
  # @param key [String] The Redis key to delete
84
+ # @return [Boolean]
82
85
  # @example
83
86
  # require 'support_readiness'
84
87
  # redis = Readiness::Redis.new('domain.com', 6379, 'p@assw0rd!')
85
88
  # Readiness::Redis.del(redis, 'foo')
86
89
  def self.del(client, key)
87
- client.connection.del(key)
90
+ response = client.connection.del(key)
91
+ return true if response == 1
92
+
93
+ false
88
94
  end
89
95
  end
90
96
  end
@@ -141,14 +141,16 @@ module Readiness
141
141
  # client = Readiness::Zendesk::Client.new(config)
142
142
  # article = Readiness::Zendesk::Articles.new
143
143
  # article.title = 'Taking photos in low light'
144
- # artricle.body = 'Use a tripod'
144
+ # article.body = 'Use a tripod'
145
145
  # article.section_id = 123
146
146
  # article.locale = 'en-us'
147
+ # article.user_segment_id = nil
148
+ # article.permission_group_id = 12528735509276
147
149
  # create = Readiness::Zendesk::Articles.create!(client, article)
148
150
  # pp create.id
149
151
  # # => 35468
150
152
  def self.create!(client, article)
151
- response = client.connection.post "help_center/sections/#{article.section_id}/articles", to_clean_json_with_key(article, 'article')
153
+ response = client.connection.post "help_center/sections/#{article.section_id}/articles", to_nearly_clean_json_with_key(article, 'article', ['user_segment_id'])
152
154
  handle_request_error(1, 'Zendesk', response.status, { action: 'Create article', message: Oj.load(response.body)}) unless response.status == 201
153
155
  Articles.new(Oj.load(response.body)['article'])
154
156
  end
@@ -175,7 +177,7 @@ module Readiness
175
177
  # pp update.body
176
178
  # # => "Use a tripod and low light approved camera"
177
179
  def self.update!(client, article)
178
- response = client.connection.put "help_center/sections/#{article.section_id}/articles", to_clean_json_with_key(article, 'article')
180
+ response = client.connection.put "help_center/articles/#{article.id}", to_nearly_clean_json_with_key(article, 'article', ['user_segment_id'])
179
181
  handle_request_error(1, 'Zendesk', response.status, { action: 'Update article', id: article.id, message: Oj.load(response.body)}) unless response.status == 200
180
182
  Articles.new(Oj.load(response.body)['article'])
181
183
  end
@@ -201,7 +203,7 @@ module Readiness
201
203
  # pp archive
202
204
  # # => true
203
205
  def self.archive!(client, article)
204
- response = client.connection.delete "help_center/articles/#{article_id}"
206
+ response = client.connection.delete "help_center/articles/#{article.id}"
205
207
  handle_request_error(1, 'Zendesk', response.status, { action: 'Archive article', id: article.id, message: Oj.load(response.body)}) unless response.status == 204
206
208
  true
207
209
  end
@@ -137,21 +137,21 @@ module Readiness
137
137
  # automation.conditions = {
138
138
  # all: [
139
139
  # {
140
- # field: 'status'
141
- # operator: 'is'
140
+ # field: 'status',
141
+ # operator: 'is',
142
142
  # value: 'solved'
143
143
  # },
144
144
  # {
145
- # field: 'priority'
146
- # operator: 'is_not'
145
+ # field: 'priority',
146
+ # operator: 'is_not',
147
147
  # value: 'low'
148
148
  # }
149
- # ]
149
+ # ],
150
150
  # any: []
151
151
  # }
152
152
  # automation.actions = [
153
153
  # {
154
- # field: 'priority'
154
+ # field: 'priority',
155
155
  # value: 'low'
156
156
  # }
157
157
  # ]
@@ -213,7 +213,7 @@ module Readiness
213
213
  end
214
214
 
215
215
  ##
216
- # Updates multiple automations via a batch job
216
+ # Updates multiple automations. Can only update position and active values.
217
217
  #
218
218
  # @author Jason Colyer
219
219
  # @since 1.0.0
@@ -238,11 +238,11 @@ module Readiness
238
238
  # updated = Readiness::Zendesk::Automations.update_many!(client, automation)
239
239
  # pp updated.first.position
240
240
  # # => 2
241
- def self.update_many(client, automations)
241
+ def self.update_many!(client, automations)
242
242
  data = { automations: automations.map { |t| to_hash(t).compact } }.to_json
243
243
  response = client.connection.put('automations/update_many', data)
244
244
  handle_request_error(1, 'Zendesk', response.status, { action: 'Update many automations', message: Oj.load(response.body)}) unless response.status == 200
245
- Oj.load(response.body).map { |a| Automations.new(a) }
245
+ Oj.load(response.body)['automations'].map { |a| Automations.new(a) }
246
246
  end
247
247
 
248
248
  ##
@@ -287,11 +287,7 @@ module Readiness
287
287
  # config.token = 'test123abc'
288
288
  # config.url = 'https://example.zendesk.com/api/v2'
289
289
  # client = Readiness::Zendesk::Client.new(config)
290
- # automation1 = Readiness::Zendesk::Automations.find!(client, 1)
291
- # automation2 = Readiness::Zendesk::Automations.find!(client, 2)
292
- # automation3 = Readiness::Zendesk::Automations.find!(client, 3)
293
- # automations = [automation1, automation2, automation3]
294
- # deleted = Readiness::Zendesk::Automations.delete_many!(client, automation)
290
+ # deleted = Readiness::Zendesk::Automations.delete_many!(client, [1, 7, 19])
295
291
  # pp deleted
296
292
  # # => true
297
293
  def self.delete_many!(client, aids)
@@ -194,7 +194,7 @@ module Readiness
194
194
  # create = Readiness::Zendesk::GroupMemberships.create_many!(client, memberships)
195
195
  # pp create.id
196
196
  # # => "82de0b044094f0c67893ac9fe64f1a99"
197
- def self.create_many(client, memberships)
197
+ def self.create_many!(client, memberships)
198
198
  data = { group_memberships: memberships.map { |t| to_hash(t).compact } }.to_json
199
199
  response = client.connection.post('group_memberships/create_many', data)
200
200
  handle_request_error(1, 'Zendesk', response.status, { action: 'Create many group memberships', message: Oj.load(response.body)}) unless response.status == 200
@@ -237,7 +237,6 @@ module Readiness
237
237
  handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
238
238
  body = Oj.load(response.body)
239
239
  array += body['group_memberships']
240
- break if limit != 0 && array.count >= (limit * 100)
241
240
  break unless body['meta']['has_more']
242
241
 
243
242
  opts = body['links'] ['next'].split('?').last
@@ -173,7 +173,7 @@ module Readiness
173
173
  end
174
174
 
175
175
  ##
176
- # Updates multiple macros via a batch job
176
+ # Updates multiple macros. Can only update position and active values.
177
177
  #
178
178
  # @author Jason Colyer
179
179
  # @since 1.0.0
@@ -230,7 +230,7 @@ module Readiness
230
230
  end
231
231
 
232
232
  ##
233
- # Deletes multiple macros via a batch job
233
+ # Deletes multiple macros
234
234
  #
235
235
  # @author Jason Colyer
236
236
  # @since 1.0.0
@@ -139,7 +139,7 @@ module Readiness
139
139
  # field.type = 'text'
140
140
  # field.title = 'Support desc'
141
141
  # field.description = 'This field describes the support plan this organization has'
142
- # field.position: 0
142
+ # field.position = 0
143
143
  # field.active = true
144
144
  # field.key = 'support_description'
145
145
  # create = Readiness::Zendesk::OrganizationFields.create!(client, field)
@@ -173,7 +173,7 @@ module Readiness
173
173
  # pp create.title
174
174
  # # => "Support description"
175
175
  def self.update!(client, field)
176
- response = client.connection.put "organization_fields/#{field.id}", to_clean_json_with_key(field, 'ticket_field')
176
+ response = client.connection.put "organization_fields/#{field.id}", to_clean_json_with_key(field, 'organization_field')
177
177
  handle_request_error(1, 'Zendesk', response.status, { action: 'Update organization field', message: Oj.load(response.body)}) unless response.status == 200
178
178
  OrganizationFields.new(Oj.load(response.body)['organization_field'])
179
179
  end
@@ -244,10 +244,10 @@ module Readiness
244
244
  # config.token = 'test123abc'
245
245
  # config.url = 'https://example.zendesk.com/api/v2'
246
246
  # client = Readiness::Zendesk::Client.new(config)
247
- # deletes = Readiness::Zendesk::OrganizationMemberships.delete!(client, [461, 462])
247
+ # deletes = Readiness::Zendesk::OrganizationMemberships.delete_many!(client, [461, 462])
248
248
  # pp deletes.id
249
249
  # # => "82de0b044094f0c67893ac9fe64f1a99"
250
- def self.delete_many(client, mids)
250
+ def self.delete_many!(client, mids)
251
251
  response = client.connection.delete("organization_memberships/destroy_many?ids=#{mids.join(',')}")
252
252
  handle_request_error(1, 'Zendesk', response.status, { action: 'Delete many organization memberships', message: Oj.load(response.body)}) unless response.status == 200
253
253
  JobStatuses.new(Oj.load(response.body)['job_status'])
@@ -503,7 +503,6 @@ module Readiness
503
503
  handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
504
504
  body = Oj.load(response.body)
505
505
  array += body['organization_memberships'].map { |o| OrganizationMemberships.new(o) }
506
- break if limit != 0 && array.count >= (limit * 100)
507
506
  break unless body['meta']['has_more']
508
507
 
509
508
  opts = body['links'] ['next'].split('?').last
@@ -62,7 +62,7 @@ module Readiness
62
62
  # @param client [Object] An instance of {Readiness::Zendesk::Client}
63
63
  # @param rid [Integer] The Custom Role ID to find
64
64
  # @return [Hash]
65
- # @see https:/developer.zendesk.com/api-reference/ticketing/account-configuration/custom_roles/#show-custom-role Zendesk API > Custom Roles > Show Custom Role
65
+ # @see https://developer.zendesk.com/api-reference/ticketing/account-configuration/custom_roles/#show-custom-role Zendesk API > Custom Roles > Show Custom Role
66
66
  # @example
67
67
  # require 'support_readiness'
68
68
  # config = Readiness::Zendesk::Configuration.new
@@ -89,7 +89,7 @@ module Readiness
89
89
  # @param client [Object] An instance of {Readiness::Zendesk::Client}
90
90
  # @param rid [Integer] The Custom Role ID to find
91
91
  # @return [Object] An instance of {Readiness::Zendesk::Roles}
92
- # @see https:/developer.zendesk.com/api-reference/ticketing/account-configuration/custom_roles/#show-custom-role Zendesk API > Custom Roles > Show Custom Role
92
+ # @see https://developer.zendesk.com/api-reference/ticketing/account-configuration/custom_roles/#show-custom-role Zendesk API > Custom Roles > Show Custom Role
93
93
  # @example
94
94
  # require 'support_readiness'
95
95
  # config = Readiness::Zendesk::Configuration.new
@@ -114,7 +114,7 @@ module Readiness
114
114
  # @param client [Object] An instance of {Readiness::Zendesk::Client}
115
115
  # @param role [Object] An instance of {Readiness::Zendesk::Roles}
116
116
  # @return [Object] An instance of {Readiness::Zendesk::Roles}
117
- # @see https:/developer.zendesk.com/api-reference/ticketing/account-configuration/custom_roles/#create-custom-role Zendesk API > Custom Roles > Create Custom Role
117
+ # @see https://developer.zendesk.com/api-reference/ticketing/account-configuration/custom_roles/#create-custom-role Zendesk API > Custom Roles > Create Custom Role
118
118
  # @example
119
119
  # require 'support_readiness'
120
120
  # config = Readiness::Zendesk::Configuration.new
@@ -145,7 +145,7 @@ module Readiness
145
145
  # @param client [Object] An instance of {Readiness::Zendesk::Client}
146
146
  # @param role [Object] An instance of {Readiness::Zendesk::Roles}
147
147
  # @return [Object] An instance of {Readiness::Zendesk::Roles}
148
- # @see https:/developer.zendesk.com/api-reference/ticketing/account-configuration/custom_roles/#update-custom-role Zendesk API > Custom Roles > Update Custom Role
148
+ # @see https://developer.zendesk.com/api-reference/ticketing/account-configuration/custom_roles/#update-custom-role Zendesk API > Custom Roles > Update Custom Role
149
149
  # @example
150
150
  # require 'support_readiness'
151
151
  # config = Readiness::Zendesk::Configuration.new
@@ -172,7 +172,7 @@ module Readiness
172
172
  # @param client [Object] An instance of {Readiness::Zendesk::Client}
173
173
  # @param role [Object] An instance of {Readiness::Zendesk::Roles}
174
174
  # @return [Boolean]
175
- # @see https:/developer.zendesk.com/api-reference/ticketing/account-configuration/custom_roles/#delete-custom-role Zendesk API > Custom Roles > Delete Custom Role
175
+ # @see https://developer.zendesk.com/api-reference/ticketing/account-configuration/custom_roles/#delete-custom-role Zendesk API > Custom Roles > Delete Custom Role
176
176
  # @example
177
177
  # require 'support_readiness'
178
178
  # config = Readiness::Zendesk::Configuration.new
@@ -145,7 +145,7 @@ module Readiness
145
145
  # pp create.id
146
146
  # # => 36
147
147
  def self.create!(client, policy)
148
- response = client.connection.post 'slas/policies', to_clean_json_with_key(policyt, 'sla_policy')
148
+ response = client.connection.post 'slas/policies', to_clean_json_with_key(policy, 'sla_policy')
149
149
  handle_request_error(1, 'Zendesk', response.status, { action: 'Create SLA Policy', message: Oj.load(response.body)}) unless response.status == 201
150
150
  SLAs.new(Oj.load(response.body)['sla_policy'])
151
151
  end
@@ -280,7 +280,7 @@ module Readiness
280
280
  # reorder = Readiness::Zendesk::TicketForms.reorder!(client, [2, 23, 46, 50])
281
281
  # pp reorder.count
282
282
  # # => 4
283
- def self.reorder(client, fids)
283
+ def self.reorder!(client, fids)
284
284
  response = client.connection.put 'ticket_forms/reorder', { ticket_form_ids: fids }.to_json
285
285
  handle_request_error(1, 'Zendesk', response.status, { action: 'Clone a ticket form', id: form.id, message: Oj.load(response.body)}) unless response.status == 200
286
286
  Oj.load(response.body)['ticket_form'].map { |f| TicketForms.new(f) }
@@ -108,7 +108,7 @@ module Readiness
108
108
  end
109
109
 
110
110
  ##
111
- # Lists the CCs on a ticket
111
+ # Lists the CCs on a ticket. If your system is not using followers, you need to use {collaborators}
112
112
  #
113
113
  # @author Jason Colyer
114
114
  # @since 1.0.0
@@ -492,7 +492,7 @@ module Readiness
492
492
  def self.delete_permanently!(client, tid)
493
493
  response = client.connection.delete "deleted_tickets/#{tid}"
494
494
  handle_request_error(1, 'Zendesk', response.status) unless response.status == 200
495
- JobStatuses.new(Oj.load(response.body['job_status']))
495
+ JobStatuses.new(Oj.load(response.body)['job_status'])
496
496
  end
497
497
 
498
498
  ##
@@ -523,7 +523,6 @@ module Readiness
523
523
  handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
524
524
  body = Oj.load(response.body)
525
525
  array += body['tickets'].map { |t| Tickets.new(t) }
526
- break if limit != 0 && array.count >= (limit * 100)
527
526
  break unless body['meta']['has_more']
528
527
 
529
528
  opts = body['links'] ['next'].split('?').last
@@ -557,7 +556,6 @@ module Readiness
557
556
  handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
558
557
  body = Oj.load(response.body)
559
558
  array += body['tickets'].map { |t| Tickets.new(t) }
560
- break if limit != 0 && array.count >= (limit * 100)
561
559
  break unless body['meta']['has_more']
562
560
 
563
561
  opts = body['links'] ['next'].split('?').last
@@ -742,7 +740,6 @@ module Readiness
742
740
  handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
743
741
  body = Oj.load(response.body)
744
742
  array += body['suspended_tickets']
745
- break if limit != 0 && array.count >= (limit * 100)
746
743
  break unless body['meta']['has_more']
747
744
 
748
745
  opts = body['links'] ['next'].split('?').last
@@ -184,7 +184,7 @@ module Readiness
184
184
  end
185
185
 
186
186
  ##
187
- # Updates multiple triggers via a batch job
187
+ # Updates multiple triggers
188
188
  #
189
189
  # @author Jason Colyer
190
190
  # @since 1.0.0
@@ -211,7 +211,7 @@ module Readiness
211
211
  data = { triggers: triggers.map { |t| to_hash(t).compact } }.to_json
212
212
  response = client.connection.put('triggers/update_many', data)
213
213
  handle_request_error(1, 'Zendesk', response.status, { action: 'Update many triggers', message: Oj.load(response.body)}) unless response.status == 200
214
- Oj.load(response.body)['trigger'].map { |t| Triggers.new(t) }
214
+ Oj.load(response.body)['triggers'].map { |t| Triggers.new(t) }
215
215
  end
216
216
 
217
217
  ##
@@ -256,10 +256,10 @@ module Readiness
256
256
  # config.token = 'test123abc'
257
257
  # config.url = 'https://example.zendesk.com/api/v2'
258
258
  # client = Readiness::Zendesk::Client.new(config)
259
- # deletes = Readiness::Zendesk::Triggers.delete!(client, [25, 23, 27, 22])
259
+ # deletes = Readiness::Zendesk::Triggers.delete_many!(client, [25, 23, 27, 22])
260
260
  # pp deletes
261
261
  # # => true
262
- def self.delete_many(client, tids)
262
+ def self.delete_many!(client, tids)
263
263
  response = client.connection.delete("triggers/destroy_many?ids=#{tids.join(',')}")
264
264
  handle_request_error(1, 'Zendesk', response.status, { action: 'Delete many triggers', message: Oj.load(response.body)}) unless response.status == 204
265
265
  true
@@ -383,8 +383,8 @@ module Readiness
383
383
  # # => 189304711533
384
384
  def self.delete_permanently!(client, uid)
385
385
  response = client.connection.delete "deleted_users/#{uid}"
386
- handle_request_error(1, 'Zendesk', response.status) unless response.status == 200
387
- Oj.load(response.body['deleted_user'])
386
+ handle_request_error(1, 'Zendesk', response.status, { action: 'Delete user permanently', id: uid, message: Oj.load(response.body)}) unless response.status == 200
387
+ Oj.load(response.body)['deleted_user']
388
388
  end
389
389
 
390
390
  ##
@@ -466,7 +466,7 @@ module Readiness
466
466
  # pp deletes['value']
467
467
  # # => 13
468
468
  def self.deleted_count(client)
469
- response = client.connection.get("deleted_users/count?#{opts}")
469
+ response = client.connection.get('deleted_users/count')
470
470
  handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
471
471
  Oj.load(response.body)['count']
472
472
  end
@@ -636,6 +636,8 @@ module Readiness
636
636
  # pp tickets.count
637
637
  # # => 2
638
638
  def self.assigned_tickets(client, user)
639
+ return 0 if user.role == 'end-user'
640
+
639
641
  array = []
640
642
  opts = "page[size]=100"
641
643
  loop do
@@ -736,7 +738,7 @@ module Readiness
736
738
  # # => "82de0b044094f0c67893ac9fe64f1a99"
737
739
  def self.create_or_update_many!(client, users)
738
740
  data = { users: users.map { |u| to_hash(u).compact } }.to_json
739
- response = client.connection.post('users/create_or_update_many', data)
741
+ response = client.connection.put('users/create_or_update_many', data)
740
742
  handle_request_error(1, 'Zendesk', response.status, { action: 'Create or update many users', message: Oj.load(response.body)}) unless response.status == 200
741
743
  JobStatuses.new(Oj.load(response.body)['job_status'])
742
744
  end
@@ -821,7 +823,7 @@ module Readiness
821
823
  array = []
822
824
  opts = "page[size]=100"
823
825
  loop do
824
- response = client.connection.get("user/#{user.id}/organization_memberships?#{opts}")
826
+ response = client.connection.get("users/#{user.id}/organization_memberships?#{opts}")
825
827
  handle_request_error(0, 'Zendesk', response.status) unless response.status == 200
826
828
  body = Oj.load(response.body)
827
829
  array += body['organization_memberships'].map { |o| OrganizationMemberships.new(o) }
@@ -840,9 +842,9 @@ module Readiness
840
842
  # @since 1.0.0
841
843
  # @param client [Object] An instance of {Readiness::Zendesk::Client}
842
844
  # @param user [Object] An instance of {Readiness::Zendesk::Users}
843
- # @param organization [Object] An instance of {Readiness::Zendesk::Organizations}
845
+ # @param membership [Object] An instance of {Readiness::Zendesk::OrganizationMemberships}
844
846
  # @return [Array]
845
- # @see https://developer.zendesk.com/api-reference/ticketing/organizations/organization_memberships/#set-organization-as-default Zendesk API > Organization Memberships > Set Organization as Default
847
+ # @see https://developer.zendesk.com/api-reference/ticketing/organizations/organization_memberships/#set-membership-as-default Zendesk API > Organization Memberships > Set Membership as Default
846
848
  # @example
847
849
  # require 'support_readiness'
848
850
  # config = Readiness::Zendesk::Configuration.new
@@ -851,12 +853,12 @@ module Readiness
851
853
  # config.url = 'https://example.zendesk.com/api/v2'
852
854
  # client = Readiness::Zendesk::Client.new(config)
853
855
  # user = Readiness::Zendesk::Users.find!(client, 123)
854
- # org = Readiness::Zendesk::Organizations.find!(client, 456)
855
- # member = Readiness::Zendesk::Users.set_default_organization!(client, user, org)
856
+ # membership = Readiness::Zendesk::Users.organization_memberships(client, user).last
857
+ # member = Readiness::Zendesk::Users.set_default_organization!(client, user, membership)
856
858
  # pp member.id
857
859
  # # => 4
858
- def self.set_default_organization!(client, user, organization)
859
- response = client.connection.put("users/#{user.id}/organizations/#{organization.id}/make_default")
860
+ def self.set_default_organization!(client, user, membership)
861
+ response = client.connection.put("users/#{user.id}/organization_memberships/#{membership.id}/make_default")
860
862
  handle_request_error(1, 'Zendesk', response.status, { action: 'Set org as default', message: Oj.load(response.body)}) unless response.status == 200
861
863
  OrganizationMemberships.new(Oj.load(response.body)['organization_membership'])
862
864
  end
@@ -894,7 +896,7 @@ module Readiness
894
896
  # @since 1.0.0
895
897
  # @param client [Object] An instance of {Readiness::Zendesk::Client}
896
898
  # @param user [Object] An instance of {Readiness::Zendesk::Users}
897
- # @param group [Object] An instance of {Readiness::Zendesk::Group}
899
+ # @param membership [Object] An instance of {Readiness::Zendesk::GroupMemberships}
898
900
  # @return [Array]
899
901
  # @see https://developer.zendesk.com/api-reference/ticketing/groups/group_memberships/#set-membership-as-default Zendesk API > Group Memberships > Set Membership as Default
900
902
  # @example
@@ -905,12 +907,12 @@ module Readiness
905
907
  # config.url = 'https://example.zendesk.com/api/v2'
906
908
  # client = Readiness::Zendesk::Client.new(config)
907
909
  # user = Readiness::Zendesk::Users.find!(client, 123)
908
- # group = Readiness::Zendesk::Groups.find!(client, 456)
909
- # member = Readiness::Zendesk::Users.set_default_group!(client, user, group)
910
+ # membership = Readiness::Zendesk::Users.group_memberships(client, user).last
911
+ # member = Readiness::Zendesk::Users.set_default_group!(client, user, membership)
910
912
  # pp member.id
911
913
  # # => 4
912
- def self.set_default_group!(client, user, group)
913
- response = client.connection.put("users/#{user.id}/group_memberships/#{group.id}/make_default")
914
+ def self.set_default_group!(client, user, membership)
915
+ response = client.connection.put("users/#{user.id}/group_memberships/#{membership.id}/make_default")
914
916
  handle_request_error(1, 'Zendesk', response.status, { action: 'Set group as default', message: Oj.load(response.body)}) unless response.status == 200
915
917
  GroupMemberships.new(Oj.load(response.body)['group_memberships'])
916
918
  end
@@ -163,39 +163,36 @@ module Readiness
163
163
  # view.title = "Kelly's tickets"
164
164
  # view.description = 'Tickets that are assigned to Kelly'
165
165
  # view.active = true
166
- # view.position: 3
167
- # view.restriction: { type: 'User', id: '213977756' }
166
+ # view.position = 3
168
167
  # view.conditions = {
169
- # all: [
170
- # { field: 'status', operator: 'less_than', value: 'solved' },
171
- # { field: 'group_id', operator: 'is', value: '24000932' },
172
- # { field: 'custom_fields_360011872073', operator: 'is', value: 'Canada' }
168
+ # "all" => [
169
+ # { "field" => 'status', "operator" => 'less_than', "value" => 'solved' }
173
170
  # ],
174
- # any: []
171
+ # "any" => []
175
172
  # }
176
173
  # view.execution = {
177
- # columns: [
178
- # { id: 'status', title: 'Status', filterable: true, sortable: true},
179
- # { id: 'requester', title: 'Requester', filterable: true, sortable: true},
180
- # { id: 'assignee', title: 'Assignee', filterable: true, sortable: true},
181
- # ]
182
- # group_by: 'assignee',
183
- # group_order: 'desc',
184
- # sort_by: 'status',
185
- # sort_order: 'desc',
186
- # group: {
187
- # id: 'assignee',
188
- # title: 'Assignee',
189
- # filterable: true,
190
- # sortable: true,
191
- # order: 'desc'
192
- # }
193
- # sort: {
194
- # id: 'status',
195
- # title: 'Status',
196
- # filterable: true,
197
- # sortable: true,
198
- # order: 'desc'
174
+ # "columns" => [
175
+ # { "id" => 'status', "title" => 'Status', "filterable" => true, "sortable" => true},
176
+ # { "id" => 'requester', "title" => 'Requester', "filterable" => true, "sortable" => true},
177
+ # { "id" => 'assignee', "title" => 'Assignee', "filterable" => true, "sortable" => true},
178
+ # ],
179
+ # "group_by" => 'assignee',
180
+ # "group_order" => 'desc',
181
+ # "sort_by" => 'status',
182
+ # "sort_order" => 'desc',
183
+ # "group" => {
184
+ # "id" => 'assignee',
185
+ # "title" => 'Assignee',
186
+ # "filterable" => true,
187
+ # "sortable" => true,
188
+ # "order" => 'desc'
189
+ # },
190
+ # "sort" => {
191
+ # "id" => 'status',
192
+ # "title" => 'Status',
193
+ # "filterable" => true,
194
+ # "sortable" => true,
195
+ # "order" => 'desc'
199
196
  # }
200
197
  # }
201
198
  # create = Readiness::Zendesk::Views.create!(client, view)
@@ -259,7 +256,7 @@ module Readiness
259
256
  # pp updates.map { |v| v.title }
260
257
  # # => ["Canada tickets", "Mexico tickets"]
261
258
  def self.update_many!(client, views)
262
- data = { views: views.map { |v| create_or_update_object(view) } }.to_json
259
+ data = { views: views.map { |v| create_or_update_object(v) } }.to_json
263
260
  response = client.connection.put('views/update_many', data)
264
261
  handle_request_error(1, 'Zendesk', response.status, { action: 'Update many views', message: Oj.load(response.body)}) unless response.status == 200
265
262
  JobStatuses.new(Oj.load(response.body)['job_status'])
@@ -292,7 +289,7 @@ module Readiness
292
289
  end
293
290
 
294
291
  ##
295
- # Deletes multiple views via a batch job
292
+ # Deletes multiple views
296
293
  #
297
294
  # @author Jason Colyer
298
295
  # @since 1.0.0
@@ -310,7 +307,7 @@ module Readiness
310
307
  # deletes = Readiness::Zendesk::Views.find!(client, [9873858, 9873843])
311
308
  # pp deletes
312
309
  # # => true
313
- def self.delete_many(client, vids)
310
+ def self.delete_many!(client, vids)
314
311
  response = client.connection.delete("views/destroy_many?ids=#{vids.join(',')}")
315
312
  handle_request_error(1, 'Zendesk', response.status, { action: 'Delete many views', message: Oj.load(response.body)}) unless response.status == 204
316
313
  true
@@ -345,7 +342,7 @@ module Readiness
345
342
  output: converted['output']
346
343
  }
347
344
  }.compact.to_json
348
- response = client.connection.post 'views/preview', data
345
+ response = client.connection.post 'views/preview', { view: data }.to_json
349
346
  handle_request_error(1, 'Zendesk', response.status, { action: 'Preview a view', message: Oj.load(response.body)}) unless response.status == 200
350
347
  Oj.load(response.body)
351
348
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab_support_readiness
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Colyer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-26 00:00:00.000000000 Z
11
+ date: 2024-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport