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

135 lines
6.0 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'
2014-05-06 13:34:38 +00:00
belongs_to :music_session, class_name: "JamRuby::MusicSession", 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}
2014-05-06 13:34:38 +00:00
TYPE_FILTERS = ['music_session', 'recording', 'all']
2014-02-17 23:26:17 +00:00
2014-02-20 03:23:38 +00:00
def self.index(user, 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)
2014-02-18 20:12:50 +00:00
time_range = params[:time_range]
time_range ||= 'all'
raise "not valid time_range #{time_range}" unless TIME_RANGES.has_key?(time_range)
2014-02-18 20:12:50 +00:00
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
target_user = params[:user]
target_band = params[:band]
2014-02-20 03:23:38 +00:00
2020-12-08 15:59:29 +00:00
# TODO: SPEED UP QUERY. CURRENTLY TAKES FOR EVER.
#if target_user or target_band
# return { query: [], next_page: nil}
#end
2020-12-08 15:59:29 +00:00
2014-05-06 13:34:38 +00:00
#query = Feed.includes([:recording]).includes([:music_session]).limit(limit)
query = Feed.joins("LEFT OUTER JOIN recordings ON recordings.id = feeds.recording_id")
2014-05-06 22:50:41 +00:00
.joins("LEFT OUTER JOIN music_sessions ON music_sessions.id = feeds.music_session_id")
.limit(limit)
2020-04-21 14:04:30 +00:00
.where('feeds.recording_id is NULL OR (recordings.all_discarded = false AND recordings.deleted = false)') # remove any 'all_discarded recordings from the search results' or 'deleted'
2020-10-19 15:31:25 +00:00
2020-10-14 02:05:08 +00:00
query = Search.scope_schools_together_feeds(query, user)
2014-02-18 20:12:50 +00:00
# handle sort
2014-02-17 23:26:17 +00:00
if sort == 'date'
2020-04-21 16:21:23 +00:00
query = query.order('feeds.id DESC')
elsif sort == 'plays'
2020-04-21 16:21:23 +00:00
query = query.order("COALESCE(recordings.play_count, music_sessions.play_count) DESC")
elsif sort == 'likes'
2020-04-21 16:21:23 +00:00
query = query.order("COALESCE(recordings.like_count, music_sessions.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
days = TIME_RANGES[time_range]
if days > 0
query = query.where("feeds.created_at > NOW() - '#{days} day'::INTERVAL")
end
2014-02-18 20:12:50 +00:00
# handle type filters
2014-05-06 13:34:38 +00:00
if type_filter == 'music_session'
query = query.where('feeds.music_session_id is not NULL')
2014-02-18 20:12:50 +00:00
elsif type_filter == 'recording'
query = query.where('feeds.recording_id is not NULL')
2014-02-18 20:12:50 +00:00
end
2014-02-20 03:23:38 +00:00
if target_user
query = query.joins("LEFT OUTER JOIN claimed_recordings ON recordings.id = claimed_recordings.recording_id AND claimed_recordings.discarded = FALSE AND (claimed_recordings.user_id = '#{target_user}' OR (recordings.band_id IN (SELECT band_id FROM bands_musicians where user_id='#{target_user}')))")
query = query.joins("LEFT OUTER JOIN music_sessions_user_history ON music_sessions.id = music_sessions_user_history.music_session_id AND music_sessions_user_history.user_id = '#{target_user}'")
2020-04-21 14:04:30 +00:00
query = query.group("feeds.id")
if sort == 'plays'
2014-05-06 22:50:41 +00:00
query = query.group("COALESCE(recordings.play_count, music_sessions.play_count)")
elsif sort == 'likes'
2014-05-06 22:50:41 +00:00
query = query.group("COALESCE(recordings.like_count, music_sessions.like_count)")
end
2020-04-21 14:04:30 +00:00
query = query.where('feeds.recording_id is NULL OR claimed_recordings.id IS NOT NULL')
query = query.where('feeds.music_session_id is NULL OR music_sessions_user_history.id IS NOT NULL')
elsif target_band
2020-04-21 14:04:30 +00:00
query = query.joins("LEFT OUTER JOIN claimed_recordings ON feeds.recording_id = claimed_recordings.recording_id AND claimed_recordings.discarded = FALSE AND recordings.band_id = '#{target_band}'")
query = query.where("feeds.music_session_id IS NULL OR music_sessions.band_id = '#{target_band}'")
query = query.group("feeds.id")
if sort == 'plays'
2014-05-06 22:50:41 +00:00
query = query.group("COALESCE(recordings.play_count, music_sessions.play_count)")
elsif sort == 'likes'
2014-05-06 22:50:41 +00:00
query = query.group("COALESCE(recordings.like_count, music_sessions.like_count)")
end
2020-04-21 14:04:30 +00:00
query = query.where('feeds.recording_id is NULL OR claimed_recordings.id IS NOT NULL')
2014-05-06 22:50:41 +00:00
#query = query.where('music_sessions.id is NULL OR music_sessions_user_history.id IS NOT NULL')
else
2020-04-21 14:04:30 +00:00
query = query.joins('LEFT OUTER JOIN claimed_recordings ON feeds.recording_id = claimed_recordings.recording_id AND claimed_recordings.discarded = FALSE')
query = query.joins("LEFT OUTER JOIN music_sessions_user_history ON music_sessions.id = music_sessions_user_history.music_session_id")
2020-04-21 14:04:30 +00:00
query = query.group("feeds.id")
if sort == 'plays'
2014-05-06 22:50:41 +00:00
query = query.group("COALESCE(recordings.play_count, music_sessions.play_count)")
elsif sort == 'likes'
2014-05-06 22:50:41 +00:00
query = query.group("COALESCE(recordings.like_count, music_sessions.like_count)")
end
2020-04-21 16:21:23 +00:00
query = query.where('feeds.recording_id is NULL OR claimed_recordings.is_public = TRUE')
2020-07-14 23:39:47 +00:00
query = query.where('feeds.music_session_id is NULL OR music_sessions.musician_access = TRUE')
2020-04-21 16:21:23 +00:00
query = query.where('feeds.music_session_id is NULL OR music_sessions_user_history.id IS NOT NULL')
2014-02-20 03:23:38 +00:00
end
current_page = params[:next_page].nil? ? 1 : params[:next_page].to_i
next_page = current_page + 1
2020-04-21 20:58:20 +00:00
# will_paginate gem0
query = query.limit(limit).offset((current_page - 1)* limit)
if params[:hash]
2014-11-02 19:26:56 +00:00
if query.length == 0 # no more results
{ query: query, next_page: nil}
2014-11-02 19:26:56 +00:00
elsif query.length < limit # no more results
{ query: query, next_page: nil}
else
{ query: query, next_page: next_page }
end
else
2014-11-02 19:26:56 +00:00
if query.length == 0 # no more results
[query, nil]
2014-11-02 19:26:56 +00:00
elsif query.length < limit # no more results
[query, nil]
else
[query, next_page]
end
end
end
end
2020-04-21 14:04:30 +00:00
end