2013-02-05 14:16:51 -05:00
class UserActionObserver < ActiveRecord :: Observer
observe :post_action , :topic , :post , :notification , :topic_user
def after_save ( model )
2013-02-07 16:45:24 +01:00
case
2013-02-28 21:54:12 +03:00
when ( model . is_a? ( PostAction ) && ( model . is_bookmark? || model . is_like? ) )
2013-02-05 14:16:51 -05:00
log_post_action ( model )
when ( model . is_a? ( Topic ) )
log_topic ( model )
when ( model . is_a? ( Post ) )
2015-09-18 12:48:43 -04:00
UserActionObserver . log_post ( model )
2013-02-05 14:16:51 -05:00
end
end
2013-02-07 16:45:24 +01:00
2014-10-27 22:06:43 +01:00
def self . log_notification ( post , user , notification_type , acting_user_id = nil )
2013-02-05 14:16:51 -05:00
action =
2014-02-03 13:57:44 +11:00
case notification_type
2013-03-01 15:07:44 +03:00
when Notification . types [ :quoted ]
2013-02-05 14:16:51 -05:00
UserAction :: QUOTE
2013-03-01 15:07:44 +03:00
when Notification . types [ :replied ]
2013-02-05 14:16:51 -05:00
UserAction :: RESPONSE
2013-03-01 15:07:44 +03:00
when Notification . types [ :mentioned ]
2013-02-05 14:16:51 -05:00
UserAction :: MENTION
2013-03-01 15:07:44 +03:00
when Notification . types [ :edited ]
2013-02-05 14:16:51 -05:00
UserAction :: EDIT
end
2014-04-04 11:08:54 +11:00
# skip any invalid items, eg failed to save post and so on
return unless action && post && user && post . id
2013-02-05 14:16:51 -05:00
2013-02-07 16:45:24 +01:00
row = {
2015-07-31 14:22:28 -04:00
action_type : action ,
user_id : user . id ,
acting_user_id : acting_user_id || post . user_id ,
target_topic_id : post . topic_id ,
target_post_id : post . id
2013-02-05 14:16:51 -05:00
}
2013-02-07 16:45:24 +01:00
if post . deleted_at . nil?
2013-02-05 14:16:51 -05:00
UserAction . log_action! ( row )
2013-02-07 16:45:24 +01:00
else
UserAction . remove_action! ( row )
2013-02-05 14:16:51 -05:00
end
end
2015-09-18 12:48:43 -04:00
def self . log_post ( model )
2013-02-05 14:16:51 -05:00
# first post gets nada
2015-04-23 19:33:29 +02:00
return if model . is_first_post?
2015-11-13 11:35:04 -05:00
return if model . topic . blank?
2013-02-05 14:16:51 -05:00
2013-02-07 16:45:24 +01:00
row = {
2015-07-31 14:22:28 -04:00
action_type : UserAction :: REPLY ,
user_id : model . user_id ,
acting_user_id : model . user_id ,
target_post_id : model . id ,
target_topic_id : model . topic_id ,
created_at : model . created_at
2013-02-05 14:16:51 -05:00
}
2013-02-07 16:45:24 +01:00
2013-02-05 14:16:51 -05:00
rows = [ row ]
2013-02-07 16:45:24 +01:00
if model . topic . private_message?
2013-02-05 14:16:51 -05:00
rows = [ ]
model . topic . topic_allowed_users . each do | ta |
row = row . dup
2013-02-07 16:45:24 +01:00
row [ :user_id ] = ta . user_id
2013-02-05 14:16:51 -05:00
row [ :action_type ] = ta . user_id == model . user_id ? UserAction :: NEW_PRIVATE_MESSAGE : UserAction :: GOT_PRIVATE_MESSAGE
rows << row
end
end
2013-02-28 21:54:12 +03:00
rows . each do | r |
2013-02-07 16:45:24 +01:00
if model . deleted_at . nil?
2013-02-28 21:54:12 +03:00
UserAction . log_action! ( r )
2013-02-07 16:45:24 +01:00
else
2013-02-28 21:54:12 +03:00
UserAction . remove_action! ( r )
2013-02-05 14:16:51 -05:00
end
end
end
def log_topic ( model )
2016-05-02 11:14:37 +10:00
# no action to log here, this can happen if a user is deleted
# then topic has no user_id
return unless model . user_id
2013-02-07 16:45:24 +01:00
row = {
2015-07-31 14:22:28 -04:00
action_type : model . archetype == Archetype . private_message ? UserAction :: NEW_PRIVATE_MESSAGE : UserAction :: NEW_TOPIC ,
user_id : model . user_id ,
acting_user_id : model . user_id ,
target_topic_id : model . id ,
target_post_id : - 1 ,
created_at : model . created_at
2013-02-05 14:16:51 -05:00
}
rows = [ row ]
if model . private_message?
2013-02-28 21:54:12 +03:00
model . topic_allowed_users . reject { | a | a . user_id == model . user_id } . each do | ta |
2013-02-05 14:16:51 -05:00
row = row . dup
2013-02-07 16:45:24 +01:00
row [ :user_id ] = ta . user_id
2013-02-05 14:16:51 -05:00
row [ :action_type ] = UserAction :: GOT_PRIVATE_MESSAGE
rows << row
end
end
2013-02-28 21:54:12 +03:00
rows . each do | r |
2013-02-07 16:45:24 +01:00
if model . deleted_at . nil?
2013-02-28 21:54:12 +03:00
UserAction . log_action! ( r )
2013-02-07 16:45:24 +01:00
else
2013-02-28 21:54:12 +03:00
UserAction . remove_action! ( r )
2013-02-05 14:16:51 -05:00
end
end
end
def log_post_action ( model )
action = UserAction :: BOOKMARK if model . is_bookmark?
action = UserAction :: LIKE if model . is_like?
2014-06-04 17:41:11 +02:00
post = Post . with_deleted . where ( id : model . post_id ) . first
2013-02-05 14:16:51 -05:00
row = {
2013-02-07 16:45:24 +01:00
action_type : action ,
user_id : model . user_id ,
acting_user_id : model . user_id ,
2013-02-05 14:16:51 -05:00
target_post_id : model . post_id ,
2014-06-04 17:41:11 +02:00
target_topic_id : post . topic_id ,
2013-02-05 14:16:51 -05:00
created_at : model . created_at
}
if model . deleted_at . nil?
UserAction . log_action! ( row )
else
UserAction . remove_action! ( row )
end
2013-02-07 16:45:24 +01:00
if model . is_like?
2013-02-05 14:16:51 -05:00
row [ :action_type ] = UserAction :: WAS_LIKED
2014-06-04 17:41:11 +02:00
row [ :user_id ] = post . user_id
2013-02-05 14:16:51 -05:00
if model . deleted_at . nil?
UserAction . log_action! ( row )
else
UserAction . remove_action! ( row )
end
end
end
end