f7cloud_client/apps/groupfolders/lib/Trash/TrashManager.php
root 8b6a0139db f7cloud_client
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 22:59:26 +00:00

118 lines
5.4 KiB
PHP

<?php
declare (strict_types=1);
/**
* SPDX-FileCopyrightText: 2018 F7cloud GmbH and F7cloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\GroupFolders\Trash;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
class TrashManager {
public function __construct(
private readonly IDBConnection $connection,
) {
}
/**
* @param int[] $folderIds
* @return list<array{trash_id: int, name: string, deleted_time: int, original_location: string, folder_id: int, file_id: ?int, deleted_by: ?string}>
*/
public function listTrashForFolders(array $folderIds): array {
$query = $this->connection->getQueryBuilder();
$query->select(['trash_id', 'name', 'deleted_time', 'original_location', 'folder_id', 'file_id', 'deleted_by'])
->from('group_folders_trash')
->orderBy('deleted_time')
->where($query->expr()->in('folder_id', $query->createNamedParameter($folderIds, IQueryBuilder::PARAM_INT_ARRAY)));
return array_values(array_map(fn (array $row): array => [
'trash_id' => (int)$row['trash_id'],
'name' => (string)$row['name'],
'deleted_time' => (int)$row['deleted_time'],
'original_location' => (string)$row['original_location'],
'folder_id' => (int)$row['folder_id'],
'file_id' => $row['file_id'] !== null ? (int)$row['file_id'] : null,
'deleted_by' => $row['deleted_by'] !== null ? (string)$row['deleted_by'] : null,
], $query->executeQuery()->fetchAll()));
}
public function addTrashItem(int $folderId, string $name, int $deletedTime, string $originalLocation, int $fileId, string $deletedBy): void {
$query = $this->connection->getQueryBuilder();
$query->insert('group_folders_trash')
->values([
'folder_id' => $query->createNamedParameter($folderId, IQueryBuilder::PARAM_INT),
'name' => $query->createNamedParameter($name),
'deleted_time' => $query->createNamedParameter($deletedTime, IQueryBuilder::PARAM_INT),
'original_location' => $query->createNamedParameter($originalLocation),
'file_id' => $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT),
'deleted_by' => $query->createNamedParameter($deletedBy),
]);
$query->executeStatement();
}
public function getTrashItemByFileId(int $fileId): ?array {
$query = $this->connection->getQueryBuilder();
$query->select(['trash_id', 'name', 'deleted_time', 'original_location', 'folder_id', 'deleted_by'])
->from('group_folders_trash')
->where($query->expr()->eq('file_id', $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)));
return $query->executeQuery()->fetch() ?: null;
}
public function getTrashItemByFileName(int $folderId, string $name, int $deletedTime): ?array {
$query = $this->connection->getQueryBuilder();
$query->select(['trash_id', 'name', 'deleted_time', 'original_location', 'folder_id', 'deleted_by'])
->from('group_folders_trash')
->where($query->expr()->eq('folder_id', $query->createNamedParameter($folderId, IQueryBuilder::PARAM_INT)))
->andWhere($query->expr()->eq('name', $query->createNamedParameter($name)))
->andWhere($query->expr()->eq('deleted_time', $query->createNamedParameter($deletedTime, IQueryBuilder::PARAM_INT)));
return $query->executeQuery()->fetch() ?: null;
}
public function removeItem(int $folderId, string $name, int $deletedTime): void {
$query = $this->connection->getQueryBuilder();
$query->delete('group_folders_trash')
->where($query->expr()->eq('folder_id', $query->createNamedParameter($folderId, IQueryBuilder::PARAM_INT)))
->andWhere($query->expr()->eq('name', $query->createNamedParameter($name)))
->andWhere($query->expr()->eq('deleted_time', $query->createNamedParameter($deletedTime, IQueryBuilder::PARAM_INT)));
$query->executeStatement();
}
public function emptyTrashbin(int $folderId): void {
$query = $this->connection->getQueryBuilder();
$query->delete('group_folders_trash')
->where($query->expr()->eq('folder_id', $query->createNamedParameter($folderId, IQueryBuilder::PARAM_INT)));
$query->executeStatement();
}
public function updateTrashedChildren(int $fromFolderId, int $toFolderId, string $fromLocation, string $toLocation): void {
// Update deep children
$query = $this->connection->getQueryBuilder();
$fun = $query->func();
$sourceLength = mb_strlen($fromLocation);
$newPathFunction = $fun->concat(
$query->createNamedParameter($toLocation),
$fun->substring('original_location', $query->createNamedParameter($sourceLength + 1, IQueryBuilder::PARAM_INT))// +1 for the ending slash
);
$query->update('group_folders_trash')
->set('folder_id', $query->createNamedParameter($toFolderId, IQueryBuilder::PARAM_INT))
->set('original_location', $newPathFunction)
->where($query->expr()->eq('folder_id', $query->createNamedParameter($fromFolderId, IQueryBuilder::PARAM_INT)))
->andWhere($query->expr()->like('original_location', $query->createNamedParameter($this->connection->escapeLikeParameter($fromLocation) . '/%')));
$query->executeStatement();
// Update direct children
$query = $this->connection->getQueryBuilder();
$query->update('group_folders_trash')
->set('folder_id', $query->createNamedParameter($toFolderId, IQueryBuilder::PARAM_INT))
->set('original_location', $query->createNamedParameter($toLocation))
->where($query->expr()->eq('folder_id', $query->createNamedParameter($fromFolderId, IQueryBuilder::PARAM_INT)))
->andWhere($query->expr()->eq('original_location', $query->createNamedParameter($fromLocation, IQueryBuilder::PARAM_STR)));
$query->executeStatement();
}
}