module Scrivito # @api public # The MembershipCollection includes all members of a given {Workspace}. # You can access it using {Workspace#memberships} method. class MembershipCollection extend Forwardable include Enumerable attr_reader :workspace # @api public # @!method each # Iterate over all {Membership Memberships} of a specfic {Workspace}. Allows # you to use all methods defined by ruby's Enumerable module. # # @yield [Membership] # # @return [Enumerator] if no block is given an Enumerator is returned # # @example # # Optain all owners of a workspace # my_workspace.memberships.select do |membership| # membership.role == "owner" # end # # # Get an array of all the members' user_ids # my_workspace.memberships.map { |membership| membership.user_id } # # # Or use it directly to iterate over all items # my_workspace.memberships.each do |membership| # puts "User #{membership.user_id} has the role #{membership.role}" # end # # @note For a complete list of all provided methods please view the # documentation of the Enumerable module def_delegator :memberships, :each def initialize(workspace) @workspace = workspace end # @api public # return a hash where the keys are user_ids and the values are Membership-Instances # @return [Hash] def to_h memberships.inject(HashWithIndifferentAccess.new) do |hash, membership| hash[membership.user_id] = membership hash end end # @api public # Returns the membership for a user or nil # # @param [User, String] id_or_user # @return [Membership, nil] def [](id_or_user) id = if id_or_user.respond_to?(:id) id_or_user.id else id_or_user end to_h[id] end def to_a memberships.sort_by(&:user_id) end private def memberships @memberships ||= begin workspace.data.memberships.map do |id, data| Membership.new(id, data) end end end end end