diff --git a/Rakefile b/Rakefile index eda7207d..f823b5b7 100644 --- a/Rakefile +++ b/Rakefile @@ -123,4 +123,49 @@ task :primenewstriperunonlyonce => [:environment] do site.plan_type = 'supporter' site.save_changes validate: false end +end + +desc 'Clean tags' +task :cleantags => [:environment] do + + Site.select(:id).all.each do |site| + site.tags.each do |tag| + if tag.name == '' + site.remove_tag tag + end + end + + site.reload + + if site.tags.length > 5 + site.tags.slice(5, site.tags.length).each {|tag| site.remove_tag tag} + end + + end + + Tag.where(name: '').delete + + Tag.all.each do |tag| + if tag.name.length > Tag::NAME_LENGTH_MAX + tag.sites.each { |site| tag.remove_site site } + tag.delete + end + + tag.update name: tag.name.downcase.strip + end + + Tag.all.each do |tag| + begin + tag.reload + rescue Sequel::Error => e + next if e.message =~ /Record not found/ + end + + matching_tags = Tag.exclude(id: tag.id).where(name: tag.name).all + + matching_tags.each do |matching_tag| + DB[:sites_tags].where(tag_id: matching_tag.id).update(tag_id: tag.id) + matching_tag.delete + end + end end \ No newline at end of file diff --git a/models/tag.rb b/models/tag.rb index f709989e..80def65a 100644 --- a/models/tag.rb +++ b/models/tag.rb @@ -6,10 +6,13 @@ class Tag < Sequel::Model def before_create super values[:name].downcase! + values[:name].strip! end def self.create_unless_exists(name) - dataset.filter(name: name.downcase).first || create(name: name) + name = name.downcase.strip + return nil if name == '' || name.nil? + dataset.filter(name: name).first || create(name: name) end def self.suggestions(name, limit=3) diff --git a/tests/tag_tests.rb b/tests/tag_tests.rb index 89ac8c48..334648be 100644 --- a/tests/tag_tests.rb +++ b/tests/tag_tests.rb @@ -9,5 +9,24 @@ describe Tag do Tag.create_unless_exists tag_name.upcase Tag.filter(name: tag_name).count.must_equal 1 end + + it 'prohibits junk tags' do + Tag.where(name: '').delete + tag = Tag.create_unless_exists '' + Tag.where(name: '').count.must_equal 0 + end + + it 'strips tags' do + name = SecureRandom.hex(4)+' ' + Tag.create_unless_exists name + + Tag[name: name.strip].wont_be_nil + end + + it 'does not duplicate' do + name = SecureRandom.hex(4).upcase + 2.times { Tag.create_unless_exists name } + Tag.where(name: name.downcase).count.must_equal 1 + end end end \ No newline at end of file