Passed
Push — be-coherent ( a74984...06aff4 )
by Matias
08:21
created

PersonController::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 20
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 1
eloc 9
c 2
b 0
f 0
nc 1
nop 10
dl 0
loc 20
ccs 0
cts 20
cp 0
crap 2
rs 9.9666

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
namespace OCA\FaceRecognition\Controller;
3
4
use OCP\IRequest;
5
use OCP\IConfig;
6
use OCP\Files\IRootFolder;
7
use OCP\Files\File;
8
use OCP\IUserSession;
9
use OCP\IURLGenerator;
10
use OCP\AppFramework\Http;
11
use OCP\AppFramework\Http\DataResponse;
12
use OCP\AppFramework\Http\JSONResponse;
13
use OCP\AppFramework\Http\DataDisplayResponse;
14
use OCP\AppFramework\Controller;
15
16
use OCA\FaceRecognition\Db\Face;
17
use OCA\FaceRecognition\Db\FaceMapper;
18
19
use OCA\FaceRecognition\Db\Image;
20
use OCA\FaceRecognition\Db\ImageMapper;
21
22
use OCA\FaceRecognition\Db\Person;
23
use OCA\FaceRecognition\Db\PersonMapper;
24
25
use OCA\FaceRecognition\Migration\AddDefaultFaceModel;
26
use OCA\FaceRecognition\BackgroundJob\Tasks\StaleImagesRemovalTask;
27
28
class PersonController extends Controller {
29
30
	private $config;
31
	private $rootFolder;
32
	private $userSession;
33
	private $urlGenerator;
34
	private $faceMapper;
35
	private $imageMapper;
36
	private $personMapper;
37
	private $userId;
38
39
	public function __construct($AppName,
40
	                            IRequest      $request,
41
	                            IConfig       $config,
42
	                            IRootFolder   $rootFolder,
43
	                            IUserSession  $userSession,
44
	                            IURLGenerator $urlGenerator,
45
	                            FaceMapper    $faceMapper,
46
	                            ImageMapper   $imageMapper,
47
	                            PersonMapper  $personmapper,
48
	                            $UserId)
49
	{
50
		parent::__construct($AppName, $request);
51
		$this->config       = $config;
52
		$this->rootFolder   = $rootFolder;
53
		$this->userSession  = $userSession;
54
		$this->urlGenerator = $urlGenerator;
55
		$this->imageMapper  = $imageMapper;
56
		$this->faceMapper   = $faceMapper;
57
		$this->personMapper = $personmapper;
58
		$this->userId       = $UserId;
59
	}
60
61
	/**
62
	 * @NoAdminRequired
63
	 */
64
	public function index() {
65
		$model = intval($this->config->getAppValue('facerecognition', 'model', AddDefaultFaceModel::DEFAULT_FACE_MODEL_ID));
66
		$notGrouped = $this->config->getAppValue('facerecognition', 'show-not-grouped', 'false');
67
		$userEnabled = $this->config->getUserValue($this->userId, 'facerecognition', 'enabled', 'false');
68
69
		$resp = array();
70
		$resp['enabled'] = $userEnabled;
71
		$resp['clusters'] = array();
72
73
		if ($userEnabled !== 'true')
74
			return new DataResponse($resp);
75
76
		$persons = $this->personMapper->findAll($this->userId);
77
		foreach ($persons as $person) {
78
			$personFaces = $this->faceMapper->findFacesFromPerson($this->userId, $person->getId(), $model);
79
			if ($notGrouped === 'false' && count($personFaces) <= 1)
80
				continue;
81
82
			$limit = 14;
83
			$faces = [];
84
			foreach ($personFaces as $personFace) {
85
				if ($limit-- === 0)
86
					break;
87
88
				$image = $this->imageMapper->find($this->userId, $personFace->getImage());
89
				$fileUrl = $this->getRedirectToFileUrl($image->getFile());
90
				if (NULL === $fileUrl) {
91
					$limit++;
92
					continue;
93
				}
94
95
				$face = [];
96
				$face['thumb-url'] = $this->getThumbUrl($personFace->getId());
97
				$face['file-url'] = $fileUrl;
98
				$faces[] = $face;
99
			}
100
101
			$cluster = [];
102
			$cluster['name'] = $person->getName();
103
			$cluster['count'] = count($personFaces);
104
			$cluster['id'] = $person->getId();
105
			$cluster['faces'] = $faces;
106
107
			$resp['clusters'][] = $cluster;
108
		}
109
		return new DataResponse($resp);
110
	}
111
112
	/**
113
	 * @NoAdminRequired
114
	 */
115
	public function find(int $id) {
116
		$model = intval($this->config->getAppValue('facerecognition', 'model', AddDefaultFaceModel::DEFAULT_FACE_MODEL_ID));
117
118
		$person = $this->personMapper->find($this->userId, $id);
119
120
		$resp = [];
121
		$faces = [];
122
		$personFaces = $this->faceMapper->findFacesFromPerson($this->userId, $person->getId(), $model);
123
		foreach ($personFaces as $personFace) {
124
			$image = $this->imageMapper->find($this->userId, $personFace->getImage());
125
			$fileUrl = $this->getRedirectToFileUrl($image->getFile());
126
			if (NULL === $fileUrl)
127
				continue;
128
			$face = [];
129
			$face['thumb-url'] = $this->getThumbUrl($personFace->getId());
130
			$face['file-url'] = $fileUrl;
131
			$faces[] = $face;
132
		}
133
		$resp['name'] = $person->getName();
134
		$resp['id'] = $person->getId();
135
		$resp['faces'] = $faces;
136
137
		return new DataResponse($resp);
138
	}
139
140
	/**
141
	 * @NoAdminRequired
142
	 */
143
	public function findByName(string $personName) {
144
		$model = intval($this->config->getAppValue('facerecognition', 'model', AddDefaultFaceModel::DEFAULT_FACE_MODEL_ID));
145
		$notGrouped = $this->config->getAppValue('facerecognition', 'show-not-grouped', 'false');
146
		$userEnabled = $this->config->getUserValue($this->userId, 'facerecognition', 'enabled', 'false');
147
148
		$resp = array();
149
		$resp['enabled'] = $userEnabled;
150
		$resp['clusters'] = array();
151
152
		if ($userEnabled !== 'true')
153
			return new DataResponse($resp);
154
155
		$persons = $this->personMapper->findByName($this->userId, $personName);
156
		foreach ($persons as $person) {
157
			$personFaces = $this->faceMapper->findFacesFromPerson($this->userId, $person->getId(), $model);
158
			if ($notGrouped === 'false' && count($personFaces) <= 1)
159
				continue;
160
161
			$faces = [];
162
			foreach ($personFaces as $personFace) {
163
				$image = $this->imageMapper->find($this->userId, $personFace->getImage());
164
				$fileUrl = $this->getRedirectToFileUrl($image->getFile());
165
				if (NULL === $fileUrl)
166
					continue;
167
168
				$face = [];
169
				$face['thumb-url'] = $this->getThumbUrl($personFace->getId());
170
				$face['file-url'] = $fileUrl;
171
				$faces[] = $face;
172
			}
173
174
			$cluster = [];
175
			$cluster['name'] = $person->getName();
176
			$cluster['count'] = count($personFaces);
177
			$cluster['id'] = $person->getId();
178
			$cluster['faces'] = $faces;
179
			$resp['clusters'][] = $cluster;
180
		}
181
		return new DataResponse($resp);
182
	}
183
184
	/**
185
	 * @NoAdminRequired
186
	 *
187
	 * @param int $id
188
	 * @param string $name
189
	 */
190
	public function updateName($id, $name) {
191
		$person = $this->personMapper->find ($this->userId, $id);
192
		$person->setName($name);
193
		$this->personMapper->update($person);
194
195
		$newPerson = $this->personMapper->find($this->userId, $id);
196
		return new DataResponse($newPerson);
197
	}
198
199
	private function getThumbUrl($faceId) {
200
		$params = [];
201
		$params['id'] = $faceId;
202
		$params['size'] = 50;
203
		return $this->urlGenerator->linkToRoute('facerecognition.face.getThumb', $params);
204
	}
205
206
	private function getRedirectToFileUrl($fileId) {
207
		$uid        = $this->userSession->getUser()->getUID();
208
		$baseFolder = $this->rootFolder->getUserFolder($uid);
209
		$files      = $baseFolder->getById($fileId);
210
		$file       = current($files);
211
212
		if(!($file instanceof File)) {
213
			$this->config->setUserValue($this->userId, 'facerecognition', StaleImagesRemovalTask::STALE_IMAGES_REMOVAL_NEEDED_KEY, 'true');
214
			return NULL;
215
		}
216
217
		$params = [];
218
		$params['dir'] = $baseFolder->getRelativePath($file->getParent()->getPath());
219
		$params['scrollto'] = $file->getName();
220
221
		return $this->urlGenerator->linkToRoute('files.view.index', $params);
222
	}
223
224
}
225