diff --git a/appinfo/routes.php b/appinfo/routes.php
index 8cce9730..f71d51f9 100644
--- a/appinfo/routes.php
+++ b/appinfo/routes.php
@@ -52,22 +52,12 @@ return [
['name' => 'Days#day', 'url' => '/api/days/{id}', 'verb' => 'GET'],
['name' => 'Days#dayPost', 'url' => '/api/days', 'verb' => 'POST'],
- ['name' => 'Albums#list', 'url' => '/api/albums', 'verb' => 'GET'],
- ['name' => 'Albums#download', 'url' => '/api/albums/download', 'verb' => 'POST'],
+ ['name' => 'Clusters#list', 'url' => '/api/clusters/{backend}', 'verb' => 'GET'],
+ ['name' => 'Clusters#preview', 'url' => '/api/clusters/{backend}/preview/{name}', 'verb' => 'GET'],
+ ['name' => 'Clusters#download', 'url' => '/api/clusters/{backend}/download', 'verb' => 'POST'],
- ['name' => 'Tags#list', 'url' => '/api/tags', 'verb' => 'GET'],
- ['name' => 'Tags#preview', 'url' => '/api/tags/preview/{name}', 'verb' => 'GET'],
['name' => 'Tags#set', 'url' => '/api/tags/set/{id}', 'verb' => 'PATCH'],
- ['name' => 'Places#list', 'url' => '/api/places', 'verb' => 'GET'],
- ['name' => 'Places#preview', 'url' => '/api/places/preview/{name}', 'verb' => 'GET'],
-
- ['name' => 'PeopleRecognize#list', 'url' => '/api/recognize/people', 'verb' => 'GET'],
- ['name' => 'PeopleRecognize#preview', 'url' => '/api/recognize/people/preview/{name}', 'verb' => 'GET'],
-
- ['name' => 'PeopleFaceRecognition#list', 'url' => '/api/facerecognition/people', 'verb' => 'GET'],
- ['name' => 'PeopleFaceRecognition#preview', 'url' => '/api/facerecognition/people/preview/{name}', 'verb' => 'GET'],
-
['name' => 'Map#clusters', 'url' => '/api/map/clusters', 'verb' => 'GET'],
['name' => 'Archive#archive', 'url' => '/api/archive/{id}', 'verb' => 'PATCH'],
diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php
index 872007d3..d38cb9d4 100644
--- a/lib/AppInfo/Application.php
+++ b/lib/AppInfo/Application.php
@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace OCA\Memories\AppInfo;
+use OCA\Memories\ClustersBackend;
use OCA\Memories\Listeners\PostDeleteListener;
use OCA\Memories\Listeners\PostWriteListener;
use OCP\AppFramework\App;
@@ -68,9 +69,17 @@ class Application extends App implements IBootstrap
public function register(IRegistrationContext $context): void
{
+ // Register file hooks
$context->registerEventListener(NodeWrittenEvent::class, PostWriteListener::class);
$context->registerEventListener(NodeTouchedEvent::class, PostWriteListener::class);
$context->registerEventListener(NodeDeletedEvent::class, PostDeleteListener::class);
+
+ // Register clusters backends
+ ClustersBackend\Backend::register('albums', ClustersBackend\AlbumsBackend::class);
+ ClustersBackend\Backend::register('tags', ClustersBackend\TagsBackend::class);
+ ClustersBackend\Backend::register('places', ClustersBackend\PlacesBackend::class);
+ ClustersBackend\Backend::register('recognize', ClustersBackend\RecognizeBackend::class);
+ ClustersBackend\Backend::register('facerecognition', ClustersBackend\FaceRecognitionBackend::class);
}
public function boot(IBootContext $context): void
diff --git a/lib/Controller/AlbumsController.php b/lib/ClustersBackend/AlbumsBackend.php
similarity index 65%
rename from lib/Controller/AlbumsController.php
rename to lib/ClustersBackend/AlbumsBackend.php
index ada3b986..b71aee32 100644
--- a/lib/Controller/AlbumsController.php
+++ b/lib/ClustersBackend/AlbumsBackend.php
@@ -21,43 +21,58 @@ declare(strict_types=1);
* along with this program. If not, see .
*/
-namespace OCA\Memories\Controller;
+namespace OCA\Memories\ClustersBackend;
+use OCA\Memories\Db\TimelineQuery;
use OCA\Memories\Errors;
use OCA\Memories\HttpResponseException;
+use OCP\App\IAppManager;
+use OCP\IUserSession;
-class AlbumsController extends GenericClusterController
+class AlbumsBackend extends Backend
{
- protected function appName(): string
+ protected TimelineQuery $timelineQuery;
+ protected string $userId;
+ protected IAppManager $appManager;
+
+ public function __construct(
+ TimelineQuery $timelineQuery,
+ IUserSession $userSession,
+ IAppManager $appManager
+ ) {
+ $this->timelineQuery = $timelineQuery;
+ $this->userId = $userSession->getUser()->getUID();
+ $this->appManager = $appManager;
+ }
+
+ public function appName(): string
{
return 'Albums';
}
- protected function isEnabled(): bool
+ public function isEnabled(): bool
{
- return $this->albumsIsEnabled();
+ return \OCA\Memories\Util::albumsIsEnabled($this->appManager);
}
- protected function useTimelineRoot(): bool
- {
- return false;
- }
-
- protected function clusterName(string $name)
+ public function clusterName(string $name)
{
return explode('/', $name)[1];
}
- protected function getClusters(): array
+ public function getClusters(): array
{
+ /** @var \OCP\IRequest $request */
+ $request = \OC::$server->get(\OCP\IRequest::class);
+
// Run actual query
$list = [];
- $t = (int) $this->request->getParam('t', 0);
+ $t = (int) $request->getParam('t', 0);
if ($t & 1) { // personal
- $list = array_merge($list, $this->timelineQuery->getAlbums($this->getUID()));
+ $list = array_merge($list, $this->timelineQuery->getAlbums($this->userId));
}
if ($t & 2) { // shared
- $list = array_merge($list, $this->timelineQuery->getAlbums($this->getUID(), true));
+ $list = array_merge($list, $this->timelineQuery->getAlbums($this->userId, true));
}
// Remove elements with duplicate album_id
@@ -75,10 +90,10 @@ class AlbumsController extends GenericClusterController
return array_values($list);
}
- protected function getPhotos(string $name, ?int $limit = null): array
+ public function getPhotos(string $name, ?int $limit = null): array
{
// Get album
- $album = $this->timelineQuery->getAlbumIfAllowed($this->getUID(), $name);
+ $album = $this->timelineQuery->getAlbumIfAllowed($this->userId, $name);
if (null === $album) {
throw new HttpResponseException(Errors::NotFound("album {$name}"));
}
diff --git a/lib/ClustersBackend/Backend.php b/lib/ClustersBackend/Backend.php
new file mode 100644
index 00000000..337dcc84
--- /dev/null
+++ b/lib/ClustersBackend/Backend.php
@@ -0,0 +1,112 @@
+
+ * @author Varun Patil
+ * @license AGPL-3.0-or-later
+ *
+ * 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\Memories\ClustersBackend;
+
+abstract class Backend
+{
+ /** Mapping of backend name to className */
+ public static array $backends = [];
+
+ /**
+ * A human-readable name for the app.
+ * Used for error messages.
+ */
+ abstract public function appName(): string;
+
+ /**
+ * Whether the app is enabled for the current user.
+ */
+ abstract public function isEnabled(): bool;
+
+ /**
+ * Get the cluster list for the current user.
+ */
+ abstract public function getClusters(): array;
+
+ /**
+ * Get a list of photos with any extra parameters for the given cluster
+ * Used for preview generation and download.
+ *
+ * @param string $name Identifier for the cluster
+ * @param int $limit Maximum number of photos to return
+ */
+ abstract public function getPhotos(string $name, ?int $limit = null): array;
+
+ /**
+ * Register a new backend.
+ *
+ * @param mixed $name
+ * @param mixed $className
+ */
+ public static function register($name, $className): void
+ {
+ self::$backends[$name] = $className;
+ }
+
+ /**
+ * Human readable name for the cluster.
+ */
+ public function clusterName(string $name)
+ {
+ return $name;
+ }
+
+ /**
+ * Put the photo objects in priority list.
+ * Works on the array in place.
+ */
+ public function sortPhotosForPreview(array &$photos)
+ {
+ shuffle($photos);
+ }
+
+ /**
+ * Quality to use for the preview file.
+ */
+ public function getPreviewQuality(): int
+ {
+ return 512;
+ }
+
+ /**
+ * Perform any post processing and get the blob from the preview file.
+ *
+ * @param \OCP\Files\SimpleFS\ISimpleFile $file Preview file
+ * @param array $photo Photo object
+ *
+ * @return [Blob, mimetype] of data
+ */
+ public function getPreviewBlob($file, $photo): array
+ {
+ return [$file->getContent(), $file->getMimeType()];
+ }
+
+ /**
+ * Get the file ID for a photo object.
+ */
+ public function getFileId(array $photo): int
+ {
+ return (int) $photo['fileid'];
+ }
+}
diff --git a/lib/Controller/PeopleFaceRecognitionController.php b/lib/ClustersBackend/FaceRecognitionBackend.php
similarity index 58%
rename from lib/Controller/PeopleFaceRecognitionController.php
rename to lib/ClustersBackend/FaceRecognitionBackend.php
index 5065e883..faef320e 100644
--- a/lib/Controller/PeopleFaceRecognitionController.php
+++ b/lib/ClustersBackend/FaceRecognitionBackend.php
@@ -21,23 +21,48 @@ declare(strict_types=1);
* along with this program. If not, see .
*/
-namespace OCA\Memories\Controller;
+namespace OCA\Memories\ClustersBackend;
-class PeopleFaceRecognitionController extends GenericClusterController
+use OCA\Memories\Db\TimelineQuery;
+use OCA\Memories\Db\TimelineRoot;
+use OCP\App\IAppManager;
+use OCP\IConfig;
+use OCP\IUserSession;
+
+class FaceRecognitionBackend extends Backend
{
- use PeopleControllerUtils;
+ use PeopleBackendUtils;
- protected function appName(): string
+ public TimelineRoot $root;
+ protected TimelineQuery $timelineQuery;
+ protected string $userId;
+ protected IAppManager $appManager;
+ protected IConfig $config;
+
+ public function __construct(
+ TimelineQuery $timelineQuery,
+ IUserSession $userSession,
+ IAppManager $appManager,
+ IConfig $config
+ ) {
+ $this->timelineQuery = $timelineQuery;
+ $this->userId = $userSession->getUser()->getUID();
+ $this->appManager = $appManager;
+ $this->config = $config;
+ }
+
+ public function appName(): string
{
return 'Face Recognition';
}
- protected function isEnabled(): bool
+ public function isEnabled(): bool
{
- return $this->recognizeIsEnabled();
+ return \OCA\Memories\Util::facerecognitionIsInstalled($this->appManager)
+ && \OCA\Memories\Util::facerecognitionIsEnabled($this->config, $this->userId);
}
- protected function getClusters(): array
+ public function getClusters(): array
{
return array_merge(
$this->timelineQuery->getFaceRecognitionPersons($this->root, $this->model()),
@@ -45,12 +70,12 @@ class PeopleFaceRecognitionController extends GenericClusterController
);
}
- protected function getPhotos(string $name, ?int $limit = null): array
+ public function getPhotos(string $name, ?int $limit = null): array
{
return $this->timelineQuery->getFaceRecognitionPhotos($name, $this->model(), $this->root, $limit) ?? [];
}
- protected function sortPhotosForPreview(array &$photos)
+ public function sortPhotosForPreview(array &$photos)
{
// Convert to recognize format (percentage position-size)
foreach ($photos as &$p) {
@@ -63,11 +88,16 @@ class PeopleFaceRecognitionController extends GenericClusterController
$this->sortByScores($photos);
}
- protected function getPreviewBlob($file, $photo): array
+ public function getPreviewBlob($file, $photo): array
{
return $this->cropFace($file, $photo, 1.8);
}
+ public function getPreviewQuality(): int
+ {
+ return 2048;
+ }
+
private function model(): int
{
return (int) $this->config->getAppValue('facerecognition', 'model', -1);
diff --git a/lib/Controller/PeopleControllerUtils.php b/lib/ClustersBackend/PeopleBackendUtils.php
similarity index 98%
rename from lib/Controller/PeopleControllerUtils.php
rename to lib/ClustersBackend/PeopleBackendUtils.php
index 1d7adb49..c5264a27 100644
--- a/lib/Controller/PeopleControllerUtils.php
+++ b/lib/ClustersBackend/PeopleBackendUtils.php
@@ -21,9 +21,9 @@ declare(strict_types=1);
* along with this program. If not, see .
*/
-namespace OCA\Memories\Controller;
+namespace OCA\Memories\ClustersBackend;
-trait PeopleControllerUtils
+trait PeopleBackendUtils
{
/**
* Sort a list of faces by the score.
diff --git a/lib/Controller/PlacesController.php b/lib/ClustersBackend/PlacesBackend.php
similarity index 59%
rename from lib/Controller/PlacesController.php
rename to lib/ClustersBackend/PlacesBackend.php
index 11c278ee..521d0d82 100644
--- a/lib/Controller/PlacesController.php
+++ b/lib/ClustersBackend/PlacesBackend.php
@@ -21,26 +21,42 @@ declare(strict_types=1);
* along with this program. If not, see .
*/
-namespace OCA\Memories\Controller;
+namespace OCA\Memories\ClustersBackend;
-class PlacesController extends GenericClusterController
+use OCA\Memories\Db\TimelineQuery;
+use OCA\Memories\Db\TimelineRoot;
+use OCP\IUserSession;
+
+class PlacesBackend extends Backend
{
- protected function appName(): string
+ public TimelineRoot $root;
+ protected TimelineQuery $timelineQuery;
+ protected string $userId;
+
+ public function __construct(
+ TimelineQuery $timelineQuery,
+ IUserSession $userSession
+ ) {
+ $this->timelineQuery = $timelineQuery;
+ $this->userId = $userSession->getUser()->getUID();
+ }
+
+ public function appName(): string
{
return 'Places';
}
- protected function isEnabled(): bool
+ public function isEnabled(): bool
{
- return $this->placesIsEnabled();
+ return \OCA\Memories\Util::placesGISType() > 0;
}
- protected function getClusters(): array
+ public function getClusters(): array
{
return $this->timelineQuery->getPlaces($this->root);
}
- protected function getPhotos(string $name, ?int $limit = null): array
+ public function getPhotos(string $name, ?int $limit = null): array
{
return $this->timelineQuery->getPlacePhotos((int) $name, $this->root, $limit) ?? [];
}
diff --git a/lib/Controller/PeopleRecognizeController.php b/lib/ClustersBackend/RecognizeBackend.php
similarity index 51%
rename from lib/Controller/PeopleRecognizeController.php
rename to lib/ClustersBackend/RecognizeBackend.php
index e38bf219..5bf50dd4 100644
--- a/lib/Controller/PeopleRecognizeController.php
+++ b/lib/ClustersBackend/RecognizeBackend.php
@@ -21,39 +21,64 @@ declare(strict_types=1);
* along with this program. If not, see .
*/
-namespace OCA\Memories\Controller;
+namespace OCA\Memories\ClustersBackend;
-class PeopleRecognizeController extends GenericClusterController
+use OCA\Memories\Db\TimelineQuery;
+use OCA\Memories\Db\TimelineRoot;
+use OCP\App\IAppManager;
+use OCP\IUserSession;
+
+class RecognizeBackend extends Backend
{
- use PeopleControllerUtils;
+ use PeopleBackendUtils;
- protected function appName(): string
+ public TimelineRoot $root;
+ protected TimelineQuery $timelineQuery;
+ protected string $userId;
+ protected IAppManager $appManager;
+
+ public function __construct(
+ TimelineQuery $timelineQuery,
+ IUserSession $userSession,
+ IAppManager $appManager
+ ) {
+ $this->timelineQuery = $timelineQuery;
+ $this->userId = $userSession->getUser()->getUID();
+ $this->appManager = $appManager;
+ }
+
+ public function appName(): string
{
return 'Recognize';
}
- protected function isEnabled(): bool
+ public function isEnabled(): bool
{
- return $this->recognizeIsEnabled();
+ return \OCA\Memories\Util::recognizeIsEnabled($this->appManager);
}
- protected function getClusters(): array
+ public function getClusters(): array
{
- return $this->timelineQuery->getPeopleRecognize($this->root, $this->getUID());
+ return $this->timelineQuery->getPeopleRecognize($this->root, $this->userId);
}
- protected function getPhotos(string $name, ?int $limit = null): array
+ public function getPhotos(string $name, ?int $limit = null): array
{
return $this->timelineQuery->getPeopleRecognizePhotos((int) $name, $this->root, $limit) ?? [];
}
- protected function sortPhotosForPreview(array &$photos)
+ public function sortPhotosForPreview(array &$photos)
{
$this->sortByScores($photos);
}
- protected function getPreviewBlob($file, $photo): array
+ public function getPreviewBlob($file, $photo): array
{
return $this->cropFace($file, $photo, 1.5);
}
+
+ public function getPreviewQuality(): int
+ {
+ return 2048;
+ }
}
diff --git a/lib/ClustersBackend/TagsBackend.php b/lib/ClustersBackend/TagsBackend.php
new file mode 100644
index 00000000..aa93b606
--- /dev/null
+++ b/lib/ClustersBackend/TagsBackend.php
@@ -0,0 +1,67 @@
+
+ * @author Varun Patil
+ * @license AGPL-3.0-or-later
+ *
+ * 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\Memories\ClustersBackend;
+
+use OCA\Memories\Db\TimelineQuery;
+use OCA\Memories\Db\TimelineRoot;
+use OCP\App\IAppManager;
+use OCP\IUserSession;
+
+class TagsBackend extends Backend
+{
+ public TimelineRoot $root;
+ protected TimelineQuery $timelineQuery;
+ protected string $userId;
+ protected IAppManager $appManager;
+
+ public function __construct(
+ TimelineQuery $timelineQuery,
+ IUserSession $userSession,
+ IAppManager $appManager
+ ) {
+ $this->timelineQuery = $timelineQuery;
+ $this->userId = $userSession->getUser()->getUID();
+ $this->appManager = $appManager;
+ }
+
+ public function appName(): string
+ {
+ return 'Tags';
+ }
+
+ public function isEnabled(): bool
+ {
+ return \OCA\Memories\Util::tagsIsEnabled($this->appManager);
+ }
+
+ public function getClusters(): array
+ {
+ return $this->timelineQuery->getTags($this->root);
+ }
+
+ public function getPhotos(string $name, ?int $limit = null): array
+ {
+ return $this->timelineQuery->getTagPhotos($name, $this->root, $limit) ?? [];
+ }
+}
diff --git a/lib/Controller/GenericClusterController.php b/lib/Controller/ClustersController.php
similarity index 54%
rename from lib/Controller/GenericClusterController.php
rename to lib/Controller/ClustersController.php
index 177055b0..094d7d8d 100644
--- a/lib/Controller/GenericClusterController.php
+++ b/lib/Controller/ClustersController.php
@@ -23,28 +23,29 @@ declare(strict_types=1);
namespace OCA\Memories\Controller;
-use OCA\Memories\Db\TimelineRoot;
+use OCA\Memories\ClustersBackend\Backend;
use OCA\Memories\Errors;
use OCA\Memories\HttpResponseException;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataDisplayResponse;
use OCP\AppFramework\Http\JSONResponse;
-abstract class GenericClusterController extends GenericApiController
+class ClustersController extends GenericApiController
{
- protected ?TimelineRoot $root;
+ /** Current backend for this instance */
+ protected Backend $backend;
/**
* @NoAdminRequired
*
* Get list of clusters
*/
- public function list(): Http\Response
+ public function list(string $backend): Http\Response
{
- return $this->guardEx(function () {
- $this->init();
+ return $this->guardEx(function () use ($backend) {
+ $this->init($backend);
- $list = $this->getClusters();
+ $list = $this->backend->getClusters();
return new JSONResponse($list, Http::STATUS_OK);
});
@@ -57,13 +58,13 @@ abstract class GenericClusterController extends GenericApiController
*
* Get preview for a cluster
*/
- public function preview(string $name): Http\Response
+ public function preview(string $backend, string $name): Http\Response
{
- return $this->guardEx(function () use ($name) {
- $this->init();
+ return $this->guardEx(function () use ($backend, $name) {
+ $this->init($backend);
// Get list of some photos in this cluster
- $photos = $this->getPhotos($name, 8);
+ $photos = $this->backend->getPhotos($name, 8);
// If no photos found then return 404
if (0 === \count($photos)) {
@@ -71,7 +72,7 @@ abstract class GenericClusterController extends GenericApiController
}
// Put the photos in the correct order
- $this->sortPhotosForPreview($photos);
+ $this->backend->sortPhotosForPreview($photos);
// Get preview from image list
return $this->getPreviewFromPhotoList($photos);
@@ -85,121 +86,47 @@ abstract class GenericClusterController extends GenericApiController
*
* Download a cluster as a zip file
*/
- public function download(string $name): Http\Response
+ public function download(string $backend, string $name): Http\Response
{
- return $this->guardEx(function () use ($name) {
- $this->init();
+ return $this->guardEx(function () use ($backend, $name) {
+ $this->init($backend);
// Get list of all files in this cluster
- $photos = $this->getPhotos($name);
- $fileIds = array_map([$this, 'getFileId'], $photos);
+ $photos = $this->backend->getPhotos($name);
+ $fileIds = array_map(fn ($p) => $this->backend->getFileId($p), $photos);
// Get download handle
- $filename = $this->clusterName($name);
+ $filename = $this->backend->clusterName($name);
$handle = \OCA\Memories\Controller\DownloadController::createHandle($filename, $fileIds);
return new JSONResponse(['handle' => $handle], Http::STATUS_OK);
});
}
- /**
- * A human-readable name for the app.
- * Used for error messages.
- */
- abstract protected function appName(): string;
-
- /**
- * Whether the app is enabled for the current user.
- */
- abstract protected function isEnabled(): bool;
-
- /**
- * Get the cluster list for the current user.
- */
- abstract protected function getClusters(): array;
-
- /**
- * Get a list of photos with any extra parameters for the given cluster
- * Used for preview generation and download.
- *
- * @param string $name Identifier for the cluster
- * @param int $limit Maximum number of photos to return
- */
- abstract protected function getPhotos(string $name, ?int $limit = null): array;
-
- /**
- * Human readable name for the cluster.
- */
- protected function clusterName(string $name)
- {
- return $name;
- }
-
- /**
- * Put the photo objects in priority list.
- * Works on the array in place.
- */
- protected function sortPhotosForPreview(array &$photos)
- {
- shuffle($photos);
- }
-
- /**
- * Quality to use for the preview file.
- */
- protected function getPreviewQuality(): int
- {
- return 512;
- }
-
- /**
- * Perform any post processing and get the blob from the preview file.
- *
- * @param \OCP\Files\SimpleFS\ISimpleFile $file Preview file
- * @param array $photo Photo object
- *
- * @return [Blob, mimetype] of data
- */
- protected function getPreviewBlob($file, $photo): array
- {
- return [$file->getContent(), $file->getMimeType()];
- }
-
- /**
- * Get the file ID for a photo object.
- */
- protected function getFileId(array $photo): int
- {
- return (int) $photo['fileid'];
- }
-
- /**
- * Should the timeline root be queried?
- */
- protected function useTimelineRoot(): bool
- {
- return true;
- }
-
/**
* Initialize and check if the app is enabled.
* Gets the root node if required.
*/
- protected function init(): void
+ protected function init(string $backend): void
{
$user = $this->userSession->getUser();
if (null === $user) {
throw new HttpResponseException(Errors::NotLoggedIn());
}
- if (!$this->isEnabled()) {
- throw new HttpResponseException(Errors::NotEnabled($this->appName()));
+ if (\array_key_exists($backend, Backend::$backends)) {
+ $this->backend = \OC::$server->get(Backend::$backends[$backend]);
+ } else {
+ throw new \Exception("Invalid clusters backend '{$backend}'");
}
- $this->root = null;
- if ($this->useTimelineRoot()) {
- $this->root = $this->getRequestRoot();
- if ($this->root->isEmpty()) {
+ if (!$this->backend->isEnabled()) {
+ throw new HttpResponseException(Errors::NotEnabled($this->backend->appName()));
+ }
+
+ if (property_exists($this->backend, 'root')) {
+ $this->backend->root = $this->getRequestRoot();
+ if ($this->backend->root->isEmpty()) {
throw new HttpResponseException(Errors::NoRequestRoot());
}
}
@@ -217,7 +144,7 @@ abstract class GenericClusterController extends GenericApiController
$userFolder = $this->rootFolder->getUserFolder($this->getUID());
foreach ($photos as $img) {
// Get the file
- $files = $userFolder->getById($this->getFileId($img));
+ $files = $userFolder->getById($this->backend->getFileId($img));
if (0 === \count($files)) {
continue;
}
@@ -229,10 +156,10 @@ abstract class GenericClusterController extends GenericApiController
// Get preview image
try {
- $quality = $this->getPreviewQuality();
+ $quality = $this->backend->getPreviewQuality();
$file = $previewManager->getPreview($files[0], $quality, $quality, false);
- [$blob, $mimetype] = $this->getPreviewBlob($file, $img);
+ [$blob, $mimetype] = $this->backend->getPreviewBlob($file, $img);
$response = new DataDisplayResponse($blob, Http::STATUS_OK, [
'Content-Type' => $mimetype,
diff --git a/lib/Controller/TagsController.php b/lib/Controller/TagsController.php
index 6b0a2a5e..07cd968d 100644
--- a/lib/Controller/TagsController.php
+++ b/lib/Controller/TagsController.php
@@ -27,7 +27,7 @@ use OCA\Memories\Errors;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
-class TagsController extends GenericClusterController
+class TagsController extends GenericApiController
{
/**
* @NoAdminRequired
@@ -38,7 +38,7 @@ class TagsController extends GenericClusterController
{
// Check tags enabled for this user
if (!$this->tagsIsEnabled()) {
- return Errors::NotEnabled($this->appName());
+ return Errors::NotEnabled('Tags');
}
// Check the user is allowed to edit the file
@@ -61,24 +61,4 @@ class TagsController extends GenericClusterController
return new JSONResponse([], Http::STATUS_OK);
}
-
- protected function appName(): string
- {
- return 'Tags';
- }
-
- protected function isEnabled(): bool
- {
- return $this->tagsIsEnabled();
- }
-
- protected function getClusters(): array
- {
- return $this->timelineQuery->getTags($this->root);
- }
-
- protected function getPhotos(string $name, ?int $limit = null): array
- {
- return $this->timelineQuery->getTagPhotos($name, $this->root, $limit) ?? [];
- }
}
diff --git a/src/services/API.ts b/src/services/API.ts
index 85a58a08..a70cd906 100644
--- a/src/services/API.ts
+++ b/src/services/API.ts
@@ -48,27 +48,27 @@ export class API {
}
static ALBUM_LIST(t: 1 | 2 | 3 = 3) {
- return gen(`${BASE}/albums?t=${t}`);
+ return gen(`${BASE}/clusters/albums?t=${t}`);
}
static ALBUM_DOWNLOAD(user: string, name: string) {
- return gen(`${BASE}/albums/download?name={user}/{name}`, { user, name });
+ return gen(`${BASE}/clusters/albums/download?name={user}/{name}`, { user, name });
}
static PLACE_LIST() {
- return gen(`${BASE}/places`);
+ return gen(`${BASE}/clusters/places`);
}
static PLACE_PREVIEW(place: number | string) {
- return gen(`${BASE}/places/preview/{place}`, { place });
+ return gen(`${BASE}/clusters/places/preview/{place}`, { place });
}
static TAG_LIST() {
- return gen(`${BASE}/tags`);
+ return gen(`${BASE}/clusters/tags`);
}
static TAG_PREVIEW(tag: string) {
- return gen(`${BASE}/tags/preview/{tag}`, { tag });
+ return gen(`${BASE}/clusters/tags/preview/{tag}`, { tag });
}
static TAG_SET(fileid: string | number) {
@@ -76,14 +76,14 @@ export class API {
}
static FACE_LIST(app: "recognize" | "facerecognition") {
- return gen(`${BASE}/${app}/people`);
+ return gen(`${BASE}/clusters/${app}`);
}
static FACE_PREVIEW(
app: "recognize" | "facerecognition",
face: string | number
) {
- return gen(`${BASE}/${app}/people/preview/{face}`, { face });
+ return gen(`${BASE}/clusters/${app}/preview/{face}`, { face });
}
static ARCHIVE(fileid: number) {