glg-databasedotcom 1.3.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 225fcce6c53745812fe468dc700dfa0459230f72
4
+ data.tar.gz: 721fa8fed64d1b8f48ddc0996fbee7a4cd0adc18
5
+ SHA512:
6
+ metadata.gz: 67b587cccf038e5974b01deee0a54210b7f0b1d987f3f55c86bb83fe7e16afa289be5a8b0818cce05600190abbe6623758293becb656114ea45cf09d35ff7bca
7
+ data.tar.gz: edc8f67c11ba001a8286a2343b1ea74c8daf49580e779ba288434ade80aac8aa2d54281d351d6d70da8e4eeb7013df3cfbce99c43e3be1a56ce3fe7dc501c7af
@@ -0,0 +1,20 @@
1
+ The MIT License
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,262 @@
1
+ # databasedotcom
2
+
3
+ [![Build Status](https://travis-ci.org/heroku/databasedotcom.png?branch=master)](https://travis-ci.org/heroku/databasedotcom) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/heroku/databasedotcom) [![Dependency Status](https://gemnasium.com/heroku/databasedotcom.png)](https://gemnasium.com/heroku/databasedotcom)
4
+
5
+ databasedotcom is a gem to enable ruby applications to access the SalesForce REST API.
6
+ If you use bundler, simply list it in your Gemfile, like so:
7
+
8
+ ```
9
+ gem 'databasedotcom'
10
+ ```
11
+
12
+ If you don't use bundler, install it by hand:
13
+
14
+ ```
15
+ gem install databasedotcom
16
+ ```
17
+
18
+ ## Documentation
19
+
20
+ Reference documentation is available at [rubydoc.info](http://rubydoc.info/github/heroku/databasedotcom/master/frames)
21
+
22
+ ## Source
23
+
24
+ Source is available at [github](http://github.com/heroku/databasedotcom)
25
+
26
+ ## Contributions
27
+
28
+ To contribute, fork this repo, make changes in your fork, then send a pull request.
29
+ No pull requests without accompanying tests will be accepted. To run tests in your
30
+ fork, just do
31
+
32
+ ```
33
+ bundle install
34
+ rake
35
+ ```
36
+
37
+ # Usage
38
+ ## Initialization
39
+ When you create a Databasedotcom::Client object, you need to configure it with a client
40
+ id and client secret that corresponds to one of the Remote Access Applications configured
41
+ within your Salesforce instance. The Salesforce UI refers to the client id as "Consumer Key",
42
+ and to the client secret as "Consumer Secret".
43
+
44
+ You can configure your Client object with a client id and client secret in one of several
45
+ different ways:
46
+
47
+ ### Configuration from the environment
48
+
49
+ If configuration information is present in the environment, the new Client will take configuration
50
+ information from there.
51
+
52
+ ```bash
53
+ export DATABASEDOTCOM_CLIENT_ID=foo
54
+ export DATABASEDOTCOM_CLIENT_SECRET=bar
55
+ ```
56
+
57
+ Then
58
+
59
+ ```ruby
60
+ client = Databasedotcom::Client.new
61
+ client.client_id #=> foo
62
+ client.client_secret #=> bar
63
+ ```
64
+
65
+ ### Configuration from a YAML file
66
+
67
+ If you pass the name of a YAML file when you create a Client, the new Client will read the YAML
68
+ file and take the client id and client secret values from there.
69
+
70
+ ```yaml
71
+ # databasedotcom.yml
72
+ #
73
+ ---
74
+ client_secret: bro
75
+ client_id: baz
76
+ ```
77
+
78
+ Then
79
+
80
+ ```ruby
81
+ client = Databasedotcom::Client.new("databasedotcom.yml")
82
+ client.client_id #=> bro
83
+ client.client_secret #=> baz
84
+ ```
85
+
86
+ ### Configuration from a Hash
87
+
88
+ If you pass a hash when you create a Client, the new Client will take configuration information
89
+ from that Hash.
90
+
91
+ ```ruby
92
+ client = Databasedotcom::Client.new :client_id => "sponge", :client_secret => "bob"
93
+ client.client_id #=> sponge
94
+ client.client_secret #=> bob
95
+ ```
96
+
97
+ ### Configuration precedence
98
+
99
+ Configuration information present in the environment always takes precedence over that passed in
100
+ via a YAML file or a Hash.
101
+
102
+ ```bash
103
+ export DATABASEDOTCOM_CLIENT_ID=foo
104
+ export DATABASEDOTCOM_CLIENT_SECRET=bar
105
+ ```
106
+
107
+ Then
108
+
109
+ ```ruby
110
+ client = Databasedotcom::Client.new :client_id => "sponge", :client_secret => "bob"
111
+ client.client_id #=> foo
112
+ client.client_secret #=> bar
113
+ ```
114
+
115
+ ### Usage in an application deployed on Heroku
116
+
117
+ You can use the `heroku config:add` command to set environment variables:
118
+
119
+ ```bash
120
+ heroku config:add DATABASEDOTCOM_CLIENT_ID=foo
121
+ heroku config:add DATABASEDOTCOM_CLIENT_SECRET=bar
122
+ ```
123
+
124
+ Then, when you create your client like:
125
+
126
+ ```ruby
127
+ client = Databasedotcom::Client.new
128
+ ```
129
+
130
+ it will use the configuration information that you set with `heroku config:add`.
131
+
132
+ ### Connect to a SalesForce sandbox account
133
+
134
+ Specify the `:host` option when creating your Client, e.g,
135
+
136
+ ```ruby
137
+ Databasedotcom::Client.new :host => "test.salesforce.com", ...
138
+ ```
139
+
140
+ ## Authentication
141
+
142
+ The first thing you need to do with the new Client is to authenticate with Salesforce.
143
+ You can do this in one of several ways:
144
+
145
+ ### Authentication via an externally-acquired OAuth access token
146
+
147
+ If you have acquired an OAuth access token for your Salesforce instance through some external
148
+ means, you can use it. Note that you have to pass both the token and your Salesforce instance
149
+ URL to the `authenticate` method:
150
+
151
+ ```ruby
152
+ client.authenticate :token => "my-oauth-token", :instance_url => "http://na1.salesforce.com" #=> "my-oauth-token"
153
+ ```
154
+
155
+ ### Authentication via Omniauth
156
+
157
+ If you are using the gem within the context of a web application, and your web app is using Omniauth
158
+ to do OAuth with Salesforce, you can authentication the Client direction via the Hash that Omniauth
159
+ passes to your OAuth callback method, like so:
160
+
161
+ ```ruby
162
+ client.authenticate request.env['omniauth.auth'] #=> "the-oauth-token"
163
+ ```
164
+
165
+ ### Authentication via username and password
166
+
167
+ You can authenticate your Client directly with Salesforce with a valid username and password for
168
+ a user in your Salesforce instance. Note that, if access to your Salesforce instance requires a
169
+ [security token](http://www.salesforce.com/us/developer/docs/api/Content/sforce_api_concepts_security.htm),
170
+ the value that you pass for <tt>:password</tt> must be the password for the user concatenated with
171
+ her security token.
172
+
173
+ ```ruby
174
+ client.authenticate :username => "foo@bar.com", :password => "ThePasswordTheSecurityToken" #=> "the-oauth-token"
175
+ ```
176
+
177
+ ## Accessing the Sobject API
178
+
179
+ You can retrieve a list of Sobject defined in your Salesforce instance like so:
180
+
181
+ ```ruby
182
+ client.list_sobjects #=> ['User', 'Group', 'Contact']
183
+ ```
184
+
185
+ Once you have the name of an Sobject, the easiest way to interact with it is to first materialize it:
186
+
187
+ ```ruby
188
+ contact_class = client.materialize("Contact") #=> Contact
189
+ ```
190
+
191
+ By default, Sobject classes are materialized into the global namespace- if you want materialize into
192
+ another module, you can easily do configure this:
193
+
194
+ ```ruby
195
+ client.sobject_module = My::Module
196
+ client.materialize("Contact") #=> My::Module::Contact
197
+ ```
198
+
199
+ Materialized Sobject classes behave much like ActiveRecord classes:
200
+
201
+ ```ruby
202
+ contact = Contact.find("contact_id") #=> #<Contact @Id="contact_id", ...>
203
+ contact = Contact.find_by_Name("John Smith") #=> dynamic finders!
204
+ contacts = Contact.all #=> a Databasedotcom::Collection of Contact instances
205
+ contacts = Contact.find_all_by_Company("IBM") #=> a Databasedotcom::Collection of matching Contacts
206
+ contact.Name #=> the contact's Name attribute
207
+ contact["Name"] #=> same thing
208
+ contact.Name = "new name" #=> change the contact's Name attribute, in memory
209
+ contact["Name"] = "new name" #=> same thing
210
+ contact.save #=> save the changes to the database
211
+ contact.update_attributes "Name" => "newer name",
212
+ "Phone" => "4156543210" #=> change several attributes at once and save them
213
+ contact.delete #=> delete the contact from the database
214
+ ```
215
+
216
+ See the [documentation](http://rubydoc.info/github/heroku/databasedotcom/master/frames) for full details.
217
+
218
+ ## Accessing the Chatter API
219
+
220
+ You can easily access Chatter feeds, group, conversations, etc.:
221
+
222
+ ```ruby
223
+ my_feed_items = Databasedotcom::Chatter::UserProfileFeed.find(client) #=> a Databasedotcom::Collection of FeedItems
224
+
225
+ my_feed_items.each do |feed_item|
226
+ feed_item.likes #=> a Databasedotcom::Collection of Like instances
227
+ feed_item.comments #=> a Databasedotcom::Collection of Comment instances
228
+ feed_item.raw_hash #=> the hash returned from the Chatter API describing this FeedItem
229
+ feed_item.comment("This is cool") #=> create a new comment on the FeedItem
230
+ feed_item.like #=> the authenticating user likes the FeedItem
231
+ end
232
+
233
+ me = Databasedotcom::Chatter::User.find(client, "me") #=> a User for the authenticating user
234
+ me.followers #=> a Databasedotcom::Collection of Users
235
+ me.post_status("what I'm doing now") #=> post a new status
236
+
237
+ you = Databasedotcom::Chatter::User.find(client, "your-user-id")
238
+ me.follow(you) #=> start following a user
239
+ ```
240
+
241
+ See the [documentation](http://rubydoc.info/github/heroku/databasedotcom/master/frames) for full details.
242
+
243
+ ## Running a Salesforce Flow
244
+ You can start Salesforce flows.
245
+
246
+ ```ruby
247
+ flow = Databasedotcom::Flow.new(client, flow_name, flow_paramaters)
248
+ flow.run
249
+ ```
250
+
251
+ Executing ```run``` will trigger a post to ```/services/data/v32.0/actions/custom/flow/#{@flow_name}``` with the passed in paramaters.
252
+
253
+ You can configure the API version with the ```:version``` option:
254
+
255
+ ```ruby
256
+ flow = Databasedotcom::Flow.new(client, flow_name, flow_paramaters, {:version => '33.0')
257
+ flow.run
258
+ ```
259
+
260
+ # License
261
+
262
+ This gem is licensed under the MIT License.
@@ -0,0 +1,11 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext'
3
+
4
+ require 'databasedotcom/version'
5
+ require 'databasedotcom/core_extensions'
6
+ require 'databasedotcom/client'
7
+ require 'databasedotcom/sales_force_error'
8
+ require 'databasedotcom/collection'
9
+ require 'databasedotcom/sobject'
10
+ require 'databasedotcom/chatter'
11
+ require 'databasedotcom/flow'
@@ -0,0 +1,11 @@
1
+ require 'databasedotcom/chatter/feeds'
2
+ require 'databasedotcom/chatter/filter_feed'
3
+ require 'databasedotcom/chatter/feed_item'
4
+ require 'databasedotcom/chatter/comment'
5
+ require 'databasedotcom/chatter/like'
6
+ require 'databasedotcom/chatter/user'
7
+ require 'databasedotcom/chatter/group'
8
+ require 'databasedotcom/chatter/group_membership'
9
+ require 'databasedotcom/chatter/subscription'
10
+ require 'databasedotcom/chatter/conversation'
11
+ require 'databasedotcom/chatter/message'
@@ -0,0 +1,10 @@
1
+ require 'databasedotcom/chatter/record'
2
+
3
+ module Databasedotcom
4
+ module Chatter
5
+
6
+ # A comment posted on a FeedItem.
7
+ class Comment < Record
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,100 @@
1
+ require 'databasedotcom/chatter/record'
2
+
3
+ module Databasedotcom
4
+ module Chatter
5
+ # A thread of private messages. When calling +Conversation.find+ or +Conversation.all+, you must pass +:user_id => <my_user_id>+ in the _parameters_
6
+ #
7
+ # Conversation.all(@client, :user_id => "me")
8
+ # Conversation.find(@client, "conversationId", :user_id => "f80ad89f9d98d89dfd89")
9
+ class Conversation < Record
10
+
11
+ # Creates a new Conversation and sets its +id+ and +url+ to values obtained from the server response.
12
+ def initialize(client, response)
13
+ super
14
+ @id ||= @raw_hash["conversationId"]
15
+ @url ||= @raw_hash["conversationUrl"]
16
+ end
17
+
18
+ # Find the Conversation identified by _cid_ and archive it. Returns the updated Conversation.
19
+ #
20
+ # Conversation.archive(@client, "fakeid")
21
+ def self.archive(client, cid)
22
+ url = "/services/data/v#{client.version}/chatter/users/me/conversations/#{cid}"
23
+ response = client.http_patch(url, nil, :archived => "true")
24
+ Conversation.new(client, response.body)
25
+ end
26
+
27
+ # Find the Conversation identified by _cid_ and unarchive it. Returns the updated Conversation.
28
+ #
29
+ # Conversation.unarchive(@client, "fakeid")
30
+ def self.unarchive(client, cid)
31
+ url = "/services/data/v#{client.version}/chatter/users/me/conversations/#{cid}"
32
+ response = client.http_patch(url, nil, :archived => "false")
33
+ Conversation.new(client, response.body)
34
+ end
35
+
36
+ # Find the Conversation identified by _cid_ and mark it as read. Returns the updated Conversation.
37
+ #
38
+ # Conversation.mark_read(@client, "fakeid")
39
+ def self.mark_read(client, cid)
40
+ url = "/services/data/v#{client.version}/chatter/users/me/conversations/#{cid}"
41
+ response = client.http_patch(url, nil, :read => "true")
42
+ Conversation.new(client, response.body)
43
+ end
44
+
45
+ # Find the Conversation identified by _cid_ and mark it as unread. Returns the updated Conversation.
46
+ #
47
+ # Conversation.mark_unread(@client, "fakeid")
48
+ def self.mark_unread(client, cid)
49
+ url = "/services/data/v#{client.version}/chatter/users/me/conversations/#{cid}"
50
+ response = client.http_patch(url, nil, :read => "false")
51
+ Conversation.new(client, response.body)
52
+ end
53
+
54
+ # Gets all messages for the Conversation specified by _cid_ and the User specified by _uid_. Returns a Collection of Message objects.
55
+ def self.messages(client, uid, cid)
56
+ conversation = self.find(client, cid, :user_id => uid)
57
+ collection = Databasedotcom::Collection.new(client, nil, conversation.raw_hash["messages"]["nextPageUrl"], conversation.raw_hash["messages"]["previousPageUrl"], conversation.raw_hash["messages"]["currentPageUrl"])
58
+ conversation.raw_hash["messages"]["messages"].each do |item|
59
+ collection << Message.new(client, item)
60
+ end
61
+ collection
62
+ end
63
+
64
+ # Archive this Conversation.
65
+ def archive
66
+ self.class.archive(self.client, self.id)
67
+ end
68
+
69
+ # Unarchive this Conversation.
70
+ def unarchive
71
+ self.class.unarchive(self.client, self.id)
72
+ end
73
+
74
+ # Mark this Conversation as read.
75
+ def mark_read
76
+ self.class.mark_read(self.client, self.id)
77
+ end
78
+
79
+ # Mark this Conversation as unread.
80
+ def mark_unread
81
+ self.class.mark_unread(self.client, self.id)
82
+ end
83
+
84
+ # Return a Collection of messages from this Conversation.
85
+ def messages
86
+ collection = Databasedotcom::Collection.new(client, nil, self.raw_hash["messages"]["nextPageUrl"], self.raw_hash["messages"]["previousPageUrl"], self.raw_hash["messages"]["currentPageUrl"])
87
+ self.raw_hash["messages"]["messages"].each do |item|
88
+ collection << Message.new(client, item)
89
+ end
90
+ collection
91
+ end
92
+
93
+ protected
94
+
95
+ def self.search_parameter_name
96
+ :Q
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,64 @@
1
+ require 'json'
2
+
3
+ module Databasedotcom
4
+ module Chatter
5
+ # Parent class of all feeds and inherits from Collection. This class is not intended to be instantiated. Methods should be called on subclasses, which are all are dynamically defined (except for FilterFeed). Defined feeds are *NewsFeed*, *UserProfileFeed*, *RecordFeed*, *ToFeed*, *PeopleFeed*, *GroupsFeed*, *FilesFeed*, *CompanyFeed*, and *FilterFeed*.
6
+ class Feed < Collection
7
+
8
+ # Returns an enumerable Feed of FeedItem objects that make up the feed with the specified _id_. Should not be called as a class method on Feed, but as a method on subclasses.
9
+ #
10
+ # NewsFeed.find(@client) #=> [#<FeedItem ...>, #<FeedItem ...>, ...]
11
+ # PeopleFeed.find(@client, "userid") #=> [#<FeedItem ...>, #<FeedItem ...>, ...]
12
+ # FilterFeed.find(@client, "me", "000") #=> [#<FeedItem ...>, #<FeedItem ...>, ...]
13
+ #
14
+ # _id_prefix_ is only applicable for FilterFeed.
15
+ def self.find(client, id="me", id_prefix=nil)
16
+ path_components = %w(services data)
17
+ path_components << "v#{client.version}"
18
+ path_components.concat(%w(chatter feeds))
19
+ path_components << feed_type
20
+ path_components << id unless feed_type == "company"
21
+ path_components << id_prefix
22
+ path_components << "feed-items"
23
+ path = "/" + path_components.compact.join('/')
24
+ result = client.http_get(path)
25
+ response = JSON.parse(result.body)
26
+ collection = self.new(client, nil, response["nextPageUrl"], response["previousPageUrl"], response["currentPageUrl"])
27
+ response["items"].each do |item|
28
+ collection << FeedItem.new(client, item)
29
+ end
30
+ collection
31
+ end
32
+
33
+ # Posts a FeedItem to a Feed specified by _user_id_. Should not be called as a class method on Feed, but as a method on subclasses.
34
+ #
35
+ # UserProfileFeed.post(@client, "me", :text => "This is a status update about Salesforce.", :url => "http://www.salesforce.com")
36
+ #
37
+ # Returns the newly created FeedItem.
38
+ def self.post(client, user_id, parameters)
39
+ url = "/services/data/v#{client.version}/chatter/feeds/#{feed_type}/#{user_id}/feed-items"
40
+ response = client.http_post(url, nil, parameters)
41
+ Databasedotcom::Chatter::FeedItem.new(client, response.body)
42
+ end
43
+
44
+ # Posts a file to a Feed specified by _user_id_. Should not be called as a class method on Feed, but as a method on subclasses.
45
+ #
46
+ # UserProfileFeed.post_file(@client, "me", File.open("MyFile"), "text/plain", "MyFile", :desc => "This is an uploaded text file.")
47
+ #
48
+ # Returns the newly created FeedItem.
49
+ def self.post_file(client, user_id, io, file_type, file_name, parameters={})
50
+ url = "/services/data/v#{client.version}/chatter/feeds/#{feed_type}/#{user_id}/feed-items"
51
+ response = client.http_multipart_post(url, {"feedItemFileUpload" => UploadIO.new(io, file_type, file_name), "fileName" => file_name}, parameters)
52
+ Databasedotcom::Chatter::FeedItem.new(client, response.body)
53
+ end
54
+
55
+ private
56
+
57
+ def self.feed_type
58
+ self.name.match(/.+::(.+)Feed$/)[1].resourcerize
59
+ end
60
+ end
61
+
62
+ FEED_TYPES = %w(News UserProfile Record To People Groups Files Company)
63
+ end
64
+ end