nextcloud-custom-apps-face-.../git_facerecognition/lib/Controller/FileController.php
2024-09-03 09:12:12 +05:00

167 lines
4.7 KiB
PHP

<?php
namespace OCA\FaceRecognition\Controller;
use OCP\IRequest;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Controller;
use OCA\FaceRecognition\Db\Image;
use OCA\FaceRecognition\Db\ImageMapper;
use OCA\FaceRecognition\Db\Face;
use OCA\FaceRecognition\Db\FaceMapper;
use OCA\FaceRecognition\Db\Person;
use OCA\FaceRecognition\Db\PersonMapper;
use OCA\FaceRecognition\Service\FileService;
use OCA\FaceRecognition\Service\SettingsService;
use OCA\FaceRecognition\Service\UrlService;
class FileController extends Controller {
/** @var ImageMapper */
private $imageMapper;
/** @var PersonMapper */
private $personMapper;
/** @var FaceMapper */
private $faceMapper;
/** @var FileService */
private $fileService;
/** @var SettingsService */
private $settingsService;
/** @var UrlService */
private $urlService;
/** @var string */
private $userId;
public function __construct($AppName,
IRequest $request,
ImageMapper $imageMapper,
PersonMapper $personMapper,
FaceMapper $faceMapper,
FileService $fileService,
SettingsService $settingsService,
UrlService $urlService,
$UserId)
{
parent::__construct($AppName, $request);
$this->imageMapper = $imageMapper;
$this->personMapper = $personMapper;
$this->faceMapper = $faceMapper;
$this->fileService = $fileService;
$this->settingsService = $settingsService;
$this->urlService = $urlService;
$this->userId = $UserId;
}
/**
* @NoAdminRequired
*
* Get persons on file.
*
* @param string $fullpath of the file to get persons
* @return JSONResponse
*/
public function getPersonsFromPath(string $fullpath) {
$resp = array();
if (!$this->settingsService->getUserEnabled($this->userId)) {
$resp['enabled'] = false;
return new JSONResponse($resp);
}
$file = $this->fileService->getFileByPath($fullpath);
$fileId = $file->getId();
$modelId = $this->settingsService->getCurrentFaceModel();
$image = $this->imageMapper->findFromFile($this->userId, $modelId, $fileId);
$resp['enabled'] = true;
$resp['is_allowed'] = $this->fileService->isAllowedNode($file);
$resp['parent_detection'] = !$this->fileService->isUnderNoDetection($file);
$resp['image_id'] = $image ? $image->getId() : 0;
$resp['is_processed'] = $image ? $image->getIsProcessed() : false;
$resp['error'] = $image ? $image->getError() : null;
$resp['persons'] = array();
$faces = $this->faceMapper->findFromFile($this->userId, $modelId, $fileId);
foreach ($faces as $face) {
// When there are faces but still dont have person, the process is not completed yet.
// See issue https://github.com/matiasdelellis/facerecognition/issues/255
if (!$face->getPerson()) {
$resp['is_processed'] = false;
break;
}
$person = $this->personMapper->find($this->userId, $face->getPerson());
$personName = $person->getName();
$facePerson = array();
$facePerson['name'] = $personName;
$facePerson['person_id'] = $person->getId();
$facePerson['person_visible'] = $person->getIsVisible();
$facePerson['face_id'] = $face->getId();
$facePerson['thumb_url'] = $this->urlService->getThumbUrl($face->getId(), 50);
$facePerson['photos_url'] = $personName ? $this->urlService->getRedirectToPersonUrl($personName) : null;
$resp['persons'][] = $facePerson;
}
return new JSONResponse($resp);
}
/**
* @NoAdminRequired
*
* Get if folder if folder is enabled
*
* @param string $fullpath of the folder
* @return JSONResponse
*/
public function getFolderOptions(string $fullpath) {
$resp = array();
if (!$this->settingsService->getUserEnabled($this->userId)) {
$resp['enabled'] = false;
return new JSONResponse($resp);
}
$folder = $this->fileService->getFileByPath($fullpath);
$resp['enabled'] = 'true';
$resp['is_allowed'] = $this->fileService->isAllowedNode($folder);
$resp['parent_detection'] = !$this->fileService->isUnderNoDetection($folder);
$resp['descendant_detection'] = $this->fileService->getDescendantDetection($folder);
return new JSONResponse($resp);
}
/**
* @NoAdminRequired
*
* Apply option to folder to enabled or disable it.
*
* @param string $fullpath of the folder.
* @param bool $detection
* @return JSONResponse
*/
public function setFolderOptions(string $fullpath, bool $detection) {
$folder = $this->fileService->getFileByPath($fullpath);
$this->fileService->setDescendantDetection($folder, $detection);
return $this->getFolderOptions($fullpath);
}
}