zendesk_api 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,7 +10,7 @@ User identities have the following keys:
10
10
  | id | integer | yes | no | Automatically assigned upon creation
11
11
  | url | string | yes | no | The API url of this identity
12
12
  | user_id | integer | yes | yes | The id of the user
13
- | type | string | yes | yes | One of "email", "twitter", "facebook" or "google"
13
+ | type | string | yes | yes | One of "email", "twitter", "facebook", "google", or "phone_number"
14
14
  | value | string | yes | yes | The identifier for this identity, e.g. an email address
15
15
  | verified | boolean | no | no | Is true of the identity has gone through verification
16
16
  | primary | boolean | no | no | Is true of the primary identity of the user
@@ -40,6 +40,7 @@ Users are represented as JSON objects which have the following keys:
40
40
  | last_login_at | date | yes | no | A time-stamp of the last time this user logged in to Zendesk
41
41
  | email | string | no | yes | The primary email address of this user
42
42
  | phone | string | no | no | The primary phone number of this user
43
+ | identities | Array | no | no | Array of user identities (e.g. email and Twitter) associated with this user. See [User Identities](user_identities.html)
43
44
  | signature | string | no | no | The signature of this user. Only agents and admins can have signatures
44
45
  | details | string | no | no | In this field you can store any details obout the user. e.g. the address
45
46
  | notes | string | no | no | In this field you can store any notes you have about the user
@@ -201,6 +202,16 @@ Location: /api/v2/users/{new-user-id}.json
201
202
  }
202
203
  ```
203
204
 
205
+ ### Create User with Multiple Identities
206
+
207
+ If you have a user with multiple identities, such as email addresses and Twitter accounts, you can also include
208
+ these values at creation time. This is especially useful when importing users from another system.
209
+
210
+ ```bash
211
+ curl -v -u {email_address}:{password} https://{subdomain}.zendesk.com/api/v2/users.json \
212
+ -H "Content-Type: application/json" -X POST -d '{"user": {"name": "Roger Wilco", "identities": [{ "type": "email", "value": "test@user.com"}, {"type": "twitter", "value": "tester84" }]}}'
213
+ ```
214
+
204
215
  ### Create Many Users
205
216
  `POST /api/v2/users/create_many.json`
206
217
 
@@ -1,7 +1,7 @@
1
1
  ## Views
2
2
 
3
3
  ### JSON Format
4
- Views are read-only and represented as simple flat JSON objects which have the following keys.
4
+ Views are represented as simple flat JSON objects which have the following keys.
5
5
 
6
6
  | Name | Type | Comment
7
7
  | --------------- | ---------------------------| -------------------
@@ -36,35 +36,33 @@ View Execution is a read-only object that describes how to display a collection
36
36
 
37
37
  | Name | Type | Comment
38
38
  | --------------- | ------- | -------
39
- | fields | Array | The ticket fields to display. System fields have a string id.
40
- | custom_fields | Array | The custom ticket fields to display. Custom fields have an id and url referencing the [Ticket Field](ticket_fields.md)
41
- | group_by | String | When present, the field by which the tickets are grouped
42
- | group_order | String | The direction the tickets are grouped. May be one of 'asc' or 'desc'
43
- | sort_order | String | The direction the tickets are sorted. May be one of 'asc' or 'desc'
44
- | sort_by | String | The ticket field used for sorting. This will either be a title or a custom field id.
39
+ | columns | Array | The ticket fields to display. Custom fields have an id, title, type and url referencing the [Ticket Field](ticket_fields.md)
40
+ | group | Object | When present, the structure indicating how the tickets are grouped
41
+ | sort | Object | The column structure of the field used for sorting.
45
42
 
46
43
  #### Example
47
44
  ```js
48
45
  {
49
46
  "execution":{
50
- "fields": [
47
+ "columns": [
51
48
  { "id": "status", "title": "Status" },
52
- { "id": "updated", "title": "Updated" }
53
- ],
54
- "custom_fields": [
49
+ { "id": "updated", "title": "Updated" },
55
50
  {
56
- "id": 5, "title": "Account",
51
+ "id": 5, "title": "Account", "type": "text",
57
52
  "url": "https://example.zendesk.com/api/v2/ticket_fields/5.json"
58
53
  },
59
54
  ...
60
55
  ]
61
- "group_by":null,
62
- "sort_order":"desc",
63
- "sort_by":"updated"
56
+ "group": { "id": "status", "title": "Status", "order": "desc" },
57
+ "sort": { "id": "updated", "title": "Updated", "order": "desc" }
64
58
  }
65
59
  }
66
60
  ```
67
61
 
62
+ # Deprecated
63
+
64
+ #
65
+
68
66
  ### Conditions
69
67
  The conditions under which a ticket is selected.
70
68
 
@@ -313,6 +311,63 @@ Status: 200 OK
313
311
  }
314
312
  ```
315
313
 
314
+ ### Create View
315
+ `POST /api/v2/views.json`
316
+
317
+ #### Allowed For
318
+
319
+ * Agents
320
+
321
+ #### Using curl
322
+
323
+ ```bash
324
+ curl -v -u {email_address}:{password} https://{subdomain}.zendesk.com/api/v2/views.json \
325
+ -H "Content-Type: application/json" -X POST -d '{"view":{"title":"Roger Wilco", "all": [{ "field": "status", "operator": "is", "value": "open" }]}}'
326
+ ```
327
+
328
+ #### Example Response
329
+
330
+ ```http
331
+ Status: 201 Created
332
+ Location: /api/v2/view/{new-view-id}.json
333
+
334
+ {
335
+ "view": {
336
+ "id": 9873843,
337
+ "title": "Roger Wilco",
338
+ ...
339
+ }
340
+ }
341
+ ```
342
+
343
+ ### Update View
344
+ `PUT /api/v2/view/{id}.json`
345
+
346
+ #### Allowed For
347
+
348
+ * Agents
349
+
350
+ #### Using curl
351
+
352
+ ```bash
353
+ curl -v -u {email_address}:{password} https://{subdomain}.zendesk.com/view/{id}.json \
354
+ -H "Content-Type: application/json" -X PUT -d '{"view":{"title":"Roger Wilco II"}}'
355
+ ```
356
+
357
+ #### Example Response
358
+
359
+ ```http
360
+ Status: 200 OK
361
+
362
+ {
363
+ "view": {
364
+ "id": 9873843,
365
+ "title": "Roger Wilco II",
366
+ ...
367
+ }
368
+ }
369
+ ```
370
+
316
371
  ### Executing Views
317
372
  `GET /api/v2/views/{id}/execute.json`
318
373
 
@@ -372,6 +427,41 @@ Status: 200 OK
372
427
  }
373
428
  ```
374
429
 
430
+ ### Getting Tickets from a view
431
+ `GET /api/v2/views/{id}/tickets.json`
432
+
433
+ #### Allowed For
434
+
435
+ * Agents
436
+
437
+ #### Using curl:
438
+
439
+ ```bash
440
+ curl https://{subdomain}.zendesk.com/api/v2/views/{id}/tickets.json \
441
+ -v -u {email_address}:{password}
442
+ ```
443
+
444
+ #### Example Responses
445
+
446
+ ```http
447
+ Status: 200 OK
448
+
449
+ {
450
+ "tickets": [
451
+ {
452
+ "id": 35436,
453
+ "subject": "Help I need somebody!",
454
+ ...
455
+ },
456
+ {
457
+ "id": 20057623,
458
+ "subject": "Not just anybody!",
459
+ ...
460
+ },
461
+ ]
462
+ }
463
+ ```
464
+
375
465
  ### Previewing Views
376
466
  `POST /api/v2/views/preview.json`
377
467
 
@@ -1,3 +1,3 @@
1
1
  module ZendeskAPI
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
@@ -107,6 +107,8 @@ RSpec.configure do |c|
107
107
 
108
108
  c.extend VCR::RSpec::Macros
109
109
  c.extend ResourceMacros
110
+ c.extend ZendeskAPI::Fixtures
111
+ c.include ZendeskAPI::Fixtures
110
112
  c.include TestHelper
111
113
  end
112
114
 
@@ -1,88 +1,91 @@
1
- def user
2
- @user ||= find_or_create_user "end-user"
3
- end
1
+ module ZendeskAPI
2
+ module Fixtures
3
+ def user
4
+ @user ||= find_or_create_user "end-user"
5
+ end
4
6
 
5
- def current_user
6
- VCR.use_cassette('current_user') do
7
- @current_user ||= client.users.find(:id => 'me')
8
- end
9
- end
7
+ def current_user
8
+ VCR.use_cassette('current_user') do
9
+ @current_user ||= client.users.find(:id => 'me')
10
+ end
11
+ end
10
12
 
11
- def agent
12
- @agent ||= find_or_create_user "agent"
13
- end
13
+ def agent
14
+ @agent ||= find_or_create_user "agent"
15
+ end
14
16
 
15
- def find_or_create_user(role)
16
- VCR.use_cassette("valid_user_#{role}") do
17
- email = "zendesk-api-client-ruby-#{role}-#{client.config.username}"
17
+ def find_or_create_user(role)
18
+ VCR.use_cassette("valid_user_#{role}") do
19
+ email = "zendesk-api-client-ruby-#{role}-#{client.config.username}"
18
20
 
19
- client.users.detect {|u| u.email == email } ||
20
- client.users.create(
21
- :name => "Test Valid with role #{role}",
22
- :verified => true,
23
- :email => email,
24
- :role => role
25
- )
26
- end
27
- end
21
+ client.users.detect {|u| u.email == email } ||
22
+ client.users.create(
23
+ :name => "Test Valid with role #{role}",
24
+ :verified => true,
25
+ :email => email,
26
+ :role => role
27
+ )
28
+ end
29
+ end
28
30
 
29
- def topic
30
- VCR.use_cassette('valid_topic') do
31
- @topic ||= forum.topics.first
32
- @topic ||= client.topics.create(
33
- :title => "Test Topic",
34
- :body => "This is the body of a topic.",
35
- :forum_id => forum.id
36
- )
37
- end
38
- end
31
+ def topic
32
+ VCR.use_cassette('valid_topic') do
33
+ @topic ||= forum.topics.first
34
+ @topic ||= client.topics.create(
35
+ :title => "Test Topic",
36
+ :body => "This is the body of a topic.",
37
+ :forum_id => forum.id
38
+ )
39
+ end
40
+ end
39
41
 
40
- def forum
41
- VCR.use_cassette('valid_forum') do
42
- @forum ||= client.forums.detect {|f| f.topics.any? }
43
- @forum ||= client.forums.create(:name => "Test Forum", :access => "everybody")
44
- end
45
- end
42
+ def forum
43
+ VCR.use_cassette('valid_forum') do
44
+ @forum ||= client.forums.detect {|f| f.topics.any? }
45
+ @forum ||= client.forums.create(:name => "Test Forum", :access => "everybody")
46
+ end
47
+ end
46
48
 
47
- def category
48
- VCR.use_cassette('valid_category') do
49
- @category ||= client.categories.first
50
- @category ||= client.categories.create(:name => "Test Category")
51
- end
52
- end
49
+ def category
50
+ VCR.use_cassette('valid_category') do
51
+ @category ||= client.categories.first
52
+ @category ||= client.categories.create(:name => "Test Category")
53
+ end
54
+ end
53
55
 
54
- def ticket
55
- VCR.use_cassette('valid_ticket') do
56
- @ticket ||= client.tickets.first
57
- @ticket ||= client.tickets.create(
58
- :subject => "Test Ticket",
59
- :description => "This is a test of the emergency alert system.",
60
- :requester_id => user.id
61
- )
62
- end
63
- end
56
+ def ticket
57
+ VCR.use_cassette('valid_ticket') do
58
+ @ticket ||= client.tickets.first
59
+ @ticket ||= client.tickets.create(
60
+ :subject => "Test Ticket",
61
+ :description => "This is a test of the emergency alert system.",
62
+ :requester_id => user.id
63
+ )
64
+ end
65
+ end
64
66
 
65
- def suspended_ticket
66
- VCR.use_cassette('valid_suspended_ticket') do
67
- @suspended_ticket ||= client.suspended_tickets.first
68
- end
69
- end
67
+ def suspended_ticket
68
+ VCR.use_cassette('valid_suspended_ticket') do
69
+ @suspended_ticket ||= client.suspended_tickets.first
70
+ end
71
+ end
70
72
 
71
- def group
72
- VCR.use_cassette('valid_group') do
73
- @ticket ||= client.groups.detect {|g| !g.default}
74
- @ticket ||= client.groups.create(:name => "Test Group")
75
- end
76
- end
73
+ def group
74
+ VCR.use_cassette('valid_group') do
75
+ @ticket ||= client.groups.detect {|g| !g.default}
76
+ @ticket ||= client.groups.create(:name => "Test Group")
77
+ end
78
+ end
77
79
 
78
- def organization
79
- VCR.use_cassette('valid_organization') do
80
- @organization ||= current_user.organization
81
- end
82
- end
80
+ def organization
81
+ VCR.use_cassette('valid_organization') do
82
+ @organization ||= current_user.organization
83
+ end
84
+ end
83
85
 
84
- # Global default options, overwritten if using under
85
- def default_options
86
- {}
86
+ # Global default options, overwritten if using under
87
+ def default_options
88
+ {}
89
+ end
90
+ end
87
91
  end
88
-
@@ -90,11 +90,38 @@ describe ZendeskAPI::Ticket do
90
90
  it "can comment while creating" do
91
91
  VCR.use_cassette("ticket_inline_comments") do
92
92
  ticket = ZendeskAPI::Ticket.new(client, valid_attributes.merge(default_options))
93
- ticket.comment = ZendeskAPI::TicketComment.new(client, :value => "My comment", :public => false)
93
+ ticket.comment = ZendeskAPI::Ticket::Comment.new(client, :value => "My comment", :public => false)
94
94
  ticket.save!
95
95
 
96
96
  ticket.changes.should == {} # comment was set before save
97
97
  ticket.attributes[:comment].should == {"value" => "My comment", "public" => false}
98
98
  end
99
99
  end
100
+
101
+ describe "import race condition" do
102
+ it "should handle it" do
103
+ email = "test+#{rand(100000)}@test.com"
104
+
105
+ VCR.use_cassette("ticket_import_race") do
106
+ threads = []
107
+
108
+ 3.times do
109
+ threads << Thread.new do
110
+ client.insert_callback do |response|
111
+ Thread.current[:response] = response
112
+ end
113
+
114
+ ZendeskAPI::Ticket.import(client, :requester => { :email => email, :name => "Hello" }, :subject => "Test", :description => "Test")
115
+ end
116
+ end
117
+
118
+ threads.map! do |thread|
119
+ thread.join(3)
120
+ thread[:response][:status]
121
+ end
122
+
123
+ threads.all? {|st| [201, 422].include?(st)}.should be_true
124
+ end
125
+ end
126
+ end
100
127
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zendesk_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-12-06 00:00:00.000000000 Z
13
+ date: 2012-12-14 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bump
@@ -270,6 +270,7 @@ files:
270
270
  - lib/zendesk_api/server/docs/activity_stream.md
271
271
  - lib/zendesk_api/server/docs/attachments.md
272
272
  - lib/zendesk_api/server/docs/autocomplete.md
273
+ - lib/zendesk_api/server/docs/automations.md
273
274
  - lib/zendesk_api/server/docs/categories.md
274
275
  - lib/zendesk_api/server/docs/custom_roles.md
275
276
  - lib/zendesk_api/server/docs/forum_subscriptions.md