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
105 changes: 0 additions & 105 deletions apps/files/lib/Helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,66 +9,12 @@

use OC\Files\Filesystem;
use OCP\Files\FileInfo;
use OCP\Files\IMimeTypeDetector;
use OCP\Files\NotFoundException;
use OCP\ITagManager;
use OCP\Server;
use OCP\Util;

/**
* Helper class for manipulating file information
*/
class Helper {
/**
* @param string $dir
* @return array
* @throws NotFoundException
*/
public static function buildFileStorageStatistics($dir) {
// information about storage capacities
$storageInfo = \OC_Helper::getStorageInfo($dir);
$l = Util::getL10N('files');
$maxUploadFileSize = Util::maxUploadFilesize($dir, $storageInfo['free']);
$maxHumanFileSize = Util::humanFileSize($maxUploadFileSize);
$maxHumanFileSize = $l->t('Upload (max. %s)', [$maxHumanFileSize]);

return [
'uploadMaxFilesize' => $maxUploadFileSize,
'maxHumanFilesize' => $maxHumanFileSize,
'freeSpace' => $storageInfo['free'],
'quota' => $storageInfo['quota'],
'total' => $storageInfo['total'],
'used' => $storageInfo['used'],
'usedSpacePercent' => $storageInfo['relative'],
'owner' => $storageInfo['owner'],
'ownerDisplayName' => $storageInfo['ownerDisplayName'],
'mountType' => $storageInfo['mountType'],
'mountPoint' => $storageInfo['mountPoint'],
];
}

/**
* Determine icon for a given file
*
* @param FileInfo $file file info
* @return string icon URL
*/
public static function determineIcon($file) {
if ($file['type'] === 'dir') {
$icon = Server::get(IMimeTypeDetector::class)->mimeTypeIcon('dir');
// TODO: move this part to the client side, using mountType
if ($file->isShared()) {
$icon = Server::get(IMimeTypeDetector::class)->mimeTypeIcon('dir-shared');
} elseif ($file->isMounted()) {
$icon = Server::get(IMimeTypeDetector::class)->mimeTypeIcon('dir-external');
}
} else {
$icon = Server::get(IMimeTypeDetector::class)->mimeTypeIcon($file->getMimetype());
}

return substr($icon, 0, -3) . 'svg';
}

/**
* Comparator function to sort files alphabetically and have
* the directories appear first
Expand Down Expand Up @@ -161,20 +107,6 @@ public static function formatFileInfo(FileInfo $i) {
return $entry;
}

/**
* Format file info for JSON
* @param FileInfo[] $fileInfos file infos
* @return array
*/
public static function formatFileInfos($fileInfos) {
$files = [];
foreach ($fileInfos as $i) {
$files[] = self::formatFileInfo($i);
}

return $files;
}

/**
* Retrieves the contents of the given directory and
* returns it as a sorted array of FileInfo.
Expand All @@ -191,43 +123,6 @@ public static function getFiles($dir, $sortAttribute = 'name', $sortDescending =
return self::sortFiles($content, $sortAttribute, $sortDescending);
}

/**
* Populate the result set with file tags
*
* @psalm-template T of array{tags?: list<string>, file_source: int, ...array<string, mixed>}
* @param list<T> $fileList
* @return list<T> file list populated with tags
*/
public static function populateTags(array $fileList, ITagManager $tagManager) {
$tagger = $tagManager->load('files');
$tags = $tagger->getTagsForObjects(array_map(static fn (array $fileData) => $fileData['file_source'], $fileList));

if (!is_array($tags)) {
throw new \UnexpectedValueException('$tags must be an array');
}

// Set empty tag array
foreach ($fileList as &$fileData) {
$fileData['tags'] = [];
}
unset($fileData);

if (!empty($tags)) {
foreach ($tags as $fileId => $fileTags) {
foreach ($fileList as &$fileData) {
if ($fileId !== $fileData['file_source']) {
continue;
}

$fileData['tags'] = $fileTags;
}
unset($fileData);
}
}

return $fileList;
}

/**
* Sort the given file info array
*
Expand Down
34 changes: 0 additions & 34 deletions apps/files/tests/HelperTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

use OC\Files\FileInfo;
use OCA\Files\Helper;
use OCP\ITagManager;
use OCP\ITags;

/**
* SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors
Expand Down Expand Up @@ -94,36 +92,4 @@ public function testSortByName(string $sort, bool $sortDescending, array $expect
$fileNames
);
}

public function testPopulateTags(): void {
$tagManager = $this->createMock(ITagManager::class);
$tagger = $this->createMock(ITags::class);

$tagManager->method('load')
->with('files')
->willReturn($tagger);

$data = [
['file_source' => 10],
['file_source' => 22, 'foo' => 'bar'],
['file_source' => 42, 'x' => 'y'],
];

$tags = [
10 => ['tag3'],
42 => ['tag1', 'tag2'],
];

$tagger->method('getTagsForObjects')
->with([10, 22, 42])
->willReturn($tags);

$result = Helper::populateTags($data, $tagManager);

$this->assertSame([
['file_source' => 10, 'tags' => ['tag3']],
['file_source' => 22, 'foo' => 'bar', 'tags' => []],
['file_source' => 42, 'x' => 'y', 'tags' => ['tag1', 'tag2']],
], $result);
}
}
45 changes: 41 additions & 4 deletions apps/files_sharing/lib/Controller/ShareAPIController.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ public function __construct(
private LoggerInterface $logger,
private IProviderFactory $factory,
private IMailer $mailer,
private ITagManager $tagManager,
private ?string $userId = null,
) {
parent::__construct($appName, $request);
Expand Down Expand Up @@ -472,7 +473,7 @@ public function getShare(string $id, bool $include_tags = false): DataResponse {
$share = $this->formatShare($share);

if ($include_tags) {
$share = Helper::populateTags([$share], Server::get(ITagManager::class));
$share = $this->populateTags([$share]);
} else {
$share = [$share];
}
Expand Down Expand Up @@ -847,7 +848,7 @@ private function getSharedWithMe($node, bool $includeTags): array {
}

if ($includeTags) {
$formatted = Helper::populateTags($formatted, Server::get(ITagManager::class));
$formatted = $this->populateTags($formatted);
}

return $formatted;
Expand Down Expand Up @@ -1100,8 +1101,7 @@ private function getFormattedShares(
$formatted = $this->fixMissingDisplayName($formatted);

if ($includeTags) {
$formatted =
Helper::populateTags($formatted, Server::get(ITagManager::class));
$formatted = $this->populateTags($formatted);
}

return $formatted;
Expand Down Expand Up @@ -2221,4 +2221,41 @@ public function generateToken(): DataResponse {
throw new OCSException($this->l->t('Failed to generate a unique token'));
}
}

/**
* Populate the result set with file tags
*
* @psalm-template T of array{tags?: list<string>, file_source: int, ...array<string, mixed>}
* @param list<T> $fileList
* @return list<T> file list populated with tags
*/
private function populateTags(array $fileList): array {
$tagger = $this->tagManager->load('files');
$tags = $tagger->getTagsForObjects(array_map(static fn (array $fileData) => $fileData['file_source'], $fileList));

if (!is_array($tags)) {
throw new \UnexpectedValueException('$tags must be an array');
}

// Set empty tag array
foreach ($fileList as &$fileData) {
$fileData['tags'] = [];
}
unset($fileData);

if (!empty($tags)) {
foreach ($tags as $fileId => $fileTags) {
foreach ($fileList as &$fileData) {
if ($fileId !== $fileData['file_source']) {
continue;
}

$fileData['tags'] = $fileTags;
}
unset($fileData);
}
}

return $fileList;
}
}
3 changes: 3 additions & 0 deletions apps/files_sharing/tests/ApiTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
use OCP\IL10N;
use OCP\IPreview;
use OCP\IRequest;
use OCP\ITagManager;
use OCP\IURLGenerator;
use OCP\IUserManager;
use OCP\Mail\IMailer;
Expand Down Expand Up @@ -111,6 +112,7 @@ private function createOCS($userId) {
$logger = $this->createMock(LoggerInterface::class);
$providerFactory = $this->createMock(IProviderFactory::class);
$mailer = $this->createMock(IMailer::class);
$tagManager = $this->createMock(ITagManager::class);
$dateTimeZone->method('getTimeZone')->willReturn(new \DateTimeZone(date_default_timezone_get()));

return new ShareAPIController(
Expand All @@ -131,6 +133,7 @@ private function createOCS($userId) {
$logger,
$providerFactory,
$mailer,
$tagManager,
$userId,
);
}
Expand Down
Loading
Loading