diff --git a/db/manifest b/db/manifest index d750aab4f..5f61f0935 100755 --- a/db/manifest +++ b/db/manifest @@ -106,4 +106,5 @@ track_connection_id_not_null.sql recordings_all_discarded.sql recordings_via_admin_web.sql relax_band_model_varchar.sql -add_piano.sql \ No newline at end of file +add_piano.sql +like_follower_poly_assoc.sql \ No newline at end of file diff --git a/db/up/like_follower_poly_assoc.sql b/db/up/like_follower_poly_assoc.sql new file mode 100644 index 000000000..61eb9a625 --- /dev/null +++ b/db/up/like_follower_poly_assoc.sql @@ -0,0 +1,59 @@ +alter table music_sessions_history +add constraint music_sessions_history_pkey PRIMARY KEY (id); + +CREATE TABLE likes +( + id character varying(64) NOT NULL DEFAULT uuid_generate_v4(), + liker_id character varying(64) NOT NULL, + user_id character varying(64), + band_id character varying(64), + session_id character varying(64), + recording_id character varying(64), + likable_type character varying(25), + created_at timestamp without time zone NOT NULL DEFAULT now(), + updated_at timestamp without time zone NOT NULL DEFAULT now(), + CONSTRAINT likes_pkey PRIMARY KEY (id), + CONSTRAINT liker_fkey FOREIGN KEY (liker_id) + REFERENCES users (id) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE CASCADE, + CONSTRAINT user_likes_fkey FOREIGN KEY (user_id) + REFERENCES users (id) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE CASCADE, + CONSTRAINT bands_likes_fkey FOREIGN KEY (band_id) + REFERENCES bands (id) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE CASCADE, + CONSTRAINT session_likes_fkey FOREIGN KEY (session_id) + REFERENCES music_sessions_history (id) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE CASCADE, + CONSTRAINT recording_likes_fkey FOREIGN KEY (recording_id) + REFERENCES recordings (id) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE CASCADE, + CONSTRAINT user_likes_uniqkey UNIQUE (liker_id, user_id), + CONSTRAINT band_likes_uniqkey UNIQUE (liker_id, band_id), + CONSTRAINT session_likes_uniqkey UNIQUE (liker_id, session_id), + CONSTRAINT recording_likes_uniqkey UNIQUE (liker_id, recording_id) +); + +CREATE TABLE followings +( + id character varying(64) NOT NULL DEFAULT uuid_generate_v4(), + follower_id character varying(64) NOT NULL, + user_id character varying(64), + band_id character varying(64), + followable_type character varying(25), + created_at timestamp without time zone NOT NULL DEFAULT now(), + updated_at timestamp without time zone NOT NULL DEFAULT now(), + CONSTRAINT followings_pkey PRIMARY KEY (id), + CONSTRAINT follower_fkey FOREIGN KEY (follower_id) + REFERENCES users (id) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE CASCADE, + CONSTRAINT user_followings_fkey FOREIGN KEY (user_id) + REFERENCES users (id) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE CASCADE, + CONSTRAINT bands_followings_fkey FOREIGN KEY (band_id) + REFERENCES bands (id) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE CASCADE, + CONSTRAINT user_followings_uniqkey UNIQUE (follower_id, user_id), + CONSTRAINT band_followings_uniqkey UNIQUE (follower_id, band_id) +); + diff --git a/ruby/lib/jam_ruby.rb b/ruby/lib/jam_ruby.rb index 2cc0844f4..326a335b3 100755 --- a/ruby/lib/jam_ruby.rb +++ b/ruby/lib/jam_ruby.rb @@ -67,15 +67,15 @@ require "jam_ruby/models/invited_user" require "jam_ruby/models/invited_user_observer" require "jam_ruby/models/artifact_update" require "jam_ruby/models/band_invitation" -require "jam_ruby/models/band_liker" -require "jam_ruby/models/band_follower" -require "jam_ruby/models/band_following" +# require "jam_ruby/models/band_liker" +# require "jam_ruby/models/band_follower" +# require "jam_ruby/models/band_following" require "jam_ruby/models/band_musician" require "jam_ruby/models/connection" require "jam_ruby/models/friendship" require "jam_ruby/models/music_session" require "jam_ruby/models/music_session_comment" -require "jam_ruby/models/music_session_liker" +# require "jam_ruby/models/music_session_liker" require "jam_ruby/models/music_session_history" require "jam_ruby/models/music_session_user_history" require "jam_ruby/models/music_session_perf_data" @@ -83,17 +83,18 @@ require "jam_ruby/models/invitation" require "jam_ruby/models/fan_invitation" require "jam_ruby/models/friend_request" require "jam_ruby/models/instrument" +require "jam_ruby/models/like" require "jam_ruby/models/musician_instrument" require "jam_ruby/models/notification" require "jam_ruby/models/track" -require "jam_ruby/models/user_liker" -require "jam_ruby/models/user_like" -require "jam_ruby/models/user_follower" -require "jam_ruby/models/user_following" +# require "jam_ruby/models/user_liker" +# require "jam_ruby/models/user_like" +# require "jam_ruby/models/user_follower" +# require "jam_ruby/models/user_following" require "jam_ruby/models/search" require "jam_ruby/models/recording" require "jam_ruby/models/recording_comment" -require "jam_ruby/models/recording_liker" +# require "jam_ruby/models/recording_liker" require "jam_ruby/models/recording_play" require "jam_ruby/models/recorded_track" require "jam_ruby/models/recorded_track_observer" diff --git a/ruby/lib/jam_ruby/models/band.rb b/ruby/lib/jam_ruby/models/band.rb index 3a297c4b9..3d2982dae 100644 --- a/ruby/lib/jam_ruby/models/band.rb +++ b/ruby/lib/jam_ruby/models/band.rb @@ -50,6 +50,10 @@ module JamRuby return self.likers.size end + # def likes?(user) + # self.likers.exists?(user) + # end + def follower_count return self.followers.size end diff --git a/ruby/lib/jam_ruby/models/following.rb b/ruby/lib/jam_ruby/models/following.rb new file mode 100644 index 000000000..e69de29bb diff --git a/ruby/lib/jam_ruby/models/like.rb b/ruby/lib/jam_ruby/models/like.rb new file mode 100644 index 000000000..22155ec36 --- /dev/null +++ b/ruby/lib/jam_ruby/models/like.rb @@ -0,0 +1,8 @@ +module JamRuby + class Like < ActiveRecord::Base + + belongs_to :liker, :class_name => "JamRuby::User", :foreign_key => "liker_id" + belongs_to :likable, :polymorphic => true + + end +end \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/user.rb b/ruby/lib/jam_ruby/models/user.rb index d8e3263ff..b989e9c04 100644 --- a/ruby/lib/jam_ruby/models/user.rb +++ b/ruby/lib/jam_ruby/models/user.rb @@ -43,35 +43,41 @@ module JamRuby has_many :claimed_recordings, :class_name => "JamRuby::ClaimedRecording", :inverse_of => :user has_many :playing_claimed_recordings, :class_name => "JamRuby::MusicSession", :inverse_of => :claimed_recording_initiator - # user likers (a musician has likers and may have likes too; fans do not have likers) - has_many :likers, :class_name => "JamRuby::UserLiker", :foreign_key => "user_id", :inverse_of => :user - has_many :inverse_likers, :through => :likers, :class_name => "JamRuby::User", :foreign_key => "liker_id" + has_many :likes, :as => :likable - # user likes (fans and musicians have likes) - has_many :likes, :class_name => "JamRuby::UserLike", :foreign_key => "liker_id", :inverse_of => :user - has_many :inverse_likes, :through => :likes, :class_name => "JamRuby::User", :foreign_key => "user_id" + # # user likers (users who like current_user) + # has_many :likers, :class_name => "JamRuby::UserLiker", :foreign_key => "user_id", :inverse_of => :user + # has_many :inverse_likers, :through => :likers, :class_name => "JamRuby::User", :foreign_key => "liker_id" - # band likes - has_many :band_likes, :class_name => "JamRuby::BandLiker", :foreign_key => "liker_id", :inverse_of => :user - has_many :inverse_band_likes, :through => :band_likes, :class_name => "JamRuby::Band", :foreign_key => "band_id" + # # user likes (users who current_user likes) + # has_many :likes, :class_name => "JamRuby::UserLike", :foreign_key => "liker_id", :inverse_of => :user + # has_many :inverse_likes, :through => :likes, :class_name => "JamRuby::User", :foreign_key => "user_id" - # followers - has_many :user_followers, :class_name => "JamRuby::UserFollower", :foreign_key => "user_id" - has_many :followers, :through => :user_followers, :class_name => "JamRuby::User" - has_many :inverse_user_followers, :through => :followers, :class_name => "JamRuby::UserFollower", :foreign_key => "follower_id" - has_many :inverse_followers, :through => :inverse_user_followers, :source => :user, :class_name => "JamRuby::User" + # # band likes + # has_many :band_likes, :class_name => "JamRuby::BandLiker", :foreign_key => "liker_id", :inverse_of => :user + # has_many :inverse_band_likes, :through => :band_likes, :class_name => "JamRuby::Band", :foreign_key => "band_id" - # user followings - has_many :user_followings, :class_name => "JamRuby::UserFollowing", :foreign_key => "follower_id" - has_many :followings, :through => :user_followings, :class_name => "JamRuby::User" - has_many :inverse_user_followings, :through => :followings, :class_name => "JamRuby::UserFollowing", :foreign_key => "user_id" - has_many :inverse_followings, :through => :inverse_user_followings, :source => :user, :class_name => "JamRuby::User" + # # session likes + # has_many :session_likes, :class_name => "JamRuby::SessionLiker", :foreign_key => "liker_id", :inverse_of => :user + # has_many :inverse_band_likes, :through => :band_likes, :class_name => "JamRuby::Band", :foreign_key => "band_id" - # band followings - has_many :b_followings, :class_name => "JamRuby::BandFollowing", :foreign_key => "follower_id" - has_many :band_followings, :through => :b_followings, :class_name => "JamRuby::Band" - has_many :inverse_b_followings, :through => :band_followings, :class_name => "JamRuby::BandFollowing", :foreign_key => "band_id" - has_many :inverse_band_followings, :through => :inverse_band_followings, :source => :band, :class_name => "JamRuby::Band" + # # followers + # has_many :user_followers, :class_name => "JamRuby::UserFollower", :foreign_key => "user_id" + # has_many :followers, :through => :user_followers, :class_name => "JamRuby::User" + # has_many :inverse_user_followers, :through => :followers, :class_name => "JamRuby::UserFollower", :foreign_key => "follower_id" + # has_many :inverse_followers, :through => :inverse_user_followers, :source => :user, :class_name => "JamRuby::User" + + # # user followings + # has_many :user_followings, :class_name => "JamRuby::UserFollowing", :foreign_key => "follower_id" + # has_many :followings, :through => :user_followings, :class_name => "JamRuby::User" + # has_many :inverse_user_followings, :through => :followings, :class_name => "JamRuby::UserFollowing", :foreign_key => "user_id" + # has_many :inverse_followings, :through => :inverse_user_followings, :source => :user, :class_name => "JamRuby::User" + + # # band followings + # has_many :b_followings, :class_name => "JamRuby::BandFollowing", :foreign_key => "follower_id" + # has_many :band_followings, :through => :b_followings, :class_name => "JamRuby::Band" + # has_many :inverse_b_followings, :through => :band_followings, :class_name => "JamRuby::BandFollowing", :foreign_key => "band_id" + # has_many :inverse_band_followings, :through => :inverse_band_followings, :source => :band, :class_name => "JamRuby::Band" # notifications has_many :notifications, :class_name => "JamRuby::Notification", :foreign_key => "target_user_id" @@ -254,17 +260,31 @@ module JamRuby return self.friends.size end - def liker_count - return self.likers.size - end + # check if "user" likes "this user" + # def likers?(user) + # return self.likers.exists?(user) + # end + + # def liker_count + # return self.likers.size + # end + + # check if "this user" likes "user" + # def likes?(user) + # return self.likes.where("EXISTS(SELECT 1 FROM") + # end def like_count return self.likes.size end - def band_like_count - return self.band_likes.size - end + # def likes_band(band) + # return self.band_likes.exists?(band) + # end + + # def band_like_count + # return self.band_likes.size + # end def following?(user) self.followings.exists?(user) @@ -278,6 +298,14 @@ module JamRuby return self.followings.size end + def following_band?(band) + self.band_followings.exists?(band) + end + + # def likes_band?(band) + # self.band_likes.exists?(band) + # end + def band_following_count return self.band_followings.size end diff --git a/web/app/views/api_bands/show.rabl b/web/app/views/api_bands/show.rabl index e064ec115..ae749ecd3 100644 --- a/web/app/views/api_bands/show.rabl +++ b/web/app/views/api_bands/show.rabl @@ -3,24 +3,26 @@ object @band attributes :id, :name, :city, :state, :country, :location, :website, :biography, :photo_url, :logo_url, :liker_count, :follower_count, :recording_count, :session_count, :original_fpfile_photo, :cropped_fpfile_photo, :crop_selection_photo -unless @band.users.blank? - child :users => :musicians do - attributes :id, :first_name, :last_name, :name, :photo_url +child :users => :musicians do + attributes :id, :first_name, :last_name, :name, :photo_url - # TODO: figure out how to omit empty arrays - node :instruments do |user| - unless user.instruments.nil? || user.instruments.size == 0 - child :musician_instruments => :instruments do - attributes :instrument_id, :description, :proficiency_level, :priority - end + # TODO: figure out how to omit empty arrays + node :instruments do |user| + unless user.instruments.nil? || user.instruments.size == 0 + child :musician_instruments => :instruments do + attributes :instrument_id, :description, :proficiency_level, :priority end end end end -unless @band.genres.blank? - child :genres => :genres do - attributes :id, :description - #partial('api_genres/index', :object => @band.genres) - end +child :genres => :genres do + attributes :id, :description + #partial('api_genres/index', :object => @band.genres) end + +if current_user + node :is_following do |uu| + current_user.following_band?(@band) + end +end \ No newline at end of file diff --git a/web/app/views/api_users/show.rabl b/web/app/views/api_users/show.rabl index 7e7f1b3a1..6fdb39f5a 100644 --- a/web/app/views/api_users/show.rabl +++ b/web/app/views/api_users/show.rabl @@ -19,6 +19,7 @@ elsif current_user node :is_following do |uu| current_user.following?(@user) end + node : end child :friends => :friends do diff --git a/web/config/environments/development.rb b/web/config/environments/development.rb index 548d9cb19..f1db54877 100644 --- a/web/config/environments/development.rb +++ b/web/config/environments/development.rb @@ -48,7 +48,7 @@ SampleApp::Application.configure do config.assets.debug = false # Set the logging destination(s) - config.log_to = %w[stdout file] + # config.log_to = %w[stdout file] # Show the logging configuration on STDOUT config.show_log_configuration = true