Sha256: ac9d13d0a35f43a7d3e3cc266a7e344473a59a3a6851790b7869e12f6974b24b

Contents?: true

Size: 1.83 KB

Versions: 75

Compression:

Stored size: 1.83 KB

Contents

module Pageflow
  # Query accounts for members, e.g. based on role
  class AccountMemberQuery < ApplicationQuery
    class Scope < ApplicationQuery::Scope
      # Account whose members we scope
      # @return [Pageflow::Account]
      attr_reader :account

      # Base scope which is further scoped according to account role
      # @return [ActiveRecord::Relation<User>]
      attr_reader :scope

      # Create scope that can limit base scope to account members at
      # or above a given role
      #
      # @param [Pageflow::Account] account
      #   Required. Membership account to check.
      # @param [ActiveRecord::Relation<User>] scope
      #   Optional. Membership entity to check.
      def initialize(account, scope = User.all)
        @account = account
        @scope = scope
      end

      # Scope to those members from scope on account who have at least
      # role
      #
      # @param [String] role
      #   Required. Minimum role that we compare against.
      # @return [ActiveRecord::Relation<User>]
      def with_role_at_least(role)
        scope.joins(memberships_for_account_with_at_least_role(role))
             .where(membership_is_present)
      end

      private

      def memberships_for_account_with_at_least_role(role)
        options = {roles: Roles.at_least(role), account_id: account.id}

        sanitize_sql(<<-SQL, options)
          LEFT OUTER JOIN pageflow_memberships as
            pageflow_account_memberships ON
          pageflow_account_memberships.user_id = users.id AND
          pageflow_account_memberships.role IN (:roles) AND
          pageflow_account_memberships.entity_id = :account_id AND
          pageflow_account_memberships.entity_type = 'Pageflow::Account'
        SQL
      end

      def membership_is_present
        'pageflow_account_memberships.entity_id IS NOT NULL'
      end
    end
  end
end

Version data entries

75 entries across 75 versions & 1 rubygems

Version Path
pageflow-17.0.4 app/models/pageflow/account_member_query.rb
pageflow-17.0.3 app/models/pageflow/account_member_query.rb
pageflow-17.0.2 app/models/pageflow/account_member_query.rb
pageflow-17.0.1 app/models/pageflow/account_member_query.rb
pageflow-17.0.0 app/models/pageflow/account_member_query.rb
pageflow-16.2.0 app/models/pageflow/account_member_query.rb
pageflow-16.1.0 app/models/pageflow/account_member_query.rb
pageflow-16.0.0 app/models/pageflow/account_member_query.rb
pageflow-15.8.0 app/models/pageflow/account_member_query.rb
pageflow-14.5.2 app/models/pageflow/account_member_query.rb
pageflow-15.7.1 app/models/pageflow/account_member_query.rb
pageflow-15.7.0 app/models/pageflow/account_member_query.rb
pageflow-15.6.1 app/models/pageflow/account_member_query.rb
pageflow-15.6.0 app/models/pageflow/account_member_query.rb
pageflow-15.5.0 app/models/pageflow/account_member_query.rb
pageflow-15.4.0 app/models/pageflow/account_member_query.rb
pageflow-15.3.0 app/models/pageflow/account_member_query.rb
pageflow-15.2.2 app/models/pageflow/account_member_query.rb
pageflow-15.2.1 app/models/pageflow/account_member_query.rb
pageflow-15.2.0 app/models/pageflow/account_member_query.rb