2012-10-03 03:50:23 +00:00
module JamRuby
class MusicSession < ActiveRecord :: Base
self . primary_key = 'id'
2012-11-02 06:51:52 +00:00
2012-11-16 02:50:03 +00:00
attr_accessible :creator , :musician_access , :approval_required , :fan_chat , :fan_access
2012-10-03 03:50:23 +00:00
belongs_to :creator , :inverse_of = > :music_sessions , :class_name = > " JamRuby::User " , :foreign_key = > " user_id "
2012-10-21 01:55:49 +00:00
has_many :connections , :class_name = > " JamRuby::Connection "
has_many :users , :through = > :connections , :class_name = > " JamRuby::User "
2012-10-25 12:11:10 +00:00
has_and_belongs_to_many :genres , :class_name = > " ::JamRuby::Genre " , :join_table = > " genres_music_sessions "
2012-10-26 10:33:39 +00:00
has_many :invitations , :foreign_key = > " music_session_id " , :inverse_of = > :music_session , :class_name = > " JamRuby::Invitation "
2012-11-16 02:50:03 +00:00
has_many :invited_musicians , :through = > :invitations , :class_name = > " JamRuby::User " , :foreign_key = > " receiver_id " , :source = > :receiver
has_many :fan_invitations , :foreign_key = > " music_session_id " , :inverse_of = > :music_session , :class_name = > " JamRuby::FanInvitation "
has_many :invited_fans , :through = > :fan_invitations , :class_name = > " JamRuby::User " , :foreign_key = > " receiver_id " , :source = > :receiver
2012-10-26 10:33:39 +00:00
2012-10-25 12:11:10 +00:00
after_save :require_at_least_one_genre , :limit_to_three_genres
2012-11-16 02:50:03 +00:00
validates :fan_chat , :inclusion = > { :in = > [ true , false ] }
validates :fan_access , :inclusion = > { :in = > [ true , false ] }
validates :approval_required , :inclusion = > { :in = > [ true , false ] }
validates :musician_access , :inclusion = > { :in = > [ true , false ] }
2012-11-18 02:59:59 +00:00
validates :creator , :presence = > true , :if = > " creator.musician? "
2012-11-16 02:50:03 +00:00
2012-11-02 06:51:52 +00:00
def self . index ( current_user )
return MusicSession . includes ( :invitations , :connections = > [ :user = > [ :friendships ] ] ) . order ( " (invitations.id is NULL) ASC, (friendships.friend_id != ' #{ current_user . id } ' OR friendships.friend_id is NULL) ASC, music_sessions.created_at DESC " ) . where ( " invitations.receiver_id = ' #{ current_user . id } ' OR (friendships.friend_id = ' #{ current_user . id } ') OR musician_access = true " )
2012-11-04 03:02:11 +00:00
end
2012-11-02 06:51:52 +00:00
# Verifies that the specified user can join this music session
def can_join? user
if self . musician_access
return true
else
# the creator can always join, and the invited users can join
2012-11-16 02:50:03 +00:00
return self . creator == user || self . invited_musicians . exists? ( user )
2012-11-02 06:51:52 +00:00
end
end
# Verifies that the specified user can see this music session
def can_see? user
if self . musician_access
return true
else
# the creator can always see, and the invited users can see it too
2012-11-16 02:50:03 +00:00
return self . creator == user || self . invited_musicians . exists? ( user )
2012-11-02 06:51:52 +00:00
end
end
# Verifies that the specified user can delete this music session
def can_delete? user
# the creator can delete
return self . creator == user
end
def access? user
return self . users . exists? user
2012-10-03 03:50:23 +00:00
end
def to_s
2012-10-25 12:11:10 +00:00
return description
end
private
def require_at_least_one_genre
if genres . count == 0
errors . add ( :genres , " Please select at least one genre " )
end
2012-10-03 03:50:23 +00:00
end
2012-10-25 12:11:10 +00:00
def limit_to_three_genres
if genres . count > 3
errors . add ( :genres , " Three genres at most, please " )
end
end
2012-10-03 03:50:23 +00:00
end
end