Sha256: 9d4af03a039430680d3d10982351ae3bfb314570d0772b06e0eea20a85713ec5

Contents?: true

Size: 1.96 KB

Versions: 60

Compression:

Stored size: 1.96 KB

Contents

module Pageflow
  # Query users for their role on accounts based on role
  class AccountRoleQuery < ApplicationQuery
    # Query for accounts where a user has a given role.
    class Scope < Scope
      # Create query scope.
      #
      # @param [User] user
      #   User to query roles for.
      # @param [ActiveRecord::Relation] scope
      #   Scope of all accounts to filter from.
      def initialize(user, scope)
        @user = user
        @scope = scope
      end

      # Find all accounts where user has at least given role.
      #
      # @param [String] role
      #   Name of role.
      # @return [ActiveRecord::Relation]
      def with_role_at_least(role)
        scope.joins(with_membership_for_account(role))
      end

      private

      attr_reader :user, :scope

      def with_membership_for_account(role)
        sanitize_sql(<<-SQL, user_id: user.id, roles: Roles.at_least(role))
          INNER JOIN pageflow_memberships ON
          pageflow_memberships.user_id = :user_id AND
          pageflow_memberships.entity_id = pageflow_accounts.id AND
          pageflow_memberships.entity_type = "Pageflow::Account" AND
          pageflow_memberships.role IN (:roles)
        SQL
      end
    end

    # Create query that can be used for role comparisons
    #
    # @param [User] user
    #   Required. Membership user to check.
    # @param [Pageflow::Account] account
    #   Required. Membership entity to check.
    def initialize(user, account)
      @user = user
      @account = account
    end

    # Return true if there is a membership with at least role for
    # user/account
    #
    # @param [String] role
    #   Required. Minimum role that we compare against.
    # @return [Boolean]
    def has_at_least_role?(role)
      @user
        .memberships
        .where(role: Roles.at_least(role))
        .where('(entity_id = :account_id AND '\
               "entity_type = 'Pageflow::Account')",
               account_id: @account.id)
        .any?
    end
  end
end

Version data entries

60 entries across 60 versions & 1 rubygems

Version Path
pageflow-14.5.2 app/models/pageflow/account_role_query.rb
pageflow-15.3.0 app/models/pageflow/account_role_query.rb
pageflow-15.2.2 app/models/pageflow/account_role_query.rb
pageflow-15.2.1 app/models/pageflow/account_role_query.rb
pageflow-15.2.0 app/models/pageflow/account_role_query.rb
pageflow-15.1.2 app/models/pageflow/account_role_query.rb
pageflow-15.1.1 app/models/pageflow/account_role_query.rb
pageflow-15.1.0 app/models/pageflow/account_role_query.rb
pageflow-15.1.0.rc0 app/models/pageflow/account_role_query.rb
pageflow-15.1.0.beta6 app/models/pageflow/account_role_query.rb
pageflow-15.1.0.beta5 app/models/pageflow/account_role_query.rb
pageflow-15.1.0.beta4 app/models/pageflow/account_role_query.rb
pageflow-15.1.0.beta3 app/models/pageflow/account_role_query.rb
pageflow-15.1.0.beta2 app/models/pageflow/account_role_query.rb
pageflow-15.1.0.beta1 app/models/pageflow/account_role_query.rb
pageflow-15.0.2 app/models/pageflow/account_role_query.rb
pageflow-15.0.1 app/models/pageflow/account_role_query.rb
pageflow-15.0.0 app/models/pageflow/account_role_query.rb
pageflow-14.5.1 app/models/pageflow/account_role_query.rb
pageflow-14.5.0 app/models/pageflow/account_role_query.rb