zendesk2 1.9.0 → 1.10.0

Sign up to get free protection for your applications and to get access to all the features.
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