Issues (71)

conditions/manager.php (5 issues)

1
<?php
2
/**
3
*
4
* Auto Groups extension for the phpBB Forum Software package.
5
*
6
* @copyright (c) 2014 phpBB Limited <https://www.phpbb.com>
7
* @license GNU General Public License, version 2 (GPL-2.0)
8
*
9
*/
10
11
namespace phpbb\autogroups\conditions;
12
13
use phpbb\exception\runtime_exception;
0 ignored issues
show
The type phpbb\exception\runtime_exception was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
14
use Symfony\Component\DependencyInjection\ContainerInterface;
0 ignored issues
show
The type Symfony\Component\Depend...tion\ContainerInterface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
15
16
/**
17
 * Auto Groups service manager class
18
 */
19
class manager
20
{
21
	/** @var array Array with auto group types */
22
	protected $autogroups_types;
23
24
	/** @var ContainerInterface */
25
	protected $phpbb_container;
26
27
	/** @var \phpbb\cache\driver\driver_interface */
0 ignored issues
show
The type phpbb\cache\driver\driver_interface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
28
	protected $cache;
29
30
	/** @var \phpbb\db\driver\driver_interface */
0 ignored issues
show
The type phpbb\db\driver\driver_interface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
31
	protected $db;
32
33
	/** @var \phpbb\language\language */
0 ignored issues
show
The type phpbb\language\language was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
34
	protected $language;
35
36
	/** @var string The database table the auto group rules are stored in */
37
	protected $autogroups_rules_table;
38
39
	/** @var string The database table the auto group types are stored in */
40
	protected $autogroups_types_table;
41
42
	/**
43
	 * Constructor
44
	 *
45
	 * @param array                                $autogroups_types       Array with auto group types
46
	 * @param ContainerInterface                   $phpbb_container        Service container interface
47
	 * @param \phpbb\cache\driver\driver_interface $cache                  Cache driver interface
48
	 * @param \phpbb\db\driver\driver_interface    $db                     Database object
49
	 * @param \phpbb\language\language             $language               Language object
50
	 * @param string                               $autogroups_rules_table Name of the table used to store auto group rules data
51
	 * @param string                               $autogroups_types_table Name of the table used to store auto group types data
52
	 *
53
	 * @access public
54
	 */
55
	public function __construct($autogroups_types, ContainerInterface $phpbb_container, \phpbb\cache\driver\driver_interface $cache, \phpbb\db\driver\driver_interface $db, \phpbb\language\language $language, $autogroups_rules_table, $autogroups_types_table)
56
	{
57
		$this->autogroups_types = $autogroups_types;
58
		$this->phpbb_container = $phpbb_container;
59
		$this->cache = $cache;
60
		$this->db = $db;
61
		$this->language = $language;
62
		$this->autogroups_rules_table = $autogroups_rules_table;
63
		$this->autogroups_types_table = $autogroups_types_table;
64
	}
65
66
	/**
67
	 * Check auto groups conditions and execute them
68
	 *
69
	 * @return void
70
	 * @access public
71
	 */
72
	public function check_conditions()
73
	{
74
		foreach ($this->autogroups_types as $autogroups_type => $data)
75
		{
76
			$this->check_condition($autogroups_type);
77
		}
78
	}
79
80
	/**
81
	 * Check auto groups condition and execute it
82
	 *
83
	 * @param string $type_name Name of the condition
84
	 * @param array  $options   Array of optional data
85
	 *
86
	 * @return void
87
	 * @access public
88
	 */
89
	public function check_condition($type_name, $options = array())
90
	{
91
		// Get an instance of the condition type to check
92
		$condition = $this->phpbb_container->get($type_name);
93
94
		// Get the user id array of users to check
95
		$check_users = $condition->get_users_for_condition($options);
96
97
		// Check the users and auto group them
98
		$condition->check($check_users, $options);
99
	}
100
101
	/**
102
	 * Add new condition type
103
	 *
104
	 * @param string $autogroups_type_name The name of the auto group type
105
	 *
106
	 * @return int The identifier of the new condition type
107
	 * @access public
108
	 */
109
	public function add_autogroups_type($autogroups_type_name)
110
	{
111
		// Insert the type name into the database
112
		$sql = 'INSERT INTO ' . $this->autogroups_types_table . ' ' .
113
			$this->db->sql_build_array('INSERT', array(
114
				'autogroups_type_name' => (string) $autogroups_type_name
115
			)
116
		);
117
		$this->db->sql_query($sql);
118
119
		// Return the id of the newly inserted condition type
120
		return (int) $this->db->sql_nextid();
121
	}
122
123
	/**
124
	 * Purge all conditions of a certain type
125
	 * (Note: This method is not used directly by Auto Groups, but is
126
	 * used in the purge step of extensions extending Auto Groups.)
127
	 *
128
	 * @param string $autogroups_type_name The name of the auto group type
129
	 *
130
	 * @return void
131
	 * @access public
132
	 */
133
	public function purge_autogroups_type($autogroups_type_name)
134
	{
135
		try
136
		{
137
			// Get the id of the condition
138
			$condition_type_id = $this->get_autogroups_type_id($autogroups_type_name);
139
140
			// Delete any rules associated with the condition id
141
			$sql = 'DELETE FROM ' . $this->autogroups_rules_table . '
142
				WHERE autogroups_type_id = ' . (int) $condition_type_id;
143
			$this->db->sql_query($sql);
144
145
			// Delete any types associated with the condition id
146
			$sql = 'DELETE FROM ' . $this->autogroups_types_table . '
147
				WHERE autogroups_type_id = ' . (int) $condition_type_id;
148
			$this->db->sql_query($sql);
149
150
			// Clear any cached autogroups data
151
			$this->cache->destroy('_autogroups_type_ids');
152
		}
153
		catch (runtime_exception $e)
154
		{
155
			// Continue
156
		}
157
	}
158
159
	/**
160
	 * Purge all autogroups rules related to a certain group_id
161
	 *
162
	 * @param int $group_id Group identifier
163
	 * @return void
164
	 * @access public
165
	 */
166
	public function purge_autogroups_group($group_id)
167
	{
168
		// Delete any rules associated with the group id
169
		$sql = 'DELETE FROM ' . $this->autogroups_rules_table . '
170
			WHERE autogroups_group_id = ' . (int) $group_id;
171
		$this->db->sql_query($sql);
172
	}
173
174
	/**
175
	 * Get the condition type id from the name
176
	 *
177
	 * @param string $autogroups_type_name The name of the auto group type
178
	 *
179
	 * @return int The condition_type_id
180
	 * @throws runtime_exception
181
	 */
182
	public function get_autogroups_type_id($autogroups_type_name)
183
	{
184
		// Get cached auto groups ids if they exist
185
		$autogroups_type_ids = $this->cache->get('_autogroups_type_ids');
186
187
		// Get auto groups ids from the db if no cache data exists, cache result
188
		if ($autogroups_type_ids === false)
189
		{
190
			$autogroups_type_ids = array();
191
192
			$sql = 'SELECT autogroups_type_id, autogroups_type_name
193
				FROM ' . $this->autogroups_types_table;
194
			$result = $this->db->sql_query($sql);
195
			while ($row = $this->db->sql_fetchrow($result))
196
			{
197
				$autogroups_type_ids[$row['autogroups_type_name']] = (int) $row['autogroups_type_id'];
198
			}
199
			$this->db->sql_freeresult($result);
200
201
			$this->cache->put('_autogroups_type_ids', $autogroups_type_ids);
202
		}
203
204
		// Add auto group type name to db if it exists as service but is not in db, cache result
205
		if (!isset($autogroups_type_ids[$autogroups_type_name]))
206
		{
207
			if (!isset($this->autogroups_types[$autogroups_type_name]))
208
			{
209
				throw new runtime_exception('AUTOGROUPS_TYPE_NOT_EXIST', array($autogroups_type_name));
210
			}
211
212
			$autogroups_type_ids[$autogroups_type_name] = $this->add_autogroups_type($autogroups_type_name);
213
214
			$this->cache->put('_autogroups_type_ids', $autogroups_type_ids);
215
		}
216
217
		return $autogroups_type_ids[$autogroups_type_name];
218
	}
219
220
	/**
221
	 * Get condition type ids (as an array)
222
	 *
223
	 * @return array Array of condition type ids
224
	 * @access public
225
	 */
226
	public function get_autogroups_type_ids()
227
	{
228
		$autogroups_type_ids = array();
229
230
		foreach ($this->autogroups_types as $type_name => $data)
231
		{
232
			$autogroups_type_ids[$type_name] = $this->get_autogroups_type_id($type_name);
233
		}
234
235
		return $autogroups_type_ids;
236
	}
237
238
	/**
239
	 * Get the condition type name from the condition or rule id
240
	 *
241
	 * @param int     $type_id      The id of the auto group type
242
	 * @param int     $rule_id      The id of the auto group rule
243
	 *
244
	 * @return string|false The condition type name, false on error
245
	 * @access public
246
	 */
247
	public function get_autogroups_type_name($type_id = 0, $rule_id = 0)
248
	{
249
		$sql_array = array(
250
			'SELECT'	=> 'agt.autogroups_type_name',
251
			'FROM'		=> array(
252
				$this->autogroups_types_table => 'agt',
253
			),
254
		);
255
256
		if ($type_id)
257
		{
258
			$sql_array['WHERE'] = 'agt.autogroups_type_id = ' . (int) $type_id;
259
		}
260
		else if ($rule_id)
261
		{
262
			$sql_array['LEFT_JOIN'] = array(
263
				array(
264
					'FROM'	=>	array($this->autogroups_rules_table	=> 'agr'),
265
					'ON'	=> 'agt.autogroups_type_id = agr.autogroups_type_id',
266
				),
267
			);
268
			$sql_array['WHERE'] = 'agr.autogroups_id = ' . (int) $rule_id;
269
		}
270
		else
271
		{
272
			return false;
273
		}
274
275
		$sql = $this->db->sql_build_query('SELECT', $sql_array);
276
		$result = $this->db->sql_query($sql);
277
		$autogroups_type_name = $this->db->sql_fetchfield('autogroups_type_name');
278
		$this->db->sql_freeresult($result);
279
280
		return $autogroups_type_name;
281
	}
282
283
	/**
284
	 * Get the condition language var from the condition type class
285
	 *
286
	 * @param string     $autogroups_type_name      The name of the auto group type
287
	 *
288
	 * @return string The condition type name
289
	 * @access public
290
	 */
291
	public function get_condition_lang($autogroups_type_name)
292
	{
293
		try
294
		{
295
			$condition = $this->phpbb_container->get($autogroups_type_name);
296
		}
297
		catch (\InvalidArgumentException $e)
298
		{
299
			return $this->language->lang('AUTOGROUPS_TYPE_NOT_EXIST', $autogroups_type_name);
300
		}
301
302
		return $condition->get_condition_type_name();
303
	}
304
305
	/**
306
	 * Run auto groups check against users for a given condition/type
307
	 * Called in the ACP when adding/editing or via the Resync button
308
	 *
309
	 * @param int     $autogroups_rule_id      The id of the auto group rule
310
	 *
311
	 * @return void
312
	 * @access public
313
	 */
314
	public function sync_autogroups($autogroups_rule_id)
315
	{
316
		// Purge cached rules table queries
317
		$this->cache->destroy('sql', $this->autogroups_rules_table);
318
319
		// Get the auto group type name used by the specified auto group rule
320
		$autogroups_type_name = $this->get_autogroups_type_name(0, $autogroups_rule_id);
321
322
		// If auto group type exists, run it
323
		if ($autogroups_type_name !== false)
324
		{
325
			$this->check_condition($autogroups_type_name, array(
326
				'action'	=> 'sync',
327
			));
328
		}
329
	}
330
}
331