From 0a831cfbf4102ebdac4589c09aaa9c7ad2759ecf Mon Sep 17 00:00:00 2001 From: maxwell <maxwell@joindiaspora.com> Date: Fri, 3 Dec 2010 19:33:54 -0800 Subject: [PATCH] invites are now on the queue --- app/controllers/invitations_controller.rb | 25 ++++------ app/models/invitation.rb | 1 + app/models/jobs/invite_user.rb | 9 ++++ app/models/jobs/receive_salmon.rb | 1 - app/models/user.rb | 16 +++---- config/environments/test.rb | 1 - features/support/env.rb | 14 +++++- .../invitations_controller_spec.rb | 47 +++++++++---------- spec/controllers/publics_controller_spec.rb | 1 + spec/models/user/invite_spec.rb | 8 +--- spec/spec_helper.rb | 4 +- 11 files changed, 63 insertions(+), 64 deletions(-) create mode 100644 app/models/jobs/invite_user.rb diff --git a/app/controllers/invitations_controller.rb b/app/controllers/invitations_controller.rb index e4560c0a3d..ac17fc56be 100644 --- a/app/controllers/invitations_controller.rb +++ b/app/controllers/invitations_controller.rb @@ -13,30 +13,21 @@ class InvitationsController < Devise::InvitationsController redirect_to :back return end - begin params[:user][:aspect_id] = params[:user].delete(:aspects) message = params[:user].delete(:invite_messages) params[:user][:invite_message] = message unless message == "" - emails = params[:user][:email].split(/, */) - invited_users = emails.map { |e| current_user.invite_user(params[:user].merge({:email => e}))} - good_users, rejected_users = invited_users.partition {|u| u.persisted? } - flash[:notice] = I18n.t('invitations.create.sent') + good_users.map{|x| x.email}.join(', ') - if rejected_users.any? - flash[:error] = I18n.t('invitations.create.rejected') + rejected_users.map{|x| x.email}.join(', ') - end - rescue RuntimeError => e - if e.message == "You have no invites" - flash[:error] = I18n.t 'invitations.create.no_more' - elsif e.message == "You already invited this person" - flash[:error] = I18n.t 'invitations.create.already_sent' - elsif e.message == "You are already connected to this person" - flash[:error] = I18n.t 'invitations.create.already_contacts' + good_emails, bad_emails = emails.partition{|e| e.try(:match, Devise.email_regexp)} + + good_emails.each{|e| Resque.enqueue(Jobs::InviteUser, current_user.id, params[:user].merge({:email => e}))} + + if bad_emails.any? + flash[:error] = I18n.t('invitations.create.sent') + good_emails.join(', ') + " "+ I18n.t('invitations.create.rejected') + bad_emails.join(', ') else - raise e + flash[:notice] = I18n.t('invitations.create.sent') + good_emails.join(', ') end - end + redirect_to :back end diff --git a/app/models/invitation.rb b/app/models/invitation.rb index 87300430a8..88174d0812 100644 --- a/app/models/invitation.rb +++ b/app/models/invitation.rb @@ -50,6 +50,7 @@ class Invitation invitee.reload end + invitee.serialized_private_key ||= User.generate_key invitee.send(:generate_invitation_token) invitee.invite! Rails.logger.info("event=invitation_sent to=#{opts[:email]} #{"inviter=#{opts[:from].diaspora_handle}" if opts[:from]}") diff --git a/app/models/jobs/invite_user.rb b/app/models/jobs/invite_user.rb new file mode 100644 index 0000000000..f302e5e1c4 --- /dev/null +++ b/app/models/jobs/invite_user.rb @@ -0,0 +1,9 @@ +module Jobs + class InviteUser + @queue = :email + def self.perform(sender_id, params) + user = User.find(sender_id) + user.invite_user(params) + end + end +end diff --git a/app/models/jobs/receive_salmon.rb b/app/models/jobs/receive_salmon.rb index 344ac27a52..b529bd7bef 100644 --- a/app/models/jobs/receive_salmon.rb +++ b/app/models/jobs/receive_salmon.rb @@ -7,4 +7,3 @@ module Jobs end end end - diff --git a/app/models/user.rb b/app/models/user.rb index fad092f691..792a3c9034 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -364,18 +364,14 @@ class User ###Invitations############ def invite_user(opts = {}) aspect_id = opts.delete(:aspect_id) - if aspect_id == nil - raise "Must invite into aspect" - end aspect_object = self.aspects.find_by_id(aspect_id) - if !(aspect_object) - raise "Must invite to your aspect" - else + if aspect_object Invitation.invite(:email => opts[:email], :from => self, :into => aspect_object, :message => opts[:invite_message]) - + else + false end end @@ -419,10 +415,10 @@ class User self.person = Person.new(opts[:person]) self.person.diaspora_handle = "#{opts[:username]}@#{APP_CONFIG[:terse_pod_url]}" self.person.url = APP_CONFIG[:pod_url] - new_key = User.generate_key - self.serialized_private_key = new_key - self.person.serialized_public_key = new_key.public_key + + self.serialized_private_key ||= User.generate_key + self.person.serialized_public_key = OpenSSL::PKey::RSA.new(self.serialized_private_key).public_key self end diff --git a/config/environments/test.rb b/config/environments/test.rb index 0c5f85bdf4..8efa799184 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -43,5 +43,4 @@ begin rescue LoadError => ignore_if_database_cleaner_not_present puts "Error on cleaner" end - end diff --git a/features/support/env.rb b/features/support/env.rb index 369af70114..a4ae3502bd 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -45,7 +45,19 @@ end require File.join(File.dirname(__FILE__), "..", "..", "spec", "helper_methods") include HelperMethods +class User +def send_contact_request_to(desired_contact, aspect) + request = Request.instantiate(:to => desired_contact, + :from => self.person, + :into => aspect) + if request.save! + dispatch_request request + end + request + end +end + Before do UserFixer.regenerate_user_fixtures UserFixer.load_user_fixtures -end \ No newline at end of file +end diff --git a/spec/controllers/invitations_controller_spec.rb b/spec/controllers/invitations_controller_spec.rb index 71bee9aba3..2efaf3f90a 100644 --- a/spec/controllers/invitations_controller_spec.rb +++ b/spec/controllers/invitations_controller_spec.rb @@ -14,6 +14,20 @@ describe InvitationsController do before do request.env["devise.mapping"] = Devise.mappings[:user] + module Resque + def enqueue(mod, *args) + mod.send(:perform, *args) + end + end + end + + after do + module Resque + def enqueue(mod, *args) + true + end + end + end @@ -22,42 +36,23 @@ describe InvitationsController do user.invites = 5 sign_in :user, user - @invite = {:invite_messages=>"test", :aspects=> aspect.id.to_s, :email=>"abc@example.com"} + @invite = {:invite_message=>"test", :aspect_id=> aspect.id.to_s, :email=>"abc@example.com"} @controller.stub!(:current_user).and_return(user) request.env["HTTP_REFERER"]= 'http://test.host/cats/foo' end - it 'invites the requested user' do - user.should_receive(:invite_user).and_return(make_user) - post :create, :user => @invite - end - - it 'creates an invitation' do - lambda{ - post :create, :user => @invite - }.should change(Invitation, :count).by(1) - end - - it 'creates an invited user with five invites' do - lambda{ - post :create, :user => @invite - }.should change(User, :count).by(1) - User.find_by_email("abc@example.com").invites.should == 5 + it 'should call the resque job Jobs::InviteUser' do + Resque.should_receive(:enqueue) + post :create, :user => @invite end - + it 'can handle a comma seperated list of emails' do - lambda { - post :create, :user => @invite.merge(:email => "foofoofoofoo@example.com, mbs@gmail.com") - }.should change(User, :count).by(2) + Resque.should_receive(:enqueue).twice() + post :create, :user => @invite.merge(:email => "foofoofoofoo@example.com, mbs@gmail.com") end it 'displays a message that tells you how many invites were sent, and which REJECTED' do post :create, :user => @invite.merge(:email => "mbs@gmail.com, foo@bar.com, foo.com, lala@foo, cool@bar.com") - flash[:notice].should_not be_empty - flash[:notice].should =~ /mbs@gmail\.com/ - flash[:notice].should =~ /foo@bar\.com/ - flash[:notice].should =~ /cool@bar\.com/ - flash[:error].should_not be_empty flash[:error].should =~ /foo\.com/ flash[:error].should =~ /lala@foo/ diff --git a/spec/controllers/publics_controller_spec.rb b/spec/controllers/publics_controller_spec.rb index 58a6e1b062..52284f429a 100644 --- a/spec/controllers/publics_controller_spec.rb +++ b/spec/controllers/publics_controller_spec.rb @@ -14,6 +14,7 @@ describe PublicsController do let(:xml) { "<walruses></walruses>" } context 'success cases' do it 'should 200 on successful receipt of a request' do + Resque.should_receive(:enqueue) post :receive, :id =>user.person.id, :xml => xml response.code.should == '200' end diff --git a/spec/models/user/invite_spec.rb b/spec/models/user/invite_spec.rb index c6e560d0e3..3cae2580b5 100644 --- a/spec/models/user/invite_spec.rb +++ b/spec/models/user/invite_spec.rb @@ -14,15 +14,11 @@ describe User do context "creating invites" do it 'requires an apect' do - proc{ - inviter.invite_user(:email => "maggie@example.com") - }.should raise_error /Must invite into aspect/ + inviter.invite_user(:email => "maggie@example.com").should == false end it 'requires your aspect' do - proc{ - inviter.invite_user(:email => "maggie@example.com", :aspect_id => wrong_aspect.id) - }.should raise_error /Must invite to your aspect/ + inviter.invite_user(:email => "maggie@example.com", :aspect_id => wrong_aspect.id).should == false end it 'calls Invitation.invite' do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index a642a265bc..5e18a770c9 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -46,8 +46,8 @@ module Resque end end -module Diaspora::UserModules::Connecting - def send_contact_request_to(desired_contact, aspect) +class User +def send_contact_request_to(desired_contact, aspect) request = Request.instantiate(:to => desired_contact, :from => self.person, :into => aspect) -- GitLab