0
0
Fork 0
mirror of https://github.com/nextcloud/server.git synced 2025-01-31 06:43:12 +00:00
nextcloud_server/apps/theming/lib/Migration/Version2006Date20240905111627.php
Ferdinand Thiessen b3ffd7356f
fix: Use migration instead of repair step for restoring custom color
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2024-09-11 15:20:33 +02:00

88 lines
3.2 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Theming\Migration;
use Closure;
use OCA\Theming\AppInfo\Application;
use OCA\Theming\Jobs\RestoreBackgroundImageColor;
use OCP\BackgroundJob\IJobList;
use OCP\IAppConfig;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
// This can only be executed once because `background_color` is again used with Nextcloud 30,
// so this part only works when updating -> Nextcloud 29 -> 30
class Version2006Date20240905111627 implements \OCP\Migration\IMigrationStep {
public function __construct(
private IJobList $jobList,
private IAppConfig $appConfig,
private IDBConnection $connection,
) {
}
public function name(): string {
return 'Restore custom primary color';
}
public function description(): string {
return 'Restore custom primary color after separating primary color from background color';
}
public function preSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
// nop
}
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options) {
$this->restoreSystemColors($output);
$userThemingEnabled = $this->appConfig->getValueBool('theming', 'disable-user-theming') === false;
if ($userThemingEnabled) {
$this->restoreUserColors($output);
}
return null;
}
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
$output->info('Initialize restoring of background colors for custom background images');
// This is done in a background job as this can take a lot of time for large instances
$this->jobList->add(RestoreBackgroundImageColor::class, ['stage' => RestoreBackgroundImageColor::STAGE_PREPARE]);
}
private function restoreSystemColors(IOutput $output): void {
$defaultColor = $this->appConfig->getValueString(Application::APP_ID, 'color', '');
if ($defaultColor === '') {
$output->info('No custom system color configured - skipping');
} else {
// Restore legacy value into new field
$this->appConfig->setValueString(Application::APP_ID, 'background_color', $defaultColor);
$this->appConfig->setValueString(Application::APP_ID, 'primary_color', $defaultColor);
// Delete legacy field
$this->appConfig->deleteKey(Application::APP_ID, 'color');
// give some feedback
$output->info('Global primary color restored');
}
}
private function restoreUserColors(IOutput $output): void {
$output->info('Restoring user primary color');
// For performance let the DB handle this
$qb = $this->connection->getQueryBuilder();
// Rename the `background_color` config to `primary_color` as this was the behavior on Nextcloud 29 and older
// with Nextcloud 30 `background_color` is a new option to define the background color independent of the primary color.
$qb->update('preferences')
->set('configkey', $qb->createNamedParameter('primary_color'))
->where($qb->expr()->eq('appid', $qb->createNamedParameter(Application::APP_ID)))
->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('background_color')));
$qb->executeStatement();
$output->info('Primary color of users restored');
}
}