class Decidim::TermCustomizer::Loader

The loader class is a middleman that converts the Translation model objects to a flat translation hash that can be directly used in the i18n backend. The main purpose of this class is to add caching possibility for the translation hashes.

Attributes

resolver[R]

Public Class Methods

new(resolver) click to toggle source
# File lib/decidim/term_customizer/loader.rb, line 10
def initialize(resolver)
  @resolver = resolver
end

Public Instance Methods

clear_cache() click to toggle source

Clears the translations cache only for the current context defined by the resolver.

# File lib/decidim/term_customizer/loader.rb, line 63
def clear_cache
  Rails.cache.delete_matched("#{cache_key_base}/*")
rescue NotImplementedError, NoMethodError
  # Some cache store, such as `ActiveSupport::Cache::MemCacheStore` or
  # `ActiveSupport::Cache::DalliStore` do not support `delete_matched`.
  # Therefore, clear all the possibly existing
  # cache keys manually for each space and component.

  # Clear all the "organization" translation keys.
  Rails.cache.delete(cache_key_base)

  # Iterate over the participatory spaces and their components to manually
  # clear the cached records for all of them.
  Decidim.participatory_space_registry.manifests.each do |manifest|
    manifest.model_class_name.constantize.all.each do |space|
      Rails.cache.delete("#{cache_key_base}/space_#{space.id}")

      next unless space.respond_to?(:components)

      space.components.each do |component|
        Rails.cache.delete(
          "#{cache_key_base}/space_#{space.id}/component_#{component.id}"
        )
      end
    end
  end
end
translations_hash() click to toggle source

Converts the translation objects to a flat hash where the keys are the translatable keys used in the i18n backend containing the locales. The values of the hash are the translations for the keys.

The final hash looks similar like this: {

en: {
  decidim: {
    translation: "Term EN"
  }
},
fi: {
  decidim: {
    translation: "Term FI"
  }
}

}

This will also cache the results and fetch the result directly from cache on consequent calls until the cache is expired.

# File lib/decidim/term_customizer/loader.rb, line 34
def translations_hash
  # In order to avoid endless loops with cache logging calling the I18n
  # calling the translation loader, calling cache logging calling I18n
  # (etc.), temporarily mute the cache logging during this call. If the
  # cache logging level is set to `Logger::DEBUG`, it could happen as
  # explained at:
  # https://github.com/mainio/decidim-module-term_customizer/issues/38
  @translations_hash ||= Rails.cache.mute do
    Rails.cache.fetch(cache_key, expires_in: 24.hours) do
      final_hash = {}
      resolver.translations.each do |tr|
        keyparts = [tr.locale] + tr.key.split(".")
        lastkey = keyparts.pop.to_sym

        current = final_hash
        keyparts.each do |key|
          current[key.to_sym] ||= {}
          current = current[key.to_sym]
        end

        current[lastkey] = tr.value
      end
      final_hash
    end
  end
end

Private Instance Methods

cache_key() click to toggle source
# File lib/decidim/term_customizer/loader.rb, line 95
def cache_key
  parts = [cache_key_base]
  parts << "space_#{resolver.space.id}" if resolver.space
  parts << "component_#{resolver.component.id}" if resolver.component

  parts.join("/")
end
cache_key_base() click to toggle source
# File lib/decidim/term_customizer/loader.rb, line 103
def cache_key_base
  main_key =
    if resolver.organization
      "organization_#{resolver.organization.id}"
    else
      "system"
    end

  "decidim_term_customizer/#{main_key}"
end