diff --git a/ruby/lib/jam_ruby/models/feed.rb b/ruby/lib/jam_ruby/models/feed.rb index 36222ccc2..31794ab9f 100644 --- a/ruby/lib/jam_ruby/models/feed.rb +++ b/ruby/lib/jam_ruby/models/feed.rb @@ -5,32 +5,55 @@ module JamRuby belongs_to :recording, class_name: "JamRuby::Recording", inverse_of: :feed, foreign_key: 'recording_id' belongs_to :music_session_history, class_name: "JamRuby::MusicSessionHistory", inverse_of: :feed, foreign_key: 'music_session_id' - def self.index(params = {start:0, limit:20, sort: 'date'}) - - start = params[:start] - start ||= 0 + FIXNUM_MAX = (2**(0.size * 8 -2) -1) + SORT_TYPES = ['date', 'plays', 'likes'] + def self.index(params = {limit:20, sort: 'date'}) limit = params[:limit] limit ||= 20 # validate sort sort = params[:sort] sort ||= 'date' - raise "not valid sort #{sort}" unless ['date', 'plays', 'likes'].include?(sort) + raise "not valid sort #{sort}" unless SORT_TYPES.include?(sort) - query = Feed.includes(:recording => :plays).includes(:music_session_history => :plays).offset(start).limit(limit) + + start = params[:start] + if sort == 'date' + start ||= FIXNUM_MAX + else + start ||= 0 + end + + query = Feed.includes([:recording]).includes([:music_session_history]).limit(limit) if sort == 'date' + query = query.where("id < #{start}") query = query.order('id DESC') elsif sort == 'plays' + query = query.offset(start) query = query.order("COALESCE(recordings.play_count, music_sessions_history.play_count) DESC ") elsif sort == 'likes' + query = query.offset(start) query = query.order("COALESCE(recordings.like_count, music_sessions_history.like_count) DESC ") else raise "sort not implemented: #{sort}" end - query + #query = query.order('claimed_recordings.created_at') + + if query.length == 0 + [query, nil] + elsif query.length < limit + [query, nil] + else + if sort == 'date' + [query, query.last.id] + else + [query, start + limit] + end + end + end end end diff --git a/ruby/spec/jam_ruby/models/feed_spec.rb b/ruby/spec/jam_ruby/models/feed_spec.rb index 9190535ea..8f9ee2359 100644 --- a/ruby/spec/jam_ruby/models/feed_spec.rb +++ b/ruby/spec/jam_ruby/models/feed_spec.rb @@ -8,13 +8,14 @@ describe Feed do let (:user4) { FactoryGirl.create(:user) } it "no result" do - Feed.index().length.should == 0 + feeds, start = Feed.index() + feeds.length.should == 0 end it "one claimed recording" do claimed_recording = FactoryGirl.create(:claimed_recording) MusicSessionHistory.delete_all # the factory makes a music_session while making the recording/claimed_recording - feeds = Feed.index() + feeds, start = Feed.index() feeds.length.should == 1 feeds[0].recording == claimed_recording.recording end @@ -29,13 +30,13 @@ describe Feed do # verify the mess above only made one recording Recording.count.should == 1 - feeds = Feed.index() + feeds, start = Feed.index feeds.length.should == 1 end it "one music session" do music_session = FactoryGirl.create(:music_session) - feeds = Feed.index() + feeds, start = Feed.index feeds.length.should == 1 feeds[0].music_session_history == music_session.music_session_history end @@ -44,7 +45,7 @@ describe Feed do it "sorts by index (date) DESC" do claimed_recording = FactoryGirl.create(:claimed_recording) - feeds = Feed.index() + feeds, start = Feed.index feeds.length.should == 2 feeds[0].recording.should == claimed_recording.recording feeds[1].music_session_history.should == claimed_recording.recording.music_session.music_session_history @@ -56,13 +57,13 @@ describe Feed do FactoryGirl.create(:recording_play, recording: claimed_recording1.recording, user:claimed_recording1.user) - feeds = Feed.index(:sort => 'plays') + feeds, start = Feed.index(:sort => 'plays') feeds.length.should == 4 FactoryGirl.create(:recording_play, recording: claimed_recording2.recording, user:claimed_recording1.user) FactoryGirl.create(:recording_play, recording: claimed_recording2.recording, user:claimed_recording2.user) - feeds = Feed.index(:sort => 'plays') + feeds, start = Feed.index(:sort => 'plays') feeds.length.should == 4 feeds[0].recording.should == claimed_recording2.recording feeds[1].recording.should == claimed_recording1.recording @@ -72,7 +73,7 @@ describe Feed do FactoryGirl.create(:music_session_play, music_session: claimed_recording1.recording.music_session.music_session_history, user: user3) - feeds = Feed.index(:sort => 'plays') + feeds, start = Feed.index(:sort => 'plays') feeds.length.should == 4 feeds[0].music_session_history.should == claimed_recording1.recording.music_session.music_session_history feeds[1].recording.should == claimed_recording2.recording @@ -85,13 +86,13 @@ describe Feed do FactoryGirl.create(:recording_like, recording: claimed_recording1.recording, user:claimed_recording1.user) - feeds = Feed.index(:sort => 'likes') + feeds, start = Feed.index(:sort => 'likes') feeds.length.should == 4 FactoryGirl.create(:recording_like, recording: claimed_recording2.recording, user:claimed_recording1.user) FactoryGirl.create(:recording_like, recording: claimed_recording2.recording, user:claimed_recording2.user) - feeds = Feed.index(:sort => 'likes') + feeds, start = Feed.index(:sort => 'likes') feeds.length.should == 4 feeds[0].recording.should == claimed_recording2.recording feeds[1].recording.should == claimed_recording1.recording @@ -100,7 +101,7 @@ describe Feed do FactoryGirl.create(:music_session_like, music_session_history: claimed_recording1.recording.music_session.music_session_history, user: user2) FactoryGirl.create(:music_session_like, music_session_history: claimed_recording1.recording.music_session.music_session_history, user: user3) - feeds = Feed.index(:sort => 'likes') + feeds, start = Feed.index(:sort => 'likes') feeds.length.should == 4 feeds[0].music_session_history.should == claimed_recording1.recording.music_session.music_session_history feeds[1].recording.should == claimed_recording2.recording @@ -109,22 +110,65 @@ describe Feed do end describe "pagination" do - it "supports pagination" do + it "supports date pagination" do claimed_recording = FactoryGirl.create(:claimed_recording) options = {limit: 1} - feeds = Feed.index(options) + feeds, start = Feed.index(options) feeds.length.should == 1 feeds[0].recording.should == claimed_recording.recording - options[:start] = 1 - feeds = Feed.index(options) + options[:start] = start + feeds, start = Feed.index(options) feeds.length.should == 1 feeds[0].music_session_history.should == claimed_recording.recording.music_session.music_session_history - options[:start] = 2 - feeds = Feed.index(options) + options[:start] = start + feeds, start = Feed.index(options) feeds.length.should == 0 + start.should be_nil + end + + it "supports likes pagination" do + claimed_recording1 = FactoryGirl.create(:claimed_recording) + + FactoryGirl.create(:music_session_like, music_session_history: claimed_recording1.recording.music_session.music_session_history, user: user1) + + options = {limit: 1, sort: 'likes'} + feeds, start = Feed.index(options) + feeds.length.should == 1 + feeds[0].music_session_history.should == claimed_recording1.recording.music_session.music_session_history + + options[:start] = start + feeds, start = Feed.index(options) + feeds.length.should == 1 + feeds[0].recording.should == claimed_recording1.recording + + options[:start] = start + feeds, start = Feed.index(options) + feeds.length.should == 0 + start.should be_nil + end + + it "supports plays pagination" do + claimed_recording1 = FactoryGirl.create(:claimed_recording) + + FactoryGirl.create(:music_session_play, music_session: claimed_recording1.recording.music_session.music_session_history, user: user1) + + options = {limit: 1, sort: 'plays'} + feeds, start = Feed.index(options) + feeds.length.should == 1 + feeds[0].music_session_history.should == claimed_recording1.recording.music_session.music_session_history + + options[:start] = start + feeds, start = Feed.index(options) + feeds.length.should == 1 + feeds[0].recording.should == claimed_recording1.recording + + options[:start] = start + feeds, start = Feed.index(options) + feeds.length.should == 0 + start.should be_nil end end diff --git a/web/app/assets/javascripts/sessionModel.js b/web/app/assets/javascripts/sessionModel.js index 419e8c920..3f38d4b9e 100644 --- a/web/app/assets/javascripts/sessionModel.js +++ b/web/app/assets/javascripts/sessionModel.js @@ -263,7 +263,6 @@ $.each(joins, function(i,v) { if (v.client_id != clientId) { - client.ParticipantJoined(newSession, v); } }); diff --git a/web/app/controllers/api_feeds_controller.rb b/web/app/controllers/api_feeds_controller.rb index 0695fb8d2..f65ce3295 100644 --- a/web/app/controllers/api_feeds_controller.rb +++ b/web/app/controllers/api_feeds_controller.rb @@ -3,26 +3,10 @@ class ApiFeedsController < ApiController respond_to :json def index - # parse out since parameter - since = params[:since] - if since - start, limit = since.split(':') - start = start.to_i - limit = limit.to_i - else - start = 0 - limit = 20 - end - - limit = params[:limit].to_i if params[:limit] # override limit if specified - - @feeds = Feed.index({user: current_user, start: start, limit: limit}) - - if @feeds.length < limit - @next = nil - else - @next = "#{start + limit}:#{limit}" - end + @feeds, @next = Feed.index(user: current_user, + start: params[:since], + limit: params[:limit], + sort: params[:sort]) render "api_feeds/index", :layout => nil end diff --git a/web/app/views/clients/_createSession.html.erb b/web/app/views/clients/_createSession.html.erb index 0d228335b..093427176 100644 --- a/web/app/views/clients/_createSession.html.erb +++ b/web/app/views/clients/_createSession.html.erb @@ -49,7 +49,7 @@