Completed
Push — master ( 048dba...c6794e )
by Nazar
04:25
created

Group::set_groups()   C

Complexity

Conditions 7
Paths 12

Size

Total Lines 48
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 25
CRAP Score 7

Importance

Changes 0
Metric Value
cc 7
eloc 30
nc 12
nop 2
dl 0
loc 48
ccs 25
cts 25
cp 1
crap 7
rs 6.7272
c 0
b 0
f 0
1
<?php
2
/**
3
 * @package   CleverStyle Framework
4
 * @author    Nazar Mokrynskyi <[email protected]>
5
 * @copyright Copyright (c) 2011-2016, Nazar Mokrynskyi
6
 * @license   MIT License, see license.txt
7
 */
8
namespace cs\User;
9
use cs\User;
10
11
/**
12
 * Trait that contains all methods from <i>>cs\User</i> for working with user groups
13
 *
14
 * @property int              $id
15
 * @property \cs\Cache\Prefix $cache
16
 *
17
 * @method \cs\DB\_Abstract db()
18
 * @method \cs\DB\_Abstract db_prime()
19
 */
20
trait Group {
21
	/**
22
	 * Add user's groups
23
	 *
24
	 * @param int|int[] $group Group id
25
	 * @param false|int $user  If not specified - current user assumed
26
	 *
27
	 * @return bool
28
	 */
29 2
	function add_groups ($group, $user = false) {
30 2
		$groups = $this->get_groups($user) ?: [];
31 2
		foreach ((array)_int($group) as $g) {
32 2
			$groups[] = $g;
33
		}
34 2
		return $this->set_groups($groups, $user);
35
	}
36
	/**
37
	 * Get user's groups
38
	 *
39
	 * @param false|int $user If not specified - current user assumed
40
	 *
41
	 * @return false|int[]
42
	 */
43 14
	function get_groups ($user = false) {
44 14
		$user = (int)$user ?: $this->id;
45 14
		if (!$user || $user == User::GUEST_ID) {
46 2
			return false;
47
		}
48 14
		return $this->cache->get(
49 14
			"groups/$user",
50 14
			function () use ($user) {
51 12
				return _int(
52 12
					array_values(
53 12
						$this->db()->qfas(
54
							"SELECT `group`
55
							FROM `[prefix]users_groups`
56 12
							WHERE `id` = '$user'
57 12
							ORDER BY `priority` ASC"
58
						)
59 12
					) ?: []
60
				);
61 14
			}
62
		);
63
	}
64
	/**
65
	 * Set user's groups
66
	 *
67
	 * @param int[]     $groups
68
	 * @param false|int $user
69
	 *
70
	 * @return bool
71
	 */
72 10
	function set_groups ($groups, $user = false) {
73 10
		$user = (int)$user ?: $this->id;
74 10
		if (!$user || $user == User::GUEST_ID) {
75 2
			return false;
76
		}
77 10
		if (!$groups) {
78 4
			return (bool)$this->db_prime()->q(
79
				"DELETE FROM `[prefix]users_groups`
80
				WHERE
81 4
					`id`	='$user'"
82
			);
83
		}
84 10
		$groups          = _int($groups);
85 10
		$groups_imploded = implode(', ', $groups);
86 10
		$return          = $this->db_prime()->q(
87
			"DELETE FROM `[prefix]users_groups`
88
			WHERE
89 10
				`id`	= '$user' AND
90 10
				`group`	NOT IN ($groups_imploded)"
91
		);
92 10
		unset($groups_imploded);
93 10
		$insert_update = [];
94 10
		foreach ($groups as $priority => $group) {
95 10
			$insert_update[] = [$group, $priority];
96
		}
97
		$return =
98 10
			$return &&
99 10
			$this->db_prime()->insert(
100
				"REPLACE INTO `[prefix]users_groups`
101
					(
102
						`id`,
103
						`group`,
104
						`priority`
105
					) VALUES (
106 10
						'$user',
107
						'%d',
108
						'%d'
109 10
					)",
110
				$insert_update
111
			);
112 10
		unset($insert_update);
113 10
		$Cache = $this->cache;
114
		unset(
115 10
			$Cache->{"groups/$user"},
116 10
			$Cache->{"permissions/$user"}
117
		);
118 10
		return $return;
119
	}
120
	/**
121
	 * Delete user's groups
122
	 *
123
	 * @param int|int[] $group Group id
124
	 * @param false|int $user  If not specified - current user assumed
125
	 *
126
	 * @return bool
127
	 */
128 2
	function del_groups ($group, $user = false) {
129 2
		$groups = array_diff(
130 2
			$this->get_groups($user) ?: [],
131 2
			(array)_int($group)
132
		);
133 2
		return $this->set_groups($groups, $user);
134
	}
135
}
136