zendesk2 1.9.0 → 1.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +30 -0
- data/.travis.yml +3 -1
- data/Gemfile +4 -5
- data/Guardfile +4 -3
- data/Rakefile +4 -3
- data/lib/zendesk2.rb +9 -6
- data/lib/zendesk2/attributes.rb +11 -8
- data/lib/zendesk2/audit_event.rb +5 -3
- data/lib/zendesk2/categories.rb +4 -3
- data/lib/zendesk2/category.rb +10 -5
- data/lib/zendesk2/client.rb +3 -3
- data/lib/zendesk2/collection.rb +35 -21
- data/lib/zendesk2/create_category.rb +10 -9
- data/lib/zendesk2/create_forum.rb +11 -10
- data/lib/zendesk2/create_group.rb +13 -12
- data/lib/zendesk2/create_membership.rb +21 -20
- data/lib/zendesk2/create_organization.rb +24 -18
- data/lib/zendesk2/create_ticket.rb +60 -56
- data/lib/zendesk2/create_ticket_field.rb +24 -22
- data/lib/zendesk2/create_topic.rb +11 -10
- data/lib/zendesk2/create_topic_comment.rb +12 -11
- data/lib/zendesk2/create_user.rb +54 -41
- data/lib/zendesk2/create_user_field.rb +22 -21
- data/lib/zendesk2/create_user_identity.rb +18 -15
- data/lib/zendesk2/create_view.rb +62 -62
- data/lib/zendesk2/destroy_category.rb +2 -1
- data/lib/zendesk2/destroy_forum.rb +2 -1
- data/lib/zendesk2/destroy_group.rb +3 -2
- data/lib/zendesk2/destroy_membership.rb +7 -5
- data/lib/zendesk2/destroy_organization.rb +3 -2
- data/lib/zendesk2/destroy_ticket.rb +3 -2
- data/lib/zendesk2/destroy_ticket_field.rb +3 -2
- data/lib/zendesk2/destroy_topic.rb +3 -2
- data/lib/zendesk2/destroy_topic_comment.rb +4 -3
- data/lib/zendesk2/destroy_user.rb +11 -10
- data/lib/zendesk2/destroy_user_field.rb +3 -2
- data/lib/zendesk2/destroy_user_identity.rb +4 -3
- data/lib/zendesk2/destroy_view.rb +3 -2
- data/lib/zendesk2/error.rb +1 -1
- data/lib/zendesk2/forum.rb +36 -18
- data/lib/zendesk2/forums.rb +4 -3
- data/lib/zendesk2/get_assignable_groups.rb +3 -2
- data/lib/zendesk2/get_categories.rb +2 -1
- data/lib/zendesk2/get_category.rb +3 -2
- data/lib/zendesk2/get_ccd_tickets.rb +4 -3
- data/lib/zendesk2/get_current_user.rb +3 -2
- data/lib/zendesk2/get_forum.rb +3 -2
- data/lib/zendesk2/get_forums.rb +2 -1
- data/lib/zendesk2/get_group.rb +3 -2
- data/lib/zendesk2/get_groups.rb +2 -1
- data/lib/zendesk2/get_membership.rb +3 -2
- data/lib/zendesk2/get_memberships.rb +3 -2
- data/lib/zendesk2/get_organization.rb +3 -2
- data/lib/zendesk2/get_organization_by_external_id.rb +8 -5
- data/lib/zendesk2/get_organization_memberships.rb +5 -2
- data/lib/zendesk2/get_organization_tickets.rb +7 -5
- data/lib/zendesk2/get_organization_users.rb +6 -5
- data/lib/zendesk2/get_organizations.rb +2 -1
- data/lib/zendesk2/get_requested_tickets.rb +5 -4
- data/lib/zendesk2/get_ticket.rb +3 -2
- data/lib/zendesk2/get_ticket_audit.rb +5 -4
- data/lib/zendesk2/get_ticket_audits.rb +4 -3
- data/lib/zendesk2/get_ticket_comments.rb +6 -5
- data/lib/zendesk2/get_ticket_field.rb +3 -2
- data/lib/zendesk2/get_ticket_fields.rb +2 -1
- data/lib/zendesk2/get_ticket_metric.rb +4 -3
- data/lib/zendesk2/get_ticket_metrics.rb +3 -2
- data/lib/zendesk2/get_tickets.rb +2 -1
- data/lib/zendesk2/get_topic.rb +3 -2
- data/lib/zendesk2/get_topic_comment.rb +4 -3
- data/lib/zendesk2/get_topic_comments.rb +5 -4
- data/lib/zendesk2/get_topics.rb +2 -1
- data/lib/zendesk2/get_user.rb +7 -7
- data/lib/zendesk2/get_user_field.rb +3 -2
- data/lib/zendesk2/get_user_fields.rb +3 -2
- data/lib/zendesk2/get_user_identities.rb +4 -3
- data/lib/zendesk2/get_user_identity.rb +4 -3
- data/lib/zendesk2/get_user_memberships.rb +4 -3
- data/lib/zendesk2/get_user_organizations.rb +5 -4
- data/lib/zendesk2/get_users.rb +3 -2
- data/lib/zendesk2/get_view.rb +3 -2
- data/lib/zendesk2/get_view_tickets.rb +19 -16
- data/lib/zendesk2/get_views.rb +2 -1
- data/lib/zendesk2/group.rb +6 -5
- data/lib/zendesk2/groups.rb +7 -6
- data/lib/zendesk2/help_center.rb +15 -0
- data/lib/zendesk2/help_center/access_policy.rb +3 -2
- data/lib/zendesk2/help_center/article.rb +10 -7
- data/lib/zendesk2/help_center/articles.rb +7 -7
- data/lib/zendesk2/help_center/categories.rb +3 -2
- data/lib/zendesk2/help_center/category.rb +8 -7
- data/lib/zendesk2/help_center/create_help_center_article.rb +31 -29
- data/lib/zendesk2/help_center/create_help_center_category.rb +17 -16
- data/lib/zendesk2/help_center/create_help_center_post.rb +37 -0
- data/lib/zendesk2/help_center/create_help_center_section.rb +32 -31
- data/lib/zendesk2/help_center/create_help_center_topic.rb +36 -0
- data/lib/zendesk2/help_center/create_help_center_translation.rb +15 -14
- data/lib/zendesk2/help_center/destroy_help_center_article.rb +3 -2
- data/lib/zendesk2/help_center/destroy_help_center_category.rb +3 -2
- data/lib/zendesk2/help_center/destroy_help_center_post.rb +15 -0
- data/lib/zendesk2/help_center/destroy_help_center_section.rb +3 -2
- data/lib/zendesk2/help_center/destroy_help_center_topic.rb +15 -0
- data/lib/zendesk2/help_center/destroy_help_center_translation.rb +2 -1
- data/lib/zendesk2/help_center/get_help_center_access_policy.rb +6 -5
- data/lib/zendesk2/help_center/get_help_center_article.rb +7 -9
- data/lib/zendesk2/help_center/get_help_center_articles.rb +3 -2
- data/lib/zendesk2/help_center/get_help_center_categories.rb +6 -2
- data/lib/zendesk2/help_center/get_help_center_categories_articles.rb +8 -7
- data/lib/zendesk2/help_center/get_help_center_categories_sections.rb +6 -5
- data/lib/zendesk2/help_center/get_help_center_category.rb +7 -9
- data/lib/zendesk2/help_center/get_help_center_post.rb +19 -0
- data/lib/zendesk2/help_center/get_help_center_posts.rb +28 -0
- data/lib/zendesk2/help_center/get_help_center_section.rb +8 -10
- data/lib/zendesk2/help_center/get_help_center_sections.rb +3 -2
- data/lib/zendesk2/help_center/get_help_center_sections_articles.rb +9 -8
- data/lib/zendesk2/help_center/get_help_center_topic.rb +14 -0
- data/lib/zendesk2/help_center/get_help_center_topics.rb +10 -0
- data/lib/zendesk2/help_center/get_help_center_translation.rb +5 -4
- data/lib/zendesk2/help_center/get_help_center_translations.rb +7 -6
- data/lib/zendesk2/help_center/post.rb +72 -0
- data/lib/zendesk2/help_center/posts.rb +18 -0
- data/lib/zendesk2/help_center/search_help_center_articles.rb +8 -7
- data/lib/zendesk2/help_center/section.rb +11 -11
- data/lib/zendesk2/help_center/sections.rb +7 -6
- data/lib/zendesk2/help_center/topic.rb +52 -0
- data/lib/zendesk2/help_center/topics.rb +13 -0
- data/lib/zendesk2/help_center/translation.rb +8 -5
- data/lib/zendesk2/help_center/translation_source.rb +16 -13
- data/lib/zendesk2/help_center/translations.rb +3 -2
- data/lib/zendesk2/help_center/update_help_center_access_policy.rb +8 -7
- data/lib/zendesk2/help_center/update_help_center_article.rb +9 -11
- data/lib/zendesk2/help_center/update_help_center_category.rb +9 -11
- data/lib/zendesk2/help_center/update_help_center_post.rb +20 -0
- data/lib/zendesk2/help_center/update_help_center_section.rb +9 -11
- data/lib/zendesk2/help_center/update_help_center_topic.rb +20 -0
- data/lib/zendesk2/help_center/update_help_center_translation.rb +4 -3
- data/lib/zendesk2/logger.rb +3 -2
- data/lib/zendesk2/mark_membership_default.rb +7 -6
- data/lib/zendesk2/mark_user_identity_primary.rb +7 -6
- data/lib/zendesk2/membership.rb +10 -8
- data/lib/zendesk2/memberships.rb +18 -12
- data/lib/zendesk2/mock.rb +39 -34
- data/lib/zendesk2/model.rb +14 -3
- data/lib/zendesk2/organization.rb +7 -7
- data/lib/zendesk2/organizations.rb +14 -12
- data/lib/zendesk2/paged_collection.rb +40 -36
- data/lib/zendesk2/rate_limit.rb +4 -3
- data/lib/zendesk2/real.rb +25 -22
- data/lib/zendesk2/request.rb +78 -82
- data/lib/zendesk2/search.rb +8 -7
- data/lib/zendesk2/search_organization.rb +14 -14
- data/lib/zendesk2/search_user.rb +41 -37
- data/lib/zendesk2/searchable.rb +36 -26
- data/lib/zendesk2/ticket.rb +20 -18
- data/lib/zendesk2/ticket_audit.rb +5 -4
- data/lib/zendesk2/ticket_audits.rb +10 -11
- data/lib/zendesk2/ticket_change.rb +10 -11
- data/lib/zendesk2/ticket_comment.rb +2 -1
- data/lib/zendesk2/ticket_comment_privacy_change.rb +12 -14
- data/lib/zendesk2/ticket_comments.rb +7 -6
- data/lib/zendesk2/ticket_create.rb +8 -9
- data/lib/zendesk2/ticket_field.rb +5 -4
- data/lib/zendesk2/ticket_fields.rb +4 -3
- data/lib/zendesk2/ticket_metric.rb +2 -2
- data/lib/zendesk2/ticket_metrics.rb +3 -2
- data/lib/zendesk2/ticket_notification.rb +12 -13
- data/lib/zendesk2/ticket_voice_comment.rb +28 -29
- data/lib/zendesk2/tickets.rb +8 -7
- data/lib/zendesk2/topic.rb +49 -22
- data/lib/zendesk2/topic_comment.rb +12 -9
- data/lib/zendesk2/topic_comments.rb +4 -3
- data/lib/zendesk2/topics.rb +4 -3
- data/lib/zendesk2/update_category.rb +8 -6
- data/lib/zendesk2/update_forum.rb +5 -4
- data/lib/zendesk2/update_group.rb +5 -4
- data/lib/zendesk2/update_organization.rb +18 -9
- data/lib/zendesk2/update_request.rb +6 -5
- data/lib/zendesk2/update_ticket.rb +39 -38
- data/lib/zendesk2/update_ticket_field.rb +5 -4
- data/lib/zendesk2/update_topic.rb +5 -4
- data/lib/zendesk2/update_user.rb +39 -31
- data/lib/zendesk2/update_user_field.rb +4 -3
- data/lib/zendesk2/update_user_identity.rb +7 -6
- data/lib/zendesk2/update_view.rb +38 -34
- data/lib/zendesk2/user.rb +41 -37
- data/lib/zendesk2/user_field.rb +9 -6
- data/lib/zendesk2/user_fields.rb +4 -3
- data/lib/zendesk2/user_identities.rb +4 -3
- data/lib/zendesk2/user_identity.rb +12 -9
- data/lib/zendesk2/users.rb +5 -4
- data/lib/zendesk2/version.rb +2 -1
- data/lib/zendesk2/view.rb +24 -13
- data/lib/zendesk2/views.rb +3 -2
- data/spec/categories_spec.rb +63 -60
- data/spec/client_spec.rb +6 -5
- data/spec/forums_spec.rb +64 -61
- data/spec/groups_spec.rb +7 -8
- data/spec/help_center/articles_spec.rb +22 -26
- data/spec/help_center/categories_spec.rb +26 -27
- data/spec/help_center/posts_spec.rb +39 -0
- data/spec/help_center/sections_spec.rb +32 -33
- data/spec/help_center/topics_spec.rb +13 -0
- data/spec/lib/paged_collection_spec.rb +11 -11
- data/spec/lib/rate_limit_spec.rb +9 -8
- data/spec/memberships_spec.rb +38 -27
- data/spec/organizations_spec.rb +92 -87
- data/spec/shared/zendesk_resource.rb +40 -25
- data/spec/spec_helper.rb +8 -13
- data/spec/support/client_helper.rb +5 -4
- data/spec/support/data_helper.rb +1 -0
- data/spec/ticket_fields_spec.rb +6 -7
- data/spec/tickets_spec.rb +69 -58
- data/spec/topic_comments_spec.rb +7 -8
- data/spec/topics_spec.rb +5 -6
- data/spec/user_fields_spec.rb +7 -7
- data/spec/user_identities_spec.rb +29 -25
- data/spec/users_spec.rb +88 -78
- data/spec/views_spec.rb +45 -34
- data/spec/zendesk2_spec.rb +3 -2
- data/zendesk2.gemspec +15 -14
- metadata +21 -2
data/lib/zendesk2/search.rb
CHANGED
@@ -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 { |_|
|
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(
|
26
|
-
type = terms.delete(
|
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: {
|
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 {
|
6
|
-
request_body { |r| {
|
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(
|
26
|
-
terms.delete(
|
26
|
+
terms = Hash[query.split(' ').map { |t| t.split(':') }]
|
27
|
+
terms.delete('type') # context already provided
|
27
28
|
|
28
|
-
collection =
|
29
|
+
collection = data[:organizations].values
|
29
30
|
|
30
31
|
# organization name is fuzzy matched
|
31
|
-
|
32
|
-
|
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(
|
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: {
|
50
|
+
page(results, params: { 'query' => query }, root: 'results')
|
51
51
|
end
|
52
52
|
end
|
data/lib/zendesk2/search_user.rb
CHANGED
@@ -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 {
|
6
|
-
request_body { |r| {
|
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(
|
26
|
-
terms.delete(
|
26
|
+
terms = Hash[query.split(' ').map { |t| t.split(':') }]
|
27
|
+
terms.delete('type') # context already provided
|
27
28
|
|
28
|
-
collection =
|
29
|
+
collection = searchable_collection(terms)
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
68
|
-
identities =
|
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
|
-
|
71
|
-
|
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
|
-
|
79
|
+
collection
|
76
80
|
end
|
77
81
|
end
|
data/lib/zendesk2/searchable.rb
CHANGED
@@ -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 =
|
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
|
47
|
-
|
48
|
-
|
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
|
data/lib/zendesk2/ticket.rb
CHANGED
@@ -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:
|
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 =
|
72
|
+
create_attributes = attributes.dup
|
71
73
|
|
72
|
-
|
73
|
-
create_attributes.merge!("requester" => with_requester)
|
74
|
-
end
|
74
|
+
with_requester = (@requester || nil) && Zendesk2.stringify_keys(@requester)
|
75
75
|
|
76
|
-
|
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(
|
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(
|
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(
|
106
|
+
comment = Zendesk2.stringify_keys(options).merge('body' => text)
|
105
107
|
|
106
108
|
cistern.ticket_comments.new(
|
107
109
|
cistern.update_ticket(
|
108
|
-
|
109
|
-
|
110
|
-
|
110
|
+
'ticket' => {
|
111
|
+
'id' => identity,
|
112
|
+
'comment' => comment,
|
111
113
|
}
|
112
|
-
).body[
|
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
|
-
|
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
|
-
|
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(
|
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
|
-
|
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
|
-
|
25
|
+
cistern.tickets.get(ticket_id)
|
25
26
|
end
|
26
27
|
|
27
28
|
def events
|
28
|
-
(
|
29
|
-
Zendesk2::AuditEvent.for(ae.merge(ticket_audit: 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 =
|
12
|
+
self.collection_root = 'audits'
|
12
13
|
self.model_method = :get_ticket_audit
|
13
|
-
self.model_root =
|
14
|
+
self.model_root = 'audit'
|
14
15
|
|
15
16
|
def ticket
|
16
|
-
|
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, {
|
23
|
+
body = cistern.send(collection_method, { 'ticket_id' => ticket_id }.merge(params)).body
|
23
24
|
|
24
|
-
collection =
|
25
|
-
collection.merge_attributes(Cistern::Hash.slice(body,
|
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
|
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
|