From 61f1e253b5ed7df39ef9c6c34012b68af102e667 Mon Sep 17 00:00:00 2001 From: Jonathan Treffler Date: Wed, 9 Oct 2024 22:22:44 +0200 Subject: [PATCH] occ commands: output data in tables instead of json by default --- appinfo/info.xml | 4 +- lib/Command/GetTag.php | 13 +--- .../{GetFolder.php => SearchGroupfolder.php} | 31 ++++---- lib/Command/SetTag.php | 51 +++++++++++++ lib/Command/Tag.php | 71 ------------------- lib/Command/TagCommand.php | 54 +++++++++++++- lib/Db/TagMapper.php | 4 +- lib/Errors/GroupfolderNotFound.php | 9 +++ lib/Errors/NotFoundException.php | 12 +++- lib/Service/TagService.php | 4 +- 10 files changed, 149 insertions(+), 104 deletions(-) rename lib/Command/{GetFolder.php => SearchGroupfolder.php} (51%) create mode 100644 lib/Command/SetTag.php delete mode 100644 lib/Command/Tag.php create mode 100644 lib/Errors/GroupfolderNotFound.php diff --git a/appinfo/info.xml b/appinfo/info.xml index 6540c9a..2a9a6ca 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -18,8 +18,8 @@ - OCA\GroupfolderTags\Command\Tag + OCA\GroupfolderTags\Command\SetTag OCA\GroupfolderTags\Command\GetTag - OCA\GroupfolderTags\Command\GetFolder + OCA\GroupfolderTags\Command\FindGroupfolders diff --git a/lib/Command/GetTag.php b/lib/Command/GetTag.php index 1817457..fdf45c2 100644 --- a/lib/Command/GetTag.php +++ b/lib/Command/GetTag.php @@ -15,6 +15,7 @@ class GetTag extends TagCommand { ->setDescription('Get single tag value by Groupfolder ID and key. Omit key to get all tags.') ->addArgument('folder_id', InputArgument::REQUIRED, 'Groupfolder ID of the tag') ->addArgument('key', InputArgument::OPTIONAL, 'Key of the tag'); + parent::configure(); } protected function execute(InputInterface $input, OutputInterface $output): int { @@ -33,16 +34,8 @@ class GetTag extends TagCommand { return 1; } - if (isset($tagKey)) { - /** @var Tag $tag */ - $tag = current($tags); - $output->writeln($tag->getTagValue()); - return 0; - } - - foreach ($tags as $tag) { - $output->writeln(json_encode($tag)); - } + $this->writeTableInOutputFormat($input, $output, $this->formatTagEntities($tags)); + return 0; } catch (Exception $e) { $output->writeln("Exception \"{$e->getMessage()}\" at {$e->getFile()} line {$e->getLine()}"); diff --git a/lib/Command/GetFolder.php b/lib/Command/SearchGroupfolder.php similarity index 51% rename from lib/Command/GetFolder.php rename to lib/Command/SearchGroupfolder.php index bcdf747..904ef66 100644 --- a/lib/Command/GetFolder.php +++ b/lib/Command/SearchGroupfolder.php @@ -2,18 +2,21 @@ namespace OCA\GroupfolderTags\Command; +use OCA\GroupfolderTags\Errors\GroupfolderNotFound; + use OCP\DB\Exception; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; -class GetFolder extends TagCommand { +class FindGroupfolders extends TagCommand { protected function configure(): void { $this - ->setName('groupfolder-tags:get-folder') - ->setDescription('Get Groupfolders with tag key optionally filtered by tag value.') + ->setName('groupfolder-tags:find-groupfolders') + ->setDescription('Get all groupfolders with tag key optionally filtered by tag value.') ->addArgument('key', InputArgument::REQUIRED, 'Key of the tag') ->addArgument('value', InputArgument::OPTIONAL, 'Value of the tag'); + parent::configure(); } protected function execute(InputInterface $input, OutputInterface $output): int { @@ -21,21 +24,25 @@ class GetFolder extends TagCommand { $tagValue = $input->getArgument('value'); try { - $results = $this->service->findFolder($tagKey, $tagValue); + $groupfolderIds = $this->service->findGroupfoldersWithTag($tagKey, $tagValue); - if (empty($results)) { - $output->writeln("Could not find Groupfolders for tag"); + if (empty($groupfolderIds)) { + $output->writeln("No matching Groupfolders"); return 1; } - foreach ($results as $result) { - $folder = $this->folderManager->getFolder($result['group_folder_id'], $this->rootFolder->getMountPoint()->getNumericStorageId()); - if ($folder === false) { - $output->writeln("Folder not found: {$result['group_folder_id']}"); - continue; + $results = []; + + foreach ($groupfolderIds as $groupfolderId) { + try { + $results[] = $this->formatGroupfolder($groupfolderId); + } catch (GroupfolderNotFound $e) { + $output->writeln("{$e->getMessage()}"); } - $output->writeln(json_encode($folder)); } + + $this->writeTableInOutputFormat($input, $output, $results); + return 0; } catch (Exception $e) { $output->writeln("Exception \"{$e->getMessage()}\" at {$e->getFile()} line {$e->getLine()}"); diff --git a/lib/Command/SetTag.php b/lib/Command/SetTag.php new file mode 100644 index 0000000..c2c15b1 --- /dev/null +++ b/lib/Command/SetTag.php @@ -0,0 +1,51 @@ +setName('groupfolder-tags:set') + ->setDescription('Update or add a tag (and optional tag value) to a groupfolder by id') + ->addArgument('groupfolder_id', InputArgument::REQUIRED, 'groupfolder id to add or update tag of') + ->addArgument('key', InputArgument::REQUIRED, 'key of tag') + ->addArgument('value', InputArgument::OPTIONAL, 'value of tag'); + parent::configure(); + } + + protected function execute(InputInterface $input, OutputInterface $output): int { + $errors = []; + + $groupFolderId = $input->getArgument('groupfolder_id'); + $tagKey = $input->getArgument('key'); + $tagValue = $input->getArgument('value'); + + if(!is_numeric($groupFolderId)) { + $errors[] = "no group folder id provided"; + } + + if(is_null($tagKey) || $tagKey === "") { + $errors[] = "no tag key provided"; + } + + if(empty($errors)) { + $tag = $this->service->update((int)$groupFolderId, $tagKey, $tagValue); + $this->writeTableInOutputFormat($input, $output, [$this->formatTagEntity($tag)]); + + return 0; + } else { + $output->writeln("Error: \n" . implode("\n", $errors)); + + return 1; + } + + } +} \ No newline at end of file diff --git a/lib/Command/Tag.php b/lib/Command/Tag.php deleted file mode 100644 index 7f83837..0000000 --- a/lib/Command/Tag.php +++ /dev/null @@ -1,71 +0,0 @@ -setName('groupfolder-tags:update') - ->setDescription('Update or add a tag (and optional tag value) to a groupfolder by id') - ->addOption( - 'groupfolder_id', - null, - InputOption::VALUE_REQUIRED, - 'Add or update tag of the given groupfolder id' - ) - ->addOption( - 'key', - null, - InputOption::VALUE_REQUIRED, - 'Set tag key to given value' - ) - ->addOption( - 'value', - null, - InputOption::VALUE_OPTIONAL, - 'Set tag value to given value' - ); - } - - protected function execute(InputInterface $input, OutputInterface $output): int { - $errors = []; - - $groupFolderId = $input->getOption('groupfolder_id'); - $tagKey = $input->getOption('key'); - $tagValue = $input->getOption('value'); - - if(!is_numeric($groupFolderId)) { - $errors[] = "no group folder id provided"; - } - - if(is_null($tagKey) || $tagKey === "") { - $errors[] = "no tag key provided"; - } - - if(empty($errors)) { - $output->writeln($groupFolderId . " " . $tagKey . " " . $tagValue); - $output->writeln(json_encode($this->service->update((int)$groupFolderId, $tagKey, $tagValue))); - return 0; - } else { - $output->writeln("Error: \n" . implode("\n", $errors)); - return 1; - } - - } -} \ No newline at end of file diff --git a/lib/Command/TagCommand.php b/lib/Command/TagCommand.php index 27aa9d2..08d5703 100644 --- a/lib/Command/TagCommand.php +++ b/lib/Command/TagCommand.php @@ -2,19 +2,67 @@ namespace OCA\GroupfolderTags\Command; +use OCA\GroupfolderTags\Db\Tag; +use OCA\GroupfolderTags\Service\TagService; +use OCA\GroupfolderTags\Errors\GroupfolderNotFound; + use OCA\GroupFolders\Command\FolderCommand; use OCA\GroupFolders\Folder\FolderManager; use OCA\GroupFolders\Mount\MountProvider; -use OCA\GroupfolderTags\Service\TagService; + + use OCP\Files\IRootFolder; +use OCP\IDateTimeFormatter; abstract class TagCommand extends FolderCommand { + private int $rootFolderNumericStorageId; + public function __construct( - protected readonly TagService $service, FolderManager $folderManager, IRootFolder $rootFolder, - MountProvider $mountProvider + MountProvider $mountProvider, + protected readonly TagService $service, + private readonly IDateTimeFormatter $dateTimeFormatter, ) { parent::__construct($folderManager, $rootFolder, $mountProvider); + + + } + + protected function getRootFolderNumericStorageId() { + if(!isset($this->rootFolderNumericStorageId)) { + $this->rootFolderNumericStorageId = $this->rootFolder->getMountPoint()->getNumericStorageId(); + } + + return $this->rootFolderNumericStorageId; + } + + protected function formatTagEntity(Tag $tag) { + return [ + "Groupfolder Id" => $tag->getGroupFolderId(), + "Key" => $tag->getTagKey(), + "Value" => $tag->getTagValue(), + "Last Updated" => $this->dateTimeFormatter->formatDateTime($tag->getLastUpdatedTimestamp()), + ]; + } + + protected function formatTagEntities($tags) { + return array_map($this->formatTagEntity(...), $tags); + } + + protected function formatGroupfolder($groupfolderId) { + $groupfolder = $this->folderManager->getFolder($groupfolderId, $this->getRootFolderNumericStorageId()); + + if ($groupfolder === false) { + throw new GroupfolderNotFound($groupfolderId); + } + + return [ + "Groupfolder Id" => $groupfolder["id"], + "Mount Point" => $groupfolder["mount_point"], + "Quota" => $groupfolder["quota"], + "Size" => $groupfolder["size"], + "ACL" => $groupfolder["acl"], + ]; } } diff --git a/lib/Db/TagMapper.php b/lib/Db/TagMapper.php index 93d4a0f..d4096c1 100644 --- a/lib/Db/TagMapper.php +++ b/lib/Db/TagMapper.php @@ -95,7 +95,7 @@ class TagMapper extends QBMapper { /** * @throws Exception */ - public function findFolder(string $tagKey, ?string $tagValue): array { + public function findGroupfoldersWithTag(string $tagKey, ?string $tagValue): array { $qb = $this->db->getQueryBuilder(); $qb->selectDistinct('group_folder_id') ->from(self::TABLENAME) @@ -105,6 +105,6 @@ class TagMapper extends QBMapper { $qb->andWhere($qb->expr()->eq('tag_value', $qb->createNamedParameter($tagValue))); } - return $qb->executeQuery()->fetchAll(); + return $qb->executeQuery()->fetchAll(\PDO::FETCH_COLUMN); } } diff --git a/lib/Errors/GroupfolderNotFound.php b/lib/Errors/GroupfolderNotFound.php new file mode 100644 index 0000000..43546f9 --- /dev/null +++ b/lib/Errors/GroupfolderNotFound.php @@ -0,0 +1,9 @@ + $id]); + } +} \ No newline at end of file diff --git a/lib/Errors/NotFoundException.php b/lib/Errors/NotFoundException.php index ff6ee94..b69f8cf 100644 --- a/lib/Errors/NotFoundException.php +++ b/lib/Errors/NotFoundException.php @@ -2,5 +2,13 @@ namespace OCA\GroupfolderTags\Errors; -abstract class NotFoundException extends \Exception { -} \ No newline at end of file +abstract class NotFoundException extends \RuntimeException { + public function __construct($entity, array|string $criteria) { + $message = sprintf( + "Could not find %s with criteria %s", + class_exists($entity) ? array_pop(explode('\\', $entity)) : $entity, + is_string($criteria) ? $criteria : json_encode($criteria), + ); + parent::__construct($message); + } +} diff --git a/lib/Service/TagService.php b/lib/Service/TagService.php index 8be97d7..298ac5e 100644 --- a/lib/Service/TagService.php +++ b/lib/Service/TagService.php @@ -82,7 +82,7 @@ class TagService { /** * @throws \OCP\DB\Exception */ - public function findFolder(string $key, ?string $value): array { - return $this->mapper->findFolder($key, $value); + public function findGroupfoldersWithTag(string $key, ?string $value): array { + return $this->mapper->findGroupfoldersWithTag($key, $value); } }