Sha256: 9e876fd124df45f1cf08db0b02330a72366137dc03928e2fd0f2f05793b798eb

Contents?: true

Size: 1.64 KB

Versions: 18

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's valid as a URL.
      # * Trims length so it fits validation constraints.
      # * Disambiguates it so it's 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

18 entries across 18 versions & 1 rubygems

Version Path
decidim-core-0.27.9 lib/decidim/nicknamizable.rb
decidim-core-0.27.8 lib/decidim/nicknamizable.rb
decidim-core-0.27.7 lib/decidim/nicknamizable.rb
decidim-core-0.27.6 lib/decidim/nicknamizable.rb
decidim-core-0.26.10 lib/decidim/nicknamizable.rb
decidim-core-0.26.9 lib/decidim/nicknamizable.rb
decidim-core-0.27.5 lib/decidim/nicknamizable.rb
decidim-core-0.26.8 lib/decidim/nicknamizable.rb
decidim-core-0.27.4 lib/decidim/nicknamizable.rb
decidim-core-0.27.3 lib/decidim/nicknamizable.rb
decidim-core-0.26.7 lib/decidim/nicknamizable.rb
decidim-core-0.26.5 lib/decidim/nicknamizable.rb
decidim-core-0.27.2 lib/decidim/nicknamizable.rb
decidim-core-0.27.1 lib/decidim/nicknamizable.rb
decidim-core-0.26.4 lib/decidim/nicknamizable.rb
decidim-core-0.27.0 lib/decidim/nicknamizable.rb
decidim-core-0.26.3 lib/decidim/nicknamizable.rb
decidim-core-0.27.0.rc2 lib/decidim/nicknamizable.rb