mirror of
https://github.com/nextcloud/server.git
synced 2025-03-15 08:45:21 +00:00
graceful background image handling
- fallback to background image from old location - migrate background images to new location as insensitive job Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
This commit is contained in:
parent
4d98128e9a
commit
59e07102ed
4 changed files with 171 additions and 5 deletions
apps/theming
appinfo
lib
|
@ -31,6 +31,9 @@
|
|||
<pre-migration>
|
||||
<step>OCA\Theming\Migration\MigrateUserConfig</step>
|
||||
</pre-migration>
|
||||
<post-migration>
|
||||
<step>OCA\Theming\Migration\InitBackgroundImagesMigration</step>
|
||||
</post-migration>
|
||||
</repair-steps>
|
||||
|
||||
<commands>
|
||||
|
|
107
apps/theming/lib/Jobs/MigrateBackgroundImages.php
Normal file
107
apps/theming/lib/Jobs/MigrateBackgroundImages.php
Normal file
|
@ -0,0 +1,107 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2022 Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||
*
|
||||
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||
*
|
||||
* @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 <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Theming\Jobs;
|
||||
|
||||
use OCA\Theming\AppInfo\Application;
|
||||
use OCP\App\IAppManager;
|
||||
use OCP\AppFramework\Utility\ITimeFactory;
|
||||
use OCP\BackgroundJob\IJobList;
|
||||
use OCP\BackgroundJob\QueuedJob;
|
||||
use OCP\Files\AppData\IAppDataFactory;
|
||||
use OCP\Files\NotFoundException;
|
||||
use OCP\Files\NotPermittedException;
|
||||
use OCP\IConfig;
|
||||
|
||||
class MigrateBackgroundImages extends QueuedJob {
|
||||
public const TIME_SENSITIVE = 0;
|
||||
|
||||
private IConfig $config;
|
||||
private IAppManager $appManager;
|
||||
private IAppDataFactory $appDataFactory;
|
||||
private IJobList $jobList;
|
||||
|
||||
public function __construct(ITimeFactory $time, IAppDataFactory $appDataFactory, IConfig $config, IAppManager $appManager, IJobList $jobList) {
|
||||
parent::__construct($time);
|
||||
$this->config = $config;
|
||||
$this->appManager = $appManager;
|
||||
$this->appDataFactory = $appDataFactory;
|
||||
$this->jobList = $jobList;
|
||||
}
|
||||
|
||||
protected function run($argument): void {
|
||||
if (!$this->appManager->isEnabledForUser('dashboard')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$themingData = $this->appDataFactory->get(Application::APP_ID);
|
||||
$dashboardData = $this->appDataFactory->get('dashboard');
|
||||
|
||||
$userIds = $this->config->getUsersForUserValue('theming', 'background', 'custom');
|
||||
|
||||
$notSoFastMode = \count($userIds) > 5000;
|
||||
$reTrigger = false;
|
||||
$processed = 0;
|
||||
|
||||
foreach ($userIds as $userId) {
|
||||
try {
|
||||
// precondition
|
||||
if ($notSoFastMode) {
|
||||
if ($this->config->getUserValue($userId, 'theming', 'background-migrated', '0') === '1') {
|
||||
// already migrated
|
||||
continue;
|
||||
}
|
||||
$reTrigger = true;
|
||||
}
|
||||
|
||||
// migration
|
||||
$file = $dashboardData->getFolder($userId)->getFile('background.jpg');
|
||||
try {
|
||||
$targetDir = $themingData->getFolder($userId);
|
||||
} catch (NotFoundException $e) {
|
||||
$targetDir = $themingData->newFolder($userId);
|
||||
}
|
||||
if (!$targetDir->fileExists('background.jpg')) {
|
||||
$targetDir->newFile('background.jpg', $file->getContent());
|
||||
}
|
||||
$file->delete();
|
||||
} catch (NotFoundException|NotPermittedException $e) {
|
||||
}
|
||||
// capture state
|
||||
if ($notSoFastMode) {
|
||||
$this->config->setUserValue($userId, 'theming', 'background-migrated', '1');
|
||||
$processed++;
|
||||
}
|
||||
if ($processed > 4999) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($reTrigger) {
|
||||
$this->jobList->add(self::class);
|
||||
}
|
||||
}
|
||||
}
|
48
apps/theming/lib/Migration/InitBackgroundImagesMigration.php
Normal file
48
apps/theming/lib/Migration/InitBackgroundImagesMigration.php
Normal file
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2022 Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||
*
|
||||
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||
*
|
||||
* @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 <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Theming\Migration;
|
||||
|
||||
use OCA\Theming\Jobs\MigrateBackgroundImages;
|
||||
use OCP\BackgroundJob\IJobList;
|
||||
use OCP\Migration\IOutput;
|
||||
|
||||
class InitBackgroundImagesMigration implements \OCP\Migration\IRepairStep {
|
||||
|
||||
private IJobList $jobList;
|
||||
|
||||
public function __construct(IJobList $jobList) {
|
||||
$this->jobList = $jobList;
|
||||
}
|
||||
|
||||
public function getName() {
|
||||
return 'Initialize migration of background images from dashboard to theming app';
|
||||
}
|
||||
|
||||
public function run(IOutput $output) {
|
||||
$this->jobList->add(MigrateBackgroundImages::class);
|
||||
}
|
||||
}
|
|
@ -30,6 +30,7 @@ namespace OCA\Theming\Service;
|
|||
use InvalidArgumentException;
|
||||
use OC\User\NoUserException;
|
||||
use OCA\Theming\AppInfo\Application;
|
||||
use OCP\Files\AppData\IAppDataFactory;
|
||||
use OCP\Files\File;
|
||||
use OCP\Files\IAppData;
|
||||
use OCP\Files\IRootFolder;
|
||||
|
@ -133,20 +134,22 @@ class BackgroundService {
|
|||
private IAppData $appData;
|
||||
private IConfig $config;
|
||||
private string $userId;
|
||||
private IAppDataFactory $appDataFactory;
|
||||
|
||||
public function __construct(
|
||||
IRootFolder $rootFolder,
|
||||
IAppData $appData,
|
||||
IConfig $config,
|
||||
?string $userId
|
||||
IRootFolder $rootFolder,
|
||||
IAppDataFactory $appDataFactory,
|
||||
IConfig $config,
|
||||
?string $userId
|
||||
) {
|
||||
if ($userId === null) {
|
||||
return;
|
||||
}
|
||||
$this->rootFolder = $rootFolder;
|
||||
$this->appData = $appData;
|
||||
$this->appData = $appDataFactory->get(Application::APP_ID);
|
||||
$this->config = $config;
|
||||
$this->userId = $userId;
|
||||
$this->appDataFactory = $appDataFactory;
|
||||
}
|
||||
|
||||
public function setDefaultBackground(): void {
|
||||
|
@ -193,6 +196,11 @@ class BackgroundService {
|
|||
try {
|
||||
return $this->getAppDataFolder()->getFile('background.jpg');
|
||||
} catch (NotFoundException | NotPermittedException $e) {
|
||||
try {
|
||||
// Fallback can be removed in 26
|
||||
$dashboardFolder = $this->appDataFactory->get('dashboard');
|
||||
return $dashboardFolder->getFolder($this->userId)->getFile('background.jpg');
|
||||
} catch (\Throwable $t) {}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
|
Loading…
Reference in a new issue