contextio 0.5.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +4 -0
- data/.gitignore +8 -0
- data/.rspec +1 -0
- data/.yardopts +1 -0
- data/ChangeLog.md +5 -0
- data/Gemfile +3 -0
- data/LICENSE.md +20 -0
- data/README.md +62 -22
- data/Rakefile +46 -36
- data/contextio.gemspec +30 -0
- data/lib/contextio.rb +69 -583
- data/lib/contextio/account.rb +132 -0
- data/lib/contextio/account_collection.rb +57 -0
- data/lib/contextio/account_sync_data.rb +22 -0
- data/lib/contextio/api.rb +162 -0
- data/lib/contextio/api/association_helpers.rb +17 -0
- data/lib/contextio/api/resource.rb +230 -0
- data/lib/contextio/api/resource_collection.rb +174 -0
- data/lib/contextio/api/url_builder.rb +153 -0
- data/lib/contextio/body_part.rb +45 -0
- data/lib/contextio/body_part_collection.rb +13 -0
- data/lib/contextio/connect_token.rb +57 -0
- data/lib/contextio/connect_token_collection.rb +44 -0
- data/lib/contextio/contact.rb +43 -0
- data/lib/contextio/contact_collection.rb +21 -0
- data/lib/contextio/email_address.rb +53 -0
- data/lib/contextio/email_address_collection.rb +21 -0
- data/lib/contextio/email_settings.rb +146 -0
- data/lib/contextio/file.rb +92 -0
- data/lib/contextio/file_collection.rb +13 -0
- data/lib/contextio/folder.rb +56 -0
- data/lib/contextio/folder_collection.rb +18 -0
- data/lib/contextio/folder_sync_data.rb +32 -0
- data/lib/contextio/message.rb +96 -0
- data/lib/contextio/message_collection.rb +35 -0
- data/lib/contextio/oauth_provider.rb +29 -0
- data/lib/contextio/oauth_provider_collection.rb +46 -0
- data/lib/contextio/source.rb +55 -0
- data/lib/contextio/source_collection.rb +41 -0
- data/lib/contextio/source_sync_data.rb +23 -0
- data/lib/contextio/thread.rb +15 -0
- data/lib/contextio/thread_collection.rb +25 -0
- data/lib/contextio/version.rb +11 -0
- data/lib/contextio/webhook.rb +39 -0
- data/lib/contextio/webhook_collection.rb +26 -0
- data/spec/config.yml.example +3 -0
- data/spec/contextio/account_collection_spec.rb +78 -0
- data/spec/contextio/account_spec.rb +52 -0
- data/spec/contextio/api/association_helpers_spec.rb +28 -0
- data/spec/contextio/api/resource_collection_spec.rb +286 -0
- data/spec/contextio/api/resource_spec.rb +467 -0
- data/spec/contextio/api/url_builder_spec.rb +78 -0
- data/spec/contextio/api_spec.rb +123 -0
- data/spec/contextio/connect_token_collection_spec.rb +74 -0
- data/spec/contextio/connect_token_spec.rb +58 -0
- data/spec/contextio/email_settings_spec.rb +112 -0
- data/spec/contextio/oauth_provider_collection_spec.rb +36 -0
- data/spec/contextio/oauth_provider_spec.rb +120 -0
- data/spec/contextio/source_collection_spec.rb +57 -0
- data/spec/contextio/source_spec.rb +52 -0
- data/spec/contextio/version_spec.rb +10 -0
- data/spec/contextio_spec.rb +64 -0
- data/spec/spec_helper.rb +17 -0
- metadata +234 -12
- data/README.textile +0 -29
@@ -0,0 +1,174 @@
|
|
1
|
+
require_relative 'association_helpers'
|
2
|
+
|
3
|
+
class ContextIO
|
4
|
+
class API
|
5
|
+
# When `include`d into a class, this module provides some helper methods for
|
6
|
+
# various things a collections of resources will need or find useful.
|
7
|
+
module ResourceCollection
|
8
|
+
include Enumerable
|
9
|
+
|
10
|
+
# (see ContextIO#api)
|
11
|
+
attr_reader :api
|
12
|
+
|
13
|
+
# @!attribute [r] where_constraints
|
14
|
+
# A Hash of the constraints limiting this collection of resources.
|
15
|
+
attr_reader :where_constraints
|
16
|
+
|
17
|
+
# @private
|
18
|
+
#
|
19
|
+
# For internal use only. Users of this gem shouldn't be calling this
|
20
|
+
# directly.
|
21
|
+
#
|
22
|
+
# @param [API] api A handle on the Context.IO API.
|
23
|
+
# @param [Hash] options Optional params for the collection.
|
24
|
+
# @option options [Hash{Symbol => String, Numeric}] :where Where
|
25
|
+
# constraints that limit the resources that belong to this collection.
|
26
|
+
# @option options [Array<Hash>] :attribute_hashes An array of hashes
|
27
|
+
# describing the resources in this collection.
|
28
|
+
def initialize(api, options={})
|
29
|
+
@api = api
|
30
|
+
@where_constraints = options[:where] || {}
|
31
|
+
@attribute_hashes = options[:attribute_hashes]
|
32
|
+
|
33
|
+
self.class.associations.each do |association_name|
|
34
|
+
instance_variable_set("@#{association_name}", options[association_name.to_sym])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# @!attribute [r] resource_url
|
39
|
+
# @return [String] The URL that will fetch attributes from the API.
|
40
|
+
def resource_url
|
41
|
+
@resource_url ||= api.url_for(self)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Iterates over the resources in question.
|
45
|
+
#
|
46
|
+
# @example
|
47
|
+
# contextio.connect_tokens.each do |connect_token|
|
48
|
+
# puts connect_token.email
|
49
|
+
# end
|
50
|
+
def each(&block)
|
51
|
+
attribute_hashes.each do |attribute_hash|
|
52
|
+
yield resource_class.new(api, attribute_hash.merge(associations_hash))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Specify one or more constraints for limiting resources in this
|
57
|
+
# collection. See individual classes for the list of valid constraints.
|
58
|
+
# Not all collections have valid where constraints at all.
|
59
|
+
#
|
60
|
+
# This can be chained at need and doesn't actually cause the API to get
|
61
|
+
# hit until some iterator is called like `#each`.
|
62
|
+
#
|
63
|
+
# @example
|
64
|
+
# accounts = contextio.accounts
|
65
|
+
# accounts = accounts.where(email: 'some@email.com')
|
66
|
+
# accounts = accounts.where(status: 'OK')
|
67
|
+
#
|
68
|
+
# accounts.each do |account|
|
69
|
+
# # API gets hit for this call
|
70
|
+
# end
|
71
|
+
#
|
72
|
+
# @param [Hash{String, Symbol => String, Integer}] constraints A Hash
|
73
|
+
# mapping keys to the desired limiting values.
|
74
|
+
def where(constraints)
|
75
|
+
self.class.new(api, associations_hash.merge(where: where_constraints.merge(constraints)))
|
76
|
+
end
|
77
|
+
|
78
|
+
# Returns a resource with the given key.
|
79
|
+
#
|
80
|
+
# This is a lazy method, making no requests. When you try to access
|
81
|
+
# attributes on the object, or otherwise interact with it, it will actually
|
82
|
+
# make requests.
|
83
|
+
#
|
84
|
+
# @example
|
85
|
+
# provider = contextio.oauth_providers['1234']
|
86
|
+
#
|
87
|
+
# @param [String] key The Provider Consumer Key for the
|
88
|
+
# provider you want to interact with.
|
89
|
+
def [](key)
|
90
|
+
resource_class.new(api, resource_class.primary_key => key)
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
# @!attribute [r] attribute_hashes
|
96
|
+
# @return [Array<Hash>] An array of attribute hashes that describe, at
|
97
|
+
# least partially, the objects in this collection.
|
98
|
+
def attribute_hashes
|
99
|
+
@attribute_hashes ||= api.request(:get, resource_url, where_constraints)
|
100
|
+
end
|
101
|
+
|
102
|
+
# @!attribute [r] associations_hash
|
103
|
+
# @return [Hash{Symbol => Resource}] A hash of association names to the
|
104
|
+
# associated resource of that type.
|
105
|
+
def associations_hash
|
106
|
+
@associations_hash ||= self.class.associations.inject({}) do |memo, association_name|
|
107
|
+
memo[association_name.to_sym] = self.send(association_name)
|
108
|
+
memo
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# Make sure a ResourceCollection has the declarative syntax handy.
|
113
|
+
def self.included(other_mod)
|
114
|
+
other_mod.extend(DeclarativeClassSyntax)
|
115
|
+
end
|
116
|
+
|
117
|
+
# This module contains helper methods for `API::ResourceCollection`s'
|
118
|
+
# class definitions. It gets `extend`ed into a class when
|
119
|
+
# `API::ResourceCollection` is `include`d.
|
120
|
+
module DeclarativeClassSyntax
|
121
|
+
# @!attribute [r] associations
|
122
|
+
# @return [Array<String] An array of the belong_to associations for
|
123
|
+
# the collection
|
124
|
+
def associations
|
125
|
+
@associations ||= []
|
126
|
+
end
|
127
|
+
|
128
|
+
# @!attribute [r] association_name
|
129
|
+
# @return [Symbol] The association name registered for this resource.
|
130
|
+
def association_name
|
131
|
+
@association_name
|
132
|
+
end
|
133
|
+
|
134
|
+
private
|
135
|
+
|
136
|
+
# Declares which class the `ResourceCollection` is intended to wrap. For
|
137
|
+
# best results, this should probably be a `Resource`. It defines an
|
138
|
+
# accessor for this class on instances of the collection, which is
|
139
|
+
# private. Make sure your collection class has required the file with
|
140
|
+
# the defeniiton of the class it wraps.
|
141
|
+
#
|
142
|
+
# @param [Class] klass The class that the collection, well, collects.
|
143
|
+
def resource_class=(klass)
|
144
|
+
define_method(:resource_class) do
|
145
|
+
klass
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# Declares which class, if any, the collection belongs to. It defines an
|
150
|
+
# accessor for the belonged-to object.
|
151
|
+
#
|
152
|
+
# @param [Symbol] association_name The name of the association for the
|
153
|
+
# class in question. Singular classes will have singular names
|
154
|
+
# registered. For instance, :message should reger to the Message
|
155
|
+
# resource.
|
156
|
+
def belongs_to(association_name)
|
157
|
+
define_method(association_name) do
|
158
|
+
instance_variable_get("@#{association_name}")
|
159
|
+
end
|
160
|
+
|
161
|
+
associations << association_name
|
162
|
+
end
|
163
|
+
|
164
|
+
# Declares the association name for the resource.
|
165
|
+
#
|
166
|
+
# @param [String, Symbol] association_name The name.
|
167
|
+
def association_name=(association_name)
|
168
|
+
@association_name = association_name.to_sym
|
169
|
+
ContextIO::API::AssociationHelpers.register_resource(self, @association_name)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
require 'contextio/connect_token_collection'
|
2
|
+
require 'contextio/oauth_provider_collection'
|
3
|
+
require 'contextio/email_settings'
|
4
|
+
require 'contextio/account_collection'
|
5
|
+
require 'contextio/source_collection'
|
6
|
+
require 'contextio/folder_collection'
|
7
|
+
require 'contextio/message_collection'
|
8
|
+
require 'contextio/body_part_collection'
|
9
|
+
require 'contextio/thread_collection'
|
10
|
+
require 'contextio/webhook_collection'
|
11
|
+
require 'contextio/email_address_collection'
|
12
|
+
require 'contextio/contact_collection'
|
13
|
+
require 'contextio/file_collection'
|
14
|
+
|
15
|
+
class ContextIO
|
16
|
+
class API
|
17
|
+
class URLBuilder
|
18
|
+
class Error < StandardError; end
|
19
|
+
|
20
|
+
# Tells you the right URL for a resource to fetch attributes from.
|
21
|
+
#
|
22
|
+
# @param [ContextIO::Resource, ContextIO::ResourceCollection] resource The
|
23
|
+
# resource or resource collection.
|
24
|
+
#
|
25
|
+
# @return [String] The path for that resource in the API.
|
26
|
+
def self.url_for(resource)
|
27
|
+
if (builder = @registered_urls[resource.class])
|
28
|
+
builder.call(resource)
|
29
|
+
else
|
30
|
+
raise Error, "URL could not be built for unregistered Class: #{resource.class}."
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Register a block that calculates the URL for a given resource.
|
35
|
+
#
|
36
|
+
# @param [Class] resource_class The class of the resource you are
|
37
|
+
# registering.
|
38
|
+
# @param [Block] block The code that will compute the url for the
|
39
|
+
# resource. This is actually a path. Start after the version number of
|
40
|
+
# the API in the URL. When a URL is being calculated for a specific
|
41
|
+
# resource, the resource instance will be yielded to the block.
|
42
|
+
#
|
43
|
+
# @example For Accounts
|
44
|
+
# register_url ContextIO::Account do |account|
|
45
|
+
# "accounts/#{account.id}"
|
46
|
+
# end
|
47
|
+
def self.register_url(resource_class, &block)
|
48
|
+
@registered_urls ||= {}
|
49
|
+
@registered_urls[resource_class] = block
|
50
|
+
end
|
51
|
+
|
52
|
+
register_url ContextIO::ConnectToken do |connect_token|
|
53
|
+
if connect_token.account && connect_token.account.id
|
54
|
+
"accounts/#{connect_token.account.id}/connect_tokens/#{connect_token.token}"
|
55
|
+
else
|
56
|
+
"connect_tokens/#{connect_token.token}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
register_url ContextIO::ConnectTokenCollection do |connect_tokens|
|
61
|
+
if connect_tokens.account && connect_tokens.account.id
|
62
|
+
"accounts/#{connect_tokens.account.id}/connect_tokens"
|
63
|
+
else
|
64
|
+
'connect_tokens'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
register_url ContextIO::OAuthProvider do |oauth_provider|
|
69
|
+
"oauth_providers/#{oauth_provider.provider_consumer_key}"
|
70
|
+
end
|
71
|
+
|
72
|
+
register_url ContextIO::OAuthProviderCollection do
|
73
|
+
'oauth_providers'
|
74
|
+
end
|
75
|
+
|
76
|
+
register_url ContextIO::EmailSettings do
|
77
|
+
'discovery'
|
78
|
+
end
|
79
|
+
|
80
|
+
register_url ContextIO::Account do |account|
|
81
|
+
"accounts/#{account.id}"
|
82
|
+
end
|
83
|
+
|
84
|
+
register_url ContextIO::AccountCollection do
|
85
|
+
'accounts'
|
86
|
+
end
|
87
|
+
|
88
|
+
register_url ContextIO::Source do |source|
|
89
|
+
"accounts/#{source.account.id}/sources/#{source.label}"
|
90
|
+
end
|
91
|
+
|
92
|
+
register_url ContextIO::SourceCollection do |sources|
|
93
|
+
"accounts/#{sources.account.id}/sources"
|
94
|
+
end
|
95
|
+
|
96
|
+
register_url ContextIO::FolderCollection do |folders|
|
97
|
+
"accounts/#{folders.source.account.id}/sources/#{folders.source.label}/folders"
|
98
|
+
end
|
99
|
+
|
100
|
+
register_url ContextIO::Message do |message|
|
101
|
+
"accounts/#{message.account.id}/messages/#{message.message_id}"
|
102
|
+
end
|
103
|
+
|
104
|
+
register_url ContextIO::MessageCollection do |messages|
|
105
|
+
"accounts/#{messages.account.id}/messages"
|
106
|
+
end
|
107
|
+
|
108
|
+
register_url ContextIO::BodyPartCollection do |parts|
|
109
|
+
"accounts/#{parts.message.account.id}/messages/#{parts.message.message_id}/body"
|
110
|
+
end
|
111
|
+
|
112
|
+
register_url ContextIO::Thread do |thread|
|
113
|
+
"accounts/#{thread.account.id}/threads/#{thread.gmail_thread_id}"
|
114
|
+
end
|
115
|
+
|
116
|
+
register_url ContextIO::ThreadCollection do |threads|
|
117
|
+
"accounts/#{threads.account.id}/threads"
|
118
|
+
end
|
119
|
+
|
120
|
+
register_url ContextIO::Webhook do |webhook|
|
121
|
+
"accounts/#{webhook.account.id}/webhooks/#{webhook.webhook_id}"
|
122
|
+
end
|
123
|
+
|
124
|
+
register_url ContextIO::WebhookCollection do |webhooks|
|
125
|
+
"accounts/#{webhooks.account.id}/webhooks"
|
126
|
+
end
|
127
|
+
|
128
|
+
register_url ContextIO::EmailAddress do |email_address|
|
129
|
+
"accounts/#{email_address.account.id}/email_addresses/#{email_address.email}"
|
130
|
+
end
|
131
|
+
|
132
|
+
register_url ContextIO::EmailAddressCollection do |email_addresses|
|
133
|
+
"accounts/#{email_addresses.account.id}/email_addresses"
|
134
|
+
end
|
135
|
+
|
136
|
+
register_url ContextIO::Contact do |contact|
|
137
|
+
"accounts/#{contact.account.id}/contacts/#{contact.email}"
|
138
|
+
end
|
139
|
+
|
140
|
+
register_url ContextIO::ContactCollection do |contacts|
|
141
|
+
"accounts/#{contacts.account.id}/contacts"
|
142
|
+
end
|
143
|
+
|
144
|
+
register_url ContextIO::File do |file|
|
145
|
+
"accounts/#{file.account.id}/files/#{file.file_id}"
|
146
|
+
end
|
147
|
+
|
148
|
+
register_url ContextIO::FileCollection do |files|
|
149
|
+
"accounts/#{files.account.id}/files"
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'contextio/api/association_helpers'
|
2
|
+
|
3
|
+
class ContextIO
|
4
|
+
class BodyPart
|
5
|
+
def self.association_name
|
6
|
+
:body_part
|
7
|
+
end
|
8
|
+
ContextIO::API::AssociationHelpers.register_resource(self, :body_part)
|
9
|
+
|
10
|
+
# (see ContextIO#api)
|
11
|
+
attr_reader :api, :message, :type, :charset, :delsp, :format, :content,
|
12
|
+
:body_section
|
13
|
+
|
14
|
+
# @private
|
15
|
+
#
|
16
|
+
# For internal use only. Users of this gem shouldn't be calling this
|
17
|
+
# directly.
|
18
|
+
#
|
19
|
+
# @param [API] api A handle on the Context.IO API.
|
20
|
+
# @param [Hash{String, Symbol => String, Numeric, Boolean}] options A Hash
|
21
|
+
# of attributes describing the resource.
|
22
|
+
def initialize(api, options = {})
|
23
|
+
@api = api
|
24
|
+
@message = options.delete(:message) || options.delete('message')
|
25
|
+
|
26
|
+
options.each do |key, value|
|
27
|
+
instance_variable_set("@#{key}", value)
|
28
|
+
|
29
|
+
unless self.respond_to?(key)
|
30
|
+
define_singleton_method(key) do
|
31
|
+
instance_variable_get("@#{key}")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def html?
|
38
|
+
type == 'text/html'
|
39
|
+
end
|
40
|
+
|
41
|
+
def plain_text?
|
42
|
+
type == 'text/plain'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative 'api/resource_collection'
|
2
|
+
require_relative 'body_part'
|
3
|
+
|
4
|
+
class ContextIO
|
5
|
+
class BodyPartCollection
|
6
|
+
include ContextIO::API::ResourceCollection
|
7
|
+
|
8
|
+
self.resource_class = ContextIO::BodyPart
|
9
|
+
self.association_name = :body_parts
|
10
|
+
|
11
|
+
belongs_to :message
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'contextio/api/resource'
|
2
|
+
|
3
|
+
class ContextIO
|
4
|
+
# Represents a single connect token for an account. You can use this to
|
5
|
+
# inspect or delete the token. Most of the attributes are lazily loaded,
|
6
|
+
# meaning that the API won't get hit until you ask for an attribute the object
|
7
|
+
# doesn't already have (presumably from a previous API call).
|
8
|
+
class ConnectToken
|
9
|
+
include API::Resource
|
10
|
+
|
11
|
+
self.primary_key = :token
|
12
|
+
self.association_name = :connect_token
|
13
|
+
|
14
|
+
# @!attribute [r] account
|
15
|
+
#
|
16
|
+
# @return [ContextIO::Account, nil] The Account associated with this token,
|
17
|
+
# if any. Will fetch from the API if necessary.
|
18
|
+
belongs_to :account
|
19
|
+
|
20
|
+
# @!attribute [r] token
|
21
|
+
# @return [String] The token associated with this connect token. Will
|
22
|
+
# fetch from the API if necessary.
|
23
|
+
# @!attribute [r] email
|
24
|
+
# @return [String] The email address associated with this token. Will
|
25
|
+
# fetch from the API if necessary.
|
26
|
+
# @!attribute [r] used
|
27
|
+
# @return [Boolean] Whether this token has been used ot not. Will fetch
|
28
|
+
# from the API if necessary.
|
29
|
+
# @!attribute [r] callback_url
|
30
|
+
# @return [String] The url that Context.IO will redirect the user to when
|
31
|
+
# the account is created. Will fetch from the API if necessary.
|
32
|
+
# @!attribute [r] service_level
|
33
|
+
# @return [String] The Context.IO service level for this account. Will
|
34
|
+
# fetch from the API if necessary.
|
35
|
+
# @!attribute [r] first_name
|
36
|
+
# @return [String] The first name of the owner of the email account
|
37
|
+
# associated with this token. Will fetch from the API if necessary.
|
38
|
+
# @!attribute [r] last_name
|
39
|
+
# @return [String] The last name of the owner of the email account
|
40
|
+
# associated with this token. Will fetch from the API if necessary.
|
41
|
+
lazy_attributes :token, :email, :created, :used, :callback_url,
|
42
|
+
:service_level, :first_name, :last_name
|
43
|
+
private :created
|
44
|
+
|
45
|
+
# @!attribute [r] created_at
|
46
|
+
#
|
47
|
+
# @return [Time] The time this token was created. Will fetch from the API
|
48
|
+
# if necessary.
|
49
|
+
def created_at
|
50
|
+
@created_at ||= Time.at(created)
|
51
|
+
end
|
52
|
+
|
53
|
+
def delete
|
54
|
+
api.request(:delete, resource_url)['success']
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative 'connect_token'
|
2
|
+
require_relative 'api/resource_collection'
|
3
|
+
|
4
|
+
class ContextIO
|
5
|
+
# Represents a collection of connect tokens for your account. You can use this
|
6
|
+
# to create a new token, fetch a specific one or iterate over them.
|
7
|
+
#
|
8
|
+
# @example You can iterate over them with `each`:
|
9
|
+
# contextio.connect_tokens.each do |connect_token|
|
10
|
+
# puts connect_token.email
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# @example You can lazily access a specific one with square brackets:
|
14
|
+
# connect_token = contextio.connect_tokens['some_token']
|
15
|
+
class ConnectTokenCollection
|
16
|
+
include ContextIO::API::ResourceCollection
|
17
|
+
|
18
|
+
self.resource_class = ContextIO::ConnectToken
|
19
|
+
self.association_name = :connect_tokens
|
20
|
+
|
21
|
+
belongs_to :account
|
22
|
+
|
23
|
+
# Creates a new connect token for your account.
|
24
|
+
#
|
25
|
+
# @param [String] callback_url The url that the user will be redirected to
|
26
|
+
# after OAuthing their account with Context.IO.
|
27
|
+
# @param [Hash{String, Symbol => String}] options Optional information you
|
28
|
+
# can provide at creation: email, service level, first_name and/or
|
29
|
+
# last_name.
|
30
|
+
#
|
31
|
+
# @return [ConnectToken] A new token instance based on the data you input.
|
32
|
+
def create(callback_url, options={})
|
33
|
+
result_hash = api.request(
|
34
|
+
:post,
|
35
|
+
resource_url,
|
36
|
+
options.merge(callback_url: callback_url)
|
37
|
+
)
|
38
|
+
|
39
|
+
result_hash.delete('success')
|
40
|
+
|
41
|
+
resource_class.new(api, result_hash)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|