thecity 0.0.2

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.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3 -0
  3. data/LICENSE.md +45 -0
  4. data/README.md +170 -0
  5. data/Rakefile +11 -0
  6. data/lib/the_city/account.rb +32 -0
  7. data/lib/the_city/api/accounts.rb +34 -0
  8. data/lib/the_city/api/client.rb +136 -0
  9. data/lib/the_city/api/events.rb +55 -0
  10. data/lib/the_city/api/groups.rb +41 -0
  11. data/lib/the_city/api/needs.rb +51 -0
  12. data/lib/the_city/api/oauth.rb +50 -0
  13. data/lib/the_city/api/prayers.rb +51 -0
  14. data/lib/the_city/api/request/multipart_with_file.rb +36 -0
  15. data/lib/the_city/api/response/parse_json.rb +27 -0
  16. data/lib/the_city/api/response/raise_error.rb +28 -0
  17. data/lib/the_city/api/topics.rb +51 -0
  18. data/lib/the_city/api/users.rb +78 -0
  19. data/lib/the_city/api/utils.rb +58 -0
  20. data/lib/the_city/arguments.rb +11 -0
  21. data/lib/the_city/base.rb +133 -0
  22. data/lib/the_city/client.rb +94 -0
  23. data/lib/the_city/collection.rb +130 -0
  24. data/lib/the_city/content.rb +29 -0
  25. data/lib/the_city/error/argument_arror.rb +8 -0
  26. data/lib/the_city/error/bad_gateway.rb +10 -0
  27. data/lib/the_city/error/bad_request.rb +10 -0
  28. data/lib/the_city/error/configuration_error.rb +8 -0
  29. data/lib/the_city/error/forbidden.rb +10 -0
  30. data/lib/the_city/error/gateway_timeout.rb +10 -0
  31. data/lib/the_city/error/internal_server_error.rb +10 -0
  32. data/lib/the_city/error/not_acceptable.rb +10 -0
  33. data/lib/the_city/error/not_found.rb +10 -0
  34. data/lib/the_city/error/service_unavailable.rb +10 -0
  35. data/lib/the_city/error/too_many_requests.rb +12 -0
  36. data/lib/the_city/error/unauthorized.rb +10 -0
  37. data/lib/the_city/error/unprocessable_entity.rb +10 -0
  38. data/lib/the_city/error.rb +66 -0
  39. data/lib/the_city/event.rb +11 -0
  40. data/lib/the_city/group.rb +6 -0
  41. data/lib/the_city/need.rb +10 -0
  42. data/lib/the_city/permissions.rb +21 -0
  43. data/lib/the_city/prayer.rb +10 -0
  44. data/lib/the_city/rate_limit.rb +17 -0
  45. data/lib/the_city/terminology.rb +39 -0
  46. data/lib/the_city/time.rb +67 -0
  47. data/lib/the_city/token.rb +16 -0
  48. data/lib/the_city/topic.rb +10 -0
  49. data/lib/the_city/user.rb +41 -0
  50. data/lib/the_city/version.rb +18 -0
  51. data/lib/the_city.rb +15 -0
  52. data/thecity.gemspec +28 -0
  53. metadata +172 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7e558202d2137889f1d2d101f981d0530ce7ba51
4
+ data.tar.gz: c0fa317f5e9b9a4df29c4c13c04befd2057917ce
5
+ SHA512:
6
+ metadata.gz: 1526b289a4e20a8b9010cc2ee5d6b8cbf01890a817715881285aa8b1f432cb7400bb214e531dfdba30b2fd38af0a6152c40e7d2c72218be19074b939ff81faaf
7
+ data.tar.gz: 4fccefc74465b71e3eccd26ab290f149a08b4afe5df92c97dda35677a391be31e45f9583c18944c1c480b2e9f5e72f186dc18aa3aa94a10b099ccfec79a69473
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ 0.0.1
2
+ -----
3
+ * [Initial release](https://github.com/robertleib/thecity/commit/cd7aecde450157ae2ec0c07a2171d7149bebb74a)
data/LICENSE.md ADDED
@@ -0,0 +1,45 @@
1
+ Copyright (c) 2013 Robert Leib
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.
21
+
22
+
23
+ Portions of this software were inspired by, modeled after, or just plain copied from:
24
+ https://github.com/sferik/twitter
25
+
26
+ Copyright (c) 2006-2013 Erik Michaels-Ober, John Nunemaker, Wynn Netherland, Steve Richert, Steve Agalloco
27
+
28
+ Permission is hereby granted, free of charge, to any person obtaining
29
+ a copy of this software and associated documentation files (the
30
+ "Software"), to deal in the Software without restriction, including
31
+ without limitation the rights to use, copy, modify, merge, publish,
32
+ distribute, sublicense, and/or sell copies of the Software, and to
33
+ permit persons to whom the Software is furnished to do so, subject to
34
+ the following conditions:
35
+
36
+ The above copyright notice and this permission notice shall be
37
+ included in all copies or substantial portions of the Software.
38
+
39
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
40
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
41
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
42
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
43
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
44
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
45
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,170 @@
1
+ # The City Ruby Gem
2
+
3
+ A Ruby interface to the The City API. For more information about The City platform, see [http://api.onthecity.org][api info]
4
+
5
+ [api info]: http://api.onthecity.org
6
+
7
+ ## Installation
8
+ gem install thecity
9
+
10
+ ## Configuration
11
+ The City API requires you to authenticate via OAuth, so you'll need to
12
+ register your application with The City under the Admin | API panel.
13
+
14
+ Your new application will be assigned a key/secret pair (app_id/app_secret). You'll need
15
+ to configure these values before you make a request or else you'll get the
16
+ error:
17
+
18
+ Bad Authentication data
19
+
20
+ You can pass configuration options as a block to `TheCity::API::Client.new`.
21
+
22
+ ```ruby
23
+ client = TheCity::API::Client.new do |config|
24
+ config.app_id = "YOUR_APP_ID"
25
+ config.app_secret = "YOUR_APP_SECRET"
26
+ config.access_token = "OAUTH_ACCESS_TOKEN"
27
+ end
28
+ ```
29
+
30
+ or
31
+
32
+ ```ruby
33
+ client = TheCity::API::Client.new
34
+ client.app_id = "YOUR_APP_ID"
35
+ client.app_secret = "YOUR_APP_SECRET"
36
+ client.access_token = "OAUTH_ACCESS_TOKEN"
37
+ ```
38
+
39
+ Alternately, you can set the following environment variables:
40
+
41
+ THECITY_APP_ID
42
+ THECITY_APP_SECRET
43
+ THECITY_ACCESS_TOKEN
44
+ THECITY_SUBDOMAIN
45
+
46
+ After configuration, requests can be made like so:
47
+
48
+ ```ruby
49
+ client.current_user
50
+ ```
51
+
52
+ or
53
+
54
+ ```ruby
55
+ client.my_groups
56
+ ```
57
+
58
+ ## Usage Examples
59
+ All examples require an authenticated TheCity client with a valid access_token. See the section on <a
60
+ href="#configuration">configuration</a>.
61
+
62
+ **Get the authenticated user (current user)**
63
+
64
+ ```ruby
65
+ client.me
66
+ ```
67
+ **Post a topic**
68
+
69
+ ```ruby
70
+ client.post_topic(:group_id => 1234567, :title => 'Mr. Watson, come here', :body => 'I want to see you.')
71
+ ```
72
+ **Fetch the groups the current user belongs to**
73
+
74
+ ```ruby
75
+ client.my_groups
76
+ ```
77
+ **Retrieve the list of permissions associated with the current user**
78
+
79
+ ```ruby
80
+ client.followers("gem")
81
+ client.followers(213747670)
82
+ client.followers
83
+ ```
84
+ **Fetch a cursored list of friends with profile details (by screen name or user ID, or by implict authenticated user)**
85
+
86
+ ```ruby
87
+ client.friends("gem")
88
+ client.friends(213747670)
89
+ client.friends
90
+ ```
91
+ For more usage examples, please see the full [documentation][].
92
+
93
+ ## Documentation
94
+ [http://rdoc.info/gems/thecity][documentation]
95
+
96
+ [documentation]: http://rdoc.info/gems/thecity
97
+
98
+ ## Announcements
99
+ You should [follow @thecity][follow] [and @thecity_status][follow_status] on Twitter for announcements and updates about
100
+ this library.
101
+
102
+ [follow]: https://twitter.com/thecity
103
+ [follow_status]: https://twitter.com/thecity_status
104
+
105
+ ## The City Builder API Developer Group
106
+ For more in depth discussiong regarding The City app platform and APIs, please join [the 'API' group on Builders][builders group].
107
+
108
+ [builders group]: https://builders.onthecity.org/groups/api
109
+
110
+ ## Apps Wiki
111
+ Does your church or organization use this gem? Add it to the [apps
112
+ wiki][apps]!
113
+
114
+ [apps]: https://github.com/robertleib/thecity/wiki/apps
115
+
116
+ ## Advanced Configuration
117
+
118
+ ### Middleware
119
+ The Faraday middleware stack is fully configurable and is exposed as a
120
+ `Faraday::Builder` object. You can modify the default middleware in-place:
121
+
122
+ ```ruby
123
+ client.middleware.insert_after TheCity::Response::RaiseError, CustomMiddleware
124
+ ```
125
+
126
+ A custom adapter may be set as part of a custom middleware stack:
127
+
128
+ ```ruby
129
+ client.middleware = Faraday::Builder.new(
130
+ &Proc.new do |builder|
131
+ # Specify a middleware stack here
132
+ builder.adapter :some_other_adapter
133
+ end
134
+ )
135
+ ```
136
+
137
+ ## Contributing to thecity gem
138
+
139
+ ### Submitting an Issue
140
+ We use the [GitHub issue tracker][issues] to track bugs and features. Before
141
+ submitting a bug report or feature request, check to make sure it hasn't
142
+ already been submitted. When submitting a bug report, please include a [Gist][]
143
+ that includes a stack trace and any details that may be necessary to reproduce
144
+ the bug, including your gem version, Ruby version, and operating system.
145
+ Ideally, a bug report should include a pull request with failing specs.
146
+
147
+ [issues]: https://github.com/robertleib/thecity/issues
148
+ [gist]: https://gist.github.com/
149
+
150
+ ### Submitting a Pull Request
151
+ 1. [Fork the repository.][fork]
152
+ 2. [Create a topic branch.][branch]
153
+ 3. Preferably, add specs for your unimplemented feature or bug fix.
154
+ 4. Run `bundle exec rake spec`. If your specs pass, return to step 3.
155
+ 5. Implement your feature or bug fix.
156
+ 6. Run `bundle exec rake spec`. If your specs fail, return to step 5.
157
+ 7. Add documentation for your feature or bug fix.
158
+ 8. Run `bundle exec rake yard`.
159
+ 9. Commit and push your changes.
160
+ 10. [Submit a pull request.][pr]
161
+
162
+ [fork]: http://help.github.com/fork-a-repo/
163
+ [branch]: http://learn.github.com/p/branching.html
164
+ [pr]: http://help.github.com/send-pull-requests/
165
+
166
+ ## Copyright
167
+ Copyright (c) 2013 Robert Leib.
168
+ See [LICENSE][] for details.
169
+
170
+ [license]: LICENSE.md
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :test => :spec
8
+ task :default => :spec
9
+
10
+ require 'yard'
11
+ YARD::Rake::YardocTask.new
@@ -0,0 +1,32 @@
1
+ module TheCity
2
+ # The City church account
3
+ #
4
+ # @!attribute [r] name
5
+ # @return [String] The name of the church, 'Grace Church'.
6
+ # @!attribute [r] subdomain
7
+ # @return [String] The subdomain used to access this account, subdomain.onthecity.org
8
+ # @!attribute [r] id
9
+ # @return [Integer] The id associated with the church account
10
+
11
+ class Account < TheCity::Base
12
+ attr_reader :name, :id, :subdomain
13
+ object_attr_reader :Terminology, :terminology
14
+
15
+ def initialize(attrs={}, options={})
16
+ super(attrs,options)
17
+ @campuses = Array(attrs.delete(:campuses)).map {|g| TheCity::Group.new(g,options)}
18
+ end
19
+
20
+ # Return campuses that belong to a multisite church
21
+ #
22
+ # @return [Array<TheCity::Group>]
23
+ def campuses
24
+ @campuses
25
+ end
26
+
27
+ def label_for(thecity_primitive)
28
+ terminology.send(thecity_primitive.downcase.to_sym)
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,34 @@
1
+ require 'the_city/arguments'
2
+ require 'the_city/api/utils'
3
+ require 'the_city/account'
4
+
5
+ module TheCity
6
+ module API
7
+ module Accounts
8
+ include TheCity::API::Utils
9
+
10
+ # Returns the current City account associated with the current user
11
+ #
12
+ # @req_scope none
13
+ # @return [TheCity::Account]
14
+ # @param options [Hash] A customizable set of options.
15
+ def church_account(options={})
16
+ @church_account = nil if options.delete(:force_download)
17
+ @church_account ||= object_from_response(TheCity::Account, :get, "/church_account", options)
18
+ end
19
+ alias current_account church_account
20
+ alias current_church church_account
21
+
22
+ # Returns an array of all the City accounts associated with the current user
23
+ #
24
+ # @req_scope none
25
+ # @return [Array<TheCity::Account>]
26
+ # @param options [Hash] A customizable set of options.
27
+ def my_accounts(options={})
28
+ @my_accounts = nil if options.delete(:force_download)
29
+ @my_accounts ||= objects_from_response(TheCity::Account, :get, "/me/accounts", options)
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,136 @@
1
+ require 'base64'
2
+ require 'faraday'
3
+ require 'faraday/request/multipart'
4
+ require 'json'
5
+ require 'the_city/client'
6
+ require 'the_city/error'
7
+ require 'the_city/error/configuration_error'
8
+ require 'the_city/api/request/multipart_with_file'
9
+ require 'the_city/api/response/parse_json'
10
+ require 'the_city/api/response/raise_error'
11
+
12
+ #require 'the_city/api/oauth'
13
+ require 'the_city/api/users'
14
+ require 'the_city/api/accounts'
15
+ require 'the_city/api/groups'
16
+ require 'the_city/api/topics'
17
+ require 'the_city/api/events'
18
+ require 'the_city/api/prayers'
19
+ require 'the_city/api/needs'
20
+
21
+ module TheCity
22
+ module API
23
+ # Wrapper for the TheCity REST API
24
+ #
25
+ # @see http://api.onthecity.com/docs
26
+ class Client < TheCity::Client
27
+ #include TheCity::API::OAuth
28
+ include TheCity::API::Users
29
+ include TheCity::API::Accounts
30
+ include TheCity::API::Groups
31
+ include TheCity::API::Topics
32
+ include TheCity::API::Events
33
+ include TheCity::API::Prayers
34
+ include TheCity::API::Needs
35
+
36
+ attr_writer :bearer_token, :connection_options, :middleware
37
+
38
+ ENDPOINT = ENV['THECITY_API_ENDPOINT'] || 'https://api.onthecity.org'
39
+
40
+ def connection_options
41
+ {
42
+ :builder => middleware,
43
+ :headers => {
44
+ :accept => "application/vnd.thecity.v#{version}+json",
45
+ 'X-THECITY-SUBDOMAIN' => subdomain,
46
+ 'X-THECITY-ACCESS-TOKEN' => access_token,
47
+ },
48
+ :request => {
49
+ :open_timeout => 5,
50
+ :timeout => 60,
51
+ },
52
+ }
53
+ end
54
+
55
+ # @note Faraday's middleware stack implementation is comparable to that of Rack middleware. The order of middleware is important: the first middleware on the list wraps all others, while the last middleware is the innermost one.
56
+ # @see https://github.com/technoweenie/faraday#advanced-middleware-usage
57
+ # @see http://mislav.uniqpath.com/2011/07/faraday-advanced-http/
58
+ # @return [Faraday::Builder]
59
+ def middleware
60
+ @middleware ||= Faraday::Builder.new do |builder|
61
+ # Convert file uploads to Faraday::UploadIO objects
62
+ builder.use TheCity::API::Request::MultipartWithFile
63
+ # Checks for files in the payload
64
+ builder.use Faraday::Request::Multipart
65
+ # Convert request params to "www-form-urlencoded"
66
+ builder.use Faraday::Request::UrlEncoded
67
+ # Handle error responses
68
+ builder.use TheCity::API::Response::RaiseError
69
+ # Parse JSON response bodies
70
+ builder.use TheCity::API::Response::ParseJson
71
+ # Set Faraday's HTTP adapter
72
+ builder.adapter Faraday.default_adapter
73
+ end
74
+ end
75
+
76
+ # Perform an HTTP DELETE request
77
+ def delete(path, params={})
78
+ request(:delete, path, params)
79
+ end
80
+
81
+ # Perform an HTTP GET request
82
+ def get(path, params={})
83
+ request(:get, path, params)
84
+ end
85
+
86
+ # Perform an HTTP POST request
87
+ def post(path, params={})
88
+ signature_params = params.values.any?{|value| value.respond_to?(:to_io)} ? {} : params
89
+ request(:post, path, params, signature_params)
90
+ end
91
+
92
+ # Perform an HTTP PUT request
93
+ def put(path, params={})
94
+ request(:put, path, params)
95
+ end
96
+
97
+
98
+ private
99
+
100
+ # Returns a proc that can be used to setup the Faraday::Request headers
101
+ #
102
+ # @param method [Symbol]
103
+ # @param path [String]
104
+ # @param params [Hash]
105
+ # @return [Proc]
106
+ def request_setup(method, path, params, signature_params)
107
+ Proc.new do |request|
108
+ request.headers[:authorization] = bearer_auth_header
109
+ end
110
+ end
111
+
112
+ def request(method, path, params={}, signature_params=params)
113
+ validate_credentials!
114
+ request_setup = request_setup(method, path, params, signature_params)
115
+ connection.send(method.to_sym, path, params, &request_setup).env
116
+ rescue Faraday::Error::ClientError, JSON::ParserError
117
+ raise TheCity::Error
118
+ end
119
+
120
+ # Returns a Faraday::Connection object
121
+ #
122
+ # @return [Faraday::Connection]
123
+ def connection
124
+ @connection ||= Faraday.new(ENDPOINT, connection_options)
125
+ end
126
+
127
+ # Generates authentication header for api request
128
+ #
129
+ # @return [String]
130
+ def bearer_auth_header
131
+ "Bearer #{access_token}"
132
+ end
133
+
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,55 @@
1
+ require 'the_city/arguments'
2
+ require 'the_city/api/utils'
3
+ require 'the_city/event'
4
+
5
+ module TheCity
6
+ module API
7
+ module Events
8
+ include TheCity::API::Utils
9
+
10
+ # Posts an Event to The City
11
+ #
12
+ # @see https://api.onthecity.org/docs
13
+ #
14
+ # @req_scope group_content
15
+ # @return [TheCity::Event]
16
+ # @param options [Hash] A customizable set of options.
17
+ # @option options [Integer] :group_id The id of the group you will be posting to.
18
+ # @option options [String] :title The title of the event.
19
+ # @option options [String] :body The body text of the event.
20
+ # @option options [Time] :starting_at The body text of the event.
21
+ # @option options [Time] :ending_at The body text of the event.
22
+ def post_event(options)
23
+ raise(Error::ArgumentError, "Must supply a options[:group_id] for the events's originating group") unless options[:group_id]
24
+ raise(Error::ArgumentError, "Title (options[:title]) required") unless options[:title]
25
+ raise(Error::ArgumentError, "Body (options[:body]) required") unless options[:body]
26
+ raise(Error::ArgumentError, "Starting At (options[:starting_at]) required") unless options[:starting_at]
27
+ raise(Error::ArgumentError, "Ending At (options[:ending_at]) required") unless options[:ending_at]
28
+ gid = options[:group_id] || 0
29
+ object_from_response(TheCity::Event, :post, "/groups/#{gid}/events/", options, {:client => self})
30
+ end
31
+
32
+ # Returns an Event by id
33
+ #
34
+ # @see https://api.onthecity.org/docs
35
+ #
36
+ # @req_scope group_content
37
+ # @return [TheCity::Event]
38
+ # @raise [TheCity::Error::NotFound] Error raised when the event cannot be found.
39
+ # @overload event(id)
40
+ # @param id [Integer] The id of the event.
41
+ # @overload event(id, options={})
42
+ # @param id [Integer] The id of the event.
43
+ # @param options [Hash] A customizable set of options.
44
+ # @option options [Boolean] :force_download Forces the request to hit the server and flush the cached response
45
+ def event(*args)
46
+ @events ||= {}
47
+ arguments = TheCity::Arguments.new(args)
48
+ eid = args.shift
49
+ @events[eid] = nil if arguments.options.delete(:force_download)
50
+ @events[eid] ||= object_from_response(TheCity::Event, :get, "/events/#{eid}", arguments.options, {:client => self})
51
+ end
52
+
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,41 @@
1
+ require 'the_city/arguments'
2
+ require 'the_city/api/utils'
3
+
4
+ module TheCity
5
+ module API
6
+ module Groups
7
+ include TheCity::API::Utils
8
+
9
+ # Returns all the groups that the current user has an active role in
10
+ #
11
+ # @req_scope group_contont or user_groups
12
+ # @param options [Hash] A customizable set of options.
13
+ # @option options [Boolean] :force_download Forces the request to hit the server and flush the cached response
14
+ # @return [Array<TheCity::Group>]
15
+ def my_groups(options={})
16
+ @my_groups = nil if options.delete(:force_download)
17
+ @my_groups ||= objects_from_response(TheCity::Group, :get, "/me/groups", options)
18
+ end
19
+
20
+ # Returns a group by id
21
+ #
22
+ # @req_scope group_trusted
23
+ # @return [TheCity::Group]
24
+ # @raise [TheCity::Error::NotFound] Error raised when the group cannot be found.
25
+ # @overload group(id)
26
+ # @param id [Integer] The id of the group.
27
+ # @overload group(id, options={})
28
+ # @param id [Integer] The id of the group.
29
+ # @param options [Hash] A customizable set of options.
30
+ # @option options [Boolean] :force_download Forces the request to hit the server and flush the cached response
31
+ def group(*args)
32
+ @groups ||= {}
33
+ arguments = TheCity::Arguments.new(args)
34
+ gid = args.shift
35
+ @groups[tid] = nil if arguments.options.delete(:force_download)
36
+ @groups[tid] ||= object_from_response(TheCity::Group, :get, "/groups/#{gid}", arguments.options)
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,51 @@
1
+ require 'the_city/arguments'
2
+ require 'the_city/api/utils'
3
+ require 'the_city/need'
4
+
5
+ module TheCity
6
+ module API
7
+ module needs
8
+ include TheCity::API::Utils
9
+
10
+ # Posts a need to The City
11
+ #
12
+ # @see https://api.onthecity.org/docs
13
+ #
14
+ # @req_scope group_content
15
+ # @return [TheCity::Need]
16
+ # @param options [Hash] A customizable set of options.
17
+ # @option options [Integer] :group_id The id of the group you will be posting to.
18
+ # @option options [String] :title The title of the need.
19
+ # @option options [String] :body The body text of the need.
20
+ def post_need(options)
21
+ raise(Error::ArgumentError, "Must supply a options[:group_id] for the needs's originating group") unless options[:group_id]
22
+ raise(Error::ArgumentError, "Title (options[:title]) required") unless options[:title]
23
+ raise(Error::ArgumentError, "Body (options[:body]) required") unless options[:body]
24
+ gid = options[:group_id] || 0
25
+ object_from_response(TheCity::Need, :post, "/groups/#{gid}/needs/", options, {:client => self})
26
+ end
27
+
28
+ # Returns a need by id
29
+ #
30
+ # @see https://api.onthecity.org/docs
31
+ #
32
+ # @req_scope group_content
33
+ # @return [TheCity::Need]
34
+ # @raise [TheCity::Error::NotFound] Error raised when the need cannot be found.
35
+ # @overload need(id)
36
+ # @param id [Integer] The id of the need.
37
+ # @overload need(id, options={})
38
+ # @param id [Integer] The id of the need.
39
+ # @param options [Hash] A customizable set of options.
40
+ # @option options [Boolean] :force_download Forces the request to hit the server and flush the cached response
41
+ def need(*args)
42
+ @needs ||= {}
43
+ arguments = TheCity::Arguments.new(args)
44
+ nid = args.shift
45
+ @needs[nid] = nil if arguments.options.delete(:force_download)
46
+ @needs[nid] ||= object_from_response(TheCity::Need, :get, "/needs/#{nid}", arguments.options, {:client => self})
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,50 @@
1
+ require 'the_city/api/utils'
2
+ require 'the_city/token'
3
+
4
+ module TheCity
5
+ module API
6
+ module OAuth
7
+ include TheCity::API::Utils
8
+
9
+ def authentication_url
10
+ "https://authentication.onthecity.org/oauth/authorize?#{authentication_headers}"
11
+ end
12
+
13
+ def authentication_headers
14
+
15
+ end
16
+
17
+ def authentication_params
18
+ "scope=user_basic&app_id="
19
+ end
20
+
21
+ def authorization_url(code)
22
+ end
23
+
24
+ # Allows a registered application to obtain an OAuth 2 Bearear Token, which can be used to make API requests
25
+ # on an application's own behalf, without a user context.
26
+ #
27
+ # Only one bearer token may exist outstanding for an application, and repeated requests to this method
28
+ # will yield the same already-existent token until it has been invalidated.
29
+ #
30
+ # @return [TheCity::Token] The Bearer Token. token_type should be 'bearer'.
31
+ # @example Generate a Bearer Token
32
+ # client = TheCity::API::Client.new(:consumer_key => "abc", :consumer_secret => 'def')
33
+ # bearer_token = client.token
34
+ def token
35
+ object_from_response(TheCity::Token, :post, "/oauth2/token", :grant_type => "client_credentials", :bearer_token_request => true)
36
+ end
37
+ alias bearer_token token
38
+
39
+ # Allows a registered application to revoke an issued OAuth 2 Bearer Token by presenting its client credentials.
40
+ #
41
+ # @param access_token [String, TheCity::Token] The bearer token to revoke.
42
+ # @return [TheCity::Token] The invalidated token. token_type should be nil.
43
+ def invalidate_token(access_token)
44
+ access_token = access_token.access_token if access_token.is_a?(TheCity::Token)
45
+ object_from_response(TheCity::Token, :post, "/oauth2/invalidate_token", :access_token => access_token)
46
+ end
47
+
48
+ end
49
+ end
50
+ end