google-api-ruby-client/examples/buzz/buzz.rb

85 lines
2.3 KiB
Ruby

$:.unshift('lib')
require 'rubygems'
require 'sinatra'
require 'datamapper'
require 'google/api_client'
use Rack::Session::Pool, :expire_after => 86400 # 1 day
# Set up our token store
DataMapper.setup(:default, 'sqlite::memory:')
class TokenPair
include DataMapper::Resource
property :id, Serial
property :refresh_token, String
property :access_token, String
property :expires_in, Integer
property :issued_at, Integer
def update_token!(object)
self.refresh_token = object.refresh_token
self.access_token = object.access_token
self.expires_in = object.expires_in
self.issued_at = object.issued_at
end
def to_hash
return {
:refresh_token => refresh_token,
:access_token => access_token,
:expires_in => expires_in,
:issued_at => Time.at(issued_at)
}
end
end
TokenPair.auto_migrate!
before do
@client = Google::APIClient.new
@client.authorization.client_id = '245083617981.apps.googleusercontent.com'
@client.authorization.client_secret = 'pYelZCRjSa+iMezYENVScXFk'
@client.authorization.scope = 'https://www.googleapis.com/auth/buzz'
@client.authorization.redirect_uri = to('/oauth2callback')
@client.authorization.code = params[:code] if params[:code]
if session[:token_id]
# Load the access token here if it's available
token_pair = TokenPair.get(session[:token_id])
@client.authorization.update_token!(token_pair.to_hash)
end
if @client.authorization.refresh_token && @client.authorization.expired?
@client.authorization.fetch_access_token!
end
@buzz = @client.discovered_api('buzz')
unless @client.authorization.access_token || request.path_info =~ /^\/oauth2/
redirect to('/oauth2authorize')
end
end
get '/oauth2authorize' do
redirect @client.authorization.authorization_uri.to_s, 303
end
get '/oauth2callback' do
@client.authorization.fetch_access_token!
# Persist the token here
token_pair = if session[:token_id]
TokenPair.get(session[:token_id])
else
TokenPair.new
end
token_pair.update_token!(@client.authorization)
token_pair.save()
session[:token_id] = token_pair.id
redirect to('/')
end
get '/' do
result = @client.execute(
@buzz.activities.list,
{'userId' => '@me', 'scope' => '@consumption', 'alt'=> 'json'}
)
status, _, _ = result.response
[status, {'Content-Type' => 'application/json'}, JSON.generate(result.data)]
end