Refactored Topic#limit_topics_per_day to reduce code climate complexity

Extracted  1) #apply_per_day_rate_limit_for, method as generic
RateLimiter , 2) #limit_first_day_topics_per_day as a separate method,
3) Added User#added_a_day_ago?, 4) Fixed private methods indentation.
This commit is contained in:
Manoj 2013-10-16 14:58:18 +05:30
parent 3d647a4b41
commit 7c03076c2a
3 changed files with 39 additions and 12 deletions

View File

@ -182,15 +182,13 @@ class Topic < ActiveRecord::Base
# Additional rate limits on topics: per day and private messages per day # Additional rate limits on topics: per day and private messages per day
def limit_topics_per_day def limit_topics_per_day
RateLimiter.new(user, "topics-per-day:#{Date.today.to_s}", SiteSetting.max_topics_per_day, 1.day.to_i) apply_per_day_rate_limit_for("topics", :max_topics_per_day)
if user.created_at > 1.day.ago limit_first_day_topics_per_day if user.added_a_day_ago?
RateLimiter.new(user, "first-day-topics-per-day:#{Date.today.to_s}", SiteSetting.max_topics_in_first_day, 1.day.to_i)
end
end end
def limit_private_messages_per_day def limit_private_messages_per_day
return unless private_message? return unless private_message?
RateLimiter.new(user, "pms-per-day:#{Date.today.to_s}", SiteSetting.max_private_messages_per_day, 1.day.to_i) apply_per_day_rate_limit_for("pms", :max_private_messages_per_day)
end end
def fancy_title def fancy_title
@ -325,9 +323,7 @@ class Topic < ActiveRecord::Base
end end
def changed_to_category(cat) def changed_to_category(cat)
return true if cat.blank? || Category.where(topic_id: id).first.present?
return true if cat.blank?
return true if Category.where(topic_id: id).first.present?
Topic.transaction do Topic.transaction do
old_category = category old_category = category
@ -615,11 +611,19 @@ class Topic < ActiveRecord::Base
private private
def update_category_topic_count_by(num) def update_category_topic_count_by(num)
if category_id.present? if category_id.present?
Category.where(['id = ?', category_id]).update_all("topic_count = topic_count " + (num > 0 ? '+' : '') + "#{num}") Category.where(['id = ?', category_id]).update_all("topic_count = topic_count " + (num > 0 ? '+' : '') + "#{num}")
end
end end
end
def limit_first_day_topics_per_day
apply_per_day_rate_limit_for("first-day-topics", :max_topics_in_first_day)
end
def apply_per_day_rate_limit_for(key, method_name)
RateLimiter.new(user, "#{key}-per-day:#{Date.today.to_s}", SiteSetting.send(method_name), 1.day.to_i)
end
end end

View File

@ -467,6 +467,10 @@ class User < ActiveRecord::Base
uploaded_avatar.present? uploaded_avatar.present?
end end
def added_a_day_ago?
created_at > 1.day.ago
end
protected protected
def cook def cook

View File

@ -822,4 +822,23 @@ describe User do
end end
end end
end end
describe "#added_a_day_ago?" do
context "when user is more than a day old" do
subject(:user) { Fabricate(:user, created_at: Date.today - 2.days) }
it "returns false" do
expect(user).to_not be_added_a_day_ago
end
end
context "is less than a day old" do
subject(:user) { Fabricate(:user) }
it "returns true" do
expect(user).to be_added_a_day_ago
end
end
end
end end