diff --git a/db/up/scheduled_sessions.sql b/db/up/scheduled_sessions.sql index dd9bc35c3..be73efdac 100644 --- a/db/up/scheduled_sessions.sql +++ b/db/up/scheduled_sessions.sql @@ -3,33 +3,45 @@ ALTER TABLE users ADD COLUMN audio_latency double precision; ALTER TABLE music_sessions_history ADD COLUMN scheduled_start TIMESTAMP WITH TIME ZONE; ALTER TABLE music_sessions_history ADD COLUMN scheduled_duration INTERVAL; -ALTER TABLE music_sessions_history ADD COLUMN musician_access BOOLEAN NOT NULL; -ALTER TABLE music_sessions_history ADD COLUMN approval_required BOOLEAN NOT NULL; -ALTER TABLE music_sessions_history ADD COLUMN fan_chat BOOLEAN NOT NULL; -ALTER TABLE music_sessions_history ADD COLUMN genre_id VARCHAR(64) NOT NULL REFERENCES genres(id); -ALTER TABLE music_sessions_history ADD COLUMN legal_policy VARCHAR(255) NOT NULL; -ALTER TABLE music_sessions_history ADD COLUMN language VARCHAR(255) NOT NULL; -ALTER TABLE music_sessions_history ADD COLUMN name TEXT NOT NULL; +ALTER TABLE music_sessions_history ADD COLUMN musician_access BOOLEAN NOT NULL DEFAULT TRUE; +ALTER TABLE music_sessions_history ADD COLUMN approval_required BOOLEAN NOT NULL DEFAULT FALSE; +ALTER TABLE music_sessions_history ADD COLUMN fan_chat BOOLEAN NOT NULL DEFAULT TRUE; +ALTER TABLE music_sessions_history ADD COLUMN genre_id VARCHAR(64) REFERENCES genres(id); +ALTER TABLE music_sessions_history ADD COLUMN legal_policy VARCHAR(255) NOT NULL DEFAULT 'standard'; +ALTER TABLE music_sessions_history ADD COLUMN language VARCHAR(255) NOT NULL DEFAULT 'en'; +ALTER TABLE music_sessions_history ADD COLUMN name TEXT; + +UPDATE music_sessions_history SET name = description; +ALTER TABLE music_sessions_history ALTER COLUMN name SET NOT NULL; +-- production db has some null genres on older sessions +UPDATE music_sessions_history SET genres = 'rock' where genres = ''; +UPDATE music_sessions_history SET genre_id = genres; +ALTER TABLE music_sessions_history ALTER COLUMN genre_id SET NOT NULL; +ALTER TABLE music_sessions_history DROP COLUMN genres; ALTER TABLE music_sessions_likers ADD COLUMN music_session_id2 VARCHAR(64) REFERENCES music_sessions_history(id) ON DELETE CASCADE; -UPDATE music_sessions_likers SET music_session_id2 = music_session_id; +-- production db has some bad data +DELETE from music_sessions_likers where music_session_id NOT IN (select id from music_sessions_history); +UPDATE music_sessions_likers SET music_session_id2 = music_session_id; ALTER TABLE music_sessions_likers DROP COLUMN music_session_id; ALTER TABLE music_sessions_likers RENAME COLUMN music_session_id2 to music_session_id; ALTER TABLE music_sessions_comments ADD COLUMN music_session_id2 VARCHAR(64) REFERENCES music_sessions_history(id) ON DELETE CASCADE; -UPDATE music_sessions_comments SET music_session_id2 = music_session_id; +-- production db has some bad data +DELETE from music_sessions_comments where music_session_id NOT IN (select id from music_sessions_history); +UPDATE music_sessions_comments SET music_session_id2 = music_session_id; ALTER TABLE music_sessions_comments DROP COLUMN music_session_id; ALTER TABLE music_sessions_comments RENAME COLUMN music_session_id2 to music_session_id; ALTER TABLE music_sessions_user_history ADD COLUMN music_session_id2 VARCHAR(64) REFERENCES music_sessions_history(id) ON DELETE CASCADE; -UPDATE music_sessions_user_history SET music_session_id2 = music_session_id; +-- production db has some bad data +DELETE from music_sessions_user_history where music_session_id NOT IN (select id from music_sessions_history); +UPDATE music_sessions_user_history SET music_session_id2 = music_session_id; ALTER TABLE music_sessions_user_history DROP COLUMN music_session_id; ALTER TABLE music_sessions_user_history RENAME COLUMN music_session_id2 to music_session_id; -ALTER TABLE music_sessions_history DROP COLUMN music_session_id; - ALTER TABLE music_sessions DROP COLUMN musician_access; ALTER TABLE music_sessions DROP COLUMN fan_access; ALTER TABLE music_sessions DROP COLUMN description; @@ -37,6 +49,8 @@ ALTER TABLE music_sessions DROP COLUMN fan_chat; ALTER TABLE music_sessions DROP COLUMN approval_required; ALTER TABLE music_sessions DROP COLUMN band_id; +ALTER TABLE music_sessions_history ALTER COLUMN music_session_id DROP NOT NULL; + CREATE TABLE rsvp_slots ( id VARCHAR(64) PRIMARY KEY DEFAULT uuid_generate_v4() NOT NULL, instrument_id VARCHAR(64) REFERENCES instruments (id), diff --git a/ruby/lib/jam_ruby/connection_manager.rb b/ruby/lib/jam_ruby/connection_manager.rb index df2a49ac3..2afd08235 100644 --- a/ruby/lib/jam_ruby/connection_manager.rb +++ b/ruby/lib/jam_ruby/connection_manager.rb @@ -39,7 +39,7 @@ module JamRuby # this simulates music_session destroy callbacks with activerecord def before_destroy_music_session(music_session_id) - music_session = MusicSession.find_by_id(music_session_id) + music_session = ActiveMusicSession.find_by_id(music_session_id) music_session.before_destroy if music_session end diff --git a/ruby/lib/jam_ruby/lib/profanity.rb b/ruby/lib/jam_ruby/lib/profanity.rb index cde21e19c..21993a998 100644 --- a/ruby/lib/jam_ruby/lib/profanity.rb +++ b/ruby/lib/jam_ruby/lib/profanity.rb @@ -33,7 +33,7 @@ end class NoProfanityValidator < ActiveModel::EachValidator # implement the method called during validation def validate_each(record, attribute, value) - record.errors[attribute] << 'cannot contain profanity' if Profanity.is_profane?(value) + record.errors[attribute] << 'cannot contain profanity' if JamRuby::Profanity.is_profane?(value) end end diff --git a/ruby/lib/jam_ruby/models/active_music_session.rb b/ruby/lib/jam_ruby/models/active_music_session.rb index 2c0004b96..d056c604d 100644 --- a/ruby/lib/jam_ruby/models/active_music_session.rb +++ b/ruby/lib/jam_ruby/models/active_music_session.rb @@ -2,21 +2,24 @@ module JamRuby class ActiveMusicSession < ActiveRecord::Base self.primary_key = 'id' + self.table_name = 'music_sessions' + attr_accessor :legal_terms, :max_score belongs_to :claimed_recording, :class_name => "JamRuby::ClaimedRecording", :foreign_key => "claimed_recording_id", :inverse_of => :playing_sessions belongs_to :claimed_recording_initiator, :class_name => "JamRuby::User", :inverse_of => :playing_claimed_recordings, :foreign_key => "claimed_recording_initiator_id" - has_one :music_session, :class_name => "JamRuby::MusicSession", :foreign_key => 'id' + has_one :music_session, :class_name => "JamRuby::MusicSession", :foreign_key => 'music_session_id' has_one :mount, :class_name => "JamRuby::IcecastMount", :inverse_of => :music_session, :foreign_key => 'music_session_id' + belongs_to :creator, :class_name => 'JamRuby::User', :foreign_key => :user_id - has_many :connections, :class_name => "JamRuby::Connection" + has_many :connections, :class_name => "JamRuby::Connection", foreign_key: :music_session_id has_many :users, :through => :connections, :class_name => "JamRuby::User" - has_many :recordings, :class_name => "JamRuby::Recording", :inverse_of => :music_session + has_many :recordings, :class_name => "JamRuby::Recording", :inverse_of => :music_session, foreign_key: :music_session_id has_many :chats, :class_name => "JamRuby::ChatMessages", :foreign_key => "session_id" - belongs_to :band, :inverse_of => :music_sessions, :class_name => "JamRuby::Band", :foreign_key => "band_id" validates :creator, :presence => true validate :creator_is_musician + validate :no_new_playback_while_playing after_create :started_session @@ -24,10 +27,6 @@ module JamRuby JamRuby::MusicSession.removed_music_session(obj.id) end - - validate :creator_is_musician - validate :no_new_playback_while_playing - #default_scope :select => "*, 0 as score" def attributes @@ -88,7 +87,15 @@ module JamRuby my_bands_only = options[:my_bands_only].nil? ? false : options[:my_bands_only] as_musician = options[:as_musician].nil? ? true : options[:as_musician] - query = MusicSession + query = ActiveMusicSession + .joins( + %Q{ + INNER JOIN + music_sessions_history + ON + music_sessions.id = music_sessions_history.id + } + ) .joins( %Q{ INNER JOIN @@ -146,9 +153,9 @@ module JamRuby query = query.where("(music_sessions.created_at < icecast_servers.config_updated_at)") end - query = query.where("music_sessions.description like '%#{keyword}%'") unless keyword.nil? + query = query.where("music_sessions_history.description like '%#{keyword}%'") unless keyword.nil? query = query.where("connections.user_id" => participants.split(',')) unless participants.nil? - query = query.joins(:genres).where("genres.id" => genres.split(',')) unless genres.nil? + query = query.where("music_sessions_history.genre_id in (?)", genres) unless genres.nil? if my_bands_only query = query.joins( @@ -192,7 +199,7 @@ module JamRuby connection = Connection.where(client_id: client_id).first! locidispid = connection.locidispid - query = MusicSession + query = ActiveMusicSession .select("music_sessions.*, max(coalesce(current_scores.score, 1000)) as max_score") # 1000 is higher than the allowed max of 999 .joins( %Q{ @@ -387,6 +394,10 @@ module JamRuby self.save end + def invitations + music_session.invitations + end + def invited_musicians music_session.invited_musicians end @@ -423,12 +434,12 @@ module JamRuby music_session.fan_chat end - def approval_required - music_session.approval_required + def band + music_session.band end - def creator - music_session.creator + def approval_required + music_session.approval_required end def tick_track_changes @@ -444,6 +455,12 @@ module JamRuby end def started_session + raise "active_music_sessions.id must be set by caller" unless self.id + # associate this active_music_session with the music_session formally + session = MusicSession.find(self.id) + session.active_music_session = self + session.save! + GoogleAnalyticsEvent.track_session_duration(self) GoogleAnalyticsEvent.track_band_real_session(self) end diff --git a/ruby/lib/jam_ruby/models/band.rb b/ruby/lib/jam_ruby/models/band.rb index 0d46ef629..f1e68e055 100644 --- a/ruby/lib/jam_ruby/models/band.rb +++ b/ruby/lib/jam_ruby/models/band.rb @@ -44,8 +44,7 @@ module JamRuby has_many :invitations, :inverse_of => :band, :class_name => "JamRuby::BandInvitation", :foreign_key => "band_id" # music_sessions - has_many :music_sessions, :class_name => "JamRuby::ActiveMusicSession", :foreign_key => "band_id" - has_many :music_session, :class_name => "JamRuby::MusicSession", :foreign_key => "band_id", :inverse_of => :band + has_many :music_sessions, :class_name => "JamRuby::MusicSession", foreign_key: :band_id, :inverse_of => :band # events has_many :event_sessions, :class_name => "JamRuby::EventSession" @@ -54,19 +53,19 @@ module JamRuby acts_as_mappable def liker_count - return self.likers.size + self.likers.size end def follower_count - return self.followers.size + self.followers.size end def recording_count - return self.recordings.size + self.recordings.size end def session_count - return self.music_sessions.size + self.music_sessions.size end def recent_history diff --git a/ruby/lib/jam_ruby/models/chat_message.rb b/ruby/lib/jam_ruby/models/chat_message.rb index b23aa711e..c02ed1d7b 100644 --- a/ruby/lib/jam_ruby/models/chat_message.rb +++ b/ruby/lib/jam_ruby/models/chat_message.rb @@ -11,6 +11,7 @@ module JamRuby belongs_to :user belongs_to :music_session + validates :user, presence: true validates :message, length: {minimum: 1, maximum: 255}, no_profanity: true class << self diff --git a/ruby/lib/jam_ruby/models/connection.rb b/ruby/lib/jam_ruby/models/connection.rb index 4533dce85..07ed45e35 100644 --- a/ruby/lib/jam_ruby/models/connection.rb +++ b/ruby/lib/jam_ruby/models/connection.rb @@ -9,7 +9,7 @@ module JamRuby self.primary_key = 'id' belongs_to :user, :class_name => "JamRuby::User" - belongs_to :music_session, :class_name => "JamRuby::ActiveMusicSession" + belongs_to :music_session, :class_name => "JamRuby::ActiveMusicSession", foreign_key: :music_session_id has_many :tracks, :class_name => "JamRuby::Track", :inverse_of => :connection, :foreign_key => 'connection_id', :dependent => :delete_all diff --git a/ruby/lib/jam_ruby/models/genre.rb b/ruby/lib/jam_ruby/models/genre.rb index 8aaa67911..b8e61a270 100644 --- a/ruby/lib/jam_ruby/models/genre.rb +++ b/ruby/lib/jam_ruby/models/genre.rb @@ -7,6 +7,10 @@ module JamRuby has_many :band_genres, class_name: "JamRuby::BandGenre" has_many :bands, class_name: "JamRuby::Band", :through => :band_genres + + # music sessions + has_many :music_sessions, :class_name => "JamRuby::MusicSession" + # genres has_and_belongs_to_many :recordings, :class_name => "JamRuby::Recording", :join_table => "recordings_genres" diff --git a/ruby/lib/jam_ruby/models/icecast_mount.rb b/ruby/lib/jam_ruby/models/icecast_mount.rb index b547a3b40..4e07dc786 100644 --- a/ruby/lib/jam_ruby/models/icecast_mount.rb +++ b/ruby/lib/jam_ruby/models/icecast_mount.rb @@ -76,7 +76,7 @@ module JamRuby end # creates a templated - def self.build_session_mount(music_session, icecast_server) + def self.build_session_mount(music_session, active_music_session, icecast_server) # only public sessions get mounts currently return nil unless music_session.fan_access @@ -84,7 +84,7 @@ module JamRuby mount = nil if icecast_server && icecast_server.mount_template_id # we have a server with an associated mount_template; we can create a mount automatically - mount = icecast_server.mount_template.build_session_mount(music_session) + mount = icecast_server.mount_template.build_session_mount(music_session, active_music_session) mount.server = icecast_server end mount diff --git a/ruby/lib/jam_ruby/models/icecast_mount_template.rb b/ruby/lib/jam_ruby/models/icecast_mount_template.rb index 64c995938..c93dc1c8a 100644 --- a/ruby/lib/jam_ruby/models/icecast_mount_template.rb +++ b/ruby/lib/jam_ruby/models/icecast_mount_template.rb @@ -44,7 +44,7 @@ module JamRuby end # pick a server that's in the same group as the user that is under the least load - def build_session_mount(music_session) + def build_session_mount(music_session, active_music_session) mount = IcecastMount.new mount.authentication = authentication mount.mount_template = self @@ -55,7 +55,7 @@ module JamRuby mount.stream_name = "JamKazam music session created by #{music_session.creator.name}" mount.stream_description = music_session.description mount.stream_url = "http://www.jamkazam.com" ## TODO/XXX, the jamkazam url should be the page hosting the widget - mount.genre = music_session.genres.map {|genre| genre.description}.join(',') + mount.genre = music_session.genre.description mount end end diff --git a/ruby/lib/jam_ruby/models/music_session.rb b/ruby/lib/jam_ruby/models/music_session.rb index 82ada305e..5d71322c2 100644 --- a/ruby/lib/jam_ruby/models/music_session.rb +++ b/ruby/lib/jam_ruby/models/music_session.rb @@ -7,20 +7,11 @@ module JamRuby self.primary_key = 'id' - belongs_to(:creator, - :class_name => 'JamRuby::User', - :foreign_key => :user_id, - :inverse_of => :music_session_histories) + belongs_to :creator,:class_name => 'JamRuby::User', :foreign_key => :user_id, :inverse_of => :music_session_histories - belongs_to(:band, - :class_name => 'JamRuby::Band', - :foreign_key => :band_id, - :foreign_key => :band_id, - :inverse_of => :music_session) + belongs_to :band, :class_name => 'JamRuby::Band', :foreign_key => :band_id, :inverse_of => :music_sessions - belongs_to(:active_music_session, - :class_name => 'JamRuby::ActiveMusicSession', - :foreign_key => 'id') + belongs_to :active_music_session, :class_name => 'JamRuby::ActiveMusicSession', foreign_key: :music_session_id has_many :music_session_user_histories, :class_name => "JamRuby::MusicSessionUserHistory", :foreign_key => "music_session_id", :dependent => :delete_all has_many :comments, :class_name => "JamRuby::MusicSessionComment", :foreign_key => "music_session_id" @@ -28,13 +19,14 @@ module JamRuby has_many :plays, :class_name => "JamRuby::PlayablePlay", :as => :playable, :dependent => :destroy has_one :share_token, :class_name => "JamRuby::ShareToken", :inverse_of => :shareable, :foreign_key => 'shareable_id' has_one :feed, :class_name => "JamRuby::Feed", :inverse_of => :music_session, :foreign_key => 'music_session_id', :dependent => :destroy - + belongs_to :genre, :class_name => "JamRuby::Genre", :inverse_of => :music_sessions, :foreign_key => 'genre_id' has_many :join_requests, :foreign_key => "music_session_id", :inverse_of => :music_session, :class_name => "JamRuby::JoinRequest", :foreign_key => "music_session_id" has_many :invitations, :foreign_key => "music_session_id", :inverse_of => :music_session, :class_name => "JamRuby::Invitation", :foreign_key => "music_session_id" 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", :foreign_key => "music_session_id" has_many :invited_fans, :through => :fan_invitations, :class_name => "JamRuby::User", :foreign_key => "receiver_id", :source => :receiver + validates :genre, :presence => true validates :description, :presence => true, :no_profanity => true validates :fan_chat, :inclusion => {:in => [true, false]} validates :fan_access, :inclusion => {:in => [true, false]} @@ -43,9 +35,7 @@ module JamRuby validates :legal_terms, :inclusion => {:in => [true]}, :on => :create validates :creator, :presence => true validate :creator_is_musician - validate :require_at_least_one_genre, :limit_max_genres - before_save :sync_music_session before_create :generate_share_token before_create :add_to_feed @@ -115,7 +105,7 @@ module JamRuby .joins(:music_session_user_histories) .group("users.id") .order("users.id") - .where(%Q{ music_sessions_user_history.music_session_id = '#{music_session_id}'}) + .where(%Q{ music_sessions_user_history.music_session_id = '#{id}'}) end # returns one user history per user, with instruments all crammed together, and with total duration @@ -127,7 +117,7 @@ module JamRuby music_sessions_user_history.user_id, music_sessions_user_history.music_session_id, users.first_name, users.last_name, users.photo_url") .group("music_sessions_user_history.user_id, music_sessions_user_history.music_session_id, users.first_name, users.last_name, users.photo_url") .order("music_sessions_user_history.user_id") - .where(%Q{ music_sessions_user_history.music_session_id = '#{music_session_id}'}) + .where(%Q{ music_sessions_user_history.music_session_id = '#{id}'}) end def duration_minutes @@ -137,13 +127,13 @@ module JamRuby def music_session_user_histories @msuh ||= JamRuby::MusicSessionUserHistory - .where(:music_session_id => self.music_session_id) + .where(:music_session_id => self.id) .order('created_at DESC') end def comments @comments ||= JamRuby::MusicSessionComment - .where(:music_session_id => self.music_session_id) + .where(:music_session_id => self.id) .order('created_at DESC') end @@ -156,15 +146,15 @@ module JamRuby # which means are currently in the music_session, or, rsvp'ed, or creator def part_of_session? user # XXX check RSVP'ed - user == self.creator || (music_session ? music_session.users.exists? : false) + user == self.creator || (active_music_session ? active_music_session.users.exists?(user) : false) end def is_over? - music_session.nil? || !session_removed_at.nil? + active_music_session.nil? end def has_mount? - music_session && music_session.mount + active_music_session && active_music_session.mount end def recordings @@ -189,7 +179,7 @@ module JamRuby def self.removed_music_session(session_id) hist = self - .where(:music_session_id => session_id) + .where(:id => session_id) .limit(1) .first @@ -204,26 +194,6 @@ module JamRuby private - def sync_music_session - MusicSession.save(self) - end - - def require_at_least_one_genre - unless skip_genre_validation - if self.genres.length < Limits::MIN_GENRES_PER_SESSION - errors.add(:genres, ValidationMessages::SESSION_GENRE_MINIMUM_NOT_MET) - end - end - end - - def limit_max_genres - unless skip_genre_validation - if self.genres.length > Limits::MAX_GENRES_PER_SESSION - errors.add(:genres, ValidationMessages::SESSION_GENRE_LIMIT_EXCEEDED) - end - end - end - def generate_share_token token = loop do @@ -238,5 +208,11 @@ module JamRuby self.share_token.shareable_type = "session" end + def creator_is_musician + unless creator && creator.musician? + errors.add(:creator, ValidationMessages::MUST_BE_A_MUSICIAN) + end + end + end end diff --git a/ruby/lib/jam_ruby/models/recording.rb b/ruby/lib/jam_ruby/models/recording.rb index 878ad0775..143aed8f6 100644 --- a/ruby/lib/jam_ruby/models/recording.rb +++ b/ruby/lib/jam_ruby/models/recording.rb @@ -16,7 +16,7 @@ module JamRuby belongs_to :owner, :class_name => "JamRuby::User", :inverse_of => :owned_recordings, :foreign_key => 'owner_id' belongs_to :band, :class_name => "JamRuby::Band", :inverse_of => :recordings - belongs_to :music_session, :class_name => "JamRuby::ActiveMusicSession", :inverse_of => :recordings + belongs_to :music_session, :class_name => "JamRuby::ActiveMusicSession", :inverse_of => :recordings, foreign_key: :music_session_id accepts_nested_attributes_for :recorded_tracks, :mixes, :claimed_recordings, allow_destroy: true diff --git a/ruby/lib/jam_ruby/models/search.rb b/ruby/lib/jam_ruby/models/search.rb index f7ce323e7..8662a55c1 100644 --- a/ruby/lib/jam_ruby/models/search.rb +++ b/ruby/lib/jam_ruby/models/search.rb @@ -300,8 +300,8 @@ module JamRuby sel_str = 'bands.*' case ordering = self.order_param(params) when :plays # FIXME: double counting? - sel_str = "COUNT(records)+COUNT(sessions) AS play_count, #{sel_str}" - rel = rel.joins("LEFT JOIN music_sessions AS sessions ON sessions.band_id = bands.id") + sel_str = "COUNT(records)+COUNT(msh) AS play_count, #{sel_str}" + rel = rel.joins("LEFT JOIN music_sessions_history AS msh ON msh.band_id = bands.id") .joins("LEFT JOIN recordings AS records ON records.band_id = bands.id") .group("bands.id") .order("play_count DESC, bands.created_at DESC") diff --git a/ruby/lib/jam_ruby/models/user.rb b/ruby/lib/jam_ruby/models/user.rb index cb52ba019..dd85f2efa 100644 --- a/ruby/lib/jam_ruby/models/user.rb +++ b/ruby/lib/jam_ruby/models/user.rb @@ -688,15 +688,7 @@ module JamRuby unless user.nil? # only save genre id and description - genres = [] - unless music_session.genres.nil? - music_session.genres.each do |genre| - g = Hash.new - g["id"] = genre.id - g["description"] = genre.description - genres << g - end - end + genres = [{id: music_session.genre.id, description: music_session.genre.description}] # only save invitation receiver id and name invitees = [] @@ -709,7 +701,7 @@ module JamRuby end end - session_settings = { :band_id => music_session.band_id, + session_settings = { :band_id => music_session.band_id, :musician_access => music_session.musician_access, :approval_required => music_session.approval_required, :fan_chat => music_session.fan_chat, diff --git a/ruby/lib/jam_ruby/resque/google_analytics_event.rb b/ruby/lib/jam_ruby/resque/google_analytics_event.rb index 58c393084..d104ecc80 100644 --- a/ruby/lib/jam_ruby/resque/google_analytics_event.rb +++ b/ruby/lib/jam_ruby/resque/google_analytics_event.rb @@ -47,7 +47,7 @@ module JamRuby @queue = QUEUE_BAND_TRACKER def self.perform(session_id) - return unless session = MusicSession.find(session_id) + return unless session = ActiveMusicSession.find(session_id) band = session.band if band.in_real_session?(session) band.update_attribute(:did_real_session, true) diff --git a/ruby/spec/factories.rb b/ruby/spec/factories.rb index 1718f7128..e128950d8 100644 --- a/ruby/spec/factories.rb +++ b/ruby/spec/factories.rb @@ -31,13 +31,23 @@ FactoryGirl.define do factory :single_user_session do after(:create) do |user, evaluator| - music_session = FactoryGirl.create(:active_music_session, :creator => user) - connection = FactoryGirl.create(:connection, :user => user, :music_session => music_session) + active_music_session = FactoryGirl.create(:active_music_session, :creator => user) + connection = FactoryGirl.create(:connection, :user => user, :music_session => active_music_session) end end end - factory :music_session_no_history, :class => JamRuby::ActiveMusicSession do + factory :musician_instrument, :class => JamRuby::MusicianInstrument do + instrument { JamRuby::Instrument.find('electric guitar') } + proficiency_level 1 + priority 0 + end + + + factory :active_music_session_no_user_history, :class => JamRuby::ActiveMusicSession do + + association :creator, factory: :user + ignore do name "My Music Session" description "Come Music Session" @@ -46,14 +56,15 @@ FactoryGirl.define do approval_required false musician_access true legal_terms true - genres [JamRuby::Genre.first] - creator FactoryGirl.create(:user) + genre JamRuby::Genre.first + band nil end + before(:create) do |session, evaluator| music_session = FactoryGirl.create(:music_session_history, name: evaluator.name, description: evaluator.description, fan_chat: evaluator.fan_chat, - fan_access: evaluator.fan_access, approval_required: evaluator.approval_required, musician_access: evaluator.musician_access, - genre: evaluator.genres.first, creator: evaluator.creator) + fan_access: evaluator.fan_access, approval_required: evaluator.approval_required, musician_access: evaluator.musician_access, + genre: evaluator.genre, creator: evaluator.creator, band: evaluator.band) session.id = music_session.id end @@ -68,17 +79,18 @@ FactoryGirl.define do end end - # this creates a music_session, and an active_music_session, in one go factory :music_session_history, :class => JamRuby::MusicSession do - ignore do - music_session nil - end - + sequence(:name) { |n| "Music Session #{n}" } + sequence(:description) { |n| "Music Session Description #{n}" } + fan_chat true fan_access true - music_session_id { music_session.id } - description { music_session.description } - user_id { music_session.user_id } - band_id { music_session.band_id } + approval_required false + musician_access true + legal_terms true + language 'english' + legal_policy 'standard' + genre JamRuby::Genre.first + association :creator, :factory => :user end factory :music_session_user_history, :class => JamRuby::MusicSessionUserHistory do @@ -162,7 +174,7 @@ FactoryGirl.define do factory :recording, :class => JamRuby::Recording do association :owner, factory: :user - association :music_session, factory: :music_session + association :music_session, factory: :active_music_session association :band, factory: :band factory :recording_with_track do @@ -204,12 +216,6 @@ FactoryGirl.define do } end - factory :musician_instrument, :class => JamRuby::MusicianInstrument do - instrument { Instrument.find('electric guitar') } - proficiency_level 1 - priority 0 - end - factory :invited_user, :class => JamRuby::InvitedUser do sequence(:email) { |n| "user#{n}@someservice.com" } autofriend false @@ -313,7 +319,7 @@ FactoryGirl.define do association :mount_template, :factory => :icecast_mount_template factory :iceast_mount_with_music_session do - association :music_session, :factory => :music_session + association :music_session, :factory => :active_music_session end end end diff --git a/ruby/spec/jam_ruby/models/feed_spec.rb b/ruby/spec/jam_ruby/models/feed_spec.rb index 96bb1f9f1..d7ba3391d 100644 --- a/ruby/spec/jam_ruby/models/feed_spec.rb +++ b/ruby/spec/jam_ruby/models/feed_spec.rb @@ -263,8 +263,8 @@ describe Feed do feeds, start = Feed.index(claimed_recording1.user) feeds.length.should == 1 - claimed_recording1.recording.music_session.fan_access = false - claimed_recording1.recording.music_session.save! + claimed_recording1.recording.music_session.music_session.fan_access = false + claimed_recording1.recording.music_session.music_session.save! feeds, start = Feed.index(claimed_recording1.user) feeds.length.should == 0 diff --git a/ruby/spec/jam_ruby/models/music_session_history_spec.rb b/ruby/spec/jam_ruby/models/music_session_history_spec.rb index c404cf00b..14928a058 100644 --- a/ruby/spec/jam_ruby/models/music_session_history_spec.rb +++ b/ruby/spec/jam_ruby/models/music_session_history_spec.rb @@ -3,15 +3,49 @@ require 'spec_helper' describe MusicSession do + let(:creator) {FactoryGirl.create(:user)} let(:some_user) { FactoryGirl.create(:user) } - let(:music_session) { FactoryGirl.create(:music_session_no_history) } + let(:music_session) { FactoryGirl.create(:active_music_session_no_user_history) } let(:user_history1) { FactoryGirl.create(:music_session_user_history, :history => music_session.music_session, :user => music_session.creator, :created_at => 2.days.ago, :session_removed_at => 1.days.ago) } let(:user_history2) { FactoryGirl.create(:music_session_user_history, :history => music_session.music_session, :user => some_user, :created_at => 2.days.ago, :session_removed_at => 1.days.ago) } let(:user_history3) { FactoryGirl.create(:music_session_user_history, :history => music_session.music_session, :user => music_session.creator, :created_at => 3.days.ago, :session_removed_at => 2.days.ago) } let(:user_history4) { FactoryGirl.create(:music_session_user_history, :history => music_session.music_session, :user => some_user, :created_at => 3.days.ago, :session_removed_at => 2.days.ago) } - it "create" do - music_session.music_session.description.should eql(music_session.description) + describe "validations" do + it "genre must be set" do + music_session = FactoryGirl.build(:music_session_history) + music_session.genre = nil + music_session.save.should be_false + music_session.errors[:genre].should == ["can't be blank"] + end + + it "updates the fields of a music session properly" do + genre1 = FactoryGirl.create(:genre) + genre2 = FactoryGirl.create(:genre) + genre3 = FactoryGirl.create(:genre) + genre4 = FactoryGirl.create(:genre) + creator = FactoryGirl.create(:user) + session = FactoryGirl.create(:music_session_history, :creator => creator, :description => "Session", :genre => genre3) + session.update_attributes({:description => "Session2", :genre => genre1}) + session.reload + session.description.should == "Session2" + session.genre.should == genre1 + end + + it "must have legal_terms accepted" do + user1 = FactoryGirl.create(:user) + music_session = FactoryGirl.build(:music_session_history, :creator => user1, legal_terms: false) + music_session.save + music_session.valid?.should be_false + music_session.errors["legal_terms"].should == ["is not included in the list"] + end + + it "cannot have profanity in the description" do + user1 = FactoryGirl.create(:user) + music_session = FactoryGirl.build(:music_session_history, :creator => user1, legal_terms: false, :description => "fuck you") + music_session.save + music_session.valid?.should be_false + end end it "unique users" do diff --git a/ruby/spec/jam_ruby/models/music_session_spec.rb b/ruby/spec/jam_ruby/models/music_session_spec.rb index 6e9bc204b..7bfeec98e 100644 --- a/ruby/spec/jam_ruby/models/music_session_spec.rb +++ b/ruby/spec/jam_ruby/models/music_session_spec.rb @@ -8,14 +8,6 @@ describe ActiveMusicSession do IcecastMount.delete_all end - describe "validations" do - it "genre must be set" do - music_session = FactoryGirl.build(:music_session) - music_session.genres = [] - music_session.save.should be_false - music_session.errors[:genres].should == [ValidationMessages::SESSION_GENRE_MINIMUM_NOT_MET] - end - end it 'can grant access to valid user' do user1 = FactoryGirl.create(:user) # in the jam session @@ -89,7 +81,8 @@ describe ActiveMusicSession do music_session.can_see?(user3).should == false end - +=begin +#XXX These tests should use nindex describe "index" do it "orders two sessions by created_at starting with most recent" do creator = FactoryGirl.create(:user) @@ -310,7 +303,7 @@ describe ActiveMusicSession do end end - +=end describe "nindex" do it "nindex orders two sessions by created_at starting with most recent" do creator = FactoryGirl.create(:user) @@ -341,20 +334,6 @@ describe ActiveMusicSession do end end - it "updates the fields of a music session properly" do - genre1 = FactoryGirl.create(:genre) - genre2 = FactoryGirl.create(:genre) - genre3 = FactoryGirl.create(:genre) - genre4 = FactoryGirl.create(:genre) - creator = FactoryGirl.create(:user) - session = FactoryGirl.create(:active_music_session, :creator => creator, :description => "Session", :genres => [genre3,genre4]) - session.update_attributes({:description => "Session2", :genre => [genre1, genre2]}) - session.genres = [genre1, genre2] - session.reload - session.description.should == "Session2" - session.genres.length.should == 2 - session.genres[0].id.should == genre1.id - end it 'uninvited users cant join approval-required sessions without invitation' do user1 = FactoryGirl.create(:user) # in the jam session @@ -367,24 +346,10 @@ describe ActiveMusicSession do end - it "must have legal_terms accepted" do - user1 = FactoryGirl.create(:user) - music_session = FactoryGirl.build(:music_session, :creator => user1, :legal_terms=> false) - music_session.save - music_session.valid?.should be_false - music_session.errors["legal_terms"].should == ["is not included in the list"] - end - - it "cannot have profanity in the description" do - user1 = FactoryGirl.create(:user) - music_session = FactoryGirl.build(:music_session, :creator => user1, :legal_terms=> false, :description => "fuck you") - music_session.save - music_session.valid?.should be_false - end it "is_recording? returns false if not recording" do user1 = FactoryGirl.create(:user) - music_session = FactoryGirl.build(:music_session, :creator => user1) + music_session = FactoryGirl.build(:active_music_session, :creator => user1) music_session.is_recording?.should be_false end @@ -500,14 +465,5 @@ describe ActiveMusicSession do @music_session.get_connection_ids(exclude_client_id: @connection2.client_id, as_musician: true).should == [@connection1.client_id] end end - - - describe "autosave of music session history" do - it "is created on initial music session create" do - music_session = FactoryGirl.create(:active_music_session) - history = MusicSession.find(music_session.id) - history.genres.should == music_session.genres.first.id - end - end end diff --git a/ruby/spec/jam_ruby/models/music_sessions_user_history_spec.rb b/ruby/spec/jam_ruby/models/music_sessions_user_history_spec.rb index d586f1dc4..3ba5b103a 100644 --- a/ruby/spec/jam_ruby/models/music_sessions_user_history_spec.rb +++ b/ruby/spec/jam_ruby/models/music_sessions_user_history_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe MusicSessionUserHistory do let(:some_user) { FactoryGirl.create(:user) } - let(:music_session) { FactoryGirl.create(:music_session_no_history) } + let(:music_session) { FactoryGirl.create(:active_music_session_no_user_history) } let(:user_history1) { FactoryGirl.create(:music_session_user_history, :history => music_session.music_session, :user => music_session.creator) } let(:user_history2) { FactoryGirl.create(:music_session_user_history, :history => music_session.music_session, :user => some_user) } @@ -136,10 +136,7 @@ describe MusicSessionUserHistory do user_history1.end_history user_history1.max_concurrent_connections.should == 3 end - - end - end diff --git a/web/app/assets/javascripts/createSession.js.erb b/web/app/assets/javascripts/createSession.js.erb index 687527bbd..8532d162c 100644 --- a/web/app/assets/javascripts/createSession.js.erb +++ b/web/app/assets/javascripts/createSession.js.erb @@ -179,51 +179,42 @@ // Defaulting to 1st instrument in profile always at the moment. data.tracks = tracks; - var jsonData = JSON.stringify(data); - $('#btn-create-session').addClass('button-disabled'); $('#btn-create-session').bind('click', false); - var url = "/api/sessions"; - $.ajax({ - type: "POST", - dataType: "json", - contentType: 'application/json', - url: url, - processData:false, - data: jsonData, - success: function(response) { - var newSessionId = response.id; - var invitationCount = inviteMusiciansUtil.createInvitations(newSessionId, function() { - context.location = '/client#/session/' + newSessionId; - }); - // Re-loading the session settings will cause the form to reset with the right stuff in it. - // This is an extra xhr call, but it keeps things to a single codepath - loadSessionSettings(); - $('#btn-create-session').removeClass('button-disabled'); - $('#btn-create-session').unbind('click', false); + rest.legacyCreateSession(data) + .done(function(response) { + var newSessionId = response.id; + var invitationCount = inviteMusiciansUtil.createInvitations(newSessionId, function() { + context.location = '/client#/session/' + newSessionId; + }); + // Re-loading the session settings will cause the form to reset with the right stuff in it. + // This is an extra xhr call, but it keeps things to a single codepath + loadSessionSettings(); + $('#btn-create-session').removeClass('button-disabled'); + $('#btn-create-session').unbind('click', false); - context.JK.GA.trackSessionCount(data.musician_access, data.fan_access, invitationCount); - - context.JK.GA.trackSessionMusicians(context.JK.GA.SessionCreationTypes.create); - }, - error: function(jqXHR) { - var handled = false; - if(jqXHR.status = 422) { - var response = JSON.parse(jqXHR.responseText); - if(response["errors"] && response["errors"]["tracks"] && response["errors"]["tracks"][0] == "Please select at least one track") { - app.notifyAlert("No Inputs Configured", $('You will need to reconfigure your audio device.')); - handled = true; - } - } - if(!handled) { - app.notifyServerError(jqXHR, "Unable to Create Session"); - } - $('#btn-create-session').removeClass('button-disabled'); - $('#btn-create-session').unbind('click', false); + context.JK.GA.trackSessionCount(data.musician_access, data.fan_access, invitationCount); + context.JK.GA.trackSessionMusicians(context.JK.GA.SessionCreationTypes.create); + }) + .fail(function(jqXHR) { + var handled = false; + if(jqXHR.status = 422) { + var response = JSON.parse(jqXHR.responseText); + if(response["errors"] && response["errors"]["tracks"] && response["errors"]["tracks"][0] == "Please select at least one track") { + app.notifyAlert("No Inputs Configured", $('You will need to reconfigure your audio device.')); + handled = true; + } } - }); + if(!handled) { + app.notifyServerError(jqXHR, "Unable to Create Session"); + } + $('#btn-create-session').removeClass('button-disabled'); + $('#btn-create-session').unbind('click', false); + + }) + return false; } diff --git a/web/app/assets/javascripts/jam_rest.js b/web/app/assets/javascripts/jam_rest.js index 942b8c976..e7cd27343 100644 --- a/web/app/assets/javascripts/jam_rest.js +++ b/web/app/assets/javascripts/jam_rest.js @@ -34,6 +34,16 @@ }); } + function legacyCreateSession(options) { + return $.ajax({ + type: "POST", + dataType: "json", + contentType: 'application/json', + url: "/api/sessions/legacy", + processData:false, + data: JSON.stringify(options)}); + } + function findSessions(query) { return $.ajax({ type: "GET", @@ -970,6 +980,7 @@ // Expose publics this.initialize = initialize; + this.legacyCreateSession = legacyCreateSession; this.getUserDetail = getUserDetail; this.getCities = getCities; this.getRegions = getRegions; diff --git a/web/app/controllers/api_invitations_controller.rb b/web/app/controllers/api_invitations_controller.rb index 30821a888..58a3965e6 100644 --- a/web/app/controllers/api_invitations_controller.rb +++ b/web/app/controllers/api_invitations_controller.rb @@ -32,7 +32,7 @@ class ApiInvitationsController < ApiController end def create - music_session = ActiveMusicSession.find(params[:music_session]) + music_session = MusicSession.find(params[:music_session]) receiver = User.find(params[:receiver]) sender = current_user join_request = JoinRequest.find(params[:join_request]) unless params[:join_request].nil? diff --git a/web/app/controllers/api_join_requests_controller.rb b/web/app/controllers/api_join_requests_controller.rb index 3e59275d0..6ef30f4aa 100644 --- a/web/app/controllers/api_join_requests_controller.rb +++ b/web/app/controllers/api_join_requests_controller.rb @@ -14,7 +14,7 @@ class ApiJoinRequestsController < ApiController end def create - music_session = ActiveMusicSession.find(params[:music_session]) + music_session = MusicSession.find(params[:music_session]) text = params[:text] sender = current_user diff --git a/web/app/controllers/api_music_sessions_controller.rb b/web/app/controllers/api_music_sessions_controller.rb index f463e77f9..5a0ff985d 100644 --- a/web/app/controllers/api_music_sessions_controller.rb +++ b/web/app/controllers/api_music_sessions_controller.rb @@ -60,39 +60,68 @@ class ApiMusicSessionsController < ApiController limit: params[:limit]) end - def create + def create_legacy client_id = params[:client_id] if client_id.nil? raise JamArgumentError, "client_id must be specified" end - if !params[:intellectual_property] + unless params[:intellectual_property] raise JamArgumentError, "You must agree to the intellectual property terms" end band = Band.find(params[:band]) unless params[:band].nil? - @music_session = MusicSessionManager.new.create( - current_user, - client_id, - params[:description], - params[:musician_access], - params[:approval_required], - params[:fan_chat], - params[:fan_access], - band, - params[:genres], - params[:tracks], - params[:legal_terms]) + # creating the MusicSession right here was added as part of the scheduled sessions changes + # Why? The new order of things is to always have a MusicSession before a ActiveMusicSession + # So, we have to make MusicSession, and pass in it's .id to MusicSessionManager.new.create() + # so that the ActiveMusicSession can have the same .id as the MusicSession + history = MusicSession.new + history.name = params[:description][0..40] + history.description = params[:description] + history.musician_access = params[:musician_access] + history.approval_required = params[:approval_required] + history.fan_chat = params[:fan_chat] + history.fan_access = params[:fan_access] + history.band = band + history.genre_id = (params[:genres].length > 0 ? params[:genres][0] : nil) if params[:genres] + history.legal_terms = params[:legal_terms] + history.language = 'english' + history.legal_policy = 'standard' + history.creator = current_user + history.save - if @music_session.errors.any? - # we have to do this because api_session_detail_url will fail with a bad @music_session + if history.errors.any? + @music_session = history response.status = :unprocessable_entity respond_with @music_session else - respond_with @music_session, responder: ApiResponder, :location => api_session_detail_url(@music_session) + history.reload # to get .id back + @music_session = MusicSessionManager.new.create( + history, + current_user, + client_id, + params[:description], + params[:musician_access], + params[:approval_required], + params[:fan_chat], + params[:fan_access], + band, + params[:genres], + params[:tracks], + params[:legal_terms]) + + if @music_session.errors.any? + response.status = :unprocessable_entity + respond_with @music_session + else + respond_with @music_session, responder: ApiResponder, :location => api_session_detail_url(@music_session) + end end + + + end def show @@ -103,7 +132,7 @@ class ApiMusicSessionsController < ApiController def update @music_session = MusicSessionManager.new.update( - @music_session, + @music_session.music_session, params[:description], params[:genres], params[:musician_access], diff --git a/web/app/helpers/feeds_helper.rb b/web/app/helpers/feeds_helper.rb index f72ad8291..1f9f135b6 100644 --- a/web/app/helpers/feeds_helper.rb +++ b/web/app/helpers/feeds_helper.rb @@ -1,10 +1,10 @@ module FeedsHelper def session_artist_name(music_session) - (music_session.band.nil? ? nil : music_session.band.name) || music_session.user.name + (music_session.band.nil? ? nil : music_session.band.name) || music_session.creator.name end def session_artist_id(music_session) - (music_session.band.nil? ? nil : music_session.band.id) || music_session.user.id + (music_session.band.nil? ? nil : music_session.band.id) || music_session.creator.id end def session_artist_hoveraction(music_session) @@ -16,7 +16,7 @@ module FeedsHelper end def session_avatar(music_session) - image_tag resolve_avatarables(music_session.band, music_session.user) + image_tag resolve_avatarables(music_session.band, music_session.creator) end def session_duration_value(music_session) @@ -36,7 +36,7 @@ module FeedsHelper 'SESSION ENDED' else if music_session.fan_access - if music_session.music_session && music_session.music_session.mount + if music_session.active_music_session && music_session.active_music_session.mount 'SESSION IN PROGRESS' else 'BROADCASTING OFFLINE' # if you see this in development, you need to set up icecast. If you see this in production, it's not healthy @@ -53,9 +53,7 @@ module FeedsHelper # grabs 1st genre def session_genre(music_session) - genres_array = music_session.genres.nil? ? [] : music_session.genres.split(MusicSession::SEPARATOR) - genre = genres_array.length > 0 ? Genre.find_by_id(genres_array[0]) : nil - genre.nil? ? '' : genre.description + music_session.genre.description end def recording_artist_name(recording) diff --git a/web/app/helpers/music_session_helper.rb b/web/app/helpers/music_session_helper.rb index 04427661f..de1956c25 100644 --- a/web/app/helpers/music_session_helper.rb +++ b/web/app/helpers/music_session_helper.rb @@ -27,7 +27,7 @@ module MusicSessionHelper if sharer && unique_users.exists?(sharer) "LIVE SESSION: #{sharer.name}#{additional_member_count(unique_users)}" else - "LIVE SESSION: #{music_session.user.name}#{additional_member_count(unique_users)}" + "LIVE SESSION: #{music_session.creator.name}#{additional_member_count(unique_users)}" end end diff --git a/web/app/views/api_feeds/show.rabl b/web/app/views/api_feeds/show.rabl index 21dba6e5c..03a8ad2c5 100644 --- a/web/app/views/api_feeds/show.rabl +++ b/web/app/views/api_feeds/show.rabl @@ -12,7 +12,7 @@ glue :music_session do node do |history| { helpers: { - avatar: asset_path(resolve_avatarables(history.band, history.user)), + avatar: asset_path(resolve_avatarables(history.band, history.creator)), artist_name: session_artist_name(history), artist_id: session_artist_id(history), artist_datakey: session_artist_datakey(history), @@ -27,7 +27,7 @@ glue :music_session do } end - child(:user => :creator) { + child(:creator => :creator) { attributes :id, :first_name, :last_name, :photo_url } @@ -60,7 +60,7 @@ glue :music_session do attributes :id, :name, :location, :photo_url } - child(:music_session => :music_session) do + child(:active_music_session => :music_session) do # only show mount info if fan_access is public. Eventually we'll also need to show this in other scenarios, like if invited child({:mount => :mount}, :if => lambda { |music_session| music_session.fan_access}) { attributes :id, :name, :sourced, :listeners, :bitrate, :subtype, :url diff --git a/web/app/views/api_music_sessions/claimed_recording_start.rabl b/web/app/views/api_music_sessions/claimed_recording_start.rabl new file mode 100644 index 000000000..e34b6943d --- /dev/null +++ b/web/app/views/api_music_sessions/claimed_recording_start.rabl @@ -0,0 +1,3 @@ +object @music_session + +extends "api_music_sessions/show" \ No newline at end of file diff --git a/web/app/views/api_music_sessions/claimed_recording_stop.rabl b/web/app/views/api_music_sessions/claimed_recording_stop.rabl new file mode 100644 index 000000000..e34b6943d --- /dev/null +++ b/web/app/views/api_music_sessions/claimed_recording_stop.rabl @@ -0,0 +1,3 @@ +object @music_session + +extends "api_music_sessions/show" \ No newline at end of file diff --git a/web/app/views/api_music_sessions/create_legacy.rabl b/web/app/views/api_music_sessions/create_legacy.rabl new file mode 100644 index 000000000..e34b6943d --- /dev/null +++ b/web/app/views/api_music_sessions/create_legacy.rabl @@ -0,0 +1,3 @@ +object @music_session + +extends "api_music_sessions/show" \ No newline at end of file diff --git a/web/app/views/api_music_sessions/history_show.rabl b/web/app/views/api_music_sessions/history_show.rabl index 9d22fd4ab..dd1064618 100644 --- a/web/app/views/api_music_sessions/history_show.rabl +++ b/web/app/views/api_music_sessions/history_show.rabl @@ -8,7 +8,7 @@ node :share_url do |history| end end -child(:user => :creator) { +child(:creator => :creator) { attributes :name, :photo_url } diff --git a/web/app/views/api_music_sessions/show.rabl b/web/app/views/api_music_sessions/show.rabl index acd7a8bb1..87fcfc683 100644 --- a/web/app/views/api_music_sessions/show.rabl +++ b/web/app/views/api_music_sessions/show.rabl @@ -16,7 +16,7 @@ else attributes :id, :description, :musician_access, :approval_required, :fan_access, :fan_chat, :band_id, :user_id, :claimed_recording_initiator_id, :track_changes_counter, :max_score node :genres do |item| - item.genres.map(&:description) + [item.genre.description] # XXX: need to return single genre; not array end if :is_recording? diff --git a/web/app/views/music_sessions/show.html.erb b/web/app/views/music_sessions/show.html.erb index f371f8387..d55ab1f11 100644 --- a/web/app/views/music_sessions/show.html.erb +++ b/web/app/views/music_sessions/show.html.erb @@ -30,13 +30,13 @@ <%= @music_session.band.name %> <% else %>