From bac1a3a6237b466d7b9d92491ad0f91d97247e46 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 17 Jun 2016 13:29:29 +0200 Subject: [PATCH] Add option to `occ files_external:list` to show all configured mounts --- apps/files_external/lib/Command/Export.php | 6 +++ .../lib/Command/ListCommand.php | 44 ++++++++++++++----- .../lib/Service/DBConfigService.php | 12 +++++ .../lib/Service/GlobalStoragesService.php | 19 ++++++++ .../tests/Service/DBConfigServiceTest.php | 10 +++++ 5 files changed, 81 insertions(+), 10 deletions(-) diff --git a/apps/files_external/lib/Command/Export.php b/apps/files_external/lib/Command/Export.php index 09c5ea8a9d..89655c1efc 100644 --- a/apps/files_external/lib/Command/Export.php +++ b/apps/files_external/lib/Command/Export.php @@ -41,6 +41,11 @@ class Export extends ListCommand { 'user_id', InputArgument::OPTIONAL, 'user id to export the personal mounts for, if no user is provided admin mounts will be exported' + )->addOption( + 'all', + 'a', + InputOption::VALUE_NONE, + 'show both system wide mounts and all personal mounts' ); } @@ -48,6 +53,7 @@ class Export extends ListCommand { $listCommand = new ListCommand($this->globalService, $this->userService, $this->userSession, $this->userManager); $listInput = new ArrayInput([], $listCommand->getDefinition()); $listInput->setArgument('user_id', $input->getArgument('user_id')); + $listInput->setOption('all', $input->getOption('all')); $listInput->setOption('output', 'json_pretty'); $listInput->setOption('show-password', true); $listInput->setOption('full', true); diff --git a/apps/files_external/lib/Command/ListCommand.php b/apps/files_external/lib/Command/ListCommand.php index bb43db17a8..e29a5f58f4 100644 --- a/apps/files_external/lib/Command/ListCommand.php +++ b/apps/files_external/lib/Command/ListCommand.php @@ -56,6 +56,8 @@ class ListCommand extends Base { */ protected $userManager; + const ALL = -1; + function __construct(GlobalStoragesService $globalService, UserStoragesService $userService, IUserSession $userSession, IUserManager $userManager) { parent::__construct(); $this->globalService = $globalService; @@ -67,7 +69,7 @@ class ListCommand extends Base { protected function configure() { $this ->setName('files_external:list') - ->setDescription('List configured mounts') + ->setDescription('List configured admin or personal mounts') ->addArgument( 'user_id', InputArgument::OPTIONAL, @@ -82,16 +84,27 @@ class ListCommand extends Base { null, InputOption::VALUE_NONE, 'don\'t truncate long values in table output' + )->addOption( + 'all', + 'a', + InputOption::VALUE_NONE, + 'show both system wide mounts and all personal mounts' ); parent::configure(); } protected function execute(InputInterface $input, OutputInterface $output) { - $userId = $input->getArgument('user_id'); - $storageService = $this->getStorageService($userId); + if ($input->getOption('all')) { + /** @var $mounts StorageConfig[] */ + $mounts = $this->globalService->getStorageForAllUsers(); + $userId = self::ALL; + } else { + $userId = $input->getArgument('user_id'); + $storageService = $this->getStorageService($userId); - /** @var $mounts StorageConfig[] */ - $mounts = $storageService->getAllStorages(); + /** @var $mounts StorageConfig[] */ + $mounts = $storageService->getAllStorages(); + } $this->listMounts($userId, $mounts, $input, $output); } @@ -102,13 +115,15 @@ class ListCommand extends Base { * @param InputInterface $input * @param OutputInterface $output */ - public function listMounts($userId, array $mounts, InputInterface $input, OutputInterface $output){ + public function listMounts($userId, array $mounts, InputInterface $input, OutputInterface $output) { $outputType = $input->getOption('output'); if (count($mounts) === 0) { if ($outputType === self::OUTPUT_FORMAT_JSON || $outputType === self::OUTPUT_FORMAT_JSON_PRETTY) { $output->writeln('[]'); } else { - if ($userId) { + if ($userId === self::ALL) { + $output->writeln("No mounts configured"); + } else if ($userId) { $output->writeln("No mounts configured by $userId"); } else { $output->writeln("No admin mounts configured"); @@ -119,10 +134,13 @@ class ListCommand extends Base { $headers = ['Mount ID', 'Mount Point', 'Storage', 'Authentication Type', 'Configuration', 'Options']; - if (!$userId) { + if (!$userId || $userId === self::ALL) { $headers[] = 'Applicable Users'; $headers[] = 'Applicable Groups'; } + if ($userId === self::ALL) { + $headers[] = 'Type'; + } if (!$input->getOption('show-password')) { $hideKeys = ['password', 'refresh_token', 'token', 'client_secret', 'public_key', 'private_key']; @@ -150,10 +168,13 @@ class ListCommand extends Base { $config->getBackendOptions(), $config->getMountOptions() ]; - if (!$userId) { + if (!$userId || $userId === self::ALL) { $values[] = $config->getApplicableUsers(); $values[] = $config->getApplicableGroups(); } + if ($userId === self::ALL) { + $values[] = $config->getType() === StorageConfig::MOUNT_TYPE_ADMIN ? 'admin' : 'personal'; + } return array_combine($keys, $values); }, $mounts); @@ -215,7 +236,7 @@ class ListCommand extends Base { $optionsString ]; - if (!$userId) { + if (!$userId || $userId === self::ALL) { $applicableUsers = implode(', ', $config->getApplicableUsers()); $applicableGroups = implode(', ', $config->getApplicableGroups()); if ($applicableUsers === '' && $applicableGroups === '') { @@ -224,6 +245,9 @@ class ListCommand extends Base { $values[] = $applicableUsers; $values[] = $applicableGroups; } + if ($userId === self::ALL) { + $values[] = $config->getType() === StorageConfig::MOUNT_TYPE_ADMIN ? 'Admin' : 'Personal'; + } return $values; }, $mounts); diff --git a/apps/files_external/lib/Service/DBConfigService.php b/apps/files_external/lib/Service/DBConfigService.php index 9f7061eb93..3e38f4aed9 100644 --- a/apps/files_external/lib/Service/DBConfigService.php +++ b/apps/files_external/lib/Service/DBConfigService.php @@ -76,6 +76,18 @@ class DBConfigService { } } + /** + * Get all configured mounts + * + * @return array + */ + public function getAllMounts() { + $builder = $this->connection->getQueryBuilder(); + $query = $builder->select(['mount_id', 'mount_point', 'storage_backend', 'auth_backend', 'priority', 'type']) + ->from('external_mounts'); + return $this->getMountsFromQuery($query); + } + /** * Get admin defined mounts * diff --git a/apps/files_external/lib/Service/GlobalStoragesService.php b/apps/files_external/lib/Service/GlobalStoragesService.php index 96d7aa46e8..39d3da5d80 100644 --- a/apps/files_external/lib/Service/GlobalStoragesService.php +++ b/apps/files_external/lib/Service/GlobalStoragesService.php @@ -162,4 +162,23 @@ class GlobalStoragesService extends StoragesService { protected function isApplicable(StorageConfig $config) { return true; } + + /** + * Get all configured admin and personal mounts + * + * @return array map of storage id to storage config + */ + public function getStorageForAllUsers() { + $mounts = $this->dbConfig->getAllMounts(); + $configs = array_map([$this, 'getStorageConfigFromDBMount'], $mounts); + $configs = array_filter($configs, function ($config) { + return $config instanceof StorageConfig; + }); + + $keys = array_map(function (StorageConfig $config) { + return $config->getId(); + }, $configs); + + return array_combine($keys, $configs); + } } diff --git a/apps/files_external/tests/Service/DBConfigServiceTest.php b/apps/files_external/tests/Service/DBConfigServiceTest.php index b088a7078d..3cfa33f0bc 100644 --- a/apps/files_external/tests/Service/DBConfigServiceTest.php +++ b/apps/files_external/tests/Service/DBConfigServiceTest.php @@ -282,4 +282,14 @@ class DBConfigServiceTest extends TestCase { $this->assertCount(1, $mounts); $this->assertEquals($id1, $mounts[0]['mount_id']); } + + public function testGetAllMounts() { + $id1 = $this->addMount('/test', 'foo', 'bar', 100, DBConfigService::MOUNT_TYPE_ADMIN); + $id2 = $this->addMount('/test2', 'foo2', 'bar2', 100, DBConfigService::MOUNT_TYPE_PERSONAl); + + $mounts = $this->dbConfig->getAllMounts(); + $this->assertCount(2, $mounts); + $this->assertEquals($id1, $mounts[0]['mount_id']); + $this->assertEquals($id2, $mounts[1]['mount_id']); + } }