diff --git a/app/models/follow.rb b/app/models/follow.rb index 70ff6188..cf1d5f17 100644 --- a/app/models/follow.rb +++ b/app/models/follow.rb @@ -10,7 +10,11 @@ class Follow < ApplicationRecord validates :user, uniqueness: { scope: :followed, message: 'This entity is already followed by this user' } after_create :add_subsetting - + + scope :active, -> { + where(muted: false) + } + private def add_subsetting diff --git a/app/models/user.rb b/app/models/user.rb index feac3d08..d9e25cad 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -58,8 +58,8 @@ class User < ApplicationRecord admin: admin } if (_options[:follows]) json['follows'] = { - topics: following.where(muted: false, followed_type: 'Topic').to_a.map(&:followed_id), - maps: following.where(muted: false, followed_type: 'Map').to_a.map(&:followed_id) + topics: following.active.where(followed_type: 'Topic').to_a.map(&:followed_id), + maps: following.active.where(followed_type: 'Map').to_a.map(&:followed_id) } end if (_options[:follow_settings]) diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb index be70cf84..87ac3be5 100644 --- a/app/services/follow_service.rb +++ b/app/services/follow_service.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true class FollowService - class << self + class << self def follow(entity, user, reason) return unless user @@ -8,7 +8,9 @@ class FollowService return if (reason == 'created' || reason == 'contributed') && !should_auto_follow(entity, user, reason) follow = Follow.where(followed: entity, user: user).first_or_create - follow.update_attribute('muted', false) + unless follow.update(muted: false) + raise follow.errors.full_messages.join("\n") + end if FollowReason::REASONS.include?(reason) && !follow.follow_reason.read_attribute(reason) follow.follow_reason.update_attribute(reason, true) end @@ -16,7 +18,11 @@ class FollowService def unfollow(entity, user) follow = Follow.where(followed: entity, user: user).first - follow.update_attribute('muted', true) + if follow + unless follow.update(muted: true) + raise follow.errors.full_messages.join("\n") + end + end end def remove_reason(entity, user, reason) diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index ba1203b8..7d7f0512 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -53,8 +53,7 @@ class NotificationService end def self.notify_followers(entity, event_type, event, reason_filter = nil, exclude_follows = nil) - follows = entity.follows.where.not(user_id: event.user.id) - follows = follows.where(muted: false) + follows = entity.follows.active.where.not(user_id: event.user.id) if !exclude_follows.nil? follows = follows.where.not(id: exclude_follows) diff --git a/config/initializers/delayed_job.rb b/config/initializers/delayed_job.rb new file mode 100644 index 00000000..d3132394 --- /dev/null +++ b/config/initializers/delayed_job.rb @@ -0,0 +1,9 @@ +Delayed::Worker.class_eval do + + def handle_failed_job_with_notification(job, error) + handle_failed_job_without_notification(job, error) + ExceptionNotifier.notify_exception(error) + end + alias_method_chain :handle_failed_job, :notification + +end diff --git a/lib/tasks/emails.rake b/lib/tasks/emails.rake index b2a7303a..02e6e372 100644 --- a/lib/tasks/emails.rake +++ b/lib/tasks/emails.rake @@ -5,7 +5,7 @@ namespace :metamaps do end def summarize_map_activity - Follow.where(followed_type: 'Map').find_each do |follow| + Follow.active.where(followed_type: 'Map').find_each do |follow| map = follow.followed user = follow.user # add logging and rescue-ing