Code Duplication    Length = 102-102 lines in 2 locations

lib/OwnershipResolver.php 1 location

@@ 16-117 (lines=102) @@
13
14
use ICanBoogie\ActiveRecord;
15
16
class OwnershipResolver implements \ArrayAccess, \IteratorAggregate, OwnershipResolverInterface
17
{
18
	/**
19
	 * Synthesizes the `users_ownership_resolver_list` config from `users` fragments.
20
	 *
21
	 * @param array $fragments
22
	 *
23
	 * @return array
24
	 */
25
	static public function synthesize_config(array $fragments)
26
	{
27
		$list = [];
28
		$weight = [];
29
30
		foreach ($fragments as $fragment)
31
		{
32
			if (empty($fragment['ownership_resolver_list']))
33
			{
34
				continue;
35
			}
36
37
			foreach ($fragment['ownership_resolver_list'] as $resolver_id => $resolver)
38
			{
39
				$resolver = ((array) $resolver) + [ 'weight' => 0 ];
40
41
				$list[$resolver_id] = $resolver[0];
42
				$weight[$resolver_id] = $resolver['weight'];
43
			}
44
		}
45
46
		return \ICanBoogie\sort_by_weight($list, function($v, $k) use($weight) {
47
48
			return $weight[$k];
49
50
		});
51
	}
52
53
	private $list = [];
54
55
	/**
56
	 * Initializes the ownership resolver list.
57
	 *
58
	 * @param array $resolver_list A ownership resolver list, such as one created by
59
	 * {@link autoconfig()}.
60
	 */
61
	public function __construct(array $resolver_list = [])
62
	{
63
		foreach ($resolver_list as $resolver_id => $resolver)
64
		{
65
			$this[$resolver_id] = $resolver;
66
		}
67
	}
68
69
	public function __invoke(User $user, ActiveRecord $record)
70
	{
71
		$granted = false;
72
73
		foreach ($this->list as $resolver_id => &$resolver)
74
		{
75
			if (!is_callable($resolver))
76
			{
77
				$resolver = new $resolver;
78
			}
79
80
			$resolver_grant = call_user_func($resolver, $user, $record);
81
82
			if ($resolver_grant === null)
83
			{
84
				continue;
85
			}
86
87
			$granted = $resolver_grant;
88
		}
89
90
		return $granted;
91
	}
92
93
	public function getIterator()
94
	{
95
		return new \ArrayIterator($this->list);
96
	}
97
98
	public function offsetExists($resolver_id)
99
	{
100
		return isset($this->list[$resolver_id]);
101
	}
102
103
	public function offsetGet($resolver_id)
104
	{
105
		return $this->list[$resolver_id];
106
	}
107
108
	public function offsetSet($resolver_id, $resolver)
109
	{
110
		$this->list[$resolver_id] = $resolver;
111
	}
112
113
	public function offsetUnset($resolver_id)
114
	{
115
		unset($this->list[$resolver_id]);
116
	}
117
}
118
119
interface OwnershipResolverInterface
120
{

lib/PermissionResolver.php 1 location

@@ 14-115 (lines=102) @@
11
12
namespace Icybee\Modules\Users;
13
14
class PermissionResolver implements \ArrayAccess, \IteratorAggregate, PermissionResolverInterface
15
{
16
	/**
17
	 * Synthesizes the `users_permission_resolver_list` config from `users` fragments.
18
	 *
19
	 * @param array $fragments
20
	 *
21
	 * @return array
22
	 */
23
	static public function synthesize_config(array $fragments)
24
	{
25
		$list = [];
26
		$weight = [];
27
28
		foreach ($fragments as $fragment)
29
		{
30
			if (empty($fragment['permission_resolver_list']))
31
			{
32
				continue;
33
			}
34
35
			foreach ($fragment['permission_resolver_list'] as $resolver_id => $resolver)
36
			{
37
				$resolver = ((array) $resolver) + [ 'weight' => 0 ];
38
39
				$list[$resolver_id] = $resolver[0];
40
				$weight[$resolver_id] = $resolver['weight'];
41
			}
42
		}
43
44
		return \ICanBoogie\sort_by_weight($list, function($v, $k) use($weight) {
45
46
			return $weight[$k];
47
48
		});
49
	}
50
51
	private $list = [];
52
53
	/**
54
	 * Initializes the permission resolver list.
55
	 *
56
	 * @param array $resolver_list A permission resolver list, such as one created by
57
	 * {@link autoconfig()}.
58
	 */
59
	public function __construct(array $resolver_list = [])
60
	{
61
		foreach ($resolver_list as $resolver_id => $resolver)
62
		{
63
			$this[$resolver_id] = $resolver;
64
		}
65
	}
66
67
	public function __invoke(User $user, $permission, $target = null)
68
	{
69
		$granted = false;
70
71
		foreach ($this->list as $resolver_id => &$resolver)
72
		{
73
			if (!is_callable($resolver))
74
			{
75
				$resolver = new $resolver;
76
			}
77
78
			$resolver_grant = call_user_func($resolver, $user, $permission, $target);
79
80
			if ($resolver_grant === null)
81
			{
82
				continue;
83
			}
84
85
			$granted = $resolver_grant;
86
		}
87
88
		return $granted;
89
	}
90
91
	public function getIterator()
92
	{
93
		return new \ArrayIterator($this->list);
94
	}
95
96
	public function offsetExists($resolver_id)
97
	{
98
		return isset($this->list[$resolver_id]);
99
	}
100
101
	public function offsetGet($resolver_id)
102
	{
103
		return $this->list[$resolver_id];
104
	}
105
106
	public function offsetSet($resolver_id, $resolver)
107
	{
108
		$this->list[$resolver_id] = $resolver;
109
	}
110
111
	public function offsetUnset($resolver_id)
112
	{
113
		unset($this->list[$resolver_id]);
114
	}
115
}
116
117
interface PermissionResolverInterface
118
{