openstreetmap-website/app/validators/normalized_uniqueness_validator.rb
Tom Hughes c12f8959dd Require user names to be unique after unicode normalisation
As with the previous checks on case sensitivity this only affects
new users, and changes to names of existing users.
2023-12-13 22:27:36 +00:00

18 lines
716 B
Ruby

class NormalizedUniquenessValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
relation = if options.fetch(:case_sensitive, true)
record.class.where("NORMALIZE(#{attribute}, NFKC) = NORMALIZE(?, NFKC)", value)
else
record.class.where("LOWER(NORMALIZE(#{attribute}, NFKC)) = LOWER(NORMALIZE(?, NFKC))", value)
end
relation = relation.where.not(record.class.primary_key => [record.id_in_database]) if record.persisted?
if relation.exists?
error_options = options.except(:case_sensitive)
error_options[:value] = value
record.errors.add(attribute, :taken, **error_options)
end
end
end