Completed
Push — master ( a8898a...5c0dbc )
by Nazar
04:15
created

Group   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 114
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 0%

Importance

Changes 3
Bugs 1 Features 1
Metric Value
c 3
b 1
f 1
dl 0
loc 114
ccs 0
cts 81
cp 0
rs 10
wmc 17
lcom 1
cbo 1

4 Methods

Rating   Name   Duplication   Size   Complexity  
A add_groups() 0 7 3
B get_groups() 0 19 5
C set_groups() 0 48 7
A del_groups() 0 7 2
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
	function add_groups ($group, $user = false) {
30
		$groups = $this->get_groups($user) ?: [];
31
		foreach ((array)_int($group) as $g) {
32
			$groups[] = $g;
33
		}
34
		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
	function get_groups ($user = false) {
44
		$user = (int)$user ?: $this->id;
45
		if (!$user || $user == User::GUEST_ID) {
46
			return false;
47
		}
48
		return $this->cache->get(
49
			"groups/$user",
50
			function () use ($user) {
51
				return _int(
52
					$this->db()->qfas(
53
						"SELECT `group`
54
							FROM `[prefix]users_groups`
55
							WHERE `id` = '$user'
56
							ORDER BY `priority` ASC"
57
					) ?: []
58
				);
59
			}
60
		);
61
	}
62
	/**
63
	 * Set user's groups
64
	 *
65
	 * @param int[]     $groups
66
	 * @param false|int $user
67
	 *
68
	 * @return bool
69
	 */
70
	function set_groups ($groups, $user = false) {
71
		$user = (int)$user ?: $this->id;
72
		if (!$user || $user == User::GUEST_ID) {
73
			return false;
74
		}
75
		if (!$groups) {
76
			return (bool)$this->db_prime()->q(
77
				"DELETE FROM `[prefix]users_groups`
78
				WHERE
79
					`id`	='$user'"
80
			);
81
		}
82
		$groups          = _int($groups);
83
		$groups_imploded = implode(', ', $groups);
84
		$return          = $this->db_prime()->q(
85
			"DELETE FROM `[prefix]users_groups`
86
			WHERE
87
				`id`	= '$user' AND
88
				`group`	NOT IN ($groups_imploded)"
89
		);
90
		unset($groups_imploded);
91
		$insert_update = [];
92
		foreach ($groups as $priority => $group) {
93
			$insert_update[] = [$group, $priority];
94
		}
95
		$return =
96
			$return &&
97
			$this->db_prime()->insert(
98
				"REPLACE INTO `[prefix]users_groups`
99
					(
100
						`id`,
101
						`group`,
102
						`priority`
103
					) VALUES (
104
						'$user',
105
						'%d',
106
						'%d'
107
					)",
108
				$insert_update
109
			);
110
		unset($insert_update);
111
		$Cache = $this->cache;
112
		unset(
113
			$Cache->{"groups/$user"},
114
			$Cache->{"permissions/$user"}
115
		);
116
		return $return;
117
	}
118
	/**
119
	 * Delete user's groups
120
	 *
121
	 * @param int|int[] $group Group id
122
	 * @param false|int $user  If not specified - current user assumed
123
	 *
124
	 * @return bool
125
	 */
126
	function del_groups ($group, $user = false) {
127
		$groups = array_diff(
128
			$this->get_groups($user) ?: [],
129
			(array)_int($group)
130
		);
131
		return $this->set_groups($groups, $user);
132
	}
133
}
134