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

95 lines
2.7 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']
TIME_RANGES = { "today" => 1 , "week" => 7, "month" => 30, "all" => 0}
TYPE_FILTERS = ['music_session_history', 'recording', 'all']
def self.index(user, params = {})
limit = params[:limit]
limit ||= 20
limit = limit.to_i
# 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
start = start.to_i
time_range = params[:time_range]
time_range ||= 'month'
raise "not valid time_range #{time_range}" unless TIME_RANGES.has_key?(time_range)
type_filter = params[:type]
type_filter ||= 'all'
raise "not valid type #{type_filter}" unless TYPE_FILTERS.include?(type_filter)
include_private = params[:include_private]
include_private ||= false # default to false
include_private = false if user.nil? # and force to false if the current user is nil
query = Feed.includes([:recording]).includes([:music_session_history]).limit(limit)
# handle sort
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
# handle time range
days = TIME_RANGES[time_range]
if days > 0
query = query.where("feeds.created_at > NOW() - '#{days} day'::INTERVAL")
end
# handle type filters
if type_filter == 'music_session_history'
query = query.where('music_session_id is not NULL')
elsif type_filter == 'recording'
query = query.where('recording_id is not NULL')
end
# handle private times
if include_private
else
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