cleanup::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 17
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 12
c 0
b 0
f 0
dl 0
loc 17
ccs 0
cts 17
cp 0
rs 9.8666
cc 1
nc 1
nop 12
crap 2

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
/**
3
 * phpBB Gallery - ACP CleanUp Extension
4
 *
5
 * @package   phpbbgallery/acpcleanup
6
 * @author    nickvergessen
7
 * @author    satanasov
8
 * @author    Leinad4Mind
9
 * @copyright 2007 nickvergessen, 2014 satanasov, 2025 Leinad4Mind
10
 * @license   GPL-2.0-only
11
 */
12
13
namespace phpbbgallery\acpcleanup;
14
15
class cleanup
16
{
17
	/** @var \phpbb\db\driver\driver_interface  */
0 ignored issues
show
Bug introduced by
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...
18
	protected $db;
19
20
	/** @var \phpbbgallery\core\file\file  */
21
	protected $tool;
22
23
	/** @var \phpbb\user  */
0 ignored issues
show
Bug introduced by
The type phpbb\user 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...
24
	protected $user;
25
26
	/** @var \phpbb\language\language  */
0 ignored issues
show
Bug introduced by
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...
27
	protected $language;
28
29
	/** @var \phpbbgallery\core\block  */
30
	protected $block;
31
32
	/** @var \phpbbgallery\core\album\album  */
33
	protected $album;
34
35
	/** @var \phpbbgallery\core\comment  */
36
	protected $comment;
37
38
	/** @var \phpbbgallery\core\config  */
39
	protected $gallery_config;
40
41
	/** @var \phpbbgallery\core\log  */
42
	protected $log;
43
44
	/** @var \phpbbgallery\core\moderate  */
45
	protected $moderate;
46
47
	/** @var   */
48
	protected $albums_table;
49
50
	/** @var   */
51
	protected $images_table;
52
53
54
	/**
55
	 * cleanup constructor.
56
	 *
57
	 * @param \phpbb\db\driver\driver_interface $db
58
	 * @param \phpbbgallery\core\file\file      $tool
59
	 * @param \phpbb\user                       $user
60
	 * @param \phpbb\language\language          $language
61
	 * @param \phpbbgallery\core\block          $block
62
	 * @param \phpbbgallery\core\album\album    $album
63
	 * @param \phpbbgallery\core\comment        $comment
64
	 * @param \phpbbgallery\core\config         $gallery_config
65
	 * @param \phpbbgallery\core\log            $log
66
	 * @param \phpbbgallery\core\moderate       $moderate
67
	 * @param                                   $albums_table
68
	 * @param                                   $images_table
69
	 */
70
	public function __construct(\phpbb\db\driver\driver_interface $db, \phpbbgallery\core\file\file $tool, \phpbb\user $user, \phpbb\language\language $language,
71
		\phpbbgallery\core\block $block, \phpbbgallery\core\album\album $album, \phpbbgallery\core\comment $comment,
72
		\phpbbgallery\core\config $gallery_config, \phpbbgallery\core\log $log, \phpbbgallery\core\moderate $moderate,
73
		$albums_table, $images_table)
74
	{
75
		$this->db = $db;
76
		$this->tool = $tool;
77
		$this->user = $user;
78
		$this->language = $language;
79
		$this->block = $block;
80
		$this->album = $album;
81
		$this->comment = $comment;
82
		$this->gallery_config = $gallery_config;
83
		$this->log = $log;
84
		$this->moderate = $moderate;
85
		$this->albums_table = $albums_table;
86
		$this->images_table = $images_table;
87
	}
88
89
	/**
90
	* Delete source files without a database entry.
91
	*
92
	* @param	array	$filenames		An array of filenames
93
	* @return	string	Language key for the success message.
94
	*/
95
	public function delete_files($filenames)
96
	{
97
		foreach ($filenames as $file)
98
		{
99
			$this->tool->delete(utf8_decode($file));
100
			$this->tool->delete_cache(utf8_decode($file));
101
		}
102
		$this->log->add_log('admin', 'clean_deletefiles', 0, 0, array('LOG_CLEANUP_DELETE_FILES', count($filenames)));
103
		return 'CLEAN_ENTRIES_DONE';
104
	}
105
106
	/**
107
	* Delete images, where the source file is missing.
108
	*
109
	* @param	mixed	$image_ids		Either an array of integers or an integer.
110
	* @return	string	Language key for the success message.
111
	*/
112
	public function delete_images($image_ids)
113
	{
114
		$this->log->add_log('admin', 'clean_deleteentries', 0, 0, array('LOG_CLEANUP_DELETE_ENTRIES', count($image_ids)));
115
		$this->moderate->delete_images($image_ids, false);
116
117
		return 'CLEAN_SOURCES_DONE';
118
	}
119
120
	/**
121
	* Delete images, where the author is missing.
122
	*
123
	* @param	mixed	$image_ids		Either an array of integers or an integer.
124
	* @return	string	Language key for the success message.
125
	*/
126
	public function delete_author_images($image_ids)
127
	{
128
		$this->log->add_log('admin', 'clean_deletenoauthors', 0, 0, array('LOG_CLEANUP_DELETE_NO_AUTHOR', count($image_ids)));
129
		$this->moderate->delete_images($image_ids);
130
131
		return 'CLEAN_AUTHORS_DONE';
132
	}
133
134
	/**
135
	* Delete comments, where the author is missing.
136
	*
137
	* @param	mixed	$comment_ids	Either an array of integers or an integer.
138
	* @return	string	Language key for the success message.
139
	*/
140
	public function delete_author_comments($comment_ids)
141
	{
142
		$this->log->add_log('admin', 'clean_deletecna', 0, 0, array('LOG_CLEANUP_COMMENT_DELETE_NO_AUTHOR', count($comment_ids)));
143
		$this->comment->delete_comments($comment_ids);
144
145
		return 'CLEAN_COMMENTS_DONE';
146
	}
147
148
	/**
149
	* Delete unwanted and obsolete personal galleries.
150
	*
151
	* @param	array	$unwanted_pegas		User IDs we want to delete the pegas.
152
	* @param	array	$obsolete_pegas		User IDs we want to delete the pegas.
153
	* @return	array	Language keys for the success messages.
154
	*/
155
	public function delete_pegas($unwanted_pegas, $obsolete_pegas)
156
	{
157
158
		$delete_pegas = array_merge($unwanted_pegas, $obsolete_pegas);
159
160
		$delete_images = $delete_albums = $user_image_count = array();
161
		$num_pegas = 0;
162
163
		$sql = 'SELECT album_id, parent_id
164
			FROM ' . $this->albums_table . '
165
			WHERE ' . $this->db->sql_in_set('album_user_id', $delete_pegas);
166
		$result = $this->db->sql_query($sql);
167
		while ($row = $this->db->sql_fetchrow($result))
168
		{
169
			$delete_albums[] = (int) $row['album_id'];
170
			if ($row['parent_id'] == 0)
171
			{
172
				$num_pegas++;
173
			}
174
		}
175
		$this->db->sql_freeresult($result);
176
177
		$sql = 'SELECT image_id, image_filename, image_status, image_user_id
178
			FROM ' . $this->images_table . '
179
			WHERE ' . $this->db->sql_in_set('image_album_id', $delete_albums, false, true);
180
		$result = $this->db->sql_query($sql);
181
182
		$filenames = array();
183
		while ($row = $this->db->sql_fetchrow($result))
184
		{
185
			$delete_images[] = (int) $row['image_id'];
186
			$filenames[(int) $row['image_id']] = $row['image_filename'];
187
188
			if (($row['image_status'] == $this->block->get_image_status_unapproved()) ||
189
			($row['image_status'] == $this->block->get_image_status_orphan()))
190
			{
191
				continue;
192
			}
193
194
			if (isset($user_image_count[(int) $row['image_user_id']]))
195
			{
196
				$user_image_count[(int) $row['image_user_id']]++;
197
			}
198
			else
199
			{
200
				$user_image_count[(int) $row['image_user_id']] = 1;
201
			}
202
		}
203
		$this->db->sql_freeresult($result);
204
205
		if (!empty($delete_images))
206
		{
207
			$this->moderate->delete_images($delete_images, $filenames);
208
		}
209
210
		$sql = 'DELETE FROM ' . $this->albums_table . '
211
			WHERE ' . $this->db->sql_in_set('album_id', $delete_albums);
212
		$this->db->sql_query($sql);
213
		$this->gallery_config->dec('num_pegas', $num_pegas);
214
215
		if (in_array($this->gallery_config->get('newest_pega_album_id'), $delete_albums))
216
		{
217
			// Update the config for the statistic on the index
218
			if ($this->gallery_config->get('num_pegas') > 0)
219
			{
220
				$sql_array = array(
221
					'SELECT'		=> 'a.album_id, u.user_id, u.username, u.user_colour',
222
					'FROM'			=> array($this->albums_table => 'a'),
223
224
					'LEFT_JOIN'		=> array(
225
						array(
226
							'FROM'		=> array(USERS_TABLE => 'u'),
0 ignored issues
show
Bug introduced by
The constant phpbbgallery\acpcleanup\USERS_TABLE was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
227
							'ON'		=> 'u.user_id = a.album_user_id',
228
						),
229
					),
230
231
					'WHERE'			=> 'a.album_user_id <> ' . (int) $this->album->get_public() . ' AND a.parent_id = 0',
0 ignored issues
show
Bug introduced by
The method get_public() does not exist on phpbbgallery\core\album\album. Did you maybe mean get_public_albums()? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

231
					'WHERE'			=> 'a.album_user_id <> ' . (int) $this->album->/** @scrutinizer ignore-call */ get_public() . ' AND a.parent_id = 0',

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
232
					'ORDER_BY'		=> 'a.album_id DESC',
233
				);
234
				$sql = $this->db->sql_build_query('SELECT', $sql_array);
235
236
				$result = $this->db->sql_query_limit($sql, 1);
237
				$newest_pega = $this->db->sql_fetchrow($result);
238
				$this->db->sql_freeresult($result);
239
			}
240
241
			if (($this->gallery_config->get('num_pegas') > 0) && isset($newest_pega))
242
			{
243
				$this->gallery_config->set('newest_pega_user_id', $newest_pega['user_id']);
244
				$this->gallery_config->set('newest_pega_username', $newest_pega['username']);
245
				$this->gallery_config->set('newest_pega_user_colour', $newest_pega['user_colour']);
246
				$this->gallery_config->set('newest_pega_album_id', $newest_pega['album_id']);
247
			}
248
			else
249
			{
250
				$this->gallery_config->set('newest_pega_user_id', 0);
251
				$this->gallery_config->set('newest_pega_username', '');
252
				$this->gallery_config->set('newest_pega_user_colour', '');
253
				$this->gallery_config->set('newest_pega_album_id', 0);
254
255
				if (isset($newest_pega))
256
				{
257
					$this->gallery_config->set('num_pegas', 0);
258
				}
259
			}
260
		}
261
/*
262
		foreach ($user_image_count as $user_id => $images)
263
		{
264
			//phpbb_gallery_hookup::add_image($user_id, (0 - $images));
265
266
			$uploader = new \phpbbgallery\core\user($this->db, $user_id, false);
267
			$uploader->update_images((0 - $images));
268
		}
269
		\phpbbgallery\core\user::update_users($delete_pegas, array('personal_album_id' => 0));
270
*/
271
		$return = array();
272
		if ($obsolete_pegas)
0 ignored issues
show
Bug Best Practice introduced by
The expression $obsolete_pegas of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
273
		{
274
			$return[] = 'CLEAN_PERSONALS_DONE';
275
		}
276
		if ($unwanted_pegas)
0 ignored issues
show
Bug Best Practice introduced by
The expression $unwanted_pegas of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
277
		{
278
			$return[] = 'CLEAN_PERSONALS_BAD_DONE';
279
		}
280
281
		return $return;
282
	}
283
284
	/**
285
	*
286
	*/
287
	public function prune($pattern)
288
	{
289
		$sql_where = '';
290
		if (isset($pattern['image_album_id']))
291
		{
292
			$pattern['image_album_id'] = array_map('intval', explode(',', $pattern['image_album_id']));
293
		}
294
		if (isset($pattern['image_user_id']))
295
		{
296
			$pattern['image_user_id'] = array_map('intval', explode(',', $pattern['image_user_id']));
297
		}
298
		foreach ($pattern as $field => $value)
299
		{
300
			if (is_array($value))
301
			{
302
				$sql_where .= (($sql_where) ? ' AND ' : ' WHERE ') . $this->db->sql_in_set($field, $value);
303
				continue;
304
			}
305
			$sql_where .= (($sql_where) ? ' AND ' : ' WHERE ') . $field . ' < ' . $value;
306
		}
307
308
		$sql = 'SELECT image_id, image_filename
309
			FROM ' . $this->images_table . '
310
			' . $sql_where;
311
312
		$result = $this->db->sql_query($sql);
313
		$image_ids = $filenames = $update_albums = array();
0 ignored issues
show
Unused Code introduced by
The assignment to $update_albums is dead and can be removed.
Loading history...
314
		while ($row = $this->db->sql_fetchrow($result))
315
		{
316
			$image_ids[] = (int) $row['image_id'];
317
			$filenames[(int) $row['image_id']] = $row['image_filename'];
318
		}
319
		$this->db->sql_freeresult($result);
320
321
		if ($image_ids)
322
		{
323
			$this->moderate->delete_images($image_ids, $filenames);
324
		}
325
326
		return 'CLEAN_PRUNE_DONE';
327
	}
328
329
	/**
330
	*
331
	*/
332
	public function lang_prune_pattern($pattern)
333
	{
334
		if (isset($pattern['image_album_id']))
335
		{
336
			$pattern['image_album_id'] = array_map('intval', explode(',', $pattern['image_album_id']));
337
		}
338
		if (isset($pattern['image_user_id']))
339
		{
340
			$pattern['image_user_id'] = array_map('intval', explode(',', $pattern['image_user_id']));
341
		}
342
343
		$lang_pattern = '';
344
		foreach ($pattern as $field => $value)
345
		{
346
			$field = (strpos($field, 'image_') === 0) ? substr($field, 6) : $field;
347
348
			switch ($field)
349
			{
350
				case 'album_id':
351
					$sql = 'SELECT album_name
352
						FROM ' . $this->albums_table . '
353
						WHERE ' . $this->db->sql_in_set('album_id', $value) . '
354
						ORDER BY album_id ASC';
355
					$result = $this->db->sql_query($sql);
356
					$value = '';
357
					while ($row = $this->db->sql_fetchrow($result))
358
					{
359
						$value .= (($value) ? ', ' : '') . $row['album_name'];
360
					}
361
					$this->db->sql_freeresult($result);
362
				break;
363
364
				case 'user_id':
365
					$sql = 'SELECT user_id, user_colour, username
366
						FROM ' . USERS_TABLE . '
0 ignored issues
show
Bug introduced by
The constant phpbbgallery\acpcleanup\USERS_TABLE was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
367
						WHERE ' . $this->db->sql_in_set('user_id', $value) . '
368
						ORDER BY user_id ASC';
369
					$result = $this->db->sql_query($sql);
370
					$value = '';
371
					while ($row = $this->db->sql_fetchrow($result))
372
					{
373
						$value .= (($value) ? ', ' : '') . get_username_string('full', $row['user_id'], (($row['user_id'] != ANONYMOUS) ? $row['username'] : $this->language->lang('GUEST')), $row['user_colour']);
0 ignored issues
show
Bug introduced by
The function get_username_string was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

373
						$value .= (($value) ? ', ' : '') . /** @scrutinizer ignore-call */ get_username_string('full', $row['user_id'], (($row['user_id'] != ANONYMOUS) ? $row['username'] : $this->language->lang('GUEST')), $row['user_colour']);
Loading history...
Bug introduced by
The constant phpbbgallery\acpcleanup\ANONYMOUS was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
374
					}
375
					$this->db->sql_freeresult($result);
376
				break;
377
378
				case 'time':
379
					$value = $this->user->format_date($value, false, true);
380
				break;
381
382
				case 'rate_avg':
383
					$value = ($value / 100);
384
				break;
385
			}
386
			$lang_pattern .= (($lang_pattern) ? '<br />' : '') . $this->language->lang('PRUNE_PATTERN_' . strtoupper($field), $value);
387
		}
388
389
		return $lang_pattern;
390
	}
391
}
392