Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 8 additions & 23 deletions lib/Command/ListShares.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@

namespace OCA\ShareListing\Command;

use iter;
use OC\Core\Command\Base;
use OCA\ShareListing\Service\SharesList;
use OCP\Files\IRootFolder;
Expand All @@ -36,32 +35,18 @@
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use function iter\toArray;

class ListShares extends Base {

/** @var ShareManager */
private $shareManager;

/** @var IUserManager */
private $userManager;

/** @var IRootFolder */
private $rootFolder;

/** @var SharesList */
private $sharesList;

public function __construct(ShareManager $shareManager,
IUserManager $userManager,
IRootFolder $rootFolder,
SharesList $sharesList) {
public function __construct(
private ShareManager $shareManager,
private IUserManager $userManager,
private IRootFolder $rootFolder,
private SharesList $sharesList,
) {
parent::__construct();

$this->shareManager = $shareManager;
$this->userManager = $userManager;
$this->rootFolder = $rootFolder;
$this->sharesList = $sharesList;

}

public function configure() {
Expand Down Expand Up @@ -105,7 +90,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$filter = $this->sharesList->filterStringToInt($input->getOption('filter'));
$outputOpt = $input->getOption('output');

$shares = iter\toArray($this->sharesList->getFormattedShares($user, $filter, $path, $token));
$shares = toArray($this->sharesList->getFormattedShares($user, $filter, $path, $token));

$output->writeln($this->sharesList->getSerializedShares($shares, $outputOpt));
return 0;
Expand Down
46 changes: 11 additions & 35 deletions lib/Controller/ApiController.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,44 +25,25 @@

namespace OCA\ShareListing\Controller;

use iter;
use OCA\ShareListing\Service\SharesList;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCS\OCSNotFoundException;
use OCP\AppFramework\OCSController;
use OCP\IRequest;
use OCP\IUserManager;
use OCP\IUserSession;
use OCP\Share\IShare;
use function iter\filter;
use function iter\map;
use function iter\toArray;

class ApiController extends OCSController {

/** @var IUserSession */
protected $userSession;

/** @var IUserManager */
private $userManager;

/** @var SharesList */
protected $sharesList;

/**
* @param string $appName
* @param IRequest $request
* @param IUserSession $userSession
* @param IUserManager $userManager
* @param SharesList $sharesList
*/
public function __construct(string $appName,
public function __construct(
string $appName,
IRequest $request,
IUserSession $userSession,
IUserManager $userManager,
SharesList $sharesList) {
private IUserSession $userSession,
private SharesList $sharesList,
) {
parent::__construct($appName, $request);

$this->userSession = $userSession;
$this->userManager = $userManager;
$this->sharesList = $sharesList;
}

/**
Expand All @@ -71,7 +52,6 @@ public function __construct(string $appName,
* Get shared sub folders of a fiven path
*
* @param string $path path of the current folder
* @return DataResponse
*/
public function getSharedSubfolders(string $path): DataResponse {
$currentUser = $this->userSession->getUser();
Expand All @@ -84,17 +64,13 @@ public function getSharedSubfolders(string $path): DataResponse {
$shares = $this->sharesList->getSub($currentUser->getUID(), SharesList::FILTER_NONE, $path);

// format results
$formattedShares = iter\map(function (IShare $share) {
return $this->sharesList->formatShare($share);
}, $shares);
$formattedShares = map(fn (IShare $share) => $this->sharesList->formatShare($share), $shares);

// remove current folder
$filteredShares = iter\filter(function ($share) use ($path) {
return $share['path'] !== $path;
}, $formattedShares);
$filteredShares = filter(fn ($share) => $share['path'] !== $path, $formattedShares);

// sort directories first
$sortedShares = iter\toArray($filteredShares);
$sortedShares = toArray($filteredShares);
usort($sortedShares, function ($a, $b) {
if ($a['is_directory'] && $b['is_directory']) {
return strcmp($a['path'], $b['path']);
Expand Down
124 changes: 44 additions & 80 deletions lib/Service/SharesList.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@

namespace OCA\ShareListing\Service;

use iter;
use EmptyIterator;
use Iterator;
use OC\User\NoUserException;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
Expand All @@ -39,6 +40,9 @@
use Symfony\Component\Serializer\Encoder\CsvEncoder;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Serializer;
use Throwable;
use function iter\filter;
use function iter\map;

class SharesList {

Expand All @@ -50,21 +54,11 @@ class SharesList {
public const FILTER_HAS_EXPIRATION = 5;
public const FILTER_NO_EXPIRATION = 6;

/** @var ShareManager */
private $shareManager;

/** @var IUserManager */
private $userManager;

/** @var IRootFolder */
private $rootFolder;

public function __construct(ShareManager $shareManager,
IUserManager $userManager,
IRootFolder $rootFolder) {
$this->shareManager = $shareManager;
$this->userManager = $userManager;
$this->rootFolder = $rootFolder;
public function __construct(
private ShareManager $shareManager,
private IUserManager $userManager,
private IRootFolder $rootFolder,
) {
}

private function getShareTypes(): array {
Expand All @@ -77,19 +71,19 @@ private function getShareTypes(): array {
];
}

public function get(?string $userId, int $filter, ?string $path = null, ?string $token = null): \Iterator {
public function get(?string $userId, int $filter, ?string $path = null, ?string $token = null): Iterator {
$shares = $this->getShares($userId);

// If path is set. Filter for the current user
if ($path !== null) {
$userFolder = $this->rootFolder->getUserFolder($userId);
try {
$node = $userFolder->get($path);
} catch (NotFoundException $e) {
} catch (NotFoundException) {
// Path is not valid for user so nothing to report;
return new \EmptyIterator();
return new EmptyIterator();
}
$shares = iter\filter(function (IShare $share) use ($node) {
$shares = filter(function (IShare $share) use ($node) {
if ($node->getId() === $share->getNodeId()) {
return true;
}
Expand All @@ -104,40 +98,30 @@ public function get(?string $userId, int $filter, ?string $path = null, ?string
}

if ($filter === self::FILTER_OWNER) {
$shares = iter\filter(function (IShare $share) use ($userId) {
return $share->getShareOwner() === $userId;
}, $shares);
$shares = filter(fn (IShare $share) => $share->getShareOwner() === $userId, $shares);
}
if ($filter === self::FILTER_INITIATOR) {
$shares = iter\filter(function (IShare $share) use ($userId) {
return $share->getSharedBy() === $userId;
}, $shares);
$shares = filter(fn (IShare $share) => $share->getSharedBy() === $userId, $shares);
}
if ($filter === self::FILTER_RECIPIENT) {
// We can't check the recipient since this might be a group share etc. However you can't share to yourself
$shares = iter\filter(function (IShare $share) use ($userId) {
return $share->getShareOwner() !== $userId && $share->getSharedBy() !== $userId;
}, $shares);
$shares = filter(fn (IShare $share) => $share->getShareOwner() !== $userId && $share->getSharedBy() !== $userId, $shares);
}

if ($filter === self::FILTER_HAS_EXPIRATION) {
$shares = iter\filter(function (IShare $share) use ($userId): bool {
return $share->getExpirationDate() !== null;
}, $shares);
$shares = filter(fn (IShare $share): bool => $share->getExpirationDate() !== null, $shares);
}

if ($filter === self::FILTER_NO_EXPIRATION) {
$shares = iter\filter(function (IShare $share) use ($userId): bool {
return $share->getExpirationDate() === null;
}, $shares);
$shares = filter(fn (IShare $share): bool => $share->getExpirationDate() === null, $shares);
}

$shares = iter\filter(function (IShare $share): bool {
$shares = filter(function (IShare $share): bool {
try {
$userFolder = $this->rootFolder->getUserFolder($share->getShareOwner());
} catch (NoUserException $e) {
} catch (NoUserException) {
return false;
} catch (\Throwable $e) {
} catch (Throwable) {
return false;
}
$nodes = $userFolder->getById($share->getNodeId());
Expand All @@ -154,19 +138,19 @@ public function get(?string $userId, int $filter, ?string $path = null, ?string
* This allows us to build a list of subfiles/folder that are shared
* as well
*/
public function getSub(string $userId, int $filter, string $path): \Iterator {
public function getSub(string $userId, int $filter, string $path): Iterator {
$shares = $this->shareManager->getAllShares();

// If path is set. Filter for the current user
$userFolder = $this->rootFolder->getUserFolder($userId);
try {
$node = $userFolder->get($path);
} catch (NotFoundException $e) {
} catch (NotFoundException) {
// Path is not valid for user so nothing to report;
return new \EmptyIterator();
return new EmptyIterator();
}

$shares = iter\filter(function (IShare $share) use ($node) {
$shares = filter(function (IShare $share) use ($node) {
if ($node->getId() === $share->getNodeId()) {
return false;
}
Expand All @@ -177,28 +161,22 @@ public function getSub(string $userId, int $filter, string $path): \Iterator {
}, $shares);

if ($filter === self::FILTER_OWNER) {
$shares = iter\filter(function (IShare $share) use ($userId) {
return $share->getShareOwner() === $userId;
}, $shares);
$shares = filter(fn (IShare $share) => $share->getShareOwner() === $userId, $shares);
}
if ($filter === self::FILTER_INITIATOR) {
$shares = iter\filter(function (IShare $share) use ($userId) {
return $share->getSharedBy() === $userId;
}, $shares);
$shares = filter(fn (IShare $share) => $share->getSharedBy() === $userId, $shares);
}
if ($filter === self::FILTER_RECIPIENT) {
// We can't check the recipient since this might be a group share etc. However you can't share to yourself
$shares = iter\filter(function (IShare $share) use ($userId) {
return $share->getShareOwner() !== $userId && $share->getSharedBy() !== $userId;
}, $shares);
$shares = filter(fn (IShare $share) => $share->getShareOwner() !== $userId && $share->getSharedBy() !== $userId, $shares);
}

$shares = iter\filter(function (IShare $share) {
$shares = filter(function (IShare $share) {
try {
$userFolder = $this->rootFolder->getUserFolder($share->getShareOwner());
} catch (NoUserException $e) {
} catch (NoUserException) {
return false;
} catch (\Throwable $e) {
} catch (Throwable) {
return false;
}
$nodes = $userFolder->getById($share->getNodeId());
Expand All @@ -209,17 +187,15 @@ public function getSub(string $userId, int $filter, string $path): \Iterator {
return $shares;
}

public function getFormattedShares(?string $userId = null, int $filter = self::FILTER_NONE, ?string $path = null, ?string $token = null): \Iterator {
public function getFormattedShares(?string $userId = null, int $filter = self::FILTER_NONE, ?string $path = null, ?string $token = null): Iterator {
$shares = $this->get($userId, $filter, $path, $token);

$formattedShares = iter\map(function (IShare $share): array {
return $this->formatShare($share);
}, $shares);
$formattedShares = map(fn (IShare $share): array => $this->formatShare($share), $shares);

return $formattedShares;
}

private function getShares(?string $userId): \Iterator {
private function getShares(?string $userId): Iterator {
if (empty($userId)) {
$shares = $this->shareManager->getAllShares();
} else {
Expand All @@ -228,7 +204,7 @@ private function getShares(?string $userId): \Iterator {
foreach ($shareTypes as $shareType) {
$shares = $this->shareManager->getSharesBy($userId, $shareType, null, true, -1, 0);

if ($shareType !== \OCP\Share\IShare::TYPE_LINK) {
if ($shareType !== IShare::TYPE_LINK) {
foreach ($shares as $share) {
yield $share;
}
Expand Down Expand Up @@ -293,26 +269,14 @@ public function formatShare(IShare $share): array {
}

public function filterStringToInt(?string $filterString): int {
switch ($filterString) {
case 'owner':
$filter = SharesList::FILTER_OWNER;
break;
case 'initiator':
$filter = SharesList::FILTER_INITIATOR;
break;
case 'recipient':
$filter = SharesList::FILTER_RECIPIENT;
break;
case 'has-expiration':
$filter = SharesList::FILTER_HAS_EXPIRATION;
break;
case 'no-expiration':
$filter = SharesList::FILTER_NO_EXPIRATION;
break;
default:
$filter = SharesList::FILTER_NONE;
break;
}
$filter = match ($filterString) {
'owner' => SharesList::FILTER_OWNER,
'initiator' => SharesList::FILTER_INITIATOR,
'recipient' => SharesList::FILTER_RECIPIENT,
'has-expiration' => SharesList::FILTER_HAS_EXPIRATION,
'no-expiration' => SharesList::FILTER_NO_EXPIRATION,
default => SharesList::FILTER_NONE,
};

return $filter;
}
Expand Down
Loading
Loading