jam-cloud/ruby/lib/jam_ruby/models/feed.rb

79 lines
2.3 KiB
Ruby
Raw Normal View History

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']
2014-02-18 20:12:50 +00:00
TIME_RANGES = ['today', 'week', 'month', 'all']
TYPE_FILTERS = ['session', 'recording', 'all']
2014-02-17 23:26:17 +00:00
2014-02-18 20:12:50 +00:00
def self.index(params = {})
2014-02-17 23:26:17 +00:00
limit = params[:limit]
limit ||= 20
2014-02-18 20:12:50 +00:00
limit = limit.to_i
2014-02-17 23:26:17 +00:00
# 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
2014-02-18 20:12:50 +00:00
start = start.to_i
time_range = params[:time_range]
time_range ||= 'month'
raise "not valid time_range #{time_range}" unless TIME_RANGES.include?(time_range)
type_filter = params[:type]
type_filter ||= 'all'
raise "not valid type #{type_filter}" unless TYPE_FILTERS.include?(type_filter)
2014-02-17 23:26:17 +00:00
query = Feed.includes([:recording]).includes([:music_session_history]).limit(limit)
2014-02-18 20:12:50 +00:00
# handle sort
2014-02-17 23:26:17 +00:00
if sort == 'date'
query = query.where("id < #{start}")
2014-02-17 23:26:17 +00:00
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}"
2014-02-17 23:26:17 +00:00
end
2014-02-18 20:12:50 +00:00
# handle time range
# handle type filters
if type_filter == 'session'
query = query.where('music_session_id is not NULL')
elsif type_filter == 'recording'
query = query.where('recording_id is not NULL')
end
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