foursquare_rails_generators 0.1.1 → 0.1.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.
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ .DS_Store
data/README.md ADDED
@@ -0,0 +1,2 @@
1
+ In 1 minute, get your Rails app with Foursquare running on Herolu
2
+ ==========
@@ -0,0 +1,12 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'foursquare_rails_generators'
3
+ s.version = '0.1.2'
4
+ s.date = '2012-10-26'
5
+ s.summary = "Foursquare Rails Generators"
6
+ s.description = "Collection of Rails generators for the Foursquare API"
7
+ s.authors = ["Pierre Valade"]
8
+ s.email = 'pierre@foursquare.com'
9
+ s.files = `git ls-files`.split("\n")
10
+ s.require_paths = ['lib']
11
+ s.homepage = 'http://rubygems.org/gems/foursquare_rails_generators'
12
+ end
@@ -0,0 +1,4 @@
1
+ require 'rails/generators'
2
+
3
+ require File.expand_path('../generators/foursquare/authentication/authentication_generator', __FILE__)
4
+ require File.expand_path('../generators/foursquare/push/push_generator', __FILE__)
@@ -0,0 +1,61 @@
1
+ module Foursquare
2
+ module Generators
3
+ class AuthenticationGenerator < Rails::Generators::Base
4
+ source_root File.expand_path("../templates", __FILE__)
5
+
6
+ desc "Adds Foursquare Connect to your app"
7
+ argument :settings, type: :hash, banner: "client_id:id client_secret:secret"
8
+
9
+ def validates_settings
10
+ raise "incorret params" if settings['client_id'].blank? || settings['client_secret'].blank?
11
+ end
12
+
13
+ def add_oauth2_gem
14
+ gem 'oauth2'
15
+ end
16
+
17
+ def create_foursquare_user_model
18
+ migration_template 'migrations/create_foursquare_user.rb'
19
+ template 'models/foursquare_user.rb', File.join('app/models/', 'foursquare_user.rb')
20
+ end
21
+
22
+ def create_foursquare_client_model
23
+ template 'models/foursquare_client.rb', File.join('app/models/', 'foursquare_client.rb')
24
+ end
25
+
26
+ def run_migrations
27
+ rake 'db:migrate'
28
+ end
29
+
30
+ def create_client_controller
31
+ template 'controllers/clients/foursquare_clients_controller.rb', File.join('app/controllers/clients', 'foursquare_clients_controller.rb')
32
+ end
33
+
34
+ def add_root_routes
35
+ route "root :to => 'users#new'"
36
+ end
37
+
38
+ def add_clients_routes
39
+ route(
40
+ %Q{
41
+ scope module: 'clients' do
42
+ resources :foursquare_clients, only: ['new'], path: 'clients/foursquare' do
43
+ collection do
44
+ get 'callback'
45
+ end
46
+ end
47
+ end
48
+ }
49
+ )
50
+ end
51
+
52
+ def create_users_controller
53
+ template 'controllers/users_controller.rb', File.join('app/controllers/', 'users_controller.rb')
54
+ end
55
+
56
+ def add_user_routes
57
+ route "resource :user"
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,24 @@
1
+ class Clients::FoursquareClientsController < ApplicationController
2
+ def new
3
+ # https://developer.foursquare.com/overview/auth
4
+ options = {
5
+ redirect_uri: callback_foursquare_clients_url,
6
+ }
7
+ redirect_to client.auth_code.authorize_url options
8
+ end
9
+
10
+ def callback
11
+ if params[:error]
12
+ # TODO: manage error
13
+ end
14
+ token = client.auth_code.get_token params[:code], redirect_uri: callback_foursquare_clients_url
15
+ user = FoursquareUser.find_or_create_by_access_token(token.token)
16
+ session[:user_id] = user.id
17
+ redirect_to user_path
18
+ end
19
+
20
+ private
21
+ def client
22
+ FoursquareClient.oauth2_client
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ class UsersController < ApplicationController
2
+ def new
3
+ render text: "<a href='#{new_foursquare_client_path}'><img src='https://playfoursquare.s3.amazonaws.com/press/logo/connect-black.png' /></a>"
4
+ end
5
+
6
+ def show
7
+ render text: "hello #{current_user.name}"
8
+ end
9
+
10
+ private
11
+ def current_user
12
+ @current_user ||= FoursquareUser.find(session[:user_id])
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ class CreateFoursquareUsers < ActiveRecord::Migration
2
+ def change
3
+ create_table :foursquare_users do |t|
4
+ t.string :foursquare_id
5
+ t.string :access_token
6
+
7
+ t.timestamps
8
+ end
9
+ add_index :foursquare_users, :foursquare_id
10
+ end
11
+ end
@@ -0,0 +1,51 @@
1
+ # https://developer.foursquare.com/docs/
2
+ class FoursquareClient
3
+ attr_accessor :access_token
4
+
5
+ def initialize(access_token)
6
+ @access_token = access_token
7
+ end
8
+
9
+ def user_info
10
+ @user_info ||= get('users/self').parsed['response']['user']
11
+ end
12
+
13
+ def user_id
14
+ user_info['id']
15
+ end
16
+
17
+ def user_name
18
+ [user_info['firstName'], user_info['lastName']].join(' ')
19
+ end
20
+
21
+ def oauth2_token
22
+ @oauth2_token ||= OAuth2::AccessToken.from_hash(self.class.oauth2_client, {access_token: access_token}.merge(mode: :query, param_name: 'oauth_token'))
23
+ end
24
+
25
+ def get(path, params = {})
26
+ oauth2_token.get(self.class.endpoint + path, params)
27
+ end
28
+
29
+ def post(path, params = {})
30
+ oauth2_token.post(self.class.endpoint + path, params)
31
+ end
32
+
33
+ def create_checkin_reply(checkin_id, options = {})
34
+ post("checkins/#{checkin_id}/reply", params: options)
35
+ end
36
+
37
+ class << self
38
+ def endpoint
39
+ 'https://api.foursquare.com/v2/'
40
+ end
41
+
42
+ def oauth2_client
43
+ options = {
44
+ authorize_url: 'https://foursquare.com/oauth2/authenticate',
45
+ token_url: 'https://foursquare.com/oauth2/access_token',
46
+ raise_errors: true,
47
+ }
48
+ OAuth2::Client.new("<%= settings['client_id'] %>", "<%= settings['client_secret'] %>", options)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,23 @@
1
+ class FoursquareUser < ActiveRecord::Base
2
+ def name
3
+ client.user_name
4
+ end
5
+
6
+ def client
7
+ @client ||= FoursquareClient.new(access_token)
8
+ end
9
+
10
+ class << self
11
+ def find_or_create_by_access_token(access_token)
12
+ client = FoursquareClient.new(access_token)
13
+
14
+ unless user = self.find_by_foursquare_id(client.user_id)
15
+ user = self.new
16
+ user.foursquare_id = client.user_id
17
+ user.access_token = client.access_token
18
+ user.save!
19
+ end
20
+ user
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,17 @@
1
+ module Foursquare
2
+ module Generators
3
+ class PushGenerator < Rails::Generators::Base
4
+ source_root File.expand_path("../templates", __FILE__)
5
+
6
+ desc "Receive push from foursquare into your app"
7
+
8
+ def add_routes
9
+ route "resources :checkins"
10
+ end
11
+
12
+ def create_checkins_controller
13
+ template 'controllers/checkins_controller.rb', File.join('app/controllers/', 'checkins_controller.rb')
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ class CheckinsController < ApplicationController
2
+ skip_before_filter :verify_authenticity_token
3
+
4
+ def create
5
+ checkin = JSON.parse(params['checkin'])
6
+ # TODO: verify push secret
7
+ user = FoursquareUser.find_by_foursquare_id(checkin['user']['id'])
8
+ user.client.create_checkin_reply(checkin['id'], text: "hello world!")
9
+ return head :ok
10
+ end
11
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foursquare_rails_generators
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -16,7 +16,19 @@ email: pierre@foursquare.com
16
16
  executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
- files: []
19
+ files:
20
+ - .gitignore
21
+ - README.md
22
+ - foursquare_rails_generators.gemspec
23
+ - lib/foursquare_rails_generators.rb
24
+ - lib/generators/foursquare/authentication/authentication_generator.rb
25
+ - lib/generators/foursquare/authentication/templates/controllers/clients/foursquare_clients_controller.rb
26
+ - lib/generators/foursquare/authentication/templates/controllers/users_controller.rb
27
+ - lib/generators/foursquare/authentication/templates/migrations/create_foursquare_user.rb
28
+ - lib/generators/foursquare/authentication/templates/models/foursquare_client.rb
29
+ - lib/generators/foursquare/authentication/templates/models/foursquare_user.rb
30
+ - lib/generators/foursquare/push/push_generator.rb
31
+ - lib/generators/foursquare/push/templates/controllers/checkins_controller.rb
20
32
  homepage: http://rubygems.org/gems/foursquare_rails_generators
21
33
  licenses: []
22
34
  post_install_message: