zendesk2 1.9.0 → 1.10.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 (222) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +30 -0
  3. data/.travis.yml +3 -1
  4. data/Gemfile +4 -5
  5. data/Guardfile +4 -3
  6. data/Rakefile +4 -3
  7. data/lib/zendesk2.rb +9 -6
  8. data/lib/zendesk2/attributes.rb +11 -8
  9. data/lib/zendesk2/audit_event.rb +5 -3
  10. data/lib/zendesk2/categories.rb +4 -3
  11. data/lib/zendesk2/category.rb +10 -5
  12. data/lib/zendesk2/client.rb +3 -3
  13. data/lib/zendesk2/collection.rb +35 -21
  14. data/lib/zendesk2/create_category.rb +10 -9
  15. data/lib/zendesk2/create_forum.rb +11 -10
  16. data/lib/zendesk2/create_group.rb +13 -12
  17. data/lib/zendesk2/create_membership.rb +21 -20
  18. data/lib/zendesk2/create_organization.rb +24 -18
  19. data/lib/zendesk2/create_ticket.rb +60 -56
  20. data/lib/zendesk2/create_ticket_field.rb +24 -22
  21. data/lib/zendesk2/create_topic.rb +11 -10
  22. data/lib/zendesk2/create_topic_comment.rb +12 -11
  23. data/lib/zendesk2/create_user.rb +54 -41
  24. data/lib/zendesk2/create_user_field.rb +22 -21
  25. data/lib/zendesk2/create_user_identity.rb +18 -15
  26. data/lib/zendesk2/create_view.rb +62 -62
  27. data/lib/zendesk2/destroy_category.rb +2 -1
  28. data/lib/zendesk2/destroy_forum.rb +2 -1
  29. data/lib/zendesk2/destroy_group.rb +3 -2
  30. data/lib/zendesk2/destroy_membership.rb +7 -5
  31. data/lib/zendesk2/destroy_organization.rb +3 -2
  32. data/lib/zendesk2/destroy_ticket.rb +3 -2
  33. data/lib/zendesk2/destroy_ticket_field.rb +3 -2
  34. data/lib/zendesk2/destroy_topic.rb +3 -2
  35. data/lib/zendesk2/destroy_topic_comment.rb +4 -3
  36. data/lib/zendesk2/destroy_user.rb +11 -10
  37. data/lib/zendesk2/destroy_user_field.rb +3 -2
  38. data/lib/zendesk2/destroy_user_identity.rb +4 -3
  39. data/lib/zendesk2/destroy_view.rb +3 -2
  40. data/lib/zendesk2/error.rb +1 -1
  41. data/lib/zendesk2/forum.rb +36 -18
  42. data/lib/zendesk2/forums.rb +4 -3
  43. data/lib/zendesk2/get_assignable_groups.rb +3 -2
  44. data/lib/zendesk2/get_categories.rb +2 -1
  45. data/lib/zendesk2/get_category.rb +3 -2
  46. data/lib/zendesk2/get_ccd_tickets.rb +4 -3
  47. data/lib/zendesk2/get_current_user.rb +3 -2
  48. data/lib/zendesk2/get_forum.rb +3 -2
  49. data/lib/zendesk2/get_forums.rb +2 -1
  50. data/lib/zendesk2/get_group.rb +3 -2
  51. data/lib/zendesk2/get_groups.rb +2 -1
  52. data/lib/zendesk2/get_membership.rb +3 -2
  53. data/lib/zendesk2/get_memberships.rb +3 -2
  54. data/lib/zendesk2/get_organization.rb +3 -2
  55. data/lib/zendesk2/get_organization_by_external_id.rb +8 -5
  56. data/lib/zendesk2/get_organization_memberships.rb +5 -2
  57. data/lib/zendesk2/get_organization_tickets.rb +7 -5
  58. data/lib/zendesk2/get_organization_users.rb +6 -5
  59. data/lib/zendesk2/get_organizations.rb +2 -1
  60. data/lib/zendesk2/get_requested_tickets.rb +5 -4
  61. data/lib/zendesk2/get_ticket.rb +3 -2
  62. data/lib/zendesk2/get_ticket_audit.rb +5 -4
  63. data/lib/zendesk2/get_ticket_audits.rb +4 -3
  64. data/lib/zendesk2/get_ticket_comments.rb +6 -5
  65. data/lib/zendesk2/get_ticket_field.rb +3 -2
  66. data/lib/zendesk2/get_ticket_fields.rb +2 -1
  67. data/lib/zendesk2/get_ticket_metric.rb +4 -3
  68. data/lib/zendesk2/get_ticket_metrics.rb +3 -2
  69. data/lib/zendesk2/get_tickets.rb +2 -1
  70. data/lib/zendesk2/get_topic.rb +3 -2
  71. data/lib/zendesk2/get_topic_comment.rb +4 -3
  72. data/lib/zendesk2/get_topic_comments.rb +5 -4
  73. data/lib/zendesk2/get_topics.rb +2 -1
  74. data/lib/zendesk2/get_user.rb +7 -7
  75. data/lib/zendesk2/get_user_field.rb +3 -2
  76. data/lib/zendesk2/get_user_fields.rb +3 -2
  77. data/lib/zendesk2/get_user_identities.rb +4 -3
  78. data/lib/zendesk2/get_user_identity.rb +4 -3
  79. data/lib/zendesk2/get_user_memberships.rb +4 -3
  80. data/lib/zendesk2/get_user_organizations.rb +5 -4
  81. data/lib/zendesk2/get_users.rb +3 -2
  82. data/lib/zendesk2/get_view.rb +3 -2
  83. data/lib/zendesk2/get_view_tickets.rb +19 -16
  84. data/lib/zendesk2/get_views.rb +2 -1
  85. data/lib/zendesk2/group.rb +6 -5
  86. data/lib/zendesk2/groups.rb +7 -6
  87. data/lib/zendesk2/help_center.rb +15 -0
  88. data/lib/zendesk2/help_center/access_policy.rb +3 -2
  89. data/lib/zendesk2/help_center/article.rb +10 -7
  90. data/lib/zendesk2/help_center/articles.rb +7 -7
  91. data/lib/zendesk2/help_center/categories.rb +3 -2
  92. data/lib/zendesk2/help_center/category.rb +8 -7
  93. data/lib/zendesk2/help_center/create_help_center_article.rb +31 -29
  94. data/lib/zendesk2/help_center/create_help_center_category.rb +17 -16
  95. data/lib/zendesk2/help_center/create_help_center_post.rb +37 -0
  96. data/lib/zendesk2/help_center/create_help_center_section.rb +32 -31
  97. data/lib/zendesk2/help_center/create_help_center_topic.rb +36 -0
  98. data/lib/zendesk2/help_center/create_help_center_translation.rb +15 -14
  99. data/lib/zendesk2/help_center/destroy_help_center_article.rb +3 -2
  100. data/lib/zendesk2/help_center/destroy_help_center_category.rb +3 -2
  101. data/lib/zendesk2/help_center/destroy_help_center_post.rb +15 -0
  102. data/lib/zendesk2/help_center/destroy_help_center_section.rb +3 -2
  103. data/lib/zendesk2/help_center/destroy_help_center_topic.rb +15 -0
  104. data/lib/zendesk2/help_center/destroy_help_center_translation.rb +2 -1
  105. data/lib/zendesk2/help_center/get_help_center_access_policy.rb +6 -5
  106. data/lib/zendesk2/help_center/get_help_center_article.rb +7 -9
  107. data/lib/zendesk2/help_center/get_help_center_articles.rb +3 -2
  108. data/lib/zendesk2/help_center/get_help_center_categories.rb +6 -2
  109. data/lib/zendesk2/help_center/get_help_center_categories_articles.rb +8 -7
  110. data/lib/zendesk2/help_center/get_help_center_categories_sections.rb +6 -5
  111. data/lib/zendesk2/help_center/get_help_center_category.rb +7 -9
  112. data/lib/zendesk2/help_center/get_help_center_post.rb +19 -0
  113. data/lib/zendesk2/help_center/get_help_center_posts.rb +28 -0
  114. data/lib/zendesk2/help_center/get_help_center_section.rb +8 -10
  115. data/lib/zendesk2/help_center/get_help_center_sections.rb +3 -2
  116. data/lib/zendesk2/help_center/get_help_center_sections_articles.rb +9 -8
  117. data/lib/zendesk2/help_center/get_help_center_topic.rb +14 -0
  118. data/lib/zendesk2/help_center/get_help_center_topics.rb +10 -0
  119. data/lib/zendesk2/help_center/get_help_center_translation.rb +5 -4
  120. data/lib/zendesk2/help_center/get_help_center_translations.rb +7 -6
  121. data/lib/zendesk2/help_center/post.rb +72 -0
  122. data/lib/zendesk2/help_center/posts.rb +18 -0
  123. data/lib/zendesk2/help_center/search_help_center_articles.rb +8 -7
  124. data/lib/zendesk2/help_center/section.rb +11 -11
  125. data/lib/zendesk2/help_center/sections.rb +7 -6
  126. data/lib/zendesk2/help_center/topic.rb +52 -0
  127. data/lib/zendesk2/help_center/topics.rb +13 -0
  128. data/lib/zendesk2/help_center/translation.rb +8 -5
  129. data/lib/zendesk2/help_center/translation_source.rb +16 -13
  130. data/lib/zendesk2/help_center/translations.rb +3 -2
  131. data/lib/zendesk2/help_center/update_help_center_access_policy.rb +8 -7
  132. data/lib/zendesk2/help_center/update_help_center_article.rb +9 -11
  133. data/lib/zendesk2/help_center/update_help_center_category.rb +9 -11
  134. data/lib/zendesk2/help_center/update_help_center_post.rb +20 -0
  135. data/lib/zendesk2/help_center/update_help_center_section.rb +9 -11
  136. data/lib/zendesk2/help_center/update_help_center_topic.rb +20 -0
  137. data/lib/zendesk2/help_center/update_help_center_translation.rb +4 -3
  138. data/lib/zendesk2/logger.rb +3 -2
  139. data/lib/zendesk2/mark_membership_default.rb +7 -6
  140. data/lib/zendesk2/mark_user_identity_primary.rb +7 -6
  141. data/lib/zendesk2/membership.rb +10 -8
  142. data/lib/zendesk2/memberships.rb +18 -12
  143. data/lib/zendesk2/mock.rb +39 -34
  144. data/lib/zendesk2/model.rb +14 -3
  145. data/lib/zendesk2/organization.rb +7 -7
  146. data/lib/zendesk2/organizations.rb +14 -12
  147. data/lib/zendesk2/paged_collection.rb +40 -36
  148. data/lib/zendesk2/rate_limit.rb +4 -3
  149. data/lib/zendesk2/real.rb +25 -22
  150. data/lib/zendesk2/request.rb +78 -82
  151. data/lib/zendesk2/search.rb +8 -7
  152. data/lib/zendesk2/search_organization.rb +14 -14
  153. data/lib/zendesk2/search_user.rb +41 -37
  154. data/lib/zendesk2/searchable.rb +36 -26
  155. data/lib/zendesk2/ticket.rb +20 -18
  156. data/lib/zendesk2/ticket_audit.rb +5 -4
  157. data/lib/zendesk2/ticket_audits.rb +10 -11
  158. data/lib/zendesk2/ticket_change.rb +10 -11
  159. data/lib/zendesk2/ticket_comment.rb +2 -1
  160. data/lib/zendesk2/ticket_comment_privacy_change.rb +12 -14
  161. data/lib/zendesk2/ticket_comments.rb +7 -6
  162. data/lib/zendesk2/ticket_create.rb +8 -9
  163. data/lib/zendesk2/ticket_field.rb +5 -4
  164. data/lib/zendesk2/ticket_fields.rb +4 -3
  165. data/lib/zendesk2/ticket_metric.rb +2 -2
  166. data/lib/zendesk2/ticket_metrics.rb +3 -2
  167. data/lib/zendesk2/ticket_notification.rb +12 -13
  168. data/lib/zendesk2/ticket_voice_comment.rb +28 -29
  169. data/lib/zendesk2/tickets.rb +8 -7
  170. data/lib/zendesk2/topic.rb +49 -22
  171. data/lib/zendesk2/topic_comment.rb +12 -9
  172. data/lib/zendesk2/topic_comments.rb +4 -3
  173. data/lib/zendesk2/topics.rb +4 -3
  174. data/lib/zendesk2/update_category.rb +8 -6
  175. data/lib/zendesk2/update_forum.rb +5 -4
  176. data/lib/zendesk2/update_group.rb +5 -4
  177. data/lib/zendesk2/update_organization.rb +18 -9
  178. data/lib/zendesk2/update_request.rb +6 -5
  179. data/lib/zendesk2/update_ticket.rb +39 -38
  180. data/lib/zendesk2/update_ticket_field.rb +5 -4
  181. data/lib/zendesk2/update_topic.rb +5 -4
  182. data/lib/zendesk2/update_user.rb +39 -31
  183. data/lib/zendesk2/update_user_field.rb +4 -3
  184. data/lib/zendesk2/update_user_identity.rb +7 -6
  185. data/lib/zendesk2/update_view.rb +38 -34
  186. data/lib/zendesk2/user.rb +41 -37
  187. data/lib/zendesk2/user_field.rb +9 -6
  188. data/lib/zendesk2/user_fields.rb +4 -3
  189. data/lib/zendesk2/user_identities.rb +4 -3
  190. data/lib/zendesk2/user_identity.rb +12 -9
  191. data/lib/zendesk2/users.rb +5 -4
  192. data/lib/zendesk2/version.rb +2 -1
  193. data/lib/zendesk2/view.rb +24 -13
  194. data/lib/zendesk2/views.rb +3 -2
  195. data/spec/categories_spec.rb +63 -60
  196. data/spec/client_spec.rb +6 -5
  197. data/spec/forums_spec.rb +64 -61
  198. data/spec/groups_spec.rb +7 -8
  199. data/spec/help_center/articles_spec.rb +22 -26
  200. data/spec/help_center/categories_spec.rb +26 -27
  201. data/spec/help_center/posts_spec.rb +39 -0
  202. data/spec/help_center/sections_spec.rb +32 -33
  203. data/spec/help_center/topics_spec.rb +13 -0
  204. data/spec/lib/paged_collection_spec.rb +11 -11
  205. data/spec/lib/rate_limit_spec.rb +9 -8
  206. data/spec/memberships_spec.rb +38 -27
  207. data/spec/organizations_spec.rb +92 -87
  208. data/spec/shared/zendesk_resource.rb +40 -25
  209. data/spec/spec_helper.rb +8 -13
  210. data/spec/support/client_helper.rb +5 -4
  211. data/spec/support/data_helper.rb +1 -0
  212. data/spec/ticket_fields_spec.rb +6 -7
  213. data/spec/tickets_spec.rb +69 -58
  214. data/spec/topic_comments_spec.rb +7 -8
  215. data/spec/topics_spec.rb +5 -6
  216. data/spec/user_fields_spec.rb +7 -7
  217. data/spec/user_identities_spec.rb +29 -25
  218. data/spec/users_spec.rb +88 -78
  219. data/spec/views_spec.rb +45 -34
  220. data/spec/zendesk2_spec.rb +3 -2
  221. data/zendesk2.gemspec +15 -14
  222. metadata +21 -2
@@ -1,30 +1,31 @@
1
+ # frozen_string_literal: true
1
2
  class Zendesk2::CreateForum
2
3
  include Zendesk2::Request
3
4
 
4
5
  request_method :post
5
- request_path { |_| "/forums.json" }
6
- request_body { |r| {"forum" => r.forum_params } }
6
+ request_path { |_| '/forums.json' }
7
+ request_body { |r| { 'forum' => r.forum_params } }
7
8
 
8
9
  def self.accepted_attributes
9
- %w[name description category_id organization_id locale_id locked position forum_type access]
10
+ %w(name description category_id organization_id locale_id locked position forum_type access)
10
11
  end
11
12
 
12
13
  def forum_params
13
- Cistern::Hash.slice(params.fetch("forum"), *self.class.accepted_attributes)
14
+ Cistern::Hash.slice(params.fetch('forum'), *self.class.accepted_attributes)
14
15
  end
15
16
 
16
17
  def mock
17
18
  identity = cistern.serial_id
18
19
 
19
20
  record = {
20
- "id" => identity,
21
- "url" => url_for("/forums/#{identity}.json"),
22
- "created_at" => Time.now.iso8601,
23
- "updated_at" => Time.now.iso8601,
24
- }.merge(Cistern::Hash.slice(params.fetch("forum"), *self.class.accepted_attributes))
21
+ 'id' => identity,
22
+ 'url' => url_for("/forums/#{identity}.json"),
23
+ 'created_at' => Time.now.iso8601,
24
+ 'updated_at' => Time.now.iso8601,
25
+ }.merge(Cistern::Hash.slice(params.fetch('forum'), *self.class.accepted_attributes))
25
26
 
26
27
  cistern.data[:forums][identity] = record
27
28
 
28
- mock_response({"forum" => record}, {status: 201})
29
+ mock_response({ 'forum' => record }, { status: 201 })
29
30
  end
30
31
  end
@@ -1,31 +1,32 @@
1
+ # frozen_string_literal: true
1
2
  class Zendesk2::CreateGroup
2
3
  include Zendesk2::Request
3
4
 
4
5
  request_method :post
5
- request_path { |_| "/groups.json" }
6
- request_body { |r| { "group" => r.group_params } }
6
+ request_path { |_| '/groups.json' }
7
+ request_body { |r| { 'group' => r.group_params } }
7
8
 
8
9
  def self.accepted_attributes
9
- %w[name]
10
+ %w(name)
10
11
  end
11
12
 
12
13
  def group_params
13
- @_group_params ||= Cistern::Hash.slice(params.fetch("group"), *self.class.accepted_attributes)
14
+ @_group_params ||= Cistern::Hash.slice(params.fetch('group'), *self.class.accepted_attributes)
14
15
  end
15
16
 
16
- def mock(params={})
17
+ def mock(_params = {})
17
18
  identity = cistern.serial_id
18
19
 
19
20
  record = {
20
- "id" => identity,
21
- "url" => url_for("/groups/#{identity}.json"),
22
- "created_at" => Time.now.iso8601,
23
- "updated_at" => Time.now.iso8601,
24
- "deleted" => false,
21
+ 'id' => identity,
22
+ 'url' => url_for("/groups/#{identity}.json"),
23
+ 'created_at' => Time.now.iso8601,
24
+ 'updated_at' => Time.now.iso8601,
25
+ 'deleted' => false,
25
26
  }.merge(group_params)
26
27
 
27
- self.data[:groups][identity] = record
28
+ data[:groups][identity] = record
28
29
 
29
- mock_response({"group" => record}, {status: 201})
30
+ mock_response({ 'group' => record }, { status: 201 })
30
31
  end
31
32
  end
@@ -1,57 +1,58 @@
1
+ # frozen_string_literal: true
1
2
  class Zendesk2::CreateMembership
2
3
  include Zendesk2::Request
3
4
 
4
5
  request_method :post
5
- request_path { |r| "/users/#{r.user_id}/organization_memberships.json" }
6
- request_body { |r| { "organization_membership" => r.membership_params } }
6
+ request_path { |r| "/users/#{r.user_id}/organization_memberships.json" }
7
+ request_body { |r| { 'organization_membership' => r.membership_params } }
7
8
 
8
9
  def self.accepted_params
9
- %w[user_id organization_id default]
10
+ %w(user_id organization_id default)
10
11
  end
11
12
 
12
13
  def membership_params
13
- @_membership_params ||= Cistern::Hash.slice(params.fetch("membership"), *self.class.accepted_params)
14
+ @_membership_params ||= Cistern::Hash.slice(params.fetch('membership'), *self.class.accepted_params)
14
15
  end
15
16
 
16
17
  def user_id
17
- params.fetch("membership").fetch("user_id").to_i
18
+ params.fetch('membership').fetch('user_id').to_i
18
19
  end
19
20
 
20
21
  def organization_id
21
- params.fetch("membership").fetch("organization_id").to_i
22
+ params.fetch('membership').fetch('organization_id').to_i
22
23
  end
23
24
 
24
25
  def mock
25
26
  user = find!(:users, user_id)
26
27
  find!(:organizations, organization_id,
27
- :error => :invalid,
28
- :details => {
29
- "organization" => [ { "description" => "Organization cannot be blank" } ],
28
+ error: :invalid,
29
+ details: {
30
+ 'organization' => [{ 'description' => 'Organization cannot be blank' }],
30
31
  })
31
32
 
32
- if self.data[:memberships].values.find { |m| m["user_id"] == user_id && m["organization_id"] == organization_id }
33
- error!(:invalid, description: { "user_id" => [ { "description" => "User has already been taken" } ] })
33
+ if data[:memberships].values.find { |m| m['user_id'] == user_id && m['organization_id'] == organization_id }
34
+ error!(:invalid, description: { 'user_id' => [{ 'description' => 'User has already been taken' }] })
34
35
  end
35
36
 
36
37
  resource_id = cistern.serial_id
37
38
 
38
- default_membership = !self.data[:memberships].values.find { |m| m["user_id"] == user_id && m["default"] }
39
+ default_membership = !data[:memberships].values.find { |m| m['user_id'] == user_id && m['default'] }
39
40
 
40
41
  resource = {
41
- "id" => resource_id,
42
- "user_id" => user_id,
43
- "organization_id" => organization_id,
44
- "default" => default_membership,
42
+ 'id' => resource_id,
43
+ 'user_id' => user_id,
44
+ 'organization_id' => organization_id,
45
+ 'default' => default_membership,
45
46
  }
46
47
 
47
- self.data[:memberships][resource_id] = resource
48
+ data[:memberships][resource_id] = resource
48
49
 
49
- primary_organization = self.data[:memberships].values.find { |m| m["user_id"] == user_id && m["default"] }
50
+ primary_organization = data[:memberships].values.find { |m| m['user_id'] == user_id && m['default'] }
50
51
 
51
52
  if primary_organization
52
- user.merge!("organization_id" => primary_organization["organization_id"])
53
+ user['organization_id'] = primary_organization['organization_id']
53
54
  end
54
55
 
55
- mock_response("organization_membership" => resource)
56
+ mock_response('organization_membership' => resource)
56
57
  end
57
58
  end
@@ -1,42 +1,48 @@
1
+ # frozen_string_literal: true
1
2
  class Zendesk2::CreateOrganization
2
3
  include Zendesk2::Request
3
4
 
4
5
  request_method :post
5
- request_path { |_| "/organizations.json" }
6
- request_body { |r| { "organization" => r.organization_params } }
6
+ request_path { |_| '/organizations.json' }
7
+ request_body { |r| { 'organization' => r.organization_params } }
7
8
 
8
9
  def self.accepted_attributes
9
- %w[details domain_names external_id group_id organization_fields shared_comments shared_tickets tags name notes]
10
+ %w(details domain_names external_id group_id organization_fields shared_comments shared_tickets tags name notes)
10
11
  end
11
12
 
12
13
  def organization_params
13
- @_organization_params ||= Cistern::Hash.slice(params.fetch("organization"), *self.class.accepted_attributes)
14
+ @_organization_params ||= Cistern::Hash.slice(params.fetch('organization'), *self.class.accepted_attributes)
14
15
  end
15
16
 
16
17
  def mock
17
18
  identity = cistern.serial_id
18
19
 
19
20
  record = {
20
- "id" => identity,
21
- "url" => url_for("/organizations/#{identity}.json"),
22
- "created_at" => Time.now.iso8601,
23
- "updated_at" => Time.now.iso8601,
24
- }.merge(self.organization_params)
25
-
26
- unless record["name"]
27
- error!(:invalid, details: { "name" => [ { "description" => "Name cannot be blank" } ]})
21
+ 'id' => identity,
22
+ 'url' => url_for("/organizations/#{identity}.json"),
23
+ 'created_at' => Time.now.iso8601,
24
+ 'updated_at' => Time.now.iso8601,
25
+ }.merge(organization_params)
26
+
27
+ unless record['name']
28
+ error!(:invalid, details: { 'name' => [{ 'description' => 'Name cannot be blank' }] })
28
29
  end
29
30
 
30
- if self.data[:organizations].values.find { |o| o["name"].downcase == record["name"].downcase }
31
- error!(:invalid, details: {"name" => [ { "description" => "Name: has already been taken" } ]})
31
+ if data[:organizations].values.find { |o| o['name'].casecmp(record['name'].downcase).zero? }
32
+ error!(:invalid, details: { 'name' => [{ 'description' => 'Name: has already been taken' }] })
32
33
  end
33
34
 
34
- if record["external_id"] && self.data[:organizations].values.find { |o| o["external_id"].to_s.downcase == record["external_id"].to_s.downcase }
35
- error!(:invalid, details: {"name" => [ { "description" => "External has already been taken" } ]})
35
+ external_id = record['external_id']
36
+ matching_organization = external_id && data[:organizations].values.find do |o|
37
+ o['external_id'].to_s.casecmp(external_id.to_s.downcase).zero?
36
38
  end
37
39
 
38
- self.data[:organizations][identity] = record
40
+ if matching_organization
41
+ error!(:invalid, details: { 'name' => [{ 'description' => 'External has already been taken' }] })
42
+ end
43
+
44
+ data[:organizations][identity] = record
39
45
 
40
- mock_response({"organization" => record}, {status: 201})
46
+ mock_response({ 'organization' => record }, { status: 201 })
41
47
  end
42
48
  end
@@ -1,86 +1,90 @@
1
+ # frozen_string_literal: true
1
2
  class Zendesk2::CreateTicket
2
3
  include Zendesk2::Request
3
4
 
4
5
  request_method :post
5
- request_path { |_| "/tickets.json" }
6
- request_body { |r| {"ticket" => r.ticket_params} }
6
+ request_path { |_| '/tickets.json' }
7
+ request_body { |r| { 'ticket' => r.ticket_params } }
7
8
 
8
9
  def self.accepted_attributes
9
- %w[external_id via priority requester requester_id submitter_id assignee_id organization_id subject description custom_fields recipient status collaborator_ids tags]
10
+ %w(external_id via priority requester requester_id submitter_id assignee_id organization_id subject description
11
+ custom_fields recipient status collaborator_ids tags)
10
12
  end
11
13
 
12
14
  def ticket_params
13
- @_ticket_params ||= Cistern::Hash.slice(params.fetch("ticket"), *self.class.accepted_attributes)
15
+ Cistern::Hash.slice(params.fetch('ticket'), *self.class.accepted_attributes)
14
16
  end
15
17
 
16
18
  def mock
17
- create_params = ticket_params.dup
19
+ create_params = ticket_params
18
20
 
19
- if create_params["description"].nil? || create_params["description"] == ""
20
- error!(:invalid, :details => {"base" => [{"description" => "Description: cannot be blank"}]})
21
- end
21
+ Zendesk2.blank?(create_params['description']) &&
22
+ error!(:invalid, details: { 'base' => [{ 'description' => 'Description: cannot be blank' }] })
22
23
 
23
24
  requester_id = create_params.delete('requester_id')
24
25
 
25
- if requester = create_params.delete('requester')
26
- if !requester['name'] || requester['name'].size < 1
27
- error!(:invalid,
28
- :details => {
29
- "requester" => [
30
- {
31
- "description" => "Requester Name: is too short (minimum is 1 characters)"
32
- }
33
- ]})
34
- end
26
+ set_requester(create_params.delete('requester'), create_params)
27
+ custom_fields = get_custom_fields(create_params.delete('custom_fields') || [])
35
28
 
36
- user_id = if known_user = cistern.users.search(email: requester['email']).first
37
- known_user.identity
38
- else
39
- # name is not required in this case
40
- cistern.create_user("user" => requester).body["user"]["id"]
41
- end
29
+ identity = cistern.serial_id
42
30
 
43
- create_params['requester_id'] = user_id.to_i
44
- end
31
+ record = {
32
+ 'id' => identity,
33
+ 'url' => url_for("/tickets/#{identity}.json"),
34
+ 'created_at' => Time.now.iso8601,
35
+ 'updated_at' => Time.now.iso8601,
36
+ 'priority' => nil,
37
+ 'collaborator_ids' => [],
38
+ 'custom_fields' => custom_fields,
39
+ }.merge(create_params)
45
40
 
46
- requested_custom_fields = (create_params.delete("custom_fields") || [])
41
+ record['requester_id'] ||= (requester_id && requester_id.to_i) || cistern.current_user['id']
42
+ record['submitter_id'] = cistern.current_user['id'].to_i
47
43
 
48
- custom_fields = requested_custom_fields.map do |cf|
49
- field_id = cf["id"].to_i
44
+ requester = cistern.data[:users][record['requester_id'].to_i]
50
45
 
51
- if cistern.data[:ticket_fields][field_id]
52
- {"id" => field_id, "value" => cf["value"] }
53
- else
54
- # @fixme error ?!
55
- end
56
- end.compact
46
+ record['organization_id'] ||= requester['organization_id'] if requester
57
47
 
58
- cistern.data[:ticket_fields].each do |field_id, field|
59
- requested_custom_fields.find { |cf| cf["id"] == field_id } ||
60
- custom_fields << {"id" => field_id, "value" => nil }
61
- end
48
+ cistern.data[:tickets][identity] = record
62
49
 
63
- identity = cistern.serial_id
50
+ mock_response('ticket' => record)
51
+ end
64
52
 
65
- record = {
66
- "id" => identity,
67
- "url" => url_for("/tickets/#{identity}.json"),
68
- "created_at" => Time.now.iso8601,
69
- "updated_at" => Time.now.iso8601,
70
- "priority" => nil,
71
- "collaborator_ids" => [],
72
- "custom_fields" => custom_fields,
73
- }.merge(create_params)
53
+ private
74
54
 
75
- record["requester_id"] ||= (requester_id && requester_id.to_i) || cistern.current_user["id"]
76
- record["submitter_id"] = cistern.current_user["id"].to_i
55
+ def set_requester(requester, create_params)
56
+ return unless requester
77
57
 
78
- record["organization_id"] ||= if requester = cistern.data[:users][record["requester_id"].to_i]
79
- requester["organization_id"]
80
- end
58
+ Zendesk2.blank?(requester['name']) &&
59
+ error!(:invalid, details: {
60
+ 'requester' => [
61
+ {
62
+ 'description' => 'Requester Name: is too short (minimum is 1 characters)',
63
+ },
64
+ ],
65
+ })
81
66
 
82
- cistern.data[:tickets][identity] = record
67
+ known_user = cistern.users.search(email: requester['email']).first
68
+
69
+ user_id = (known_user && known_user.identity) || cistern.create_user('user' => requester).body['user']['id']
70
+
71
+ create_params['requester_id'] = user_id.to_i
72
+ end
73
+
74
+ def get_custom_fields(requested_custom_fields)
75
+ custom_fields = requested_custom_fields.map do |cf|
76
+ field_id = cf['id'].to_i
77
+
78
+ if cistern.data[:ticket_fields][field_id]
79
+ { 'id' => field_id, 'value' => cf['value'] }
80
+ end
81
+ end.compact
82
+
83
+ cistern.data[:ticket_fields].each do |field_id, _field|
84
+ requested_custom_fields.find { |cf| cf['id'] == field_id } ||
85
+ custom_fields << { 'id' => field_id, 'value' => nil }
86
+ end
83
87
 
84
- mock_response("ticket" => record)
88
+ custom_fields
85
89
  end
86
90
  end
@@ -1,42 +1,44 @@
1
+ # frozen_string_literal: true
1
2
  class Zendesk2::CreateTicketField
2
3
  include Zendesk2::Request
3
4
 
4
5
  request_method :post
5
- request_path { |_| "/ticket_fields.json" }
6
- request_body { |r| { "ticket_field" => r.ticket_field_params } }
6
+ request_path { |_| '/ticket_fields.json' }
7
+ request_body { |r| { 'ticket_field' => r.ticket_field_params } }
7
8
 
8
9
  def self.accepted_attributes
9
- %w[type title description position active required collapsed_for_agents regexp_for_validation title_in_portal visible_in_portal editable_in_portal required_in_portal tag custom_field_options]
10
+ %w(type title description position active required collapsed_for_agents regexp_for_validation title_in_portal
11
+ visible_in_portal editable_in_portal required_in_portal tag custom_field_options)
10
12
  end
11
13
 
12
14
  def ticket_field_params
13
- Cistern::Hash.slice(params.fetch("ticket_field"), *self.class.accepted_attributes)
15
+ Cistern::Hash.slice(params.fetch('ticket_field'), *self.class.accepted_attributes)
14
16
  end
15
17
 
16
18
  def mock
17
19
  identity = cistern.serial_id
18
20
 
19
21
  record = {
20
- "active" => true,
21
- "collapsed_for_agents" => false,
22
- "created_at" => Time.now.iso8601,
23
- "description" => params["title"],
24
- "editable_in_portal" => false,
25
- "id" => identity,
26
- "position" => 9999,
27
- "regexp_for_validation" => "",
28
- "removable" => true,
29
- "required" => false,
30
- "required_in_portal" => false,
31
- "tag" => "",
32
- "title_in_portal" => params["title"],
33
- "updated_at" => Time.now.iso8601,
34
- "url" => url_for("/ticket_fields/#{identity}.json"),
35
- "visible_in_portal" => false,
22
+ 'active' => true,
23
+ 'collapsed_for_agents' => false,
24
+ 'created_at' => Time.now.iso8601,
25
+ 'description' => params['title'],
26
+ 'editable_in_portal' => false,
27
+ 'id' => identity,
28
+ 'position' => 9999,
29
+ 'regexp_for_validation' => '',
30
+ 'removable' => true,
31
+ 'required' => false,
32
+ 'required_in_portal' => false,
33
+ 'tag' => '',
34
+ 'title_in_portal' => params['title'],
35
+ 'updated_at' => Time.now.iso8601,
36
+ 'url' => url_for("/ticket_fields/#{identity}.json"),
37
+ 'visible_in_portal' => false,
36
38
  }.merge(ticket_field_params)
37
39
 
38
- self.data[:ticket_fields][identity] = record
40
+ data[:ticket_fields][identity] = record
39
41
 
40
- mock_response("ticket_field" => record)
42
+ mock_response('ticket_field' => record)
41
43
  end
42
44
  end