60 lines
1.6 KiB
Ruby
60 lines
1.6 KiB
Ruby
|
|
module JamRuby
|
|
class Feed < ActiveRecord::Base
|
|
|
|
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'
|
|
|
|
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 SORT_TYPES.include?(sort)
|
|
|
|
|
|
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.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
|