diff --git a/db/manifest b/db/manifest index 81e889eef..48157c8e2 100755 --- a/db/manifest +++ b/db/manifest @@ -111,3 +111,4 @@ feed.sql like_follower_poly_assoc.sql feed_use_recording.sql feed_autoincrement_primary_key.sql +music_session_plays.sql diff --git a/ruby/lib/jam_ruby.rb b/ruby/lib/jam_ruby.rb index fb4db7331..620fb52d7 100755 --- a/ruby/lib/jam_ruby.rb +++ b/ruby/lib/jam_ruby.rb @@ -118,6 +118,7 @@ require "jam_ruby/models/icecast_template_socket" require "jam_ruby/models/icecast_server_group" require "jam_ruby/models/icecast_mount_template" require "jam_ruby/models/facebook_signup" +require "jam_ruby/models/recordings_plays" require "jam_ruby/models/feed" diff --git a/ruby/lib/jam_ruby/models/feed.rb b/ruby/lib/jam_ruby/models/feed.rb index 21e373966..39f32fef1 100644 --- a/ruby/lib/jam_ruby/models/feed.rb +++ b/ruby/lib/jam_ruby/models/feed.rb @@ -5,8 +5,27 @@ 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}) - Feed.includes(:recording).includes(:music_session_history).order('created_at DESC').offset(params[:start]).limit(params[:limit]) + def self.index(params = {start:0, limit:20, sort: 'date'}) + + start = params[:start] + start ||= 0 + + limit = params[:limit] + limit ||= 20 + + # validate sort + sort = params[:sort] + sort ||= 'date' + raise "not valid sort #{sort}" unless ['date', 'plays', 'likes'].include?(sort) + + query = Feed.includes(:recording).includes(:music_session_history).offset(start).limit(limit) + if sort == 'date' + query = query.order('id DESC') + else + throw "not implemented" + end + + query end end end diff --git a/ruby/spec/factories.rb b/ruby/spec/factories.rb index b52117c26..9db288300 100644 --- a/ruby/spec/factories.rb +++ b/ruby/spec/factories.rb @@ -368,4 +368,8 @@ FactoryGirl.define do sequence(:token) { |n| "token-#{n}"} token_expires_at Time.now end + + factory :recordings_plays, :class => JamRuby::RecordingsPlays do + + end end diff --git a/ruby/spec/jam_ruby/models/feed_spec.rb b/ruby/spec/jam_ruby/models/feed_spec.rb index 7b81ba384..5b1dbb586 100644 --- a/ruby/spec/jam_ruby/models/feed_spec.rb +++ b/ruby/spec/jam_ruby/models/feed_spec.rb @@ -35,11 +35,35 @@ describe Feed do feeds[0].music_session_history == music_session.music_session_history end + describe "sorting" do + it "sorts by index (date) DESC" do + claimed_recording = FactoryGirl.create(:claimed_recording) + + feeds = 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 + end + + it "sort by plays DESC" do + claimed_recording1 = FactoryGirl.create(:claimed_recording) + claimed_recording2 = FactoryGirl.create(:claimed_recording) + MusicSessionHistory.delete_all + + FactoryGirl.create(:recordings_plays, recording: claimed_recording1.recording, player:claimed_recording1.user) + + feeds = Feed.index(:sort => 'plays') + + feeds.length.should == 2 + feeds[0].recording.should == claimed_recording1.recording + feeds[1].recording.should == claimed_recording2.recording + + end + end + describe "pagination" do it "supports pagination" do claimed_recording = FactoryGirl.create(:claimed_recording) - claimed_recording.recording.created_at = 3.days.ago - claimed_recording.recording.save! options = {limit: 1} feeds = Feed.index(options) diff --git a/ruby/spec/jam_ruby/models/recordings_plays.rb b/ruby/spec/jam_ruby/models/recordings_plays.rb new file mode 100644 index 000000000..401358154 --- /dev/null +++ b/ruby/spec/jam_ruby/models/recordings_plays.rb @@ -0,0 +1,17 @@ +module JamRuby + class RecordingsPlays < ActiveRecord::Base + + + self.table_name = "recordings_plays" + + self.primary_key = 'id' + + belongs_to :recording, + class_name: "JamRuby::Recording", + foreign_key: "recording_id" + + belongs_to :player, + class_name: "JamRuby::User", + foreign_key: "player_id" + end +end