Firesphere/silverstripe-solr-member-permissions

View on GitHub
src/Extensions/DataObjectExtension.php

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
<?php
/**
 * Class DataObjectExtension|Firesphere\SolrPermissions\Extensions\DataObjectExtension Generate the View permissions of
 * each member for indexing
 *
 * @package Firesphere\Solr\Permissions
 * @author Simon `Firesphere` Erkelens; Marco `Sheepy` Hermo
 * @copyright Copyright (c) 2018 - now() Firesphere & Sheepy
 */

namespace Firesphere\SolrPermissions\Extensions;

use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataExtension;
use SilverStripe\ORM\DataObject;
use SilverStripe\Security\Member;
use SilverStripe\Security\Security;

/**
 * Class \Firesphere\SolrPermissions\Extensions\DataObjectExtension
 *
 * Add the ability to get the Member View statusses for Solr.
 *
 * @package Firesphere\Solr\Permissions
 * @property DataObject|DataObjectExtension $owner
 */
class DataObjectExtension extends DataExtension
{
    /**
     * @var ArrayList Cached list of the members to reduce looping impact
     */
    protected static $memberList;

    /**
     * Get the member permissions for each unique user in the system
     * This is additional to the GroupView permissions
     *
     * @return array
     */
    public function getMemberView()
    {
        /** @var Member|null $currentUser */
        $currentUser = Security::getCurrentUser();
        Security::setCurrentUser(null);

        if ($this->owner->canView(null)) {
            Security::setCurrentUser($currentUser);

            return ['null'];
        }

        $return = $this->getViewList();

        Security::setCurrentUser($currentUser);

        return $return;
    }

    /**
     * Get the list of members who can view this owner
     *
     * @return array
     */
    private function getViewList(): array
    {
        if (!static::$memberList) {
            static::$memberList = ArrayList::create(Member::get()->toArray());
        }

        $return = ['false'];
        foreach (static::$memberList as $member) {
            if ($this->owner->canView($member)) {
                $return[] = sprintf('1-%s', $member->ID);
            }
        }

        return $return;
    }
}