Sha256: 74acf1d8a780e116e5b043ac168dfc4e6722b4afbb05dbc6b3fb46112f17d811

Contents?: true

Size: 1.85 KB

Versions: 5

Compression:

Stored size: 1.85 KB

Contents

# frozen_string_literal: true
module Hyrax
  module CustomQueries
    ##
    # @see https://github.com/samvera/valkyrie/wiki/Queries#custom-queries
    class FindModelsByAccess
      def self.queries
        [:find_models_by_access]
      end

      def initialize(query_service:)
        @query_service = query_service
      end

      attr_reader :query_service
      delegate :resource_factory, to: :query_service
      delegate :orm_class, to: :resource_factory

      ##
      # @note this is an unoptimized default implementation of this custom
      #   query. it's Hyrax's policy to provide such implementations of custom
      #   queries in use for cross-compatibility of Valkyrie query services.
      #   it's advisable to provide an optimized query for the specific adapter.
      #
      # @param model [Class]
      # @param ids [Enumerable<#to_s>, Symbol]
      #
      def find_models_by_access(mode:, models: nil, agent:, group: nil)
        agent = "group/#{agent}" if group.present?
        internal_array = "{\"permissions\": [{\"mode\": \"#{mode}\", \"agent\": \"#{agent}\"}]}"
        if models.present?
          query_service.run_query(find_models_by_access_query, internal_array, models)
        else
          query_service.run_query(find_by_access_query, internal_array)
        end
      end

      def find_models_by_access_query
        <<-SQL
          SELECT * FROM orm_resources
          WHERE id IN (
            SELECT uuid(metadata::json#>'{access_to,0}'->>'id') FROM orm_resources
            WHERE metadata @> ?
          ) AND internal_resource IN (?);
        SQL
      end

      def find_by_access_query
        <<-SQL
          SELECT * FROM orm_resources
          WHERE id IN (
            SELECT uuid(metadata::json#>'{access_to,0}'->>'id') FROM orm_resources
            WHERE metadata @> ?
          );
        SQL
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
hyrax-5.0.1 app/services/hyrax/custom_queries/find_models_by_access.rb
hyrax-5.0.0 app/services/hyrax/custom_queries/find_models_by_access.rb
hyrax-5.0.0.rc3 app/services/hyrax/custom_queries/find_models_by_access.rb
hyrax-5.0.0.rc2 app/services/hyrax/custom_queries/find_models_by_access.rb
hyrax-5.0.0.rc1 app/services/hyrax/custom_queries/find_models_by_access.rb