diff --git a/ruby/lib/jam_ruby/app/mailers/user_mailer.rb b/ruby/lib/jam_ruby/app/mailers/user_mailer.rb index e8785e81c..9afebd965 100644 --- a/ruby/lib/jam_ruby/app/mailers/user_mailer.rb +++ b/ruby/lib/jam_ruby/app/mailers/user_mailer.rb @@ -78,5 +78,15 @@ format.html end end + + def new_musicians(user, new_nearby) + @user, @new_nearby = user, new_nearby + sendgrid_unique_args :type => "new_musicians" + mail(:to => user.email, :subject => "JamKazam New Musicians in Your Area") do |format| + format.text + format.html + end + end + end end diff --git a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.html.erb b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.html.erb new file mode 100644 index 000000000..104eaab6e --- /dev/null +++ b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.html.erb @@ -0,0 +1,5 @@ +<% provide(:title, 'Confirm Email') %> + +
New JamKazam Musicians in your Area, <%= @user.first_name %>!
+ + diff --git a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.text.erb b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.text.erb new file mode 100644 index 000000000..7c127fe37 --- /dev/null +++ b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.text.erb @@ -0,0 +1,5 @@ +<% provide(:title, 'Confirm Email') %> + +New JamKazam Musicians in your Area, <%= @user.first_name %>! + + diff --git a/ruby/lib/jam_ruby/models/search.rb b/ruby/lib/jam_ruby/models/search.rb index cdfcb8d53..8ee7ea767 100644 --- a/ruby/lib/jam_ruby/models/search.rb +++ b/ruby/lib/jam_ruby/models/search.rb @@ -250,16 +250,14 @@ module JamRuby false end - def self.new_musicians(since_date=Time.now - 1.week, max_count=100, radius=M_MILES_DEFAULT) + def self.new_musicians(usr, since_date=Time.now - 1.week, max_count=50, radius=M_MILES_DEFAULT) return unless block_given? - User.where(['lat IS NOT NULL AND lng IS NOT NULL']).find_each do |usr| - rel = User.musicians - .where(['created_at >= ? AND users.id != ?', since_date, usr.id]) - .within(radius, :origin => [usr.lat, usr.lng]) - .order('created_at DESC') - .limit(max_count) - yield(rel) if 0 < rel.count - end + rel = User.musicians + .where(['created_at >= ? AND users.id != ?', since_date, usr.id]) + .within(radius, :origin => [usr.lat, usr.lng]) + .order('created_at DESC') + .limit(max_count) + yield(rel) if 0 < rel.count end end diff --git a/ruby/lib/jam_ruby/models/user.rb b/ruby/lib/jam_ruby/models/user.rb index a07554d81..5a4d7debc 100644 --- a/ruby/lib/jam_ruby/models/user.rb +++ b/ruby/lib/jam_ruby/models/user.rb @@ -139,7 +139,8 @@ module JamRuby validate :update_email_case_insensitive_uniqueness, :if => :updating_email scope :musicians, where(:musician => true) - scope :musicians_geocoded, where(['musician = ? AND lat IS NOT NULL AND lng IS NOT NULL',true]) + scope :geocoded_users, where(['lat IS NOT NULL AND lng IS NOT NULL']) + scope :musicians_geocoded, musicians.geocoded_users def user_progression_fields @user_progression_fields ||= Set.new ["first_downloaded_client_at", "first_ran_client_at", "first_music_session_at", "first_real_music_session_at", "first_good_music_session_at", "first_certified_gear_at", "first_invited_at", "first_friended_at", "first_social_promoted_at" ] @@ -988,6 +989,14 @@ module JamRuby .order('follows.created_at DESC') .limit(3) end + + def self.deliver_new_musician_notifications + self.geocoded_users.find_each do |usr| + Search.new_musicians(usr) do |new_nearby| + UserMailer.password_changed(self, new_nearby).deliver + end + end + end # devise compatibility diff --git a/ruby/spec/jam_ruby/models/musician_search_spec.rb b/ruby/spec/jam_ruby/models/musician_search_spec.rb index e86bd5db4..6eda4ae28 100644 --- a/ruby/spec/jam_ruby/models/musician_search_spec.rb +++ b/ruby/spec/jam_ruby/models/musician_search_spec.rb @@ -204,15 +204,31 @@ describe 'Musician search' do end context 'new users' do + it "find nearby" do - # create new user to ensure its excluded from results - usr = FactoryGirl.create(:user, {city: "Austin", state: "TX", country: "US"}) - Search.new_musicians do |usrs| - # the newly created user is not nearby the existing users (which are in Apex, NC) - # and that user is not included in query - expect(usrs.count).to eq(User.musicians.count - 1) + # create new user outside 500 from Apex to ensure its excluded from results + FactoryGirl.create(:user, {city: "Austin", state: "TX", country: "US"}) + User.geocoded_users.find_each do |usr| + Search.new_musicians(usr) do |new_usrs| + # the newly created user is not nearby the existing users (which are in Apex, NC) + # and that user is not included in query + expect(new_usrs.count).to eq(User.musicians.count - 1) + end end end + + it "sends new musician email" do + # create new user outside 500 from Apex to ensure its excluded from results + FactoryGirl.create(:user, {city: "Austin", state: "TX", country: "US"}) + User.geocoded_users.find_each do |usr| + Search.new_musicians(usr) do |new_usrs| + # the newly created user is not nearby the existing users (which are in Apex, NC) + # and that user is not included in query + expect(new_usrs.count).to eq(User.musicians.count - 1) + end + end + end + end end diff --git a/ruby/spec/mailers/user_mailer_spec.rb b/ruby/spec/mailers/user_mailer_spec.rb index 77f48e0c4..30ecc52af 100644 --- a/ruby/spec/mailers/user_mailer_spec.rb +++ b/ruby/spec/mailers/user_mailer_spec.rb @@ -137,4 +137,23 @@ describe UserMailer do end + describe "sends new musicians email" do + + let(:mail) { UserMailer.deliveries[0] } + + before(:each) do + UserMailer.new_musicians(user, User.musicians).deliver + end + + it { UserMailer.deliveries.length.should == 1 } + + it { mail['from'].to_s.should == UserMailer::DEFAULT_SENDER } + it { mail['to'].to_s.should == user.email } + it { mail.multipart?.should == true } # because we send plain + html + + # verify that the messages are correctly configured + it { mail.html_part.body.include?("New JamKazam Musicians in your Area").should be_true } + it { mail.text_part.body.include?("New JamKazam Musicians in your Area").should be_true } + end + end