2022-11-16 07:45:01 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
|
|
namespace OCA\Memories\Db;
|
|
|
|
|
2023-03-24 22:53:26 +00:00
|
|
|
use OCP\Files\FileInfo;
|
2022-11-16 07:45:01 +00:00
|
|
|
|
|
|
|
class TimelineRoot
|
|
|
|
{
|
|
|
|
protected array $folders;
|
|
|
|
protected array $folderPaths;
|
|
|
|
|
|
|
|
/** Initialize */
|
|
|
|
public function __construct()
|
|
|
|
{
|
2023-04-14 22:26:20 +00:00
|
|
|
$this->folders = [];
|
|
|
|
$this->folderPaths = [];
|
2022-11-16 07:45:01 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 08:16:01 +00:00
|
|
|
/**
|
|
|
|
* Add a folder to the root.
|
|
|
|
*
|
|
|
|
* @throws \Exception if node is not valid readable folder
|
|
|
|
*/
|
2023-03-24 22:53:26 +00:00
|
|
|
public function addFolder(FileInfo $info)
|
2022-11-16 07:45:01 +00:00
|
|
|
{
|
2023-04-14 22:26:20 +00:00
|
|
|
$path = $info->getPath();
|
2022-11-16 08:16:01 +00:00
|
|
|
|
2023-03-24 22:53:26 +00:00
|
|
|
if (FileInfo::MIMETYPE_FOLDER !== $info->getMimetype()) {
|
2023-04-14 22:26:20 +00:00
|
|
|
throw new \Exception("Not a folder: {$path}");
|
2022-11-16 08:16:01 +00:00
|
|
|
}
|
|
|
|
|
2023-03-24 22:53:26 +00:00
|
|
|
if (!$info->isReadable()) {
|
2023-04-14 22:26:20 +00:00
|
|
|
throw new \Exception("Folder not readable: {$path}");
|
2022-11-16 08:16:01 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 07:45:01 +00:00
|
|
|
// Add top level folder
|
2023-04-14 22:26:20 +00:00
|
|
|
$this->setFolder($info->getId(), $info, $path);
|
2022-11-16 07:45:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Add mountpoints recursively
|
|
|
|
public function addMountPoints()
|
|
|
|
{
|
2023-10-13 22:10:59 +00:00
|
|
|
$manager = \OC\Files\Filesystem::getMountManager();
|
2022-11-16 07:45:01 +00:00
|
|
|
foreach ($this->folderPaths as $id => $folderPath) {
|
2023-10-13 22:10:59 +00:00
|
|
|
$mounts = $manager->findIn($folderPath);
|
2023-04-14 22:26:20 +00:00
|
|
|
foreach ($mounts as $mount) {
|
|
|
|
$this->setFolder($mount->getStorageRootId(), null, $mount->getMountPoint());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function excludePaths(array $paths)
|
|
|
|
{
|
|
|
|
foreach ($paths as $path) {
|
|
|
|
foreach ($this->folderPaths as $id => $folderPath) {
|
2023-05-30 17:36:20 +00:00
|
|
|
// dirname strips the trailing slash, so we can directly add a
|
|
|
|
// trailing slash to folderPath and path to prevent false matches.
|
|
|
|
// https://github.com/pulsejet/memories/issues/668
|
|
|
|
if (str_starts_with($folderPath.'/', $path.'/')) {
|
2023-04-14 22:26:20 +00:00
|
|
|
unset($this->folderPaths[$id], $this->folders[$id]);
|
|
|
|
}
|
2022-11-16 07:45:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getFolderPath(int $id)
|
|
|
|
{
|
|
|
|
return $this->folderPaths[$id];
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getIds()
|
|
|
|
{
|
|
|
|
return array_keys($this->folderPaths);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getOneId()
|
|
|
|
{
|
|
|
|
return array_key_first($this->folders);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getFolder(int $id)
|
|
|
|
{
|
|
|
|
return $this->folders[$id];
|
|
|
|
}
|
|
|
|
|
|
|
|
public function isEmpty()
|
|
|
|
{
|
|
|
|
return empty($this->folderPaths);
|
|
|
|
}
|
2023-04-14 22:26:20 +00:00
|
|
|
|
|
|
|
private function setFolder(int $id, ?FileInfo $fileInfo, ?string $path)
|
|
|
|
{
|
|
|
|
if (null !== $path) {
|
|
|
|
$this->folderPaths[$id] = $path;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (null !== $fileInfo) {
|
|
|
|
$this->folders[$id] = $fileInfo;
|
|
|
|
}
|
|
|
|
}
|
2022-11-16 07:45:01 +00:00
|
|
|
}
|