From b2173fb1c0ee1c652ef01df08f85d6bfc1e1fdd2 Mon Sep 17 00:00:00 2001 From: Tim Kelty Date: Tue, 6 Feb 2024 00:37:20 -0500 Subject: [PATCH] Convert columns to json --- .../m240206_035135_convert_json_columns.php | 36 +++++++++++++++++++ src/models/DeprecationError.php | 10 ++++++ src/records/GqlSchema.php | 10 ++++++ src/services/Dashboard.php | 5 +++ src/services/Deprecator.php | 2 +- src/services/Entries.php | 4 ++- src/services/Fields.php | 2 +- src/services/Gql.php | 2 +- src/services/Users.php | 8 +++-- 9 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 src/migrations/m240206_035135_convert_json_columns.php diff --git a/src/migrations/m240206_035135_convert_json_columns.php b/src/migrations/m240206_035135_convert_json_columns.php new file mode 100644 index 00000000000..b79128e4f18 --- /dev/null +++ b/src/migrations/m240206_035135_convert_json_columns.php @@ -0,0 +1,36 @@ +alterColumn(Table::DEPRECATIONERRORS, 'traces', $this->json()); + $this->alterColumn(Table::FIELDLAYOUTS, 'config', $this->json()); + $this->alterColumn(Table::GQLSCHEMAS, 'scope', $this->json()); + $this->alterColumn(Table::SECTIONS, 'previewTargets', $this->json()); + $this->alterColumn(Table::USERPREFERENCES, 'preferences', $this->json()); + $this->alterColumn(Table::WIDGETS, 'settings', $this->json()); + + return true; + } + + /** + * @inheritdoc + */ + public function safeDown(): bool + { + echo "m240206_035135_convert_json_columns cannot be reverted.\n"; + return false; + } +} diff --git a/src/models/DeprecationError.php b/src/models/DeprecationError.php index 4c23174d1af..b9833fa20df 100644 --- a/src/models/DeprecationError.php +++ b/src/models/DeprecationError.php @@ -8,6 +8,7 @@ namespace craft\models; use craft\base\Model; +use craft\helpers\Json; use craft\validators\DateTimeValidator; use DateTime; @@ -59,6 +60,15 @@ class DeprecationError extends Model */ public ?array $traces = null; + public function __construct($config = []) + { + if (is_string($config['traces'] ?? null)) { + $config['traces'] = Json::decode($config['traces']); + } + + parent::__construct($config); + } + /** * @inheritdoc */ diff --git a/src/records/GqlSchema.php b/src/records/GqlSchema.php index c9573d25d56..e3f8cdbd31b 100644 --- a/src/records/GqlSchema.php +++ b/src/records/GqlSchema.php @@ -9,6 +9,7 @@ use craft\db\ActiveRecord; use craft\db\Table; +use craft\helpers\Json; /** * Class GqlSchema record. @@ -30,4 +31,13 @@ public static function tableName(): string { return Table::GQLSCHEMAS; } + + public function __construct($config = []) + { + if (is_string($config['scope'] ?? null)) { + $config['scope'] = Json::decode($config['scope']); + } + + parent::__construct($config); + } } diff --git a/src/services/Dashboard.php b/src/services/Dashboard.php index ce5e2284d02..01c07a62b53 100644 --- a/src/services/Dashboard.php +++ b/src/services/Dashboard.php @@ -17,6 +17,7 @@ use craft\events\WidgetEvent; use craft\helpers\Component as ComponentHelper; use craft\helpers\Db; +use craft\helpers\Json; use craft\records\Widget as WidgetRecord; use craft\widgets\CraftSupport as CraftSupportWidget; use craft\widgets\Feed as FeedWidget; @@ -122,6 +123,10 @@ public function createWidget(mixed $config): WidgetInterface $config = ['type' => $config]; } + if (is_string($config['settings'] ?? null)) { + $config['settings'] = Json::decode($config['settings']); + } + try { $widget = ComponentHelper::createComponent($config, WidgetInterface::class); } catch (MissingComponentException $e) { diff --git a/src/services/Deprecator.php b/src/services/Deprecator.php index d7c794ae6de..ce99fcb75c6 100644 --- a/src/services/Deprecator.php +++ b/src/services/Deprecator.php @@ -149,7 +149,7 @@ public function storeLogs(): void 'file' => $log->file, 'line' => $log->line, 'message' => $log->message, - 'traces' => Json::encode($log->traces), + 'traces' => $log->traces, ]); $log->id = (int)$db->getLastInsertID(); } catch (Exception $e) { diff --git a/src/services/Entries.php b/src/services/Entries.php index 07f548e15ce..b285d2b8231 100644 --- a/src/services/Entries.php +++ b/src/services/Entries.php @@ -228,7 +228,9 @@ private function _sections(): MemoizableArray $this->_sections = new MemoizableArray($results, function(array $result) use (&$siteSettingsBySection) { if (!empty($result['previewTargets'])) { - $result['previewTargets'] = Json::decode($result['previewTargets']); + $result['previewTargets'] = is_string($result['previewTargets']) + ? Json::decode($result['previewTargets']) + : $result['previewTargets']; } else { $result['previewTargets'] = []; } diff --git a/src/services/Fields.php b/src/services/Fields.php index 63b1aba9ec9..91a02fa5346 100644 --- a/src/services/Fields.php +++ b/src/services/Fields.php @@ -757,7 +757,7 @@ private function _layouts(): MemoizableArray if (array_key_exists('config', $config)) { $nestedConfig = ArrayHelper::remove($config, 'config'); if ($nestedConfig) { - $config += Json::decode($nestedConfig); + $config += is_string($nestedConfig) ? Json::decode($nestedConfig) : $nestedConfig; } $loadTabs = false; } else { diff --git a/src/services/Gql.php b/src/services/Gql.php index 3b8d42b4e88..ed49681a594 100644 --- a/src/services/Gql.php +++ b/src/services/Gql.php @@ -992,7 +992,7 @@ public function handleChangedSchema(ConfigEvent $event): void $schemaRecord->uid = $schemaUid; $schemaRecord->name = $data['name']; $schemaRecord->isPublic = (bool)($data['isPublic'] ?? false); - $schemaRecord->scope = (!empty($data['scope']) && is_array($data['scope'])) ? Json::encode($data['scope']) : []; + $schemaRecord->scope = empty($data['scope']) ? [] : $data['scope']; // Save the schema record $schemaRecord->save(false); diff --git a/src/services/Users.php b/src/services/Users.php index 269605df270..9ade36eb34f 100644 --- a/src/services/Users.php +++ b/src/services/Users.php @@ -369,9 +369,11 @@ public function getUserPreferences(int $userId): array ->select(['preferences']) ->from([Table::USERPREFERENCES]) ->where(['userId' => $userId]) - ->scalar(); + ->scalar() ?: []; - $this->_userPreferences[$userId] = $preferences ? Json::decode($preferences) : []; + $this->_userPreferences[$userId] = is_string($preferences) + ? Json::decode($preferences) + : $preferences; } return $this->_userPreferences[$userId]; @@ -390,7 +392,7 @@ public function saveUserPreferences(User $user, array $preferences): void Db::upsert(Table::USERPREFERENCES, [ 'userId' => $user->id, - 'preferences' => Json::encode($preferences), + 'preferences' => $preferences, ]); $this->_userPreferences[$user->id] = $preferences;