* * @author Ming Tsang * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ namespace OCA\FaceRecognition\Controller; use OCP\IRequest; use OCP\Files\File; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\JSONResponse; use OCP\AppFramework\Http\DataDisplayResponse; use OCP\AppFramework\OCSController; use OCA\FaceRecognition\Db\Face; use OCA\FaceRecognition\Db\FaceMapper; use OCA\FaceRecognition\Db\Image; use OCA\FaceRecognition\Db\ImageMapper; use OCA\FaceRecognition\Db\Person; use OCA\FaceRecognition\Db\PersonMapper; use OCA\FaceRecognition\Service\SettingsService; use OCA\FaceRecognition\Service\UrlService; class OcsApiController extends OCSController { /** @var FaceMapper */ private $faceMapper; /** @var ImageMapper */ private $imageMapper; /** @var PersonMapper */ private $personMapper; /** @var SettingsService */ private $settingsService; /** @var UrlService */ private $urlService; /** @var string */ private $userId; public function __construct( $AppName, IRequest $request, FaceMapper $faceMapper, ImageMapper $imageMapper, PersonMapper $personmapper, SettingsService $settingsService, UrlService $urlService, $UserId) { parent::__construct($AppName, $request); $this->faceMapper = $faceMapper; $this->imageMapper = $imageMapper; $this->personMapper = $personmapper; $this->settingsService = $settingsService; $this->urlService = $urlService; $this->userId = $UserId; } /** * API V1 */ /** * Get all named persons * * - Endpoint: /persons * - Method: GET * - Response: Array of persons * - Person: * - name: Name of the person * - thumbFaceId: Face representing this person * - count: Number of images associated to this person * * @NoAdminRequired * * @return DataResponse */ public function getPersonsV1(): DataResponse { $userEnabled = $this->settingsService->getUserEnabled($this->userId); $resp = array(); if (!$userEnabled) return new DataResponse($resp); $modelId = $this->settingsService->getCurrentFaceModel(); $personsNames = $this->personMapper->findDistinctNames($this->userId, $modelId); foreach ($personsNames as $personNamed) { $facesCount = 0; $thumbFaceId = null; $persons = $this->personMapper->findByName($this->userId, $modelId, $personNamed->getName()); foreach ($persons as $person) { $personFaces = $this->faceMapper->findFromCluster($this->userId, $person->getId(), $modelId); if (is_null($thumbFaceId)) { $thumbFaceId = $personFaces[0]->getId(); } $facesCount += count($personFaces); } $respPerson = []; $respPerson['name'] = $personNamed->getName(); $respPerson['thumbFaceId'] = $thumbFaceId; $respPerson['count'] = $facesCount; $resp[] = $respPerson; } return new DataResponse($resp); } /** * Get all faces associated to a person * * - Endpoint: /person//faces * - Method: GET * - URL Arguments: name - (string) name of the person * - Response: Array of faces * - Face: * - id: Face ID * - fileId: The file where this face was found * * @NoAdminRequired * * @return DataResponse */ public function getFacesByPerson(string $name): DataResponse { $userEnabled = $this->settingsService->getUserEnabled($this->userId); $resp = array(); if (!$userEnabled) return new DataResponse($resp); $modelId = $this->settingsService->getCurrentFaceModel(); $clusters = $this->personMapper->findByName($this->userId, $modelId, $name); foreach ($clusters as $cluster) { $faces = $this->faceMapper->findFromCluster($this->userId, $cluster->getId(), $modelId); foreach ($faces as $face) { $image = $this->imageMapper->find($this->userId, $face->getImage()); $respFace = []; $respFace['id'] = $face->getId(); $respFace['fileId'] = $image->getFile(); $resp[] = $respFace; } } return new DataResponse($resp); } }