From 735abbc8fbb982c01cc327f9a858a45b084e81dd Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Wed, 14 Sep 2016 20:15:15 +0200 Subject: [PATCH] Use a backgroundjob to move avatars Signed-off-by: Roeland Jago Douma --- .../Repair/NC11/MoveAvatarBackgroundJob.php | 110 ++++++++++++++++++ lib/private/Repair/NC11/MoveAvatars.php | 86 ++------------ 2 files changed, 118 insertions(+), 78 deletions(-) create mode 100644 lib/private/Repair/NC11/MoveAvatarBackgroundJob.php diff --git a/lib/private/Repair/NC11/MoveAvatarBackgroundJob.php b/lib/private/Repair/NC11/MoveAvatarBackgroundJob.php new file mode 100644 index 0000000000..4c16196f6e --- /dev/null +++ b/lib/private/Repair/NC11/MoveAvatarBackgroundJob.php @@ -0,0 +1,110 @@ + + * + * @author Roeland Jago Douma + * + * @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 . + * + */ +namespace OC\Repair\NC11; + +use OC\BackgroundJob\QueuedJob; +use OCP\Files\File; +use OCP\Files\Folder; +use OCP\Files\IAppData; +use OCP\Files\IRootFolder; +use OCP\Files\NotFoundException; +use OCP\ILogger; +use OCP\IUser; +use OCP\IUserManager; + +class MoveAvatarsBackgroundJob extends QueuedJob { + + /** @var IUserManager */ + private $userManager; + + /** @var IRootFolder */ + private $rootFolder; + + /** @var IAppData */ + private $appData; + + /** @var ILogger */ + private $logger; + + /** + * MoveAvatars constructor. + * + * @param IUserManager $userManager + * @param IRootFolder $rootFolder + * @param ILogger $logger + */ + public function __construct(IUserManager $userManager, + IRootFolder $rootFolder, + ILogger $logger) { + $this->userManager = $userManager; + $this->rootFolder = $rootFolder; + $this->logger = $logger; + $this->appData = \OC::$server->getAppDataDir('avatar'); + } + + public function run($arguments) { + $this->logger->info('Started migrating avatars to AppData folder'); + $this->moveAvatars(); + $this->logger->info('All avatars migrated to AppData folder'); + } + + private function moveAvatars() { + $counter = 0; + $this->userManager->callForAllUsers(function (IUser $user) use ($counter) { + if ($user->getLastLogin() !== 0) { + $uid = $user->getUID(); + + \OC\Files\Filesystem::initMountPoints($uid); + /** @var Folder $userFolder */ + $userFolder = $this->rootFolder->get($uid); + + try { + $userData = $this->appData->getFolder($uid); + } catch (NotFoundException $e) { + $userData = $this->appData->newFolder($uid); + } + + + $regex = '/^avatar\.([0-9]+\.)?(jpg|png)$/'; + $avatars = $userFolder->getDirectoryListing(); + + foreach ($avatars as $avatar) { + /** @var File $avatar */ + if (preg_match($regex, $avatar->getName())) { + /* + * This is not the most effective but it is the most abstract way + * to handle this. Avatars should be small anyways. + */ + $newAvatar = $userData->newFile($avatar->getName()); + $newAvatar->putContent($avatar->getContent()); + $avatar->delete(); + } + } + } + $counter++; + if ($counter % 100) { + $this->logger->info('{amount} avatars migrated', ['amount' => $counter]); + } + }); + } +} diff --git a/lib/private/Repair/NC11/MoveAvatars.php b/lib/private/Repair/NC11/MoveAvatars.php index d0d78cb1fd..44402b1be4 100644 --- a/lib/private/Repair/NC11/MoveAvatars.php +++ b/lib/private/Repair/NC11/MoveAvatars.php @@ -23,26 +23,14 @@ namespace OC\Repair\NC11; use OC\SystemConfig; -use OCP\Files\File; -use OCP\Files\Folder; -use OCP\Files\IAppData; -use OCP\Files\IRootFolder; -use OCP\Files\NotFoundException; -use OCP\IUser; -use OCP\IUserManager; +use OCP\BackgroundJob\IJobList; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; class MoveAvatars implements IRepairStep { - /** @var IUserManager */ - private $userManager; - - /** @var IRootFolder */ - private $rootFolder; - - /** @var IAppData */ - private $appData; + /** @var IJobList */ + private $jobList; /** @var SystemConfig */ private $systemConfig; @@ -50,18 +38,12 @@ class MoveAvatars implements IRepairStep { /** * MoveAvatars constructor. * - * @param IUserManager $userManager - * @param IRootFolder $rootFolder - * @param IAppData $appData + * @param IJobList $jobList * @param SystemConfig $systemConfig */ - public function __construct(IUserManager $userManager, - IRootFolder $rootFolder, - IAppData $appData, + public function __construct(IJobList $jobList, SystemConfig $systemConfig) { - $this->userManager = $userManager; - $this->rootFolder = $rootFolder; - $this->appData = $appData; + $this->jobList = $jobList; $this->systemConfig = $systemConfig; } @@ -69,66 +51,14 @@ class MoveAvatars implements IRepairStep { * @return string */ public function getName() { - return 'Move avatars to AppData folder'; + return 'Add mover avatar background job'; } public function run(IOutput $output) { if ($this->systemConfig->getValue('enable_avatars', true) === false) { $output->info('Avatars are disabled'); } else { - $output->startProgress($this->userCount()); - $this->moveAvatar($output); - $output->finishProgress(); + $this->jobList->add(MoveAvatarsBackgroundJob::class); } } - - private function moveAvatar(IOutput $output) { - $this->userManager->callForAllUsers(function (IUser $user) use ($output) { - if ($user->getLastLogin() !== 0) { - $uid = $user->getUID(); - - \OC\Files\Filesystem::initMountPoints($uid); - /** @var Folder $userFolder */ - $userFolder = $this->rootFolder->get($uid); - - try { - $userData = $this->appData->getFolder($uid); - } catch (NotFoundException $e) { - $userData = $this->appData->newFolder($uid); - } - - - $regex = '/^avatar\.([0-9]+\.)?(jpg|png)$/'; - $avatars = $userFolder->getDirectoryListing(); - - foreach ($avatars as $avatar) { - /** @var File $avatar */ - if (preg_match($regex, $avatar->getName())) { - /* - * This is not the most effective but it is the most abstract way - * to handle this. Avatars should be small anyways. - */ - $newAvatar = $userData->newFile($avatar->getName()); - $newAvatar->putContent($avatar->getContent()); - $avatar->delete(); - } - } - } - $output->advance(); - }); - } - - /** - * @return int - */ - private function userCount() { - $backends = $this->userManager->countUsers(); - $count = 0; - - foreach ($backends as $backend => $amount) { - $count += $amount; - } - - return $count; - } }