diff --git a/lib/discourse_tagging.rb b/lib/discourse_tagging.rb index c9b0e14e6ec..bf635e79439 100644 --- a/lib/discourse_tagging.rb +++ b/lib/discourse_tagging.rb @@ -29,12 +29,6 @@ module DiscourseTagging category = topic.category tag_names = tag_names + old_tag_names if append - # validate minimum required tags for a category - if !guardian.is_staff? && category && category.minimum_required_tags > 0 && tag_names.length < category.minimum_required_tags - topic.errors[:base] << I18n.t("tags.minimum_required_tags", count: category.minimum_required_tags) - return false - end - if tag_names.present? # guardian is explicitly nil cause we don't want to strip all # staff tags that already passed validation @@ -54,8 +48,20 @@ module DiscourseTagging end end + # validate minimum required tags for a category + if !guardian.is_staff? && category && category.minimum_required_tags > 0 && tags.length < category.minimum_required_tags + topic.errors[:base] << I18n.t("tags.minimum_required_tags", count: category.minimum_required_tags) + return false + end + topic.tags = tags else + # validate minimum required tags for a category + if !guardian.is_staff? && category && category.minimum_required_tags > 0 + topic.errors[:base] << I18n.t("tags.minimum_required_tags", count: category.minimum_required_tags) + return false + end + topic.tags = [] end topic.tags_changed = true diff --git a/spec/components/discourse_tagging_spec.rb b/spec/components/discourse_tagging_spec.rb index d9660ef2d32..60ed771a938 100644 --- a/spec/components/discourse_tagging_spec.rb +++ b/spec/components/discourse_tagging_spec.rb @@ -101,6 +101,12 @@ describe DiscourseTagging do let(:category) { Fabricate(:category, minimum_required_tags: 2) } let(:topic) { Fabricate(:topic, category: category) } + it 'when tags are not present' do + valid = DiscourseTagging.tag_topic_by_names(topic, Guardian.new(user), []) + expect(valid).to eq(false) + expect(topic.errors[:base]&.first).to eq(I18n.t("tags.minimum_required_tags", count: category.minimum_required_tags)) + end + it 'when tags are less than minimum_required_tags' do valid = DiscourseTagging.tag_topic_by_names(topic, Guardian.new(user), [tag1.name]) expect(valid).to eq(false)