69 lines
2.4 KiB
Ruby
69 lines
2.4 KiB
Ruby
module JamRuby
|
|
class MusicSession < ActiveRecord::Base
|
|
|
|
self.primary_key = 'id'
|
|
|
|
belongs_to :creator, :inverse_of => :music_sessions, :class_name => "JamRuby::User", :foreign_key => "user_id"
|
|
|
|
has_many :connections, :class_name => "JamRuby::Connection"
|
|
has_many :users, :through => :connections, :class_name => "JamRuby::User"
|
|
has_and_belongs_to_many :genres, :class_name => "::JamRuby::Genre", :join_table => "genres_music_sessions"
|
|
has_many :invitations, :foreign_key => "music_session_id", :inverse_of => :music_session, :class_name => "JamRuby::Invitation"
|
|
has_many :invited_users, :through => :invitations, :class_name => "JamRuby::User", :foreign_key => "receiver_id", :source => :receiver
|
|
|
|
after_save :require_at_least_one_genre, :limit_to_three_genres
|
|
|
|
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")
|
|
end
|
|
|
|
# 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
|
|
return self.creator == user || self.invited_users.exists?(user)
|
|
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
|
|
return self.creator == user || self.invited_users.exists?(user)
|
|
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
|
|
end
|
|
|
|
def to_s
|
|
return description
|
|
end
|
|
|
|
private
|
|
|
|
def require_at_least_one_genre
|
|
if genres.count == 0
|
|
errors.add(:genres, "Please select at least one genre")
|
|
end
|
|
end
|
|
|
|
def limit_to_three_genres
|
|
if genres.count > 3
|
|
errors.add(:genres, "Three genres at most, please")
|
|
end
|
|
end
|
|
end
|
|
end
|