diff options
author | Roeland Jago Douma <roeland@famdouma.nl> | 2019-11-11 10:16:12 +0300 |
---|---|---|
committer | Roeland Jago Douma <roeland@famdouma.nl> | 2019-11-11 10:16:12 +0300 |
commit | f895fa76ee1ee7659f9ce24b3d8df5c661172d98 (patch) | |
tree | db5077a35d99994dbbbd34a91a9d9d0a362143c1 /lib | |
parent | 9c94a3e10fb3345ed57df27f44d51dde2f7ff733 (diff) |
Add album fetch routes
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Controller/AlbumsController.php | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/lib/Controller/AlbumsController.php b/lib/Controller/AlbumsController.php new file mode 100644 index 00000000..e57539bc --- /dev/null +++ b/lib/Controller/AlbumsController.php @@ -0,0 +1,143 @@ +<?php +declare(strict_types=1); +/** + * @copyright Copyright (c) 2019, Roeland Jago Douma <roeland@famdouma.nl> + * + * @author Roeland Jago Douma <roeland@famdouma.nl> + * + * @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 <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Photos\Controller; + +use OCA\Files_Sharing\SharedStorage; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\JSONResponse; +use OCP\Files\File; +use OCP\Files\Folder; +use OCP\Files\IRootFolder; +use OCP\FIles\Node; +use OCP\Files\NotFoundException; +use OCP\IRequest; + +class AlbumsController extends Controller { + + /** @var string */ + private $userId; + /** @var IRootFolder */ + private $rootFolder; + + public function __construct($appName, IRequest $request, string $userId, IRootFolder $rootFolder) { + parent::__construct($appName, $request); + $this->userId = $userId; + $this->rootFolder = $rootFolder; + } + + /** + * @NoAdminRequired + * @NoCSRFRequired + */ + public function myAlbums(string $path = ''): JSONResponse { + return $this->generate($path, false); + } + + /** + * @NoAdminRequired + * @NoCSRFRequired + */ + public function sharedAlbums(string $path = ''): JSONResponse { + return $this->generate($path, true); + } + + private function generate(string $path, bool $shared): JSONResponse { + $userFolder = $this->rootFolder->getUserFolder($this->userId); + + $folder = $userFolder; + if ($path !== '') { + try { + $folder = $userFolder->get($path); + } catch (NotFoundException $e) { + return new JSONResponse([], Http::STATUS_NOT_FOUND); + } + } + + $data = $this->scanCurrentFolder($folder, $shared); + $result = $this->formatData($data); + + return new JSONResponse($result, Http::STATUS_OK); + } + + private function formatData(iterable $nodes): array { + $result = []; + /** @var Node $node */ + foreach ($nodes as $node) { + $result[] = $node->getName(); + } + + return $result; + } + + private function scanCurrentFolder(Folder $folder, bool $shared): iterable { + $nodes = $folder->getDirectoryListing(); + + foreach ($nodes as $node) { + if ($node instanceof Folder) { + yield from $this->scanFolder($node, 0, $shared); + } elseif ($node instanceof File) { + if ($this->validFile($node, $shared)) { + yield $node; + } + } + } + } + + private function validFile(File $file, bool $shared): bool { + if ($file->getMimePart() === 'image' && $this->isShared($file) === $shared) { + return true; + } + + return false; + } + + private function isShared(Node $node): bool { + return $node->getStorage()->instanceOfStorage(SharedStorage::class); + } + + private function scanFolder(Folder $folder, int $depth, bool $shared): iterable { + if ($depth > 4) { + return []; + } + + $nodes = $folder->getDirectoryListing(); + + foreach ($nodes as $node) { + if ($node instanceof File) { + if ($this->validFile($node, $shared)) { + yield $folder; + return []; + } + } + } + + foreach ($nodes as $node) { + if ($node instanceof Folder && $this->isShared($node) === $shared) { + yield from $this->scanFolder($node, $depth + 1, $shared); + } + } + } +} |