2014-02-15 21:19:03 +00:00
module JamRuby
class Feed < ActiveRecord :: Base
2014-02-16 13:10:00 +00:00
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'
2014-02-15 21:19:03 +00:00
2014-02-18 18:53:16 +00:00
FIXNUM_MAX = ( 2 ** ( 0 . size * 8 - 2 ) - 1 )
SORT_TYPES = [ 'date' , 'plays' , 'likes' ]
2014-02-20 02:22:41 +00:00
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-11-02 17:57:43 +00:00
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'
2014-02-18 18:53:16 +00:00
raise " not valid sort #{ sort } " unless SORT_TYPES . include? ( sort )
2014-02-18 20:12:50 +00:00
time_range = params [ :time_range ]
2014-06-30 20:44:28 +00:00
time_range || = 'all'
2014-02-20 02:22:41 +00:00
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
2014-02-20 07:45:51 +00:00
target_user = params [ :user ]
target_band = params [ :band ]
2014-02-20 03:23:38 +00:00
2014-05-06 13:34:38 +00:00
#query = Feed.includes([:recording]).includes([:music_session]).limit(limit)
2014-02-20 07:45:51 +00:00
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 " )
2014-02-20 07:45:51 +00:00
. 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-14 02:05:08 +00:00
s
query = Search . scope_schools_together_feeds ( query , user )
2014-02-18 13:34:51 +00:00
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' )
2014-02-18 03:42:42 +00:00
elsif sort == 'plays'
2020-04-21 16:21:23 +00:00
query = query . order ( " COALESCE(recordings.play_count, music_sessions.play_count) DESC " )
2014-02-18 13:34:51 +00:00
elsif sort == 'likes'
2020-04-21 16:21:23 +00:00
query = query . order ( " COALESCE(recordings.like_count, music_sessions.like_count) DESC " )
2014-02-18 13:34:51 +00:00
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
2014-02-20 02:22:41 +00:00
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'
2014-02-20 07:45:51 +00:00
query = query . where ( 'feeds.music_session_id is not NULL' )
2014-02-18 20:12:50 +00:00
elsif type_filter == 'recording'
2014-02-20 07:45:51 +00:00
query = query . where ( 'feeds.recording_id is not NULL' )
2014-02-18 20:12:50 +00:00
end
2014-02-18 18:53:16 +00:00
2014-02-20 03:23:38 +00:00
2014-08-14 05:45:37 +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 " )
2014-02-20 07:45:51 +00:00
if sort == 'plays'
2014-05-06 22:50:41 +00:00
query = query . group ( " COALESCE(recordings.play_count, music_sessions.play_count) " )
2014-02-20 07:45:51 +00:00
elsif sort == 'likes'
2014-05-06 22:50:41 +00:00
query = query . group ( " COALESCE(recordings.like_count, music_sessions.like_count) " )
2014-02-20 07:45:51 +00:00
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' )
2014-02-20 07:45:51 +00:00
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 " )
2014-02-20 07:45:51 +00:00
if sort == 'plays'
2014-05-06 22:50:41 +00:00
query = query . group ( " COALESCE(recordings.play_count, music_sessions.play_count) " )
2014-02-20 07:45:51 +00:00
elsif sort == 'likes'
2014-05-06 22:50:41 +00:00
query = query . group ( " COALESCE(recordings.like_count, music_sessions.like_count) " )
2014-02-20 07:45:51 +00:00
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')
2014-02-20 07:45:51 +00:00
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' )
2014-08-14 05:45:37 +00:00
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 " )
2014-02-20 07:45:51 +00:00
if sort == 'plays'
2014-05-06 22:50:41 +00:00
query = query . group ( " COALESCE(recordings.play_count, music_sessions.play_count) " )
2014-02-20 07:45:51 +00:00
elsif sort == 'likes'
2014-05-06 22:50:41 +00:00
query = query . group ( " COALESCE(recordings.like_count, music_sessions.like_count) " )
2014-02-20 07:45:51 +00:00
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
2014-11-02 17:57:43 +00:00
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 )
2014-11-02 17:57:43 +00:00
2014-03-11 06:09:44 +00:00
if params [ :hash ]
2014-11-02 19:26:56 +00:00
if query . length == 0 # no more results
2014-11-02 17:57:43 +00:00
{ query : query , next_page : nil }
2014-11-02 19:26:56 +00:00
elsif query . length < limit # no more results
2014-11-02 17:57:43 +00:00
{ query : query , next_page : nil }
2014-03-11 06:09:44 +00:00
else
2014-11-02 17:57:43 +00:00
{ query : query , next_page : next_page }
2014-03-11 06:09:44 +00:00
end
2014-02-18 18:53:16 +00:00
else
2014-11-02 19:26:56 +00:00
if query . length == 0 # no more results
2014-03-11 06:09:44 +00:00
[ query , nil ]
2014-11-02 19:26:56 +00:00
elsif query . length < limit # no more results
2014-03-11 06:09:44 +00:00
[ query , nil ]
2014-02-18 18:53:16 +00:00
else
2014-11-02 17:57:43 +00:00
[ query , next_page ]
2014-02-18 18:53:16 +00:00
end
end
2014-02-15 21:19:03 +00:00
end
end
2020-04-21 14:04:30 +00:00
end