diff --git a/app/jobs/badge_achievements/send_email_notification_job.rb b/app/jobs/badge_achievements/send_email_notification_job.rb new file mode 100644 index 000000000..c417e5a87 --- /dev/null +++ b/app/jobs/badge_achievements/send_email_notification_job.rb @@ -0,0 +1,10 @@ +module BadgeAchievements + class SendEmailNotificationJob < ApplicationJob + queue_as :badge_achievements_send_email_notification + + def perform(badge_achievement_id) + badge_achievement = BadgeAchievement.find_by(id: badge_achievement_id) + NotifyMailer.new_badge_email(badge_achievement).deliver_now if badge_achievement + end + end +end diff --git a/app/models/badge_achievement.rb b/app/models/badge_achievement.rb index f254febea..967dc5ef5 100644 --- a/app/models/badge_achievement.rb +++ b/app/models/badge_achievement.rb @@ -30,9 +30,12 @@ class BadgeAchievement < ApplicationRecord end def send_email_notification - NotifyMailer.new_badge_email(self).deliver if user.class.name == "User" && user.email.present? && user.email_badge_notifications + BadgeAchievements::SendEmailNotificationJob.perform_later(id) if user.class.name == "User" && user.email.present? && user.email_badge_notifications + end + + def send_email_notification_without_delay + BadgeAchievements::SendEmailNotificationJob.perform_now(id) if user.class.name == "User" && user.email.present? && user.email_badge_notifications end - handle_asynchronously :send_email_notification def award_credits Credit.add_to(user, 5) diff --git a/spec/jobs/badge_achievements/send_email_notification_job_spec.rb b/spec/jobs/badge_achievements/send_email_notification_job_spec.rb new file mode 100644 index 000000000..9b8809517 --- /dev/null +++ b/spec/jobs/badge_achievements/send_email_notification_job_spec.rb @@ -0,0 +1,22 @@ +require "rails_helper" + +RSpec.describe BadgeAchievements::SendEmailNotificationJob, type: :job do + let(:user) { create(:user, email_badge_notifications: true) } + let(:badge_achievement) { create(:badge_achievement, user: user) } + + describe ".perform_later" do + it "add job to the queue :badge_achievements_send_email_notification" do + expect do + described_class.perform_later(1) + end.to have_enqueued_job.with(1).on_queue("badge_achievements_send_email_notification") + end + end + + describe "#perform" do + it "calls on NotifyMailer" do + described_class.new.perform(badge_achievement.id) do + expect(NotifyMailer).to have_received(:new_badge_email).with(badge_achievement) + end + end + end +end