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