diff --git a/app/models/post.rb b/app/models/post.rb index 112cb49..3157d1a 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -5,6 +5,8 @@ class Post < ApplicationRecord validates :content, length: { maximum: 777 } validates :content, presence: true, if: :quoted_post? + validate :user, :limit_of_post_per_day + def kind if quoted_post? :quoted_post @@ -24,4 +26,12 @@ class Post < ApplicationRecord def repost? content.blank? && quoted_post_id end + + def limit_of_post_per_day + posts_from_day = user.posts.where('created_at >= ?', Time.zone.now.beginning_of_day) + + if posts_from_day.count >= 5 + errors.add(:base, 'You can post only 5 posts per day') + end + end end diff --git a/app/models/user.rb b/app/models/user.rb index 0ed9edc..1885014 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -7,4 +7,6 @@ class User < ApplicationRecord format: { with: /\A[a-zA-Z0-9]+\z/, } + + has_many :posts end diff --git a/app/models/user_follow.rb b/app/models/user_follow.rb index 19c13bc..e529c83 100644 --- a/app/models/user_follow.rb +++ b/app/models/user_follow.rb @@ -7,6 +7,8 @@ class UserFollow < ApplicationRecord private def user_cant_follow_himself - errors.add(:followed, 'can\'t follow himself') if follower_id == followed_id + if follower_id == followed_id + errors.add(:followed, 'can\'t follow himself') + end end end diff --git a/spec/models/post_spec.rb b/spec/models/post_spec.rb index 34a8f05..0c6a0f6 100644 --- a/spec/models/post_spec.rb +++ b/spec/models/post_spec.rb @@ -28,4 +28,30 @@ RSpec.describe Post, type: :model do end end end + + describe '#limit_of_post_per_day' do + context 'when user tries to post more than 5 times in a day' do + it 'returns error' do + user = create(:user) + + 5.times do + create(:post, user: user) + end + + expect(build(:post, user: user).valid?).to be_falsey + end + end + + context 'when the user has not yet reached their publication limit' do + it 'does not returns error' do + user = create(:user) + + 4.times do + create(:post, user: user) + end + + expect(build(:post, user: user).valid?).to be_truthy + end + end + end end