Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
# frozen_string_literal: true

module FacultyRBAC
  class Group
    # RBAC-schema query methods
    module Query
      OWN_MEMBERS = %(
        select distinct username
        from rbac_user_group ug
        where ug.group_id = ?
      )

      MEMBERS = %(
        select distinct username
        from rbac_recursive_group gg
        join rbac_user_group ug on ug.group_id = gg.member_group_id
        where gg.group_id = ?
      )

      MEMBERSHIPS = %(
        select distinct username, ug.group_id
        from rbac_recursive_group gg
        join rbac_user_group ug on ug.group_id = gg.member_group_id
        where gg.group_id = ?
      )

      OWN_MEMBER_GROUPS = %(
        select distinct member_group_id group_id
        from rbac_group_group gg
        where gg.group_id = ?
      )

      MEMBER_GROUPS = %(
        select distinct member_group_id group_id
        from rbac_recursive_group gg
        where gg.group_id = ? and gg.member_group_id <> gg.group_id
      )

      ENCLOSING_GROUPS = %(
        select distinct group_id
        from rbac_group_group gg
        where gg.member_group_id = ?
      )

      def _cte_select(name, query, *parameters)
        _db[name].with(name, _db[query, *parameters])
      end

      def self.define_query_method(method_name, query, &transform)
        define_method(method_name) do
          dataset = _cte_select(method_name, query, @id)
          transform ? yield(dataset) : dataset
        end
      end

      define_query_method :own_members, OWN_MEMBERS, &DatasetDelegator.mapping(:username)
      define_query_method :members, MEMBERS, &DatasetDelegator.mapping(:username)
      define_query_method :memberships, MEMBERSHIPS

      define_query_method :own_member_groups, OWN_MEMBER_GROUPS, &DatasetDelegator.mapping(:group_id)
      define_query_method :member_groups, MEMBER_GROUPS, &DatasetDelegator.mapping(:group_id)
      define_query_method :enclosing_groups, ENCLOSING_GROUPS, &DatasetDelegator.mapping(:group_id)

      def grants
        _db[:rbac_grant].where(group_id: @id).map { |grant| Grant[@controller, grant] }
      end
    end
  end
end