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,29 +1,30 @@
1
+ # frozen_string_literal: true
1
2
  class Zendesk2::Search
2
3
  include Zendesk2::Request
3
4
 
4
5
  request_method :get
5
6
  request_body { |r| { query: r.query } }
6
- request_path { |_| "/search.json" }
7
+ request_path { |_| '/search.json' }
7
8
 
8
9
  page_params!
9
10
 
10
11
  attr_reader :query
11
12
 
12
- def _mock(query, params={})
13
+ def _mock(query, params = {})
13
14
  @query = query
14
15
  setup(params)
15
16
  mock
16
17
  end
17
18
 
18
- def _real(query, params={})
19
+ def _real(query, params = {})
19
20
  @query = query
20
21
  setup(params)
21
22
  real
22
23
  end
23
24
 
24
25
  def mock
25
- terms = Hash[query.split(" ").map { |t| t.split(":") }]
26
- type = terms.delete("type")
26
+ terms = Hash[query.split(' ').map { |t| t.split(':') }]
27
+ type = terms.delete('type')
27
28
 
28
29
  collection = if type.nil?
29
30
  cistern.data.values
@@ -31,8 +32,8 @@ class Zendesk2::Search
31
32
  cistern.data[pluralize(type).to_sym]
32
33
  end
33
34
 
34
- results = collection.values.select { |v| terms.all?{ |term, condition| v[term].to_s == condition.to_s } }
35
+ results = collection.values.select { |v| terms.all? { |term, condition| v[term].to_s == condition.to_s } }
35
36
 
36
- page(results, params: {"query" => query}, root: "results")
37
+ page(results, params: { 'query' => query }, root: 'results')
37
38
  end
38
39
  end
@@ -1,40 +1,40 @@
1
+ # frozen_string_literal: true
1
2
  class Zendesk2::SearchOrganization
2
3
  include Zendesk2::Request
3
4
 
4
5
  request_method :get
5
- request_path { "/search.json" }
6
- request_body { |r| { "query" => r.query } }
6
+ request_path { '/search.json' }
7
+ request_body { |r| { 'query' => r.query } }
7
8
 
8
9
  attr_reader :query
9
10
 
10
11
  page_params!
11
12
 
12
- def _mock(query, params={})
13
+ def _mock(query, params = {})
13
14
  @query = query
14
15
  setup(params)
15
16
  mock
16
17
  end
17
18
 
18
- def _real(query, params={})
19
+ def _real(query, params = {})
19
20
  @query = query
20
21
  setup(params)
21
22
  real
22
23
  end
23
24
 
24
25
  def mock
25
- terms = Hash[query.split(" ").map { |t| t.split(":") }]
26
- terms.delete("type") # context already provided
26
+ terms = Hash[query.split(' ').map { |t| t.split(':') }]
27
+ terms.delete('type') # context already provided
27
28
 
28
- collection = self.data[:organizations].values
29
+ collection = data[:organizations].values
29
30
 
30
31
  # organization name is fuzzy matched
31
- if organization_name = terms.delete("name")
32
- terms.merge!("name" => "*#{organization_name}*")
33
- end
32
+ organization_name = terms.delete('name')
33
+ organization_name && terms['name'] = "*#{organization_name}*"
34
34
 
35
- compiled_terms = terms.inject({}) do |r,(term, raw_condition)|
36
- condition = if raw_condition.include?("*")
37
- Regexp.compile(raw_condition.gsub("*", ".*"), Regexp::IGNORECASE)
35
+ compiled_terms = terms.inject({}) do |r, (term, raw_condition)|
36
+ condition = if raw_condition.include?('*')
37
+ Regexp.compile(raw_condition.gsub('*', '.*'), Regexp::IGNORECASE)
38
38
  else
39
39
  raw_condition
40
40
  end
@@ -47,6 +47,6 @@ class Zendesk2::SearchOrganization
47
47
  end
48
48
  end
49
49
 
50
- page(results, params: {"query" => query}, root: "results")
50
+ page(results, params: { 'query' => query }, root: 'results')
51
51
  end
52
52
  end
@@ -1,56 +1,36 @@
1
+ # frozen_string_literal: true
1
2
  class Zendesk2::SearchUser
2
3
  include Zendesk2::Request
3
4
 
4
5
  request_method :get
5
- request_path { "/search.json" }
6
- request_body { |r| { "query" => r.query } }
6
+ request_path { '/search.json' }
7
+ request_body { |r| { 'query' => r.query } }
7
8
 
8
9
  attr_reader :query
9
10
 
10
11
  page_params!
11
12
 
12
- def _mock(query, params={})
13
+ def _mock(query, params = {})
13
14
  @query = query
14
15
  setup(params)
15
16
  mock
16
17
  end
17
18
 
18
- def _real(query, params={})
19
+ def _real(query, params = {})
19
20
  @query = query
20
21
  setup(params)
21
22
  real
22
23
  end
23
24
 
24
25
  def mock
25
- terms = Hash[query.split(" ").map { |t| t.split(":") }]
26
- terms.delete("type") # context already provided
26
+ terms = Hash[query.split(' ').map { |t| t.split(':') }]
27
+ terms.delete('type') # context already provided
27
28
 
28
- collection = self.data[:users].values
29
+ collection = searchable_collection(terms)
29
30
 
30
- # create a copy of each user mapped to a specific user identity
31
- collection = collection.map do |user|
32
- self.data[:identities].values.select { |i| i["type"] == "email" && i["user_id"] == user["id"] }.map do |identity|
33
- user.merge("email" => identity["value"])
34
- end
35
- end.flatten
36
-
37
- # allow searching by organization name
38
- collection = collection.map do |user|
39
- if organization = self.data[:organizations][user["organization_id"].to_i]
40
- user.merge("organization" => organization["name"])
41
- else
42
- user
43
- end
44
- end
45
-
46
- # organization name is fuzzy matched
47
- if organization_name = terms.delete("organization")
48
- terms.merge!("organization" => "*#{organization_name}*")
49
- end
50
-
51
- compiled_terms = terms.inject({}) do |r,(term, raw_condition)|
52
- condition = if raw_condition.include?("*")
53
- Regexp.compile(raw_condition.gsub("*", ".*"), Regexp::IGNORECASE)
31
+ compiled_terms = terms.inject({}) do |r, (term, raw_condition)|
32
+ condition = if raw_condition.include?('*')
33
+ Regexp.compile(raw_condition.gsub('*', '.*'), Regexp::IGNORECASE)
54
34
  else
55
35
  raw_condition
56
36
  end
@@ -64,14 +44,38 @@ class Zendesk2::SearchUser
64
44
  end
65
45
 
66
46
  # return the unmunged data
67
- results = munged_results.map { |u|
68
- identities = self.data[:identities].values.select { |i| i["user_id"] == u["id"] }
47
+ results = munged_results.map do |u|
48
+ identities = data[:identities].values.select { |i| i['user_id'] == u['id'] }
49
+ identity = identities.find { |i| i['type'] == 'email' && i['primary'] } ||
50
+ identities.find { |i| i['type'] == 'email' }
51
+ u.merge!('email' => identity['value']) if identity
52
+ end
69
53
 
70
- if identity = identities.find { |i| i["type"] == "email" && i["primary"] } || identities.find { |i| i["type"] == "email" }
71
- u.merge!("email" => identity["value"])
54
+ page(results, params: { 'query' => query }, root: 'results')
55
+ end
56
+
57
+ private
58
+
59
+ def searchable_collection(terms)
60
+ collection = data[:users].values
61
+
62
+ # create a copy of each user mapped to a specific user identity
63
+ collection = collection.map do |user|
64
+ data[:identities].values.select { |i| i['type'] == 'email' && i['user_id'] == user['id'] }.map do |identity|
65
+ user.merge('email' => identity['value'])
72
66
  end
73
- }
67
+ end.flatten
68
+
69
+ # allow searching by organization name
70
+ collection = collection.map do |user|
71
+ organization = data[:organizations][user['organization_id'].to_i]
72
+ organization ? user.merge('organization' => organization['name']) : user
73
+ end
74
+
75
+ # organization name is fuzzy matched
76
+ organization_name = terms.delete('organization')
77
+ organization_name && terms['organization'] = "*#{organization_name}*"
74
78
 
75
- page(results, params: {"query" => query}, root: "results")
79
+ collection
76
80
  end
77
81
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+ # Defines {#search} on relevant collections
1
3
  module Zendesk2::Searchable
2
4
  def self.included(klass)
3
5
  klass.send(:extend, Zendesk2::Searchable::Attributes)
@@ -17,39 +19,47 @@ module Zendesk2::Searchable
17
19
  #
18
20
  # @param [String, Hash] seach terms. This will be converted to a qualified Zendesk search String
19
21
  # @see http://developer.zendesk.com/documentation/rest_api/search.html
20
- def search(terms, params={})
21
- query = if terms.is_a?(Hash)
22
- terms.merge!("type" => self.class.search_type) if self.class.search_type
23
- terms.merge(self.class.scopes.inject({}) { |r,k|
24
- val = public_send(k)
25
- val.nil? ? r : r.merge(k.to_s => val)
26
- }).map { |k,v| "#{k}:#{v}" }.join(" ")
27
- else
28
- additional_terms = []
29
- additional_terms = ["type:#{self.class.search_type}"] if self.class.search_type
30
- additional_terms += self.class.scopes.inject([]) { |r,k|
31
- val = public_send(k)
32
- val.nil? ? r : ["#{k}:#{val}"]
33
- }
34
-
35
- additional_terms.inject(terms.to_s) do |qualified_search, qualification|
36
- if !qualified_search.include?(qualification)
37
- "#{qualified_search} #{qualification}"
38
- else
39
- qualified_search
40
- end
41
- end
42
- end
22
+ def search(terms, params = {})
23
+ query = (terms.is_a?(Hash) ? search_by_hash(terms) : search_by_string(terms))
43
24
 
44
25
  body = cistern.send(self.class.search_request, query, params).body
26
+ data = body.delete('results')
45
27
 
46
- if data = body.delete("results")
47
- self.load(data)
48
- self.merge_attributes(Cistern::Hash.slice(body, "count", "next_page", "previous_page").merge("filtered" => true))
28
+ if data
29
+ load(data)
30
+ merge_attributes(Cistern::Hash.slice(body, 'count', 'next_page', 'previous_page').merge('filtered' => true))
49
31
  self
50
32
  end
51
33
  end
52
34
 
35
+ private
36
+
37
+ def search_by_hash(terms)
38
+ terms['type'] = self.class.search_type if self.class.search_type
39
+ terms.merge(self.class.scopes.inject({}) do |r, k|
40
+ val = public_send(k)
41
+ val.nil? ? r : r.merge(k.to_s => val)
42
+ end,).map { |k, v| "#{k}:#{v}" }.join(' ',)
43
+ end
44
+
45
+ def search_by_string(terms)
46
+ additional_terms = []
47
+ additional_terms = ["type:#{self.class.search_type}"] if self.class.search_type
48
+ additional_terms += self.class.scopes.inject([]) do |r, k|
49
+ val = public_send(k)
50
+ val.nil? ? r : ["#{k}:#{val}"]
51
+ end
52
+
53
+ additional_terms.inject(terms.to_s) do |qualified_search, qualification|
54
+ if !qualified_search.include?(qualification)
55
+ "#{qualified_search} #{qualification}"
56
+ else
57
+ qualified_search
58
+ end
59
+ end
60
+ end
61
+
62
+ # define {#search_request} for atypical searches
53
63
  module Attributes
54
64
  attr_accessor :search_type
55
65
  attr_writer :search_request
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  class Zendesk2::Ticket
2
3
  include Zendesk2::Model
3
4
 
@@ -27,7 +28,8 @@ class Zendesk2::Ticket
27
28
  attribute :has_incidents, type: :boolean
28
29
  # @return [Integer] The organization of the requester
29
30
  attribute :organization_id, type: :integer
30
- # @return [String] Priority, defines the urgency with which the ticket should be addressed: "urgent", "high", "normal", "low"
31
+ # @return [String] Priority, defines the urgency with which the ticket should be addressed:
32
+ # "urgent", "high", "normal", "low"
31
33
  attribute :priority, type: :string
32
34
  # @return [Integer] The problem this incident is linked to, if any
33
35
  attribute :problem_id, type: :integer
@@ -67,17 +69,17 @@ class Zendesk2::Ticket
67
69
  data = if new_record?
68
70
  requires :subject, :description
69
71
 
70
- create_attributes = self.attributes.dup
72
+ create_attributes = attributes.dup
71
73
 
72
- if with_requester = (@requester || nil) && Zendesk2.stringify_keys(@requester)
73
- create_attributes.merge!("requester" => with_requester)
74
- end
74
+ with_requester = (@requester || nil) && Zendesk2.stringify_keys(@requester)
75
75
 
76
- cistern.create_ticket("ticket" => create_attributes).body["ticket"]
76
+ with_requester && create_attributes['requester'] = with_requester
77
+
78
+ cistern.create_ticket('ticket' => create_attributes).body['ticket']
77
79
  else
78
80
  requires :identity
79
81
 
80
- cistern.update_ticket("ticket" => self.attributes).body["ticket"]
82
+ cistern.update_ticket('ticket' => attributes).body['ticket']
81
83
  end
82
84
 
83
85
  merge_attributes(data)
@@ -86,7 +88,7 @@ class Zendesk2::Ticket
86
88
  def destroy!
87
89
  requires :identity
88
90
 
89
- cistern.destroy_ticket("ticket" => {"id" => self.identity})
91
+ cistern.destroy_ticket('ticket' => { 'id' => identity })
90
92
  end
91
93
 
92
94
  # Adds a ticket comment
@@ -96,26 +98,26 @@ class Zendesk2::Ticket
96
98
  # @option options [Array] :attachments Attachment to upload with comment
97
99
  # @option options [Boolean] :public (true)
98
100
  # @return [Zendesk2::TicketComment]
99
- def comment(text, options={})
101
+ def comment(text, options = {})
100
102
  requires :identity
101
103
 
102
104
  options[:public] = true if options[:public].nil?
103
105
 
104
- comment = Zendesk2.stringify_keys(options).merge("body" => text)
106
+ comment = Zendesk2.stringify_keys(options).merge('body' => text)
105
107
 
106
108
  cistern.ticket_comments.new(
107
109
  cistern.update_ticket(
108
- "ticket" => {
109
- "id" => self.identity,
110
- "comment" => comment,
110
+ 'ticket' => {
111
+ 'id' => identity,
112
+ 'comment' => comment,
111
113
  }
112
- ).body["audit"]["events"].first
114
+ ).body['audit']['events'].first
113
115
  )
114
116
  end
115
117
 
116
118
  # @return [Array<Zendesk2::User>] All users CCD on this ticket
117
119
  def collaborators
118
- self.collaborator_ids.map { |cid| self.cistern.users.get(cid) }
120
+ collaborator_ids.map { |cid| cistern.users.get(cid) }
119
121
  end
120
122
 
121
123
  # Update list of users to be CCD on this ticket
@@ -126,16 +128,16 @@ class Zendesk2::Ticket
126
128
 
127
129
  # @return [Zendesk2::TicketAudits] all audits for this ticket
128
130
  def audits
129
- self.cistern.ticket_audits(ticket_id: self.identity).all
131
+ cistern.ticket_audits(ticket_id: identity).all
130
132
  end
131
133
 
132
134
  # @return [Zendesk2::TicketMetric] metrics for this ticket
133
135
  def metrics
134
- Zendesk2::TicketMetric.new(self.cistern.get_ticket_metric("ticket_id" => self.identity).body["ticket_metric"])
136
+ Zendesk2::TicketMetric.new(cistern.get_ticket_metric('ticket_id' => identity).body['ticket_metric'])
135
137
  end
136
138
 
137
139
  # @return [Array<Zendesk2::TicketComment>] all comments for this ticket
138
140
  def comments
139
- self.cistern.ticket_comments(ticket_id: self.identity).all
141
+ cistern.ticket_comments(ticket_id: identity).all
140
142
  end
141
143
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  class Zendesk2::TicketAudit
2
3
  include Zendesk2::Model
3
4
 
@@ -21,12 +22,12 @@ class Zendesk2::TicketAudit
21
22
  def ticket
22
23
  requires :ticket_id
23
24
 
24
- self.cistern.tickets.get(self.ticket_id)
25
+ cistern.tickets.get(ticket_id)
25
26
  end
26
27
 
27
28
  def events
28
- (self.attributes[:events] || []).map { |ae|
29
- Zendesk2::AuditEvent.for(ae.merge(ticket_audit: self, cistern: self.cistern))
30
- }
29
+ (attributes[:events] || []).map do |ae|
30
+ Zendesk2::AuditEvent.for(ae.merge(ticket_audit: self, cistern: cistern))
31
+ end
31
32
  end
32
33
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  class Zendesk2::TicketAudits
2
3
  include Zendesk2::Collection
3
4
 
@@ -8,30 +9,28 @@ class Zendesk2::TicketAudits
8
9
  attribute :ticket_id, type: :integer
9
10
 
10
11
  self.collection_method = :get_ticket_audits
11
- self.collection_root = "audits"
12
+ self.collection_root = 'audits'
12
13
  self.model_method = :get_ticket_audit
13
- self.model_root = "audit"
14
+ self.model_root = 'audit'
14
15
 
15
16
  def ticket
16
- self.cistern.tickets.get(self.ticket_id)
17
+ cistern.tickets.get(ticket_id)
17
18
  end
18
19
 
19
- def all(params={})
20
+ def all(params = {})
20
21
  requires :ticket_id
21
22
 
22
- body = cistern.send(collection_method, {"ticket_id" => self.ticket_id}.merge(params)).body
23
+ body = cistern.send(collection_method, { 'ticket_id' => ticket_id }.merge(params)).body
23
24
 
24
- collection = self.clone.load(body[collection_root])
25
- collection.merge_attributes(Cistern::Hash.slice(body, "count", "next_page", "previous_page"))
25
+ collection = clone.load(body[collection_root])
26
+ collection.merge_attributes(Cistern::Hash.slice(body, 'count', 'next_page', 'previous_page'))
26
27
  collection
27
28
  end
28
29
 
29
30
  def get(id)
30
31
  requires :ticket_id
31
-
32
- if data = self.cistern.send(model_method, {"ticket_id" => self.ticket_id, "id" => id}).body[self.model_root]
33
- new(data)
34
- end
32
+ data = cistern.send(model_method, 'ticket_id' => ticket_id, 'id' => id).body[model_root]
33
+ new(data) if data
35
34
  rescue Zendesk2::Error
36
35
  nil
37
36
  end