Passed
Push — 4.1.1 ( 01ed8a )
by Robbie
09:45
created

InheritedPermissionFlusher   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 90
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 90
rs 10
c 0
b 0
f 0
wmc 14

6 Methods

Rating   Name   Duplication   Size   Complexity  
A setOwner() 0 12 3
A flush() 0 3 1
A getServices() 0 3 1
A setServices() 0 16 3
A flushCache() 0 5 2
A getMemberIDList() 0 11 4
1
<?php
2
3
namespace SilverStripe\Security;
4
5
use Psr\Log\InvalidArgumentException;
6
use SilverStripe\Core\Flushable;
7
use SilverStripe\ORM\DataExtension;
8
use SilverStripe\ORM\DataObject;
9
use SilverStripe\Core\Cache\MemberCacheFlusher;
10
11
class InheritedPermissionFlusher extends DataExtension implements Flushable
12
{
13
    /**
14
     * @var MemberCacheFlusher[]
15
     */
16
    protected $services = [];
17
18
    /**
19
     * Flush all MemberCacheFlusher services
20
     */
21
    public static function flush()
22
    {
23
        singleton(__CLASS__)->flushCache();
24
    }
25
26
    /**
27
     * @param DataObject $owner
28
     */
29
    public function setOwner($owner)
30
    {
31
        if (!$owner instanceof Member && !$owner instanceof Group) {
32
            throw new InvalidArgumentException(sprintf(
33
                '%s can only be applied to %s or %s',
34
                __CLASS__,
35
                Member::class,
36
                Group::class
37
            ));
38
        }
39
40
        parent::setOwner($owner);
41
    }
42
43
    /**
44
     * @param MemberCacheFlusher[]
45
     * @throws InvalidArgumentException
46
     * @return $this
47
     */
48
    public function setServices($services)
49
    {
50
        foreach ($services as $service) {
51
            if (!$service instanceof MemberCacheFlusher) {
52
                throw new InvalidArgumentException(sprintf(
53
                    '%s.services must contain only %s instances. %s provided.',
54
                    __CLASS__,
55
                    MemberCacheFlusher::class,
56
                    get_class($service)
57
                ));
58
            }
59
        }
60
61
        $this->services = $services;
62
63
        return $this;
64
    }
65
66
    /**
67
     * @return MemberCacheFlusher[]
68
     */
69
    public function getServices()
70
    {
71
        return $this->services;
72
    }
73
74
    /**
75
     * Flushes all registered MemberCacheFlusher services
76
     */
77
    public function flushCache()
78
    {
79
        $ids = $this->getMemberIDList();
80
        foreach ($this->getServices() as $service) {
81
            $service->flushMemberCache($ids);
82
        }
83
    }
84
85
    /**
86
     * Get a list of member IDs that need their permissions flushed
87
     *
88
     * @return array|null
89
     */
90
    protected function getMemberIDList()
91
    {
92
        if (!$this->owner || !$this->owner->exists()) {
93
            return null;
94
        }
95
96
        if ($this->owner instanceof Group) {
97
            return $this->owner->Members()->column('ID');
98
        }
99
100
        return [$this->owner->ID];
101
    }
102
}
103