diff options
Diffstat (limited to 'apps/files_trashbin/lib/UserMigration/TrashbinMigrator.php')
-rw-r--r-- | apps/files_trashbin/lib/UserMigration/TrashbinMigrator.php | 97 |
1 files changed, 49 insertions, 48 deletions
diff --git a/apps/files_trashbin/lib/UserMigration/TrashbinMigrator.php b/apps/files_trashbin/lib/UserMigration/TrashbinMigrator.php index dbc6267eb3a..baff1ef6032 100644 --- a/apps/files_trashbin/lib/UserMigration/TrashbinMigrator.php +++ b/apps/files_trashbin/lib/UserMigration/TrashbinMigrator.php @@ -3,30 +3,14 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2022 Côme Chilliet <come.chilliet@nextcloud.com> - * - * @author Côme Chilliet <come.chilliet@nextcloud.com> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\Files_Trashbin\UserMigration; use OCA\Files_Trashbin\AppInfo\Application; +use OCA\Files_Trashbin\Trashbin; use OCP\Files\Folder; use OCP\Files\IRootFolder; use OCP\Files\NotFoundException; @@ -36,31 +20,40 @@ use OCP\IUser; use OCP\UserMigration\IExportDestination; use OCP\UserMigration\IImportSource; use OCP\UserMigration\IMigrator; +use OCP\UserMigration\ISizeEstimationMigrator; use OCP\UserMigration\TMigratorBasicVersionHandling; use OCP\UserMigration\UserMigrationException; use Symfony\Component\Console\Output\OutputInterface; -class TrashbinMigrator implements IMigrator { +class TrashbinMigrator implements IMigrator, ISizeEstimationMigrator { use TMigratorBasicVersionHandling; - protected const PATH_FILES_FOLDER = Application::APP_ID.'/files'; - protected const PATH_LOCATIONS_FILE = Application::APP_ID.'/locations.json'; - - protected IRootFolder $root; - - protected IDBConnection $dbc; - - protected IL10N $l10n; + protected const PATH_FILES_FOLDER = Application::APP_ID . '/files'; + protected const PATH_LOCATIONS_FILE = Application::APP_ID . '/locations.json'; public function __construct( - IRootFolder $rootFolder, - IDBConnection $dbc, - IL10N $l10n + protected IRootFolder $root, + protected IDBConnection $dbc, + protected IL10N $l10n, ) { - $this->root = $rootFolder; - $this->dbc = $dbc; - $this->l10n = $l10n; + } + + /** + * {@inheritDoc} + */ + public function getEstimatedExportSize(IUser $user): int|float { + $uid = $user->getUID(); + + try { + $trashbinFolder = $this->root->get('/' . $uid . '/files_trashbin'); + if (!$trashbinFolder instanceof Folder) { + return 0; + } + return ceil($trashbinFolder->getSize() / 1024); + } catch (\Throwable $e) { + return 0; + } } /** @@ -72,18 +65,26 @@ class TrashbinMigrator implements IMigrator { $uid = $user->getUID(); try { - $trashbinFolder = $this->root->get('/'.$uid.'/files_trashbin'); + $trashbinFolder = $this->root->get('/' . $uid . '/files_trashbin'); if (!$trashbinFolder instanceof Folder) { - throw new UserMigrationException('/'.$uid.'/files_trashbin is not a folder'); + throw new UserMigrationException('/' . $uid . '/files_trashbin is not a folder'); } - $output->writeln("Exporting trashbin files…"); + $output->writeln('Exporting trashbin files…'); $exportDestination->copyFolder($trashbinFolder, static::PATH_FILES_FOLDER); - $originalLocations = \OCA\Files_Trashbin\Trashbin::getLocations($uid); + $originalLocations = []; + // TODO Export all extra data and bump migrator to v2 + foreach (Trashbin::getExtraData($uid) as $filename => $extraData) { + $locationData = []; + foreach ($extraData as $timestamp => ['location' => $location]) { + $locationData[$timestamp] = $location; + } + $originalLocations[$filename] = $locationData; + } $exportDestination->addFileContents(static::PATH_LOCATIONS_FILE, json_encode($originalLocations)); } catch (NotFoundException $e) { - $output->writeln("No trashbin to export…"); + $output->writeln('No trashbin to export…'); } catch (\Throwable $e) { - throw new UserMigrationException("Could not export trashbin: ".$e->getMessage(), 0, $e); + throw new UserMigrationException('Could not export trashbin: ' . $e->getMessage(), 0, $e); } } @@ -102,18 +103,18 @@ class TrashbinMigrator implements IMigrator { if ($importSource->pathExists(static::PATH_FILES_FOLDER)) { try { - $trashbinFolder = $this->root->get('/'.$uid.'/files_trashbin'); + $trashbinFolder = $this->root->get('/' . $uid . '/files_trashbin'); if (!$trashbinFolder instanceof Folder) { - throw new UserMigrationException('Could not import trashbin, /'.$uid.'/files_trashbin is not a folder'); + throw new UserMigrationException('Could not import trashbin, /' . $uid . '/files_trashbin is not a folder'); } } catch (NotFoundException $e) { - $trashbinFolder = $this->root->newFolder('/'.$uid.'/files_trashbin'); + $trashbinFolder = $this->root->newFolder('/' . $uid . '/files_trashbin'); } - $output->writeln("Importing trashbin files…"); + $output->writeln('Importing trashbin files…'); try { $importSource->copyToFolder($trashbinFolder, static::PATH_FILES_FOLDER); } catch (\Throwable $e) { - throw new UserMigrationException("Could not import trashbin.", 0, $e); + throw new UserMigrationException('Could not import trashbin.', 0, $e); } $locations = json_decode($importSource->getFileContents(static::PATH_LOCATIONS_FILE), true, 512, JSON_THROW_ON_ERROR); $qb = $this->dbc->getQueryBuilder(); @@ -130,13 +131,13 @@ class TrashbinMigrator implements IMigrator { ->setParameter('id', $id) ->setParameter('timestamp', $timestamp) ->setParameter('location', $location) - ; + ; $qb->executeStatement(); } } } else { - $output->writeln("No trashbin to import…"); + $output->writeln('No trashbin to import…'); } } @@ -158,6 +159,6 @@ class TrashbinMigrator implements IMigrator { * {@inheritDoc} */ public function getDescription(): string { - return $this->l10n->t('Deleted files and folders in the trash bin'); + return $this->l10n->t('Deleted files and folders in the trash bin (may expire during export if you are low on storage space)'); } } |