module Scrivito # @api public # The Scrivito::MembershipCollection includes all members of a given {Scrivito::Workspace}. # You can access it using the {Scrivito::Workspace#memberships} method. class MembershipCollection extend Forwardable include Enumerable attr_reader :workspace # @api public # @!method each # Iterate over all {Scrivito::Membership Memberships} of a specific {Scrivito::Workspace}. # Allows you to use all the methods defined by Ruby's Enumerable module. # # @yield [Scrivito::Membership] # # @return [Enumerator] if no block is given, an Enumerator is returned # # @example # # Obtain 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 the provided methods, please refer to the # documentation of the Enumerable module. def_delegator :memberships, :each def initialize(workspace) @workspace = workspace end # @api public # Returns a hash where the keys are +user_id+s 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 of a user or nil. # # @param [Scrivito::User, String] id_or_user # @return [Scrivito::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 return [] if workspace.published? @memberships ||= begin workspace.data.memberships.map do |id, data| Membership.new(id, data) end end end end end