Sha256: ac080c0ccc7695a6ca120994d9ce06b027ab584571cdec8074f8125656b93126

Contents?: true

Size: 1.85 KB

Versions: 3

Compression:

Stored size: 1.85 KB

Contents

module Locomotive
  module Steam

    class PageFinderService

      include Locomotive::Steam::Services::Concerns::Decorator

      attr_accessor_initialize :repository

      def find(path)
        decorate do
          repository.by_fullpath(path)
        end
      end

      def match(path)
        decorate do
          repository.matching_fullpath(path_combinations(path))
        end
      end

      def by_handle(handle, with_cache = true)
        decorate do
          with_cache ? page_map[handle] : repository.by_handle(handle)
        end
      end

      def find_by_id(id)
        decorate do
          repository.find(id)
        end
      end

      private

      def decorate(&block)
        super(Decorators::PageDecorator, &block)
      end

      # Instead of hitting the DB each time we want a page from its handle,
      # just get all the handles at once and cache the result. (up to 20% boost)
      #
      def page_map
        @page_map ||= {}

        return @page_map[repository.locale] if @page_map[repository.locale]

        {}.tap do |map|
          repository.only_handle_and_fullpath.each do |page|
            map[page.handle] = page
          end

          @page_map[repository.locale] = map
        end
      end

      def path_combinations(path)
        _path_combinations(path.split('/'))
      end

      def _path_combinations(segments, can_include_template = true)
        return nil if segments.empty?
        segment = segments.shift

        (can_include_template ? [segment, WILDCARD] : [segment]).map do |_segment|
          if (_combinations = _path_combinations(segments.clone, can_include_template && _segment != WILDCARD))
            [*_combinations].map do |_combination|
              File.join(_segment, _combination)
            end
          else
            [_segment]
          end
        end.flatten
      end

    end

  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
locomotivecms_steam-1.5.0.beta3 lib/locomotive/steam/services/page_finder_service.rb
locomotivecms_steam-1.5.0.beta2 lib/locomotive/steam/services/page_finder_service.rb
locomotivecms_steam-1.5.0.beta1 lib/locomotive/steam/services/page_finder_service.rb