%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/related_resources/lib/Command/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps_old/apps/related_resources/lib/Command/Test.php |
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\RelatedResources\Command;
use Exception;
use OC\Core\Command\Base;
use OCA\Circles\CirclesManager;
use OCA\RelatedResources\Exceptions\RelatedResourceProviderNotFound;
use OCA\RelatedResources\Service\RelatedService;
use OCA\RelatedResources\Tools\Traits\TStringTools;
use OCP\AutoloadNotAllowedException;
use OCP\ICache;
use OCP\ICacheFactory;
use OCP\IConfig;
use OCP\IUserManager;
use OCP\Server;
use Psr\Container\ContainerExceptionInterface;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\OutputInterface;
/**
* Class Create
*
* @package OCA\RelatedResources\Command
*/
class Test extends Base {
use TStringTools;
private IUserManager $userManager;
private IConfig $config;
private ICache $cache;
private OutputInterface $output;
private RelatedService $relatedService;
public function __construct(
IUserManager $userManager,
IConfig $config,
RelatedService $relatedService,
ICacheFactory $cacheFactory
) {
$this->config = $config;
parent::__construct();
$this->userManager = $userManager;
$this->cache = $cacheFactory->createDistributed(RelatedService::CACHE_RELATED);
$this->relatedService = $relatedService;
}
/**
* @return void
*/
protected function configure() {
parent::configure();
$this->setName('related:test')
->setHidden(!$this->config->getSystemValueBool('debug'))
->setDescription('returns related resource to a share')
->addArgument('userId', InputArgument::REQUIRED, 'user\'s point of view')
->addArgument('providerId', InputArgument::REQUIRED, 'Provider Id (ie. files)')
->addOption('clear-cache', '', InputOption::VALUE_NONE, 'clear cache')
->addOption('resource-type', '', InputOption::VALUE_REQUIRED, 'limit to a type of resources', '')
->addArgument('itemId', InputArgument::REQUIRED, 'Item Id');
}
/**
* @param InputInterface $input
* @param OutputInterface $output
*
* @return int
* @throws RelatedResourceProviderNotFound
*/
protected function execute(InputInterface $input, OutputInterface $output): int {
$userId = $input->getArgument('userId');
$providerId = $input->getArgument('providerId');
$itemId = $input->getArgument('itemId');
if ($input->getOption('clear-cache')) {
$this->cache->clear();
}
$user = $this->userManager->get($userId);
if (is_null($user)) {
throw new InvalidArgumentException('must specify a valid local user');
}
$userId = $user->getUID();
try {
/** @var CirclesManager $circleManager */
$circleManager = Server::get(CirclesManager::class);
} catch (ContainerExceptionInterface | AutoloadNotAllowedException $e) {
throw new Exception('Circles needs to be enabled');
}
$circleManager->startSession($circleManager->getLocalFederatedUser($userId));
$this->displayRecipients($providerId, $itemId);
$this->displayRelated($providerId, $itemId, $input->getOption('resource-type'), ($input->getOption('output') === 'json'));
return 0;
}
private function displayRecipients(string $providerId, string $itemId): void {
$result = $this->relatedService->getRelatedFromItem($providerId, $itemId);
$output = new ConsoleOutput();
$output->writeln('<info>Title</info>: ' . $result->getTitle());
$output->writeln('<info>Group Shared</info>: ' . ($result->isGroupShared() ? 'true' : 'false'));
$output->writeln('<info>Virtual Group</info>: ' . json_encode($result->getVirtualGroup()));
$output->writeln('<info>Recipients</info>: ' . json_encode($result->getRecipients()));
$output->writeln('');
}
private function displayRelated(string $providerId, string $itemId, string $resourceType, bool $json): void {
$result = $this->relatedService->getRelatedToItem($providerId, $itemId, -1, $resourceType);
$output = new ConsoleOutput();
if ($json) {
$output->writeln(json_encode($result, JSON_PRETTY_PRINT));
return;
}
$output = $output->section();
$table = new Table($output);
$table->setHeaders(
[
'Provider Id',
'Item Id',
'Title',
'Description',
'Score',
'Link'
]
);
$table->render();
foreach ($result as $entry) {
$table->appendRow(
[
$entry->getProviderId(),
$entry->getItemId(),
$entry->getTitle(),
$entry->getSubtitle(),
$entry->getScore(),
$entry->getUrl()
]
);
}
$output->writeln('');
}
}