almost done, need to figure out how whats the deal with the controller not being called
This commit is contained in:
parent
70d71ec491
commit
dcc80d5b43
9 changed files with 113 additions and 64 deletions
17
app/controllers/sessions_controller.rb
Normal file
17
app/controllers/sessions_controller.rb
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
\.
|
||||
|
||||
|
|
@ -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"
|
||||
|
|
@ -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'
|
||||
|
|
|
|||
43
spec/controllers/sessions_controller_spec.rb
Normal file
43
spec/controllers/sessions_controller_spec.rb
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue