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

PersonController::findByName()   B

Complexity

Conditions 7
Paths 6

Size

Total Lines 39
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 56

Importance

Changes 0
Metric Value
cc 7
eloc 30
c 0
b 0
f 0
nc 6
nop 1
dl 0
loc 39
ccs 0
cts 33
cp 0
crap 56
rs 8.5066
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