almost done, need to figure out how whats the deal with the controller not being called

This commit is contained in:
zhitomirskiyi 2011-03-18 18:45:04 -07:00
parent 70d71ec491
commit dcc80d5b43
9 changed files with 113 additions and 64 deletions

View file

@ -0,0 +1,17 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
class SessionsController < Devise::SessionsController
after_filter :enqueue_update, :only => :create
protected
def enqueue_update
if current_user
pp params
current_user.services.each{|s|
Resque.enqueue(Job::UpdateServiceUsers, s.id) if s.respond_to? :save_friends
}
end
end
end

View file

@ -5,6 +5,7 @@
module Job
class UpdateServiceUsers < Base
@queue = :http_service
def self.perform_delegate(service_id)
service = Service.find(service_id)
service.save_friends

View file

@ -6,6 +6,7 @@ class Service < ActiveRecord::Base
include ActionView::Helpers::TextHelper
belongs_to :user
has_many :service_users
def public_message(post, length, url = "")
url = "" if post.respond_to?(:photos) && post.photos.count == 0

View file

@ -21,46 +21,16 @@ class Services::Facebook < Service
def finder(opts = {})
Rails.logger.debug("event=friend_finder type=facebook sender_id=#{self.user_id}")
response = RestClient.get("https://graph.facebook.com/me/friends", {:params => {:access_token => self.access_token}})
data = JSON.parse(response.body)['data']
data_h = {}
data.each do |d|
data_h[d['id']] = {:name => d['name']}
end
invitation_objects = Invitation.joins(:recipient).where(:sender_id => self.user_id,
:users => {:invitation_service => 'facebook',
:invitation_identifier => data_h.keys})
invitation_objects.each do |inv|
data_h[inv.recipient.invitation_identifier][:invitation_id] = inv.id
end
service_objects = Services::Facebook.where(:uid => data_h.keys).includes(:user => {:person => :profile})
person_ids_and_uids = {}
service_objects.each do |s|
data_h[s.uid][:person] = s.user.person if s.user.person.profile.searchable
person_ids_and_uids[s.user.person.id] = s.uid
end
requests = Request.where(:recipient_id => self.user.person.id, :sender_id => person_ids_and_uids.keys).all
requests.each{|r| data_h[person_ids_and_uids[r.sender_id]][:request] = r}
contact_objects = Contact.unscoped.where(:user_id => self.user.id, :person_id => person_ids_and_uids.keys)
contact_objects.each{|c| data_h[person_ids_and_uids[c.person_id]][:contact] = c}
Resque.enqueue(Job::UpdateServiceUsers, self.id)
person = Person.arel_table
service_user = ServiceUser.arel_table
if opts[:local]
data_h.delete_if {|key, value| value[:person].nil? }
ServiceUser.joins(:person).where(:service_id => self.id).where(person[:owner_id].not_eq(nil))
elsif opts[:remote]
ServiceUser.joins(:person).where(:service_id => self.id).where(person[:owner_id].eq(nil))
else
self.service_users
end
if opts[:remote]
data_h.delete_if {|key, value| !value[:person].nil? }
end
data_h
end
def save_friends
@ -68,7 +38,7 @@ class Services::Facebook < Service
{:fields => ['name', 'id', 'picture'], :access_token => self.access_token}})
data = JSON.parse(response.body)['data']
data.each{ |p|
ServiceUser.find_or_create(:service_id => self.id, :name => p["name"],
ServiceUser.find_or_create_by_service_id_and_name_and_uid_and_photo_url(:service_id => self.id, :name => p["name"],
:uid => p["id"], :photo_url => p["picture"])
}
end

View file

@ -54,11 +54,11 @@
\.
%p.submit
= f.submit t('.sign_in')
= f.submit t('devise.sessions.new.sign_in')
%span#remember_me
- if devise_mapping.rememberable?
= f.check_box :remember_me
= f.label :remember_me, t('.remember_me')
= f.label :remember_me, t('devise.sessions.new.remember_me')
- else
\.

View file

@ -13,10 +13,10 @@
%p
= f.label :password , t('password')
= f.password_field :password
= f.submit t('.sign_in')
= f.submit t('devise.sessions.new.sign_in')
- if devise_mapping.rememberable?
= f.check_box :remember_me
= f.label :remember_me, t('.remember_me')
= f.label :remember_me, t('devise.sessions.new.remember_me')
%p
= render :partial => "devise/shared/links"

View file

@ -47,6 +47,7 @@ Diaspora::Application.routes.draw do
devise_for :users, :controllers => {:registrations => "registrations",
:password => "devise/passwords",
:sessions => "sessions",
:invitations => "invitations"} do
get 'invitations/resend/:id' => 'invitations#resend', :as => 'invitation_resend'

View file

@ -0,0 +1,43 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
require 'spec_helper'
class Object
def id
super
end
end
describe SessionsController do
include Devise::TestHelpers
render_views
let(:mock_access_token) { Object.new }
let(:omniauth_auth) {
{ 'provider' => 'twitter',
'uid' => '2',
'user_info' => { 'nickname' => 'grimmin' },
'credentials' => { 'token' => 'tokin', 'secret' =>"not_so_much" }
}
}
before do
request.env["devise.mapping"] = Devise.mappings[:user]
@user = alice
@service = Services::Facebook.new(:access_token => "yeah")
@user.services << @service
@user.save
end
describe "#create" do
it 'queues up an update job' do
Resque.should_receive(:enqueue).with(Job::UpdateServiceUsers, @service.id)
post :create, {"user"=>{"remember_me"=>"0", "username"=>"alice",
"password"=>"evankorth"}}
end
end
end

View file

@ -27,11 +27,12 @@ describe Services::Facebook do
end
end
describe '#cache_friends' do
context 'finder' do
before do
@user2 = Factory.create(:user_with_aspect)
@user2_fb_id = '820651'
@user2_fb_name = 'Maxwell Salzberg'
@user2_fb_photo_url = "http://cdn.fn.com/pic1.jpg"
@user2_service = Services::Facebook.new(:uid => @user2_fb_id, :access_token => "yo")
@user2.services << @user2_service
@fb_list_hash = <<JSON
@ -40,7 +41,7 @@ describe Services::Facebook do
{
"name": "#{@user2_fb_name}",
"id": "#{@user2_fb_id}",
"picture": "http://cdn.fn.com/pic1.jpg"
"picture": "#{@user2_fb_photo_url}"
},
{
"name": "Person to Invite",
@ -55,29 +56,44 @@ JSON
RestClient.stub!(:get).and_return(@web_mock)
end
it 'requests a friend list' do
RestClient.should_receive(:get).with("https://graph.facebook.com/me/friends", {:params =>
{:fields => ['name', 'id', 'picture'], :access_token => @service.access_token}}).and_return(@web_mock)
@service.save_friends
end
describe '#save_friends' do
it 'requests a friend list' do
RestClient.should_receive(:get).with("https://graph.facebook.com/me/friends", {:params =>
{:fields => ['name', 'id', 'picture'], :access_token => @service.access_token}}).and_return(@web_mock)
@service.save_friends
end
it 'creates a service user objects' do
lambda{
@service.save_friends
}.should change(ServiceUser, :count).by(2)
end
context 'only local' do
it 'does not return people who are remote' do
@service.finder(:local => true).should be_empty
@service.finder(:local => true).should_not be_empty
it 'creates a service user objects' do
lambda{
@service.save_friends
}.should change(ServiceUser, :count).by(2)
end
end
context 'only remote' do
it 'does not return people who are remote' do
@service.finder(:remote => true).should_not be_empty
@service.finder(:remote => true).should be_empty
describe '#finder' do
it 'dispatches a resque job' do
Resque.should_receive(:enqueue).with(Job::UpdateServiceUsers, @service.id)
@service.finder
end
context 'opts' do
it 'only local does not return people who are remote' do
@service.save_friends
@service.finder(:local => true).all.each{|su| su.person.should == @user2.person}
end
it 'does not return people who are remote' do
@service.save_friends
@service.finder(:remote => true).all.each{|su| su.person.should be_nil}
end
it 'does not return wrong service objects' do
su2 = ServiceUser.create(:service => @user2_service, :uid => @user2_fb_id, :name => @user2_fb_name, :photo_url => @user2_fb_photo_url)
su2.person.should == @user2.person
@service.finder(:local => true).all.each{|su| su.service.should == @service}
@service.finder(:remote => true).all.each{|su| su.service.should == @service}
@service.finder.all.each{|su| su.service.should == @service}
end
end
end
end