diff --git a/app/controllers/services_controller.rb b/app/controllers/services_controller.rb index 9193b06f4..cbfb39d35 100644 --- a/app/controllers/services_controller.rb +++ b/app/controllers/services_controller.rb @@ -25,7 +25,7 @@ class ServicesController < ApplicationController flash[:notice] = I18n.t 'services.create.success' if current_user.getting_started - redirect_to getting_started_path(:step => 3) + redirect_to getting_started_path(:step => 1) else redirect_to services_url end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 761ac7924..be1b00253 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -78,15 +78,18 @@ class UsersController < ApplicationController @person = @user.person @profile = @user.profile @services = @user.services - @requests = Request.where(:recipient_id => @person.id).all + service = current_user.services.where(:type => "Services::Facebook").first @step = ((params[:step].to_i>0)&&(params[:step].to_i<5)) ? params[:step].to_i : 1 @step ||= 1 if @step == 3 - service = current_user.services.where(:type => "Services::Facebook").first - @friends = service ? service.finder : {} + @requests = Request.where(:recipient_id => @person.id).includes(:sender).all + @friends = service ? service.finder(:local => true) : {} + @friends.delete_if{|key, value| @requests.any?{ |r| r.sender_id == value[:person].id} } elsif @step == 4 + @invites = @user.invites + @friends = service ? service.finder(:remote => true) : {} @user.getting_started = false @user.save end diff --git a/app/models/services/facebook.rb b/app/models/services/facebook.rb index f0987a16f..a8f6def73 100644 --- a/app/models/services/facebook.rb +++ b/app/models/services/facebook.rb @@ -19,7 +19,7 @@ class Services::Facebook < Service super(post, MAX_CHARACTERS, url) end - def finder + 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'] @@ -45,9 +45,21 @@ class Services::Facebook < Service 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 = self.user.contacts.where(:person_id => person_ids_and_uids.keys) contact_objects.each{|c| data_h[person_ids_and_uids[c.person_id]][:contact] = c} + if opts[:local] + data_h.delete_if {|key, value| value[:person].nil? } + end + + if opts[:remote] + data_h.delete_if {|key, value| !value[:person].nil? } + end + data_h end end diff --git a/app/views/services/_remote_friend.html.haml b/app/views/services/_remote_friend.html.haml index fa28a2f91..90815db4a 100644 --- a/app/views/services/_remote_friend.html.haml +++ b/app/views/services/_remote_friend.html.haml @@ -2,7 +2,7 @@ -if friend[:person] = render :partial => 'people/person', :locals => {:person => friend[:person], :contact => friend[:contact], :request => friend[:request]} -else - .stream_element + .steam_element .right -if friend[:invitation_id] = t('invitations.new.already_invited') diff --git a/app/views/users/getting_started.html.haml b/app/views/users/getting_started.html.haml index 6c405dac2..67acb744a 100644 --- a/app/views/users/getting_started.html.haml +++ b/app/views/users/getting_started.html.haml @@ -38,10 +38,10 @@ = t('.edit_profile') %br - if @step != 3 - = link_to t('.define_aspects'), getting_started_path(:step => 3) + = link_to t('.connect_on_diaspora'), getting_started_path(:step => 3) - else %span.current_gs_step - = t('.define_aspects') + = t('.connect_on_diaspora') %br - if @step != 4 = link_to t('.finished'), getting_started_path(:step => 4) diff --git a/app/views/users/getting_started/_step_3.html.haml b/app/views/users/getting_started/_step_3.html.haml index de5cb05c7..33091cafc 100644 --- a/app/views/users/getting_started/_step_3.html.haml +++ b/app/views/users/getting_started/_step_3.html.haml @@ -8,20 +8,19 @@ = t('.your_aspects') .description = t('.description') - -if @requests.length > 0 - %br - = t('.your_inviter') - %br + %br + = t('.your_inviter') + %br + + #people_stream.stream + - for pending_req in @requests + - person = pending_req.sender + + = render :partial => 'people/person', :locals => {:request => pending_req, :person => person, :contact => nil} + - for fb_id in @friends.keys + - friend = @friends[fb_id] + = render :partial => 'people/person', :locals => {:request => friend[:request], :person => friend[:person], :contact => friend[:contact]} - #people_stream.stream - - for pending_req in @requests - - person = pending_req.sender - - = render :partial => 'people/person', :locals => {:request => pending_req, :person => person, :contact => nil} - -unless @friends.blank? - %br - .contact_list - = render :partial => 'services/finder', :locals => {:friends => @friends, :getting_started => true} .submit_block diff --git a/app/views/users/getting_started/_step_4.html.haml b/app/views/users/getting_started/_step_4.html.haml index 3661bf972..143e011bc 100644 --- a/app/views/users/getting_started/_step_4.html.haml +++ b/app/views/users/getting_started/_step_4.html.haml @@ -10,7 +10,13 @@ %ul.inline_aspect_listing - for aspect in @all_aspects %li= aspect - +-unless @friends.blank? + %br + = t('services.finder.invite_your_friends_from', :service => "facebook".titleize) + = t('shared.invitations.invitations_left', :count => @invites) + %br + .contact_list + = render :partial => 'services/finder', :locals => {:friends => @friends, :getting_started => true} %br %br diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml index 809560c6e..b04bdcab2 100644 --- a/config/locales/diaspora/en.yml +++ b/config/locales/diaspora/en.yml @@ -230,7 +230,7 @@ en: welcome: "Welcome to Diaspora!" signup_steps: "Finish your sign up by completing these three steps:" edit_profile: "Edit your profile" - define_aspects: "Define your aspects" + connect_on_diaspora: "Connect on Diaspora" connect_services: "Connect your other services" finished: "Finished!" skip: "skip getting started" diff --git a/spec/models/services/facebook_spec.rb b/spec/models/services/facebook_spec.rb index e67076a13..84cd5ad10 100644 --- a/spec/models/services/facebook_spec.rb +++ b/spec/models/services/facebook_spec.rb @@ -40,6 +40,10 @@ describe Services::Facebook do { "name": "#{@user2_fb_name}", "id": "#{@user2_fb_id}" + }, + { + "name": "Person to Invite", + "id": "abc123" } ] } @@ -54,12 +58,14 @@ JSON @service.finder end + + context 'returns a hash' do it 'returns a hash' do @service.finder.class.should == Hash end it 'contains a name' do - @service.finder.values.first[:name].should == @user2_fb_name + @service.finder["#{@user2_fb_id}"][:name].should == @user2_fb_name end it 'contains a photo url' do pending @@ -68,21 +74,44 @@ JSON @service.finder.include?(@user2_fb_id).should be_true end it 'contains a diaspora person object' do - @service.finder.values.first[:person].should == @user2.person + @service.finder["#{@user2_fb_id}"][:person].should == @user2.person end it 'caches the profile' do - @service.finder.values.first[:person].profile.loaded?.should be_true + @service.finder["#{@user2_fb_id}"][:person].profile.loaded?.should be_true end it 'does not include the person if the search is disabled' do p = @user2.person.profile p.searchable = false p.save - @service.finder.values.first[:person].should be_nil + @service.finder["#{@user2_fb_id}"][:person].should be_nil end + + it 'contains a request object if one has been sent' do + request = Request.diaspora_initialize(:from => @user2.person, :to => @user.person, :into => @user2.aspects.first) + Postzord::Receiver.new(@user, :object => request, :person => @user2.person).receive_object + Request.count.should == 1 + @service.finder["#{@user2_fb_id}"][:request].should == request + end + it 'contains a contact object if connected' do connect_users(@user, @user.aspects.first, @user2, @user2.aspects.first) - @service.finder.values.first[:contact].should == @user.reload.contact_for(@user2.person) + @service.finder["#{@user2_fb_id}"][:contact].should == @user.reload.contact_for(@user2.person) end + + context 'only local' do + it 'does not return people who are remote' do + @service.finder(:local => true)['abc123'].should be nil + @service.finder(:local => true)["#{@user2_fb_id}"].should_not be_nil + end + end + + context 'only remote' do + it 'does not return people who are remote' do + @service.finder(:remote => true)['abc123'].should_not be nil + @service.finder(:remote => true)["#{@user2_fb_id}"].should be_nil + end + end + context 'already invited' do before do @user2.invitation_service = 'facebook' @@ -91,14 +120,14 @@ JSON end it 'contains an invitation if invited' do @inv = Invitation.create(:sender => @user, :recipient => @user2, :aspect => @user.aspects.first) - @service.finder.values.first[:invitation_id].should == @inv.id + @service.finder["#{@user2_fb_id}"][:invitation_id].should == @inv.id end it 'does not find the user with a wrong identifier' do @user2.invitation_identifier = 'dsaofhnadsoifnsdanf' @user2.save @inv = Invitation.create(:sender => @user, :recipient => @user2, :aspect => @user.aspects.first) - @service.finder.values.first[:invitation_id].should be_nil + @service.finder["#{@user2_fb_id}"][:invitation_id].should be_nil end end end