Sha256: 909173226444ba7943686dcf46a2d5277ec285b47e842aa22e2463c4aa71bd05

Contents?: true

Size: 1.64 KB

Versions: 13

Compression:

Stored size: 1.64 KB

Contents

# frozen_string_literal: true

require "active_support/concern"

module Decidim
  # This concern contains the logic related to nicknames.
  module Nicknamizable
    extend ActiveSupport::Concern

    included do
      validates :nickname, length: { maximum: nickname_max_length }, allow_blank: true
    end

    class_methods do
      #
      # Maximum allowed nickname length
      #
      def nickname_max_length
        20
      end

      #
      # Converts any string into a valid nickname
      #
      # * Parameterizes it so it is valid as a URL.
      # * Trims length so it fits validation constraints.
      # * Disambiguates it so it is unique.
      #
      # name - the String to nicknamize
      # scope - a Hash with extra values to scope the nickname to
      #
      # Example to nicknamize a user name, scoped to the organization:
      #
      #    nicknamize(user_name, organization: current_organization)
      #
      def nicknamize(name, scope = {})
        return unless name

        disambiguate(
          name.parameterize(separator: "_")[nickname_length_range],
          scope
        )
      end

      private

      def nickname_length_range
        (0...nickname_max_length)
      end

      def disambiguate(name, scope)
        candidate = name

        2.step do |n|
          return candidate if Decidim::UserBaseEntity.where("nickname ILIKE ?", candidate.downcase).where(scope).empty?

          candidate = numbered_variation_of(name, n)
        end
      end

      def numbered_variation_of(name, number)
        appendix = "_#{number}"

        "#{name[0...(nickname_max_length - appendix.length)]}#{appendix}"
      end
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
decidim-core-0.29.1 lib/decidim/nicknamizable.rb
decidim-core-0.28.4 lib/decidim/nicknamizable.rb
decidim-core-0.29.0 lib/decidim/nicknamizable.rb
decidim-core-0.28.3 lib/decidim/nicknamizable.rb
decidim-core-0.29.0.rc4 lib/decidim/nicknamizable.rb
decidim-core-0.29.0.rc3 lib/decidim/nicknamizable.rb
decidim-core-0.29.0.rc2 lib/decidim/nicknamizable.rb
decidim-core-0.29.0.rc1 lib/decidim/nicknamizable.rb
decidim-core-0.28.2 lib/decidim/nicknamizable.rb
decidim-core-0.28.1 lib/decidim/nicknamizable.rb
decidim-core-0.28.0 lib/decidim/nicknamizable.rb
decidim-core-0.28.0.rc5 lib/decidim/nicknamizable.rb
decidim-core-0.28.0.rc4 lib/decidim/nicknamizable.rb