mirror of
https://github.com/nextcloud/server.git
synced 2026-06-10 17:23:59 -04:00
Merge pull request #31575 from nextcloud/enh/add-trashbin-migrator
Add trashbin migrator to export and import trashbin data
This commit is contained in:
commit
b984cd1d83
4 changed files with 148 additions and 4 deletions
|
|
@ -43,4 +43,5 @@ return array(
|
|||
'OCA\\Files_Trashbin\\Trash\\TrashItem' => $baseDir . '/../lib/Trash/TrashItem.php',
|
||||
'OCA\\Files_Trashbin\\Trash\\TrashManager' => $baseDir . '/../lib/Trash/TrashManager.php',
|
||||
'OCA\\Files_Trashbin\\Trashbin' => $baseDir . '/../lib/Trashbin.php',
|
||||
'OCA\\Files_Trashbin\\UserMigration\\TrashbinMigrator' => $baseDir . '/../lib/UserMigration/TrashbinMigrator.php',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ class ComposerStaticInitFiles_Trashbin
|
|||
'OCA\\Files_Trashbin\\Trash\\TrashItem' => __DIR__ . '/..' . '/../lib/Trash/TrashItem.php',
|
||||
'OCA\\Files_Trashbin\\Trash\\TrashManager' => __DIR__ . '/..' . '/../lib/Trash/TrashManager.php',
|
||||
'OCA\\Files_Trashbin\\Trashbin' => __DIR__ . '/..' . '/../lib/Trashbin.php',
|
||||
'OCA\\Files_Trashbin\\UserMigration\\TrashbinMigrator' => __DIR__ . '/..' . '/../lib/UserMigration/TrashbinMigrator.php',
|
||||
);
|
||||
|
||||
public static function getInitializer(ClassLoader $loader)
|
||||
|
|
|
|||
|
|
@ -30,17 +30,20 @@ use OCA\Files_Trashbin\Capabilities;
|
|||
use OCA\Files_Trashbin\Expiration;
|
||||
use OCA\Files_Trashbin\Trash\ITrashManager;
|
||||
use OCA\Files_Trashbin\Trash\TrashManager;
|
||||
use OCP\App\IAppManager;
|
||||
use OCA\Files_Trashbin\UserMigration\TrashbinMigrator;
|
||||
use OCP\AppFramework\App;
|
||||
use OCP\AppFramework\Bootstrap\IBootContext;
|
||||
use OCP\AppFramework\Bootstrap\IBootstrap;
|
||||
use OCP\AppFramework\Bootstrap\IRegistrationContext;
|
||||
use OCP\App\IAppManager;
|
||||
use OCP\ILogger;
|
||||
use OCP\IServerContainer;
|
||||
|
||||
class Application extends App implements IBootstrap {
|
||||
public const APP_ID = 'files_trashbin';
|
||||
|
||||
public function __construct(array $urlParams = []) {
|
||||
parent::__construct('files_trashbin', $urlParams);
|
||||
parent::__construct(self::APP_ID, $urlParams);
|
||||
}
|
||||
|
||||
public function register(IRegistrationContext $context): void {
|
||||
|
|
@ -50,6 +53,8 @@ class Application extends App implements IBootstrap {
|
|||
$context->registerServiceAlias(ITrashManager::class, TrashManager::class);
|
||||
/** Register $principalBackend for the DAV collection */
|
||||
$context->registerServiceAlias('principalBackend', Principal::class);
|
||||
|
||||
$context->registerUserMigrator(TrashbinMigrator::class);
|
||||
}
|
||||
|
||||
public function boot(IBootContext $context): void {
|
||||
|
|
@ -65,10 +70,10 @@ class Application extends App implements IBootstrap {
|
|||
\OCP\Util::connectHook('OC_Filesystem', 'delete', 'OCA\Files_Trashbin\Trashbin', 'ensureFileScannedHook');
|
||||
|
||||
\OCA\Files\App::getNavigationManager()->add(function () {
|
||||
$l = \OC::$server->getL10N('files_trashbin');
|
||||
$l = \OC::$server->getL10N(self::APP_ID);
|
||||
return [
|
||||
'id' => 'trashbin',
|
||||
'appname' => 'files_trashbin',
|
||||
'appname' => self::APP_ID,
|
||||
'script' => 'list.php',
|
||||
'order' => 50,
|
||||
'name' => $l->t('Deleted files'),
|
||||
|
|
|
|||
137
apps/files_trashbin/lib/UserMigration/TrashbinMigrator.php
Normal file
137
apps/files_trashbin/lib/UserMigration/TrashbinMigrator.php
Normal file
|
|
@ -0,0 +1,137 @@
|
|||
<?php
|
||||
|
||||
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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Files_Trashbin\UserMigration;
|
||||
|
||||
use OCA\Files_Trashbin\AppInfo\Application;
|
||||
use OCP\Files\Folder;
|
||||
use OCP\Files\IRootFolder;
|
||||
use OCP\Files\NotFoundException;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IUser;
|
||||
use OCP\UserMigration\IExportDestination;
|
||||
use OCP\UserMigration\IImportSource;
|
||||
use OCP\UserMigration\IMigrator;
|
||||
use OCP\UserMigration\TMigratorBasicVersionHandling;
|
||||
use OCP\UserMigration\UserMigrationException;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
class TrashbinMigrator implements IMigrator {
|
||||
|
||||
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;
|
||||
|
||||
public function __construct(
|
||||
IRootFolder $rootFolder,
|
||||
IDBConnection $dbc
|
||||
) {
|
||||
$this->root = $rootFolder;
|
||||
$this->dbc = $dbc;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function export(IUser $user, IExportDestination $exportDestination, OutputInterface $output): void {
|
||||
$output->writeln('Exporting trashbin into ' . Application::APP_ID . '…');
|
||||
|
||||
$uid = $user->getUID();
|
||||
|
||||
try {
|
||||
$trashbinFolder = $this->root->get('/'.$uid.'/files_trashbin');
|
||||
if (!$trashbinFolder instanceof Folder) {
|
||||
throw new UserMigrationException('Could not export trashbin, /'.$uid.'/files_trashbin is not a folder');
|
||||
}
|
||||
$output->writeln("Exporting trashbin files…");
|
||||
if ($exportDestination->copyFolder($trashbinFolder, static::PATH_FILES_FOLDER) === false) {
|
||||
throw new UserMigrationException("Could not export trashbin.");
|
||||
}
|
||||
$originalLocations = \OCA\Files_Trashbin\Trashbin::getLocations($uid);
|
||||
if ($exportDestination->addFileContents(static::PATH_LOCATIONS_FILE, json_encode($originalLocations)) === false) {
|
||||
throw new UserMigrationException("Could not export trashbin.");
|
||||
}
|
||||
} catch (NotFoundException $e) {
|
||||
$output->writeln("No trashbin to export…");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function import(IUser $user, IImportSource $importSource, OutputInterface $output): void {
|
||||
if ($importSource->getMigratorVersion(static::class) === null) {
|
||||
$output->writeln('No version for ' . static::class . ', skipping import…');
|
||||
return;
|
||||
}
|
||||
|
||||
$output->writeln('Importing trashbin from ' . Application::APP_ID . '…');
|
||||
|
||||
$uid = $user->getUID();
|
||||
|
||||
if ($importSource->pathExists(static::PATH_FILES_FOLDER)) {
|
||||
try {
|
||||
$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');
|
||||
}
|
||||
} catch (NotFoundException $e) {
|
||||
$trashbinFolder = $this->root->newFolder('/'.$uid.'/files_trashbin');
|
||||
}
|
||||
$output->writeln("Importing trashbin files…");
|
||||
if ($importSource->copyToFolder($trashbinFolder, static::PATH_FILES_FOLDER) === false) {
|
||||
throw new UserMigrationException("Could not import trashbin.");
|
||||
}
|
||||
$locations = json_decode($importSource->getFileContents(static::PATH_LOCATIONS_FILE), true, 512, JSON_THROW_ON_ERROR);
|
||||
$qb = $this->dbc->getQueryBuilder();
|
||||
$qb->insert('files_trash')
|
||||
->values([
|
||||
'id' => $qb->createParameter('id'),
|
||||
'timestamp' => $qb->createParameter('timestamp'),
|
||||
'location' => $qb->createParameter('location'),
|
||||
'user' => $qb->createNamedParameter($uid),
|
||||
]);
|
||||
foreach ($locations as $id => $fileLocations) {
|
||||
foreach ($fileLocations as $timestamp => $location) {
|
||||
$qb
|
||||
->setParameter('id', $id)
|
||||
->setParameter('timestamp', $timestamp)
|
||||
->setParameter('location', $location)
|
||||
;
|
||||
|
||||
$qb->executeStatement();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$output->writeln("No trashbin to import…");
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue