helpscout 0.0.3 → 0.0.4

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.
@@ -1,49 +1,170 @@
1
- require "date"
2
- require "httparty"
1
+ # Help Scout API V1 Client
2
+ # http://developer.helpscout.net/
3
+ #
4
+ # These models are used by the HelpScout client.
5
+ #
6
+ # They include wrappers for the three response envelopes, as well as wrappers
7
+ # for the JSON hashes returned in SingleItemEnvelope and CollectionsEnvelope.
8
+ #
9
+ # All date/times returned by the API are in ISO8601 format and in UTC timezone.
3
10
 
4
11
  module HelpScout
12
+
13
+ # Response Envelopes
14
+ # http://developer.helpscout.net/
15
+ #
16
+ # The Help Scout API will return one of three envelopes, depending upon the
17
+ # request issued.
18
+
19
+ # Single Item Envelope
20
+ class SingleItemEnvelope
21
+ attr_reader :item
22
+
23
+ # Creates a new SingleItemEnvelope object from a Hash of attributes
24
+ def initialize(object)
25
+ @item = object["item"]
26
+ end
27
+ end
28
+
29
+ # Collections Envelope
30
+ class CollectionsEnvelope
31
+ attr_reader :page, :pages, :count, :items
32
+
33
+ # Creates a new CollectionsEnvelope object from a Hash of attributes
34
+ def initialize(object)
35
+ @page = object["page"]
36
+ @pages = object["pages"]
37
+ @count = object["count"]
38
+ @items = object["items"]
39
+ end
40
+ end
41
+
42
+ # Error Envelope
43
+ class ErrorEnvelope
44
+ attr_reader :status, :message
45
+
46
+ # Creates a new ErrorEnvelope object from a Hash of attributes
47
+ def initialize(object)
48
+ @status = object["status"]
49
+ @message = object["message"]
50
+ end
51
+ end
52
+
53
+
54
+ # Client Objects
55
+
56
+ # Mailbox
57
+ # http://developer.helpscout.net/objects/mailbox/
58
+ # http://developer.helpscout.net/objects/mailbox/mailbox-ref/
59
+ #
60
+ # MailboxRefs are a subset of a full Mailbox object, and only include the
61
+ # attributes marked with a *.
62
+ #
63
+ # MailboxRefs are returned by endpoints that include multiple mailboxes.
64
+ # A full Mailbox object can be obtained by fetching a single mailbox directly.
65
+ #
66
+ # Name Type Example Notes
67
+ # *id Int 1234 Unique identifier
68
+ # *name String Feedback Name of the Mailbox
69
+ # slug String 47204a026903ce6d Key used to represent this
70
+ # Mailbox
71
+ # email String feedback@support.com Email address
72
+ # createdAt DateTime 2012-07-23T12:34:12Z UTC time when this mailbox was
73
+ # created.
74
+ # modifiedAt DateTime 2012-07-24T20:18:33Z UTC time when this mailbox was
75
+ # modified.
76
+
5
77
  class Mailbox
6
- attr_accessor :id, :name, :slug, :email, :createdAt, :modifiedAt
78
+ attr_reader :id, :name, :slug, :email, :createdAt, :modifiedAt
79
+
80
+ # Creates a new Mailbox object from a Hash of attributes
7
81
  def initialize(object)
82
+ @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
83
+ @modifiedAt = DateTime.iso8601(object["modifiedAt"]) if object["modifiedAt"]
84
+
8
85
  @id = object["id"]
9
86
  @name = object["name"]
87
+
10
88
  @slug = object["slug"]
11
89
  @email = object["email"]
12
- @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
13
- @modifiedAt = DateTime.iso8601(object["modifiedAt"]) if object["modifiedAt"]
14
90
  end
91
+ end
15
92
 
16
- class Folder
17
- attr_accessor :id, :name, :type, :userId, :totalCount, :activeCount, :modifiedAt
18
-
19
- FOLDER_TYPE_UNASSIGNED = "unassigned"
20
- FOLDER_TYPE_MY_TICKETS = "mytickets"
21
- FOLDER_TYPE_DRAFTS = "drafts"
22
- FOLDER_TYPE_ASSIGNED = "assigned"
23
- FOLDER_TYPE_CLOSED = "closed"
24
- FOLDER_TYPE_SPAM = "spam"
25
93
 
26
- def initialize(object)
27
- @id = object["id"]
28
- @name = object["name"]
29
- @type = object["type"]
30
- @userId = object["userId"] # 0, unless type == FOLDER_TYPE_MY_TICKETS
31
- @totalCount = object["totalCount"]
32
- @activeCount = object["activeCount"]
33
- @modifiedAt = DateTime.iso8601(object["modifiedAt"]) if object["modifiedAt"]
34
- end
35
- end
36
- end
94
+ # Conversation
95
+ # http://developer.helpscout.net/objects/conversation/
96
+ #
97
+ # Name Type Example Notes
98
+ # id Int 2391938111 Unique identifier
99
+ # folderId Int 1234 ID of the Folder to which
100
+ # this conversation resides.
101
+ # isDraft Boolean false Is this a draft?
102
+ # number Int 349 The conversation number
103
+ # displayed in the UI.
104
+ # owner User User of the Help Scout user
105
+ # that is currently assigned
106
+ # to this conversation
107
+ # mailbox Mailbox Mailbox to which this
108
+ # conversation belongs.
109
+ # customer Customer Customer to which this
110
+ # conversation belongs.
111
+ # threadCount Int 4 This count represents the
112
+ # number of published threads
113
+ # found on the conversation
114
+ # (it does not include line
115
+ # items, drafts or threads
116
+ # held for review by Traffic
117
+ # Cop).
118
+ # status String active Status of the conversation.
119
+ # subject String I need help!
120
+ # preview String Hello, I...
121
+ # createdBy Customer Either the Customer or User
122
+ # - or - that created this
123
+ # User conversation.
124
+ # Inspect the Source object
125
+ # for clarification.
126
+ # createdAt DateTime 2012-07-23T12:34:12Z UTC time when this
127
+ # conversation was created.
128
+ # modifiedAt DateTime 2012-07-24T20:18:33Z UTC time when this.
129
+ # conversation was modified.
130
+ # closedAt DateTime UTC time when this
131
+ # conversation was closed.
132
+ # Null if not closed.
133
+ # closedBy User User of the Help Scout user
134
+ # that closed this
135
+ # conversation.
136
+ # source Source Specifies the method in
137
+ # which this conversation was
138
+ # created.
139
+ # cc Array Collection of strings
140
+ # representing emails.
141
+ # bcc Array Collection of strings
142
+ # representing emails.
143
+ # tags Array Collection of strings
144
+ # threads Array Collection of Thread
145
+ # objects. Only available when
146
+ # retrieving a single
147
+ # Conversation
148
+ #
149
+ # Possible values for status include:
150
+ # * STATUS_ACTIVE
151
+ # * STATUS_PENDING
152
+ # * STATUS_CLOSED
153
+ # * STATUS_SPAM
37
154
 
38
155
  class Conversation
39
- attr_accessor :id, :folderId, :isDraft, :number, :owner, :mailbox, :customer, :threadCount, :status, :subject, :preview, :createdBy, :createdAt, :modifiedAt, :closedAt, :closedBy, :source, :cc, :bcc, :tags, :threads
156
+ attr_reader :id, :folderId, :isDraft, :number, :owner, :mailbox, :customer, :threadCount, :status, :subject, :preview, :createdBy, :createdAt, :modifiedAt, :closedAt, :closedBy, :source, :cc, :bcc, :tags, :threads, :url
40
157
 
41
- CONVERSATION_STATUS_ACTIVE = "active"
42
- CONVERSATION_STATUS_PENDING = "pending"
43
- CONVERSATION_STATUS_CLOSED = "closed"
44
- CONVERSATION_STATUS_SPAM = "spam"
158
+ STATUS_ACTIVE = "active"
159
+ STATUS_PENDING = "pending"
160
+ STATUS_CLOSED = "closed"
161
+ STATUS_SPAM = "spam"
45
162
 
163
+ # Creates a new Conversation object from a Hash of attributes
46
164
  def initialize(object)
165
+ @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
166
+ @modifiedAt = DateTime.iso8601(object["userModifiedAt"]) if object["userModifiedAt"]
167
+ @closedAt = DateTime.iso8601(object["closedAt"]) if object["closedAt"]
47
168
  @id = object["id"]
48
169
  @folderId = object["folderId"]
49
170
  @isDraft = object["isDraft"]
@@ -55,9 +176,6 @@ module HelpScout
55
176
  @status = object["status"]
56
177
  @subject = object["subject"]
57
178
  @preview = object["preview"]
58
- @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
59
- @modifiedAt = DateTime.iso8601(object["modifiedAt"]) if object["modifiedAt"]
60
- @closedAt = DateTime.iso8601(object["closedAt"]) if object["closedAt"]
61
179
  @closedBy = User.new(object["closedBy"]) if object["closedBy"]
62
180
 
63
181
  @source = nil
@@ -65,9 +183,9 @@ module HelpScout
65
183
  @source = Source.new(object["source"])
66
184
 
67
185
  if object["createdBy"]
68
- if @source.type == Source::SOURCE_VIA_CUSTOMER
186
+ if @source.type == Source::VIA_CUSTOMER
69
187
  @createdBy = Customer.new(object["createdBy"])
70
- elsif @source.type == Source::SOURCE_VIA_USER
188
+ elsif @source.type == Source::VIA_USER
71
189
  @createdBy = User.new(object["createdBy"])
72
190
  end
73
191
  end
@@ -83,91 +201,135 @@ module HelpScout
83
201
  @threads << Thread.new(thread)
84
202
  end
85
203
  end
86
- end
87
204
 
88
- def to_s
89
- "Last Modified: #{@modifiedAt}\nAssigned to: #{@owner}\nSubject: #{@subject}\n#{@preview}"
205
+ @url = "https://secure.helpscout.net/conversation/#{@id}/#{@number}/"
90
206
  end
91
207
 
92
- class Attachment
93
- attr_accessor :id, :mimeType, :filename, :size, :width, :height, :url
94
-
95
- def initialize(object)
96
- @id = object["id"]
97
- @mimeType = object["mimeType"]
98
- @filename = object["filename"]
99
- @size = object["size"]
100
- @width = object["width"]
101
- @height = object["height"]
102
- @url = object["url"]
103
- end
104
- end
105
-
106
- class AttachmentData
107
- attr_accessor :id, :data
108
-
109
- def initialize(object)
110
- @id = object["id"]
111
- @data = object["data"]
112
- end
208
+ # Returns a String suitable for display
209
+ def to_s
210
+ "Last Modified: #{@modifiedAt}\nStatus: #{@status}\nAssigned to: #{@owner}\nSubject: #{@subject}\n#{@preview}"
113
211
  end
114
212
 
115
- class Source
116
- attr_accessor :type, :via
117
-
118
- SOURCE_TYPE_EMAIL = "email"
119
- SOURCE_TYPE_WEB = "web"
120
- SOURCE_TYPE_NOTIFICATION = "notification"
121
- SOURCE_TYPE_EMAIL_FWD = "emailfwd"
122
213
 
123
- SOURCE_VIA_USER = "user"
124
- SOURCE_VIA_CUSTOMER = "customer"
125
-
126
- def initialize(object)
127
- @type = object["type"]
128
- @via = object["via"]
129
- end
130
- end
214
+ # Conversation::Thread
215
+ # http://developer.helpscout.net/objects/conversation/thread/
216
+ #
217
+ # Name Type Example Notes
218
+ # id Int 88171881 Unique identifier
219
+ # assignedTo User User of the Help Scout user
220
+ # to which this conversation
221
+ # has been assigned.
222
+ # status String active Status of the thread. Thread
223
+ # status is only updated when
224
+ # there is a status change.
225
+ # Otherwise, the status will
226
+ # be set to STATUS_NO_CHANGE.
227
+ # createdAt DateTime 2012-07-23T12:34:12Z UTC time when this thread
228
+ # was created.
229
+ # createdBy Customer Either the Customer or User
230
+ # - or - that created this
231
+ # User conversation. Inspect the
232
+ # Source object for
233
+ # clarification.
234
+ # source Source
235
+ # fromMailbox Mailbox If the conversation was
236
+ # moved, fromMailbox
237
+ # represents the Mailbox from
238
+ # which it was moved.
239
+ # type String message The type of thread.
240
+ # state String published The state of the thread.
241
+ # customer Customer If type is message, this is
242
+ # the Customer of the customer
243
+ # in which the message was
244
+ # sent. If type is customer,
245
+ # this is the Customer of the
246
+ # customer that initiated the
247
+ # thread.
248
+ # body String Thank you.
249
+ # to Array Collection of Strings
250
+ # representing emails.
251
+ # cc Array Collection of Strings
252
+ # representing emails.
253
+ # bcc Array Collection of Strings
254
+ # representing emails.
255
+ # attachments Array Collection of Attachment
256
+ # objects, if they exist.
257
+ #
258
+ # Possible values for state include:
259
+ # * STATE_PUBLISHED
260
+ # * STATE_DRAFT
261
+ # * STATE_UNDER_REVIEW
262
+ #
263
+ # A state of STATE_UNDER_REVIEW means the thread has been stopped by Traffic
264
+ # Cop and is waiting to be confirmed (or discarded) by the person that
265
+ # created the thread.
266
+ #
267
+ # Traffic Cop is the Help Scout feature that stops a thread from going out
268
+ # if multiple Users act on the same Help Scout simultaneously.
269
+ #
270
+ # Possible values for status include:
271
+ # * STATUS_ACTIVE
272
+ # * STATUS_NO_CHANGE
273
+ # * STATUS_PENDING
274
+ # * STATUS_CLOSED
275
+ # * STATUS_SPAM
276
+ #
277
+ # Possible values for type include:
278
+ # * TYPE_NOTE
279
+ # * TYPE_MESSAGE
280
+ # * TYPE_CUSTOMER
281
+ # * TYPE_LINEITEM
282
+ # * TYPE_FWD_PARENT
283
+ # * TYPE_FWD_CHILD
284
+ #
285
+ # TYPE_LINEITEM represents a change of state on the conversation. This could
286
+ # include, but not limited to, the conversation was assigned, the status
287
+ # changed, the conversation was moved from one mailbox to another, etc. A
288
+ # line item won't have a body, to/cc/bcc lists, or attachments.
289
+ #
290
+ # When a conversation is forwarded, a new conversation is created to
291
+ # represent the forwarded conversation.
292
+ # * TYPE_FWD_PARENT is the type set on the thread of the original
293
+ # conversation that initiated the forward event.
294
+ # * TYPE_FWD_CHILD is the type set on the first thread of the new forwarded
295
+ # conversation.
131
296
 
132
297
  class Thread
133
- attr_accessor :id, :assignedTo, :status, :createdAt, :createdBy, :source, :fromMailbox, :type, :state, :customer, :body, :to, :cc, :bcc, :attachments
134
-
135
- THREAD_STATE_PUBLISHED = "published"
136
- THREAD_STATE_DRAFT = "draft"
137
- THREAD_STATE_UNDER_REVIEW = "underreview"
138
-
139
- THREAD_STATUS_ACTIVE = "active"
140
- THREAD_STATUS_NO_CHANGE = "nochange"
141
- THREAD_STATUS_PENDING = "pending"
142
- THREAD_STATUS_CLOSED = "closed"
143
- THREAD_STATUS_SPAM = "spam"
144
-
145
- THREAD_TYPE_NOTE = "note"
146
- THREAD_TYPE_MESSAGE = "message"
147
- THREAD_TYPE_CUSTOMER = "customer"
148
-
149
- # A lineitem represents a change of state on the conversation. This could include, but not limited to, the conversation was assigned, the status changed, the conversation was moved from one mailbox to another, etc. A line item won't have a body, to/cc/bcc lists, or attachments.
150
- THREAD_TYPE_LINEITEM = "lineitem"
151
-
152
- # When a conversation is forwarded, a new conversation is created to represent the forwarded conversation.
153
- THREAD_TYPE_FWD_PARENT = "forwardparent" # forwardparent is the type set on the thread of the original conversation that initiated the forward event.
154
- THREAD_TYPE_FWD_CHILD = "forwardchild" # forwardchild is the type set on the first thread of the new forwarded conversation.
155
-
156
-
298
+ attr_reader :id, :assignedTo, :status, :createdAt, :createdBy, :source, :fromMailbox, :type, :state, :customer, :body, :to, :cc, :bcc, :attachments
299
+
300
+ STATE_PUBLISHED = "published"
301
+ STATE_DRAFT = "draft"
302
+ STATE_UNDER_REVIEW = "underreview"
303
+
304
+ STATUS_ACTIVE = "active"
305
+ STATUS_NO_CHANGE = "nochange"
306
+ STATUS_PENDING = "pending"
307
+ STATUS_CLOSED = "closed"
308
+ STATUS_SPAM = "spam"
309
+
310
+ TYPE_NOTE = "note"
311
+ TYPE_MESSAGE = "message"
312
+ TYPE_CUSTOMER = "customer"
313
+ TYPE_LINEITEM = "lineitem"
314
+ TYPE_FWD_PARENT = "forwardparent"
315
+ TYPE_FWD_CHILD = "forwardchild"
316
+
317
+ # Creates a new Conversation::Thread object from a Hash of attributes
157
318
  def initialize(object)
319
+ @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
320
+
158
321
  @id = object["id"]
159
322
  @assignedTo = User.new(object["assignedTo"]) if object["assignedTo"]
160
323
  @status = object["status"]
161
- @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
162
324
 
163
325
  @source = nil
164
326
  if object["source"]
165
327
  @source = Source.new(object["source"])
166
328
 
167
329
  if object["createdBy"]
168
- if @source.type == Source::SOURCE_VIA_CUSTOMER
330
+ if @source.type == Source::VIA_CUSTOMER
169
331
  @createdBy = Customer.new(object["createdBy"])
170
- elsif @source.type == Source::SOURCE_VIA_USER
332
+ elsif @source.type == Source::VIA_USER
171
333
  @createdBy = User.new(object["createdBy"])
172
334
  end
173
335
  end
@@ -190,21 +352,102 @@ module HelpScout
190
352
  end
191
353
  end
192
354
 
355
+ # Returns a String suitable for display
193
356
  def to_s
194
357
  "#{@customer}: #{@body}"
195
358
  end
196
359
  end
197
360
 
361
+
362
+ # Conversation::Attachment
363
+ # http://developer.helpscout.net/objects/conversation/attachment/
364
+ #
365
+ # Name Type Example Notes
366
+ # id Int 12391 Unique identifier
367
+ # mimeType String image/jpeg
368
+ # filename String logo.jpg
369
+ # size Int 22 Size of the attachment in bytes.
370
+ # width Int 160
371
+ # height Int 160
372
+ # url String https://.../logo.jpg Public-facing url where
373
+ # attachment can be downloaded
374
+
375
+ class Attachment
376
+ attr_reader :id, :mimeType, :filename, :size, :width, :height, :url
377
+
378
+ # Creates a new Conversation::Attachment object from a Hash of attributes
379
+ def initialize(object)
380
+ @id = object["id"]
381
+ @mimeType = object["mimeType"]
382
+ @filename = object["filename"]
383
+ @size = object["size"]
384
+ @width = object["width"]
385
+ @height = object["height"]
386
+ @url = object["url"]
387
+ end
388
+ end
389
+
390
+
391
+ # Conversation::AttachmentData
392
+ # http://developer.helpscout.net/objects/conversation/attachment-data/
393
+ #
394
+ # Name Type Example Notes
395
+ # id Int 887171 Unique identifier
396
+ # data String base64 encoded data
397
+
398
+ class AttachmentData
399
+ attr_reader :id, :data
400
+
401
+ # Creates a new Conversation::AttachmentData object from a Hash of
402
+ # attributes
403
+ def initialize(object)
404
+ @id = object["id"]
405
+ @data = object["data"]
406
+ end
407
+ end
198
408
  end
199
409
 
410
+
411
+ # User
412
+ # http://developer.helpscout.net/objects/user/
413
+ # http://developer.helpscout.net/objects/user/user-ref/
414
+ #
415
+ # UserRefs are a subset of a full User object, and only include the attributes
416
+ # marked with a *.
417
+ #
418
+ # UserRefs are returned by endpoints that include multiple users.
419
+ # A full User object can be obtained by fetching a single user directly.
420
+ #
421
+ # Name Type Example Notes
422
+ # *id Int 1234 Unique identifier
423
+ # *firstName String Jack
424
+ # *lastName String Sprout
425
+ # *email String jack.sprout@gmail.com
426
+ # role String owner Role of this user.
427
+ # timezone String America/New_York
428
+ # photoUrl String http://.../avatar.jpg The user's photo, if one
429
+ # exists.
430
+ # createdAt DateTime 2011-04-01T03:18:33Z UTC time when this user was
431
+ # created.
432
+ # modifiedAt DateTime 2012-07-24T20:18:33Z UTC time when this user was
433
+ # modified.
434
+ #
435
+ # Possible values for role include:
436
+ # * ROLE_OWNER
437
+ # * ROLE_ADMIN
438
+ # * ROLE_USER
439
+
200
440
  class User
201
- attr_accessor :id, :firstName, :lastName, :email, :role, :timezone, :photoUrl, :createdAt, :createdBy
441
+ attr_reader :id, :firstName, :lastName, :email, :role, :timezone, :photoUrl, :createdAt, :createdBy
202
442
 
203
- USER_ROLE_OWNER = "owner"
204
- USER_ROLE_ADMIN = "admin"
205
- USER_ROLE_USER = "user"
443
+ ROLE_OWNER = "owner"
444
+ ROLE_ADMIN = "admin"
445
+ ROLE_USER = "user"
206
446
 
447
+ # Creates a new User object from a Hash of attributes
207
448
  def initialize(object)
449
+ @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
450
+
208
451
  @id = object["id"]
209
452
  @firstName = object["firstName"]
210
453
  @lastName = object["lastName"]
@@ -212,31 +455,80 @@ module HelpScout
212
455
  @role = object["role"]
213
456
  @timezone = object["timezone"]
214
457
  @photoUrl = object["photoUrl"]
215
- @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
216
458
  @createdBy = object["createdBy"]
217
459
  end
218
460
 
461
+ # Returns a String suitable for display
219
462
  def to_s
220
463
  "#{@firstName} #{@lastName}"
221
464
  end
222
465
  end
223
466
 
467
+
468
+ # Customer
469
+ # http://developer.helpscout.net/objects/customer/
470
+ # http://developer.helpscout.net/objects/customer/customer-ref/
471
+ #
472
+ # CustomerRefs are a subset of a full Customer object, and only include the
473
+ # attributes marked with a *.
474
+ #
475
+ # CustomerRefs are returned by endpoints that include multiple customers.
476
+ #
477
+ # A full Customer object can be obtained by fetching a single customer
478
+ # directly.
479
+ #
480
+ # Name Type Example Notes
481
+ # *id Int 29418 Unique identifier
482
+ # *firstName String Vernon
483
+ # *lastName String Bear
484
+ # *email String vbear@mywork.com If the customer has multiple
485
+ # emails, only one is returned.
486
+ # photoUrl String http://../avatar.jpg
487
+ # photoType String twitter Type of photo.
488
+ # gender String Male Gender of this customer.
489
+ # age String 30-35
490
+ # organization String Acme, Inc
491
+ # jobTitle String CEO and Co-Founder
492
+ # location String Austin
493
+ # createdAt DateTime 2012-07-23T12:34:12Z UTC time when this customer
494
+ # was created.
495
+ # modifiedAt DateTime 2012-07-24T20:18:33Z UTC time when this customer
496
+ # was modified.
497
+ #
498
+ # Possible values for photoType include:
499
+ # * PHOTO_TYPE_UNKNOWN
500
+ # * PHOTO_TYPE_GRAVATAR
501
+ # * PHOTO_TYPE_TWITTER
502
+ # * PHOTO_TYPE_FACEBOOK
503
+ # * PHOTO_TYPE_GOOGLE_PROFILE
504
+ # * PHOTO_TYPE_GOOGLE_PLUS
505
+ # * PHOTO_TYPE_LINKEDIN
506
+ #
507
+ # Possible values for gender include:
508
+ # * GENDER_MALE
509
+ # * GENDER_FEMALE
510
+ # * GENDER_UNKNOWN
511
+
224
512
  class Customer
225
- attr_accessor :id, :firstName, :lastName, :photoUrl, :photoType, :gender, :age, :organization, :jobTitle, :location, :createdAt, :modifiedAt, :background, :address, :socialProfiles, :emails, :phones, :chats, :websites
513
+ attr_reader :id, :firstName, :lastName, :photoUrl, :photoType, :gender, :age, :organization, :jobTitle, :location, :createdAt, :modifiedAt, :background, :address, :socialProfiles, :emails, :phones, :chats, :websites
226
514
 
227
- CUSTOMER_PHOTO_TYPE_UNKNOWN = "unknown"
228
- CUSTOMER_PHOTO_TYPE_GRAVATAR = "gravatar"
229
- CUSTOMER_PHOTO_TYPE_TWITTER = "twitter"
230
- CUSTOMER_PHOTO_TYPE_FACEBOOK = "facebook"
231
- CUSTOMER_PHOTO_TYPE_GOOGLE_PROFILE = "googleprofile"
232
- CUSTOMER_PHOTO_TYPE_GOOGLE_PLUS = "googleplus"
233
- CUSTOMER_PHOTO_TYPE_LINKEDIN = "linkedin"
515
+ PHOTO_TYPE_UNKNOWN = "unknown"
516
+ PHOTO_TYPE_GRAVATAR = "gravatar"
517
+ PHOTO_TYPE_TWITTER = "twitter"
518
+ PHOTO_TYPE_FACEBOOK = "facebook"
519
+ PHOTO_TYPE_GOOGLE_PROFILE = "googleprofile"
520
+ PHOTO_TYPE_GOOGLE_PLUS = "googleplus"
521
+ PHOTO_TYPE_LINKEDIN = "linkedin"
234
522
 
235
- CUSTOMER_GENDER_MALE = "male"
236
- CUSTOMER_GENDER_FEMALE = "female"
237
- CUSTOMER_GENDER_UNKNOWN = "unknown"
523
+ GENDER_MALE = "male"
524
+ GENDER_FEMALE = "female"
525
+ GENDER_UNKNOWN = "unknown"
238
526
 
527
+ # Creates a new Customer object from a Hash of attributes
239
528
  def initialize(object)
529
+ @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
530
+ @modifiedAt = DateTime.iso8601(object["modifiedAt"]) if object["modifiedAt"]
531
+
240
532
  @id = object["id"]
241
533
  @firstName = object["firstName"]
242
534
  @lastName = object["lastName"]
@@ -288,42 +580,83 @@ module HelpScout
288
580
  @websites << Website.new(item)
289
581
  end
290
582
  end
291
-
292
- @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
293
- @modifiedAt = DateTime.iso8601(object["modifiedAt"]) if object["modifiedAt"]
294
583
  end
295
584
 
585
+ # Returns a String suitable for display
296
586
  def to_s
297
587
  "#{@firstName} #{@lastName}"
298
588
  end
299
589
 
590
+
591
+ # Customer::Address
592
+ # http://developer.helpscout.net/objects/customer/address/
593
+ #
594
+ # Name Type Example Notes
595
+ # id Int 1234 Unique identifier
596
+ # lines Array Collection of strings
597
+ # representing the
598
+ # customer's street
599
+ # address.
600
+ # city String Dallas
601
+ # state String TX
602
+ # postalCode String 74206
603
+ # country String US
604
+ # createdAt DateTime 2012-07-23T12:34:12Z UTC time when this
605
+ # address was created.
606
+ # modifiedAt DateTime 2012-07-24T20:18:33Z UTC time when this
607
+ # address was modified.
608
+
300
609
  class Address
301
- attr_accessor :id, :lines, :city, :state, :postalCode, :country, :createdAt, :modifiedAt
610
+ attr_reader :id, :lines, :city, :state, :postalCode, :country, :createdAt, :modifiedAt
611
+
612
+ # Creates a new Address object from a Hash of attributes
302
613
  def initialize(object)
614
+ @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
615
+ @modifiedAt = DateTime.iso8601(object["modifiedAt"]) if object["modifiedAt"]
616
+
303
617
  @id = object["id"]
304
618
  @lines = object["lines"]
305
619
  @city = object["city"]
306
620
  @state = object["state"]
307
621
  @postalCode = object["postalCode"]
308
622
  @country = object["country"]
309
- @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
310
- @modifiedAt = DateTime.iso8601(object["modifiedAt"]) if object["modifiedAt"]
311
623
  end
312
624
  end
313
625
 
314
- class Chat
315
- attr_accessor :id, :value, :type
316
-
317
- CHAT_TYPE_AIM = "aim"
318
- CHAT_TYPE_GTALK = "gtalk"
319
- CHAT_TYPE_ICQ = "icq"
320
- CHAT_TYPE_XMPP = "xmpp"
321
- CHAT_TYPE_MSN = "msn"
322
- CHAT_TYPE_SKYPE = "skype"
323
- CHAT_TYPE_YAHOO = "yahoo"
324
- CHAT_TYPE_QQ = "qq"
325
- CHAT_TYPE_OTHER = "other"
326
626
 
627
+ # Customer::Chat
628
+ # http://developer.helpscout.net/objects/customer/chat/
629
+ #
630
+ # Name Type Example Notes
631
+ # id Int 77183 Unique identifier
632
+ # value String jsprout
633
+ # type String aim Chat type
634
+ #
635
+ # Possible values for type include:
636
+ # * TYPE_AIM
637
+ # * TYPE_GTALK
638
+ # * TYPE_ICQ
639
+ # * TYPE_XMPP
640
+ # * TYPE_MSN
641
+ # * TYPE_SKYPE
642
+ # * TYPE_YAHOO
643
+ # * TYPE_QQ
644
+ # * TYPE_OTHER
645
+
646
+ class Chat
647
+ attr_reader :id, :value, :type
648
+
649
+ TYPE_AIM = "aim"
650
+ TYPE_GTALK = "gtalk"
651
+ TYPE_ICQ = "icq"
652
+ TYPE_XMPP = "xmpp"
653
+ TYPE_MSN = "msn"
654
+ TYPE_SKYPE = "skype"
655
+ TYPE_YAHOO = "yahoo"
656
+ TYPE_QQ = "qq"
657
+ TYPE_OTHER = "other"
658
+
659
+ # Creates a new Customer::Chat object from a Hash of attributes
327
660
  def initialize(object)
328
661
  @id = object["id"]
329
662
  @value = object["value"]
@@ -331,13 +664,29 @@ module HelpScout
331
664
  end
332
665
  end
333
666
 
667
+
668
+ # Customer::Email
669
+ # http://developer.helpscout.net/objects/customer/email/
670
+ #
671
+ # Name Type Example Notes
672
+ # id Int 98131 Unique identifier
673
+ # value String vbear@mywork.com
674
+ # location String work Location for this email address.
675
+ # Defaults to LOCATION_WORK
676
+ #
677
+ # Possible values for location include:
678
+ # * LOCATION_WORK (Default)
679
+ # * LOCATION_HOME
680
+ # * LOCATION_OTHER
681
+
334
682
  class Email
335
- attr_accessor :id, :value, :location
683
+ attr_reader :id, :value, :location
336
684
 
337
- EMAIL_LOCATION_WORK = "work"
338
- EMAIL_LOCATION_HOME = "home"
339
- EMAIL_LOCATION_OTHER = "other"
685
+ LOCATION_WORK = "work"
686
+ LOCATION_HOME = "home"
687
+ LOCATION_OTHER = "other"
340
688
 
689
+ # Creates a new Customer::Email object from a Hash of attributes
341
690
  def initialize(object)
342
691
  @id = object["id"]
343
692
  @value = object["value"]
@@ -345,16 +694,34 @@ module HelpScout
345
694
  end
346
695
  end
347
696
 
697
+
698
+ # Customer::Phone
699
+ # http://developer.helpscout.net/objects/customer/phone/
700
+ #
701
+ # Name Type Example Notes
702
+ # id Int 22381 Unique identifier
703
+ # value String 222-333-4444
704
+ # location String home Location for this phone
705
+ #
706
+ # Possible values for location include:
707
+ # * LOCATION_HOME
708
+ # * LOCATION_WORK
709
+ # * LOCATION_MOBILE
710
+ # * LOCATION_FAX
711
+ # * LOCATION_PAGER
712
+ # * LOCATION_OTHER
713
+
348
714
  class Phone
349
- attr_accessor :id, :value, :location
715
+ attr_reader :id, :value, :location
350
716
 
351
- PHONE_LOCATION_HOME = "home"
352
- PHONE_LOCATION_WORK = "work"
353
- PHONE_LOCATION_MOBILE = "mobile"
354
- PHONE_LOCATION_FAX = "fax"
355
- PHONE_LOCATION_PAGER = "pager"
356
- PHONE_LOCATION_OTHER = "other"
717
+ LOCATION_HOME = "home"
718
+ LOCATION_WORK = "work"
719
+ LOCATION_MOBILE = "mobile"
720
+ LOCATION_FAX = "fax"
721
+ LOCATION_PAGER = "pager"
722
+ LOCATION_OTHER = "other"
357
723
 
724
+ # Creates a new Customer::Phone object from a Hash of attributes
358
725
  def initialize(object)
359
726
  @id = object["id"]
360
727
  @value = object["value"]
@@ -362,36 +729,159 @@ module HelpScout
362
729
  end
363
730
  end
364
731
 
365
- class SocialProfile
366
- attr_accessor :id, :value, :type
367
-
368
- SOCIAL_PROFILE_TYPE_TWITTER = "twitter"
369
- SOCIAL_PROFILE_TYPE_FACEBOOK = "facebook"
370
- SOCIAL_PROFILE_TYPE_LINKEDIN = "linkedin"
371
- SOCIAL_PROFILE_TYPE_ABOUTME = "aboutme"
372
- SOCIAL_PROFILE_TYPE_GOOGLE = "google"
373
- SOCIAL_PROFILE_TYPE_GOOGLE_PLUS = "googleplus"
374
- SOCIAL_PROFILE_TYPE_TUNGLEME = "tungleme"
375
- SOCIAL_PROFILE_TYPE_QUORA = "quora"
376
- SOCIAL_PROFILE_TYPE_FOURSQUARE = "foursquare"
377
- SOCIAL_PROFILE_TYPE_YOUTUBE = "youtube"
378
- SOCIAL_PROFILE_TYPE_FLICKR = "flickr"
379
- SOCIAL_PROFILE_TYPE_OTHER = "other"
380
732
 
733
+ # Customer::SocialProfile
734
+ # http://developer.helpscout.net/objects/customer/social-profile/
735
+ #
736
+ # Name Type Example Notes
737
+ # id Int 9184 Unique identifier
738
+ # value String https://twitter.com/helpscout
739
+ # type String twitter Type of social profile.
740
+ #
741
+ # Possible values for type include:
742
+ # * TYPE_TWITTER
743
+ # * TYPE_FACEBOOK
744
+ # * TYPE_LINKEDIN
745
+ # * TYPE_ABOUTME
746
+ # * TYPE_GOOGLE
747
+ # * TYPE_GOOGLE_PLUS
748
+ # * TYPE_TUNGLEME
749
+ # * TYPE_QUORA
750
+ # * TYPE_FOURSQUARE
751
+ # * TYPE_YOUTUBE
752
+ # * TYPE_FLICKR
753
+ # * TYPE_OTHER
754
+
755
+ class SocialProfile
756
+ attr_reader :id, :value, :type
757
+
758
+ TYPE_TWITTER = "twitter"
759
+ TYPE_FACEBOOK = "facebook"
760
+ TYPE_LINKEDIN = "linkedin"
761
+ TYPE_ABOUTME = "aboutme"
762
+ TYPE_GOOGLE = "google"
763
+ TYPE_GOOGLE_PLUS = "googleplus"
764
+ TYPE_TUNGLEME = "tungleme"
765
+ TYPE_QUORA = "quora"
766
+ TYPE_FOURSQUARE = "foursquare"
767
+ TYPE_YOUTUBE = "youtube"
768
+ TYPE_FLICKR = "flickr"
769
+ TYPE_OTHER = "other"
770
+
771
+ # Creates a new Customer::SocialProfile object from a Hash of attributes
381
772
  def initialize(object)
382
773
  @id = object["id"]
383
774
  @value = object["value"]
384
- @type = object["type"] # twitter, facebook, linkedin, aboutme, google, googleplus, tungleme, quora, foursquare, youtube, flickr, other
775
+ @type = object["type"]
385
776
  end
386
777
  end
387
778
 
779
+
780
+ # Customer::Website
781
+ # http://developer.helpscout.net/objects/customer/website/
782
+ #
783
+ # Name Type Example Notes
784
+ # id Int 5584 Unique identifier
785
+ # value String http://www.somewhere.com
786
+
388
787
  class Website
389
- attr_accessor :id, :value
788
+ attr_reader :id, :value
789
+
790
+ # Creates a new Customer::Website object from a Hash of attributes
390
791
  def initialize(object)
391
792
  @id = object["id"]
392
793
  @value = object["value"]
393
794
  end
394
795
  end
395
796
  end
396
- end
397
797
 
798
+
799
+ # Source
800
+ # http://developer.helpscout.net/objects/source/
801
+ #
802
+ # Name Type Example Notes
803
+ # type String email The method from which this conversation (or thread)
804
+ # was created.
805
+ # via String customer
806
+ #
807
+ # Possible values for type include:
808
+ # * TYPE_EMAIL
809
+ # * TYPE_WEB
810
+ # * TYPE_NOTIFICATION
811
+ # * TYPE_FWD
812
+ #
813
+ # Possible values for via include:
814
+ # * VIA_USER
815
+ # * VIA_CUSTOMER
816
+
817
+ class Source
818
+ attr_reader :type, :via
819
+
820
+ TYPE_EMAIL = "email"
821
+ TYPE_WEB = "web"
822
+ TYPE_NOTIFICATION = "notification"
823
+ TYPE_FWD = "emailfwd"
824
+
825
+ VIA_USER = "user"
826
+ VIA_CUSTOMER = "customer"
827
+
828
+ # Creates a new Source object from a Hash of attributes
829
+ def initialize(object)
830
+ @type = object["type"]
831
+ @via = object["via"]
832
+ end
833
+ end
834
+
835
+
836
+ # Folder
837
+ # http://developer.helpscout.net/objects/folder/
838
+ #
839
+ # Name Type Example Notes
840
+ # id Int 1234 Unique identifier
841
+ # name String My Tickets Folder name
842
+ # type String mytickets The type this folder
843
+ # represents.
844
+ # userId Int 4532 If the folder type is
845
+ # TYPE_MY_TICKETS, userId
846
+ # represents the Help Scout user
847
+ # to which this folder belongs.
848
+ # Otherwise userId is 0.
849
+ # totalCount Int 2 Total number of conversations
850
+ # in this folder
851
+ # activeCount Int 1 Total number of conversations
852
+ # in this folder that are in an
853
+ # active state (vs pending).
854
+ # modifiedAt DateTime 2012-07-24T20:18:33Z UTC time when this folder was
855
+ # modified.
856
+ #
857
+ # Possible values for type include:
858
+ # * TYPE_UNASSIGNED
859
+ # * TYPE_MY_TICKETS
860
+ # * TYPE_DRAFTS
861
+ # * TYPE_ASSIGNED
862
+ # * TYPE_CLOSED
863
+ # * TYPE_SPAM
864
+
865
+ class Folder
866
+ attr_reader :id, :name, :type, :userId, :totalCount, :activeCount, :modifiedAt
867
+
868
+ TYPE_UNASSIGNED = "open"
869
+ TYPE_MY_TICKETS = "mytickets"
870
+ TYPE_DRAFTS = "drafts"
871
+ TYPE_ASSIGNED = "assigned"
872
+ TYPE_CLOSED = "closed"
873
+ TYPE_SPAM = "spam"
874
+
875
+ # Creates a new Folder object from a Hash of attributes
876
+ def initialize(object)
877
+ @modifiedAt = DateTime.iso8601(object["modifiedAt"]) if object["modifiedAt"]
878
+
879
+ @id = object["id"]
880
+ @name = object["name"]
881
+ @type = object["type"]
882
+ @userId = object["userId"]
883
+ @totalCount = object["totalCount"]
884
+ @activeCount = object["activeCount"]
885
+ end
886
+ end
887
+ end