more work on like/follow refactor

This commit is contained in:
Brian Smith 2014-02-15 20:24:51 -05:00
parent c03404d520
commit c173582aa3
19 changed files with 113 additions and 341 deletions

View File

@ -1,3 +1,10 @@
drop table users_followers;
drop table users_likers;
drop table bands_followers;
drop table bands_likers;
drop table music_sessions_likers;
drop table recordings_likers;
alter table music_sessions_history
add constraint music_sessions_history_pkey PRIMARY KEY (id);
@ -10,9 +17,7 @@ CREATE TABLE likes
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 likes_user_fkey FOREIGN KEY (user_id)
REFERENCES users (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT likes_user_fkey FOREIGN KEY (user_id) REFERENCES users (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT likes_user_uniqkey UNIQUE (user_id, likable_id)
);
@ -25,8 +30,6 @@ CREATE TABLE follows
created_at timestamp without time zone NOT NULL DEFAULT now(),
updated_at timestamp without time zone NOT NULL DEFAULT now(),
CONSTRAINT follows_pkey PRIMARY KEY (id),
CONSTRAINT follows_user_fkey FOREIGN KEY (user_id)
REFERENCES users (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT follows_user_fkey FOREIGN KEY (user_id) REFERENCES users (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT follows_user_uniqkey UNIQUE (user_id, followable_id)
);

View File

@ -67,15 +67,11 @@ 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_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_history"
require "jam_ruby/models/music_session_user_history"
require "jam_ruby/models/music_session_perf_data"
@ -88,14 +84,9 @@ require "jam_ruby/models/follow"
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/search"
require "jam_ruby/models/recording"
require "jam_ruby/models/recording_comment"
# 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"

View File

@ -27,19 +27,10 @@ module JamRuby
has_many :recordings, :class_name => "JamRuby::Recording", :foreign_key => "band_id"
# self.id = likable_id in likes table
has_many :likes, :as => :likable, :class_name => "JamRuby::Like", :dependent => :destroy
has_many :likers, :as => :likable, :class_name => "JamRuby::Like", :dependent => :destroy
# self.id = followable_id in follows table
has_many :follows, :as => :followable, :class_name => "JamRuby::Follow", :dependent => :destroy
# has_many :likers, :class_name => "JamRuby::BandLiker", :foreign_key => "band_id", :inverse_of => :band
# has_many :inverse_likers, :through => :likers, :class_name => "JamRuby::User", :foreign_key => "liker_id"
# followers
# has_many :band_followers, :class_name => "JamRuby::BandFollower", :foreign_key => "band_id"
# has_many :followers, :through => :band_followers, :class_name => "JamRuby::User"
# has_many :inverse_band_followers, :through => :followers, :class_name => "JamRuby::BandFollower", :foreign_key => "follower_id"
# has_many :inverse_followers, :through => :inverse_band_followers, :source => :band, :class_name => "JamRuby::Band"
has_many :followers, :as => :followable, :class_name => "JamRuby::Follow", :dependent => :destroy
# invitations
has_many :invitations, :inverse_of => :band, :class_name => "JamRuby::BandInvitation", :foreign_key => "band_id"
@ -55,10 +46,6 @@ module JamRuby
return self.likers.size
end
# def likes?(user)
# self.likers.exists?(user)
# end
def follower_count
return self.followers.size
end

View File

@ -1,11 +0,0 @@
module JamRuby
class BandFollower < ActiveRecord::Base
self.table_name = "bands_followers"
self.primary_key = 'id'
belongs_to :band, :class_name => "JamRuby::Band", :foreign_key => "band_id"
belongs_to :follower, :class_name => "JamRuby::User", :foreign_key => "follower_id"
end
end

View File

@ -1,11 +0,0 @@
module JamRuby
class BandFollowing < ActiveRecord::Base
self.table_name = "bands_followers"
self.primary_key = 'id'
belongs_to :user, :class_name => "JamRuby::User", :foreign_key => "follower_id", :inverse_of => :inverse_band_followings
belongs_to :band_following, :class_name => "JamRuby::Band", :foreign_key => "band_id", :inverse_of => :band_followings
end
end

View File

@ -1,11 +0,0 @@
module JamRuby
class BandLiker < ActiveRecord::Base
self.table_name = "bands_likers"
self.primary_key = 'id'
belongs_to :band, :class_name => "JamRuby::Band", :foreign_key => "band_id", :inverse_of => :likers
belongs_to :user, :class_name => "JamRuby::User", :foreign_key => "liker_id", :inverse_of => :band_likes
end
end

View File

@ -21,7 +21,6 @@ module JamRuby
has_many :music_session_user_histories, :class_name => "JamRuby::MusicSessionUserHistory", :foreign_key => "music_session_id"
has_many :comments, :class_name => "JamRuby::MusicSessionComment", :foreign_key => "music_session_id"
# has_many :likes, :class_name => "JamRuby::MusicSessionLiker", :foreign_key => "music_session_id"
has_many :likes, :as => :likable, :class_name => "JamRuby::Like", :dependent => :destroy
has_one :share_token, :class_name => "JamRuby::ShareToken", :inverse_of => :shareable, :foreign_key => 'shareable_id'

View File

@ -1,17 +0,0 @@
module JamRuby
class MusicSessionLiker < ActiveRecord::Base
self.table_name = "music_sessions_likers"
self.primary_key = 'id'
belongs_to(:music_session_history,
:class_name => "JamRuby::MusicSessionHistory",
:foreign_key => "music_session_id")
belongs_to(:user,
:class_name => "JamRuby::User",
:foreign_key => "liker_id")
end
end

View File

@ -1,12 +0,0 @@
module JamRuby
class RecordingLiker < ActiveRecord::Base
self.table_name = "recordings_likers"
self.primary_key = 'id'
belongs_to :recording, :class_name => "JamRuby::Recording", :foreign_key => "recording_id"
belongs_to :user, :class_name => "JamRuby::User", :foreign_key => "liker_id"
end
end

View File

@ -47,47 +47,13 @@ module JamRuby
has_many :likings, :class_name => "JamRuby::Like", :inverse_of => :user, :dependent => :destroy
# self.id = likable_id in likes table
has_many :likes, :as => :likable, :class_name => "JamRuby::Like", :dependent => :destroy
has_many :likers, :as => :likable, :class_name => "JamRuby::Like", :dependent => :destroy
# self.id = user_id in follows table
has_many :followings, :class_name => "JamRuby::Follow", :inverse_of => :user, :dependent => :destroy
# self.id = followable_id in follows table
has_many :follows, :as => :followable, :class_name => "JamRuby::Follow", :dependent => :destroy
# # 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"
# # 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"
# # 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"
# # 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"
# # 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"
has_many :followers, :as => :followable, :class_name => "JamRuby::Follow", :dependent => :destroy
# notifications
has_many :notifications, :class_name => "JamRuby::Notification", :foreign_key => "target_user_id"
@ -263,69 +229,45 @@ module JamRuby
end
def friends?(user)
return self.friends.exists?(user)
self.friends.exists?(user)
end
def friend_count
return self.friends.size
self.friends.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
# check if "this user" likes entity
def likes?(entity)
self.likings.where(:user_id => self.id).where(:likable_id => entity.id).size > 0
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)
def liking_count
self.likings.size
end
def follower_count
return self.followers.size
def liker_count
self.likers.size
end
# check if "this user" follows entity
def following?(entity)
self.followings.where(:user_id => self.id).where(:likable_id => entity.id).size > 0
end
def following_count
return self.followings.size
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
def follower_count
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
@ -604,28 +546,63 @@ module JamRuby
self.save
end
def create_user_following(user_id)
follower = UserFollower.new
follower.user_id = user_id
follower.follower_id = self.id
follower.save
def create_user_following(targetUserId)
targetUser = User.new
targetUser.id = targetUserId
follow = Follow.new
follow.followable = targetUser
follow.user = self
follow.save
# TODO: make this async
user = User.find(user_id)
user = User.find(targetUserId)
Notification.send_new_user_follower(self, user)
end
def create_band_following(band_id)
follower = BandFollower.new
follower.band_id = band_id
follower.follower_id = self.id
follower.save
def create_band_following(targetBandId)
targetBand= Band.new
targetBand.id = targetBandId
follow = Follow.new
follow.followable = targetBand
follow.user = self
follow.save
# TODO: make this async
band = Band.find(band_id)
band = Band.find(targetBandId)
Notification.send_new_band_follower(self, band)
end
def self.delete_following(likerId, targetEntityId)
Follow.delete_all "(user_id = '#{liker_id}' AND followable_id = '#{targetEntityId}')"
end
def create_user_like(targetUserId)
targetUser = User.new
targetUser.id = targetUserId
like = Like.new
like.likable = targetUser
like.user = self
like.save
end
def create_band_like(targetBandId)
targetBand = Band.new
targetBand.id = targetBandId
like = Like.new
like.likable = targetBand
like.user = self
like.save
end
def self.delete_like(likerId, targetEntityId)
Like.delete_all "(user_id = '#{liker_id}' AND likable_id = '#{targetEntityId}')"
end
def self.finalize_update_email(update_email_token)
# updates the user model to have a new email address
user = User.find_by_update_email_token!(update_email_token)
@ -638,46 +615,6 @@ module JamRuby
return user
end
def self.create_user_like(user_id, liker_id)
liker = UserLiker.new()
liker.user_id = user_id
liker.liker_id = liker_id
liker.save
end
def self.delete_like(user_id, band_id, liker_id)
if !user_id.nil?
JamRuby::UserLiker.delete_all "(user_id = '#{user_id}' AND liker_id = '#{liker_id}')"
elsif !band_id.nil?
JamRuby::BandLiker.delete_all "(band_id = '#{band_id}' AND liker_id = '#{liker_id}')"
end
end
def self.create_band_like(band_id, liker_id)
liker = BandLiker.new
liker.band_id = band_id
liker.liker_id = liker_id
liker.save
end
def self.delete_band_like(band_id, liker_id)
JamRuby::BandLiker.delete_all "(band_id = '#{band_id}' AND liker_id = '#{liker_id}')"
end
def self.delete_following(user_id, band_id, follower_id)
if !user_id.nil?
JamRuby::UserFollower.delete_all "(user_id = '#{user_id}' AND follower_id = '#{follower_id}')"
elsif !band_id.nil?
JamRuby::BandFollower.delete_all "(band_id = '#{band_id}' AND follower_id = '#{follower_id}')"
end
end
def self.delete_band_following(band_id, follower_id)
JamRuby::BandFollower.delete_all "(band_id = '#{band_id}' AND follower_id = '#{follower_id}')"
end
def self.create_favorite(user_id, recording_id)
favorite = UserFavorite.new
favorite.user_id = user_id

View File

@ -1,11 +0,0 @@
module JamRuby
class UserFollower < ActiveRecord::Base
self.table_name = "users_followers"
self.primary_key = 'id'
belongs_to :user, :class_name => "JamRuby::User", :foreign_key => "user_id", :inverse_of => :inverse_followers
belongs_to :follower, :class_name => "JamRuby::User", :foreign_key => "follower_id", :inverse_of => :followers
end
end

View File

@ -1,11 +0,0 @@
module JamRuby
class UserFollowing < ActiveRecord::Base
self.table_name = "users_followers"
self.primary_key = 'id'
belongs_to :user, :class_name => "JamRuby::User", :foreign_key => "follower_id", :inverse_of => :inverse_followings
belongs_to :following, :class_name => "JamRuby::User", :foreign_key => "user_id", :inverse_of => :followings
end
end

View File

@ -1,10 +0,0 @@
module JamRuby
class UserLike < ActiveRecord::Base
self.table_name = "users_likers"
self.primary_key = 'id'
belongs_to :user, :class_name => "JamRuby::User", :foreign_key => "user_id", :inverse_of => :inverse_likes
end
end

View File

@ -1,10 +0,0 @@
module JamRuby
class UserLiker < ActiveRecord::Base
self.table_name = "users_likers"
self.primary_key = 'id'
belongs_to :user, :class_name => "JamRuby::User", :foreign_key => "liker_id", :inverse_of => :inverse_likers
end
end

View File

@ -46,55 +46,34 @@
newFollowing.band_id = id;
}
var url = "/api/users/" + context.JK.currentUserId + "/followings";
$.ajax({
type: "POST",
dataType: "json",
contentType: 'application/json',
url: url,
data: JSON.stringify(newFollowing),
processData: false,
success: function(response) {
renderActive(); // refresh stats
rest.addFollowing(newFollowing)
.done(function() {
if (isBand) {
configureBandFollowingButton(true);
}
else {
configureMemberFollowingButton(true, id);
}
},
error: app.ajaxError
});
configureFollowingButton();
})
.fail(app.ajaxError);
}
function removeFollowing(isBand, id) {
var following = {};
if (!isBand) {
following.user_id = id;
}
else {
following.band_id = id;
}
following.target_entity_id = id;
var url = "/api/users/" + context.JK.currentUserId + "/followings";
$.ajax({
type: "DELETE",
dataType: "json",
contentType: 'application/json',
url: url,
data: JSON.stringify(following),
processData: false,
success: function(response) {
renderActive(); // refresh stats
if (isBand) {
configureBandFollowingButton(false);
}
else {
configureMemberFollowingButton(false, id);
}
},
error: app.ajaxError
});
rest.removeFollowing(following)
.done(function() {
renderActive(); // refresh stats
if (isBand) {
configureBandFollowingButton(false);
}
else {
configureMemberFollowingButton(false, id);
}
})
.fail(app.ajaxError);
}
function isFollowingMember(userId) {

View File

@ -214,13 +214,7 @@
function removeFollowing(isBand, id) {
var following = {};
if (!isBand) {
following.user_id = id;
}
else {
following.band_id = id;
}
following.target_entity_id = id;
rest.removeFollowing(following)
.done(function() {

View File

@ -194,26 +194,18 @@ class ApiUsersController < ApiController
end
def like_create
id = params[:id]
if !params[:user_id].nil?
User.create_user_like(params[:user_id], id)
@user.create_user_like(params[:user_id])
respond_with @user, responder: ApiResponder, :location => api_user_like_index_url(@user)
elsif !params[:band_id].nil?
User.create_band_like(params[:band_id], id)
@user.create_band_like(params[:band_id])
respond_with @user, responder: ApiResponder, :location => api_band_like_index_url(@user)
end
end
def like_destroy
if !params[:user_id].nil?
User.delete_like(params[:user_id], nil, params[:id])
elsif !params[:band_id].nil?
User.delete_like(nil, params[:band_id], params[:id])
end
User.delete_like(params[:id], params[:target_entity_id])
respond_with responder: ApiResponder, :status => 204
end
@ -228,21 +220,19 @@ class ApiUsersController < ApiController
@user = User.find(params[:id])
end
def following_show
@following = UserFollowing.find_by_user_id_and_follower_id(params[:user_id], params[:id])
end
# def following_show
# @following = UserFollowing.find_by_user_id_and_follower_id(params[:user_id], params[:id])
# end
def band_following_index
@user = User.find(params[:id])
end
def band_following_show
@following = BandFollowing.find_by_band_id_and_follower_id(params[:band_id], params[:id])
end
# def band_following_show
# @following = BandFollowing.find_by_band_id_and_follower_id(params[:band_id], params[:id])
# end
def following_create
id = params[:id]
if !params[:user_id].nil?
@user.create_user_following(params[:user_id])
respond_with @user, responder: ApiResponder, :location => api_user_following_index_url(@user)
@ -254,13 +244,7 @@ class ApiUsersController < ApiController
end
def following_destroy
if !params[:user_id].nil?
User.delete_following(params[:user_id], nil, params[:id])
elsif !params[:band_id].nil?
User.delete_following(nil, params[:band_id], params[:id])
end
User.delete_following(params[:id], params[:target_entity_id])
respond_with responder: ApiResponder, :status => 204
end

View File

@ -19,7 +19,9 @@ elsif current_user
node :is_following do |uu|
current_user.following?(@user)
end
node :
node :is_liking do |uu|
current_user.likes
end
end
child :friends => :friends do
@ -27,7 +29,7 @@ child :friends => :friends do
end
child :followings => :followings do
attributes :id, :first_name, :last_name, :name, :online, :photo_url
attributes :id, :name, :location, :photo_url
end
child :band_musicians => :bands do

View File

@ -171,10 +171,10 @@ SampleApp::Application.routes.draw do
# user followings
match '/users/:id/followings' => 'api_users#following_index', :via => :get, :as => 'api_user_following_index'
match '/users/:id/followings/:user_id' => 'api_users#following_show', :via => :get, :as => 'api_following_detail'
# match '/users/:id/followings/:user_id' => 'api_users#following_show', :via => :get, :as => 'api_following_detail'
match '/users/:id/band_followings' => 'api_users#band_following_index', :via => :get, :as => 'api_band_following_index'
match '/users/:id/band_followings/:band_id' => 'api_users#band_following_show', :via => :get, :as => 'api_band_following_detail'
# match '/users/:id/band_followings/:band_id' => 'api_users#band_following_show', :via => :get, :as => 'api_band_following_detail'
match '/users/:id/followings' => 'api_users#following_create', :via => :post
match '/users/:id/followings' => 'api_users#following_destroy', :via => :delete