From 03a122f0ce0d6080f286729b8acca1b668a62035 Mon Sep 17 00:00:00 2001 From: Kartikey Tanna Date: Tue, 21 May 2019 18:15:58 +0530 Subject: [PATCH] Implemented ActiveJob for RateLimitChecker Job (#2878) * Implemented ActiveJob for RateLimitChecker Job * Changes as per the review * Further changes as per the review --- app/jobs/rate_limit_checker_job.rb | 8 ++++++ app/labor/rate_limit_checker.rb | 14 ++++------ app/services/ping_admins.rb | 24 +++++++++++++++++ spec/jobs/rate_limit_checker_job_spec.rb | 34 ++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 9 deletions(-) create mode 100644 app/jobs/rate_limit_checker_job.rb create mode 100644 app/services/ping_admins.rb create mode 100644 spec/jobs/rate_limit_checker_job_spec.rb diff --git a/app/jobs/rate_limit_checker_job.rb b/app/jobs/rate_limit_checker_job.rb new file mode 100644 index 000000000..769ccf381 --- /dev/null +++ b/app/jobs/rate_limit_checker_job.rb @@ -0,0 +1,8 @@ +class RateLimitCheckerJob < ApplicationJob + queue_as :rate_limit_checker + + def perform(user_id) + user = User.find_by(id: user_id) + PingAdmins.call(user) if user + end +end diff --git a/app/labor/rate_limit_checker.rb b/app/labor/rate_limit_checker.rb index 256f43b41..0862821ce 100644 --- a/app/labor/rate_limit_checker.rb +++ b/app/labor/rate_limit_checker.rb @@ -34,14 +34,10 @@ class RateLimitChecker end def ping_admins - return unless user && Rails.env.production? - - SlackBot.ping( - "Rate limit exceeded. https://dev.to#{user.path}", - channel: "abuse-reports", - username: "rate_limit", - icon_emoji: ":hand:", - ) + RateLimitCheckerJob.perform_later(user.id) + end + + def ping_admins_without_delay + RateLimitCheckerJob.perform_now(user.id) end - handle_asynchronously :ping_admins end diff --git a/app/services/ping_admins.rb b/app/services/ping_admins.rb new file mode 100644 index 000000000..46cec2bf2 --- /dev/null +++ b/app/services/ping_admins.rb @@ -0,0 +1,24 @@ +class PingAdmins + def initialize(user) + @user = user + end + + def self.call(*args) + new(*args).call + end + + def call + return unless user && Rails.env.production? + + SlackBot.ping( + "Rate limit exceeded. https://dev.to#{user.path}", + channel: "abuse-reports", + username: "rate_limit", + icon_emoji: ":hand:", + ) + end + + private + + attr_reader :user +end diff --git a/spec/jobs/rate_limit_checker_job_spec.rb b/spec/jobs/rate_limit_checker_job_spec.rb new file mode 100644 index 000000000..8271ccd10 --- /dev/null +++ b/spec/jobs/rate_limit_checker_job_spec.rb @@ -0,0 +1,34 @@ +require "rails_helper" + +RSpec.describe RateLimitCheckerJob, type: :job do + include_examples "#enqueues_job", "rate_limit_checker", 2 + + describe "#perform_later" do + let(:user) { create(:user) } + let(:service) { PingAdmins } + + before { allow(service).to receive(:call) } + + it "enqueues the job" do + expect do + described_class.perform_later(user.id) + end.to have_enqueued_job.with(user.id).on_queue("rate_limit_checker") + end + + it "calls a service" do + perform_enqueued_jobs do + described_class.perform_now(user.id) + + expect(service).to have_received(:call).with(user).once + end + end + + it "does nothing for non-existent user" do + perform_enqueued_jobs do + described_class.perform_now(nil) + + expect(service).not_to have_received(:call) + end + end + end +end