From d0f12ed1efc7743d6dcbf33081235cce276bb71e Mon Sep 17 00:00:00 2001 From: Roardom Date: Sun, 15 Oct 2023 09:05:39 +0000 Subject: [PATCH] fix: json serialization in database migrations When the switch was made in the database migrations to use the query builder instead of eloquent models in e67f7dc01387daa4f00e44eeb8ffa9322f756c4a, the json casting provided by the eloquent models weren't accounted for. We have to deserialize and serialize the json manually now. --- ...090331_update_user_notifications_table.php | 43 +++++++++------- ...12_30_090351_update_user_privacy_table.php | 49 +++++++++++-------- 2 files changed, 55 insertions(+), 37 deletions(-) diff --git a/database/migrations/2022_12_30_090331_update_user_notifications_table.php b/database/migrations/2022_12_30_090331_update_user_notifications_table.php index 4c918f88c9..83b90f4de9 100644 --- a/database/migrations/2022_12_30_090331_update_user_notifications_table.php +++ b/database/migrations/2022_12_30_090331_update_user_notifications_table.php @@ -21,38 +21,47 @@ public function up(): void ->toArray(); // - // Input format looks like: + // Input format looks like ("1" means accepts notifications, "0" means blocks notifications): // { // "default_groups": { // "1": 0, // "2": 1, // "3": 0, - // "4": 1, + // "4": 1 // } // } // - // Output format looks like: + // Output format looks like (Presence means blocks notifications) // [ // 1, - // 3, + // 3 // ] // - $migrate = fn ($groups) => array_keys(array_filter( - $groups, - fn ($groupId, $acceptsNotifications) => ! $acceptsNotifications && \in_array($groupId, $allowedGroups), - ARRAY_FILTER_USE_BOTH - )); + $migrate = function ($jsonGroups) use ($allowedGroups) { + $new = []; + $old = json_decode($jsonGroups); + + if (\is_object($old) && \is_object($old->default_groups)) { + foreach ($old->default_groups as $groupId => $acceptsNotifications) { + if (! $acceptsNotifications && \in_array($groupId, $allowedGroups)) { + $new[] = (int) $groupId; + } + } + } + + return json_encode(array_values(array_unique($new))); + } ; foreach (DB::table('user_notifications')->get() as $user_notification) { - $user_notification->json_account_groups = $migrate($user_notification->json_account_groups['default_groups']); - $user_notification->json_bon_groups = $migrate($user_notification->json_bon_groups['default_groups']); - $user_notification->json_mention_groups = $migrate($user_notification->json_mention_groups['default_groups']); - $user_notification->json_request_groups = $migrate($user_notification->json_request_groups['default_groups']); - $user_notification->json_torrent_groups = $migrate($user_notification->json_torrent_groups['default_groups']); - $user_notification->json_forum_groups = $migrate($user_notification->json_forum_groups['default_groups']); - $user_notification->json_following_groups = $migrate($user_notification->json_following_groups['default_groups']); - $user_notification->json_subscription_groups = $migrate($user_notification->json_subscription_groups['default_groups']); + $user_notification->json_account_groups = $migrate($user_notification->json_account_groups); + $user_notification->json_bon_groups = $migrate($user_notification->json_bon_groups); + $user_notification->json_mention_groups = $migrate($user_notification->json_mention_groups); + $user_notification->json_request_groups = $migrate($user_notification->json_request_groups); + $user_notification->json_torrent_groups = $migrate($user_notification->json_torrent_groups); + $user_notification->json_forum_groups = $migrate($user_notification->json_forum_groups); + $user_notification->json_following_groups = $migrate($user_notification->json_following_groups); + $user_notification->json_subscription_groups = $migrate($user_notification->json_subscription_groups); $user_notification->save(); } } diff --git a/database/migrations/2022_12_30_090351_update_user_privacy_table.php b/database/migrations/2022_12_30_090351_update_user_privacy_table.php index 447442d271..98dac0186c 100644 --- a/database/migrations/2022_12_30_090351_update_user_privacy_table.php +++ b/database/migrations/2022_12_30_090351_update_user_privacy_table.php @@ -21,41 +21,50 @@ public function up(): void ->toArray(); // - // Input format looks like: + // Input format looks like ("1" means accepts notifications, "0" means blocks notifications): // { // "default_groups": { // "1": 0, // "2": 1, // "3": 0, - // "4": 1, + // "4": 1 // } // } // - // Output format looks like: + // Output format looks like (Presence means blocks notifications) // [ // 1, - // 3, + // 3 // ] // - $migrate = fn ($groups) => array_keys(array_filter( - $groups, - fn ($groupId, $isAllowed) => ! $isAllowed && \in_array($groupId, $allowedGroups), - ARRAY_FILTER_USE_BOTH - )); + $migrate = function ($jsonGroups) use ($allowedGroups) { + $new = []; + $old = json_decode($jsonGroups); + + if (\is_object($old) && \is_object($old->default_groups)) { + foreach ($old->default_groups as $groupId => $isAllowed) { + if (! $isAllowed && \in_array($groupId, $allowedGroups)) { + $new[] = (int) $groupId; + } + } + } + + return json_encode(array_values(array_unique($new))); + } ; foreach (DB::table('user_privacy')->get() as $user_privacy) { - $user_privacy->json_profile_groups = $migrate($user_privacy->json_profile_groups['default_groups']); - $user_privacy->json_torrent_groups = $migrate($user_privacy->json_torrent_groups['default_groups']); - $user_privacy->json_forum_groups = $migrate($user_privacy->json_forum_groups['default_groups']); - $user_privacy->json_bon_groups = $migrate($user_privacy->json_bon_groups['default_groups']); - $user_privacy->json_comment_groups = $migrate($user_privacy->json_comment_groups['default_groups']); - $user_privacy->json_wishlist_groups = $migrate($user_privacy->json_wishlist_groups['default_groups']); - $user_privacy->json_follower_groups = $migrate($user_privacy->json_follower_groups['default_groups']); - $user_privacy->json_achievement_groups = $migrate($user_privacy->json_achievement_groups['default_groups']); - $user_privacy->json_rank_groups = $migrate($user_privacy->json_rank_groups['default_groups']); - $user_privacy->json_request_groups = $migrate($user_privacy->json_request_groups['default_groups']); - $user_privacy->json_other_groups = $migrate($user_privacy->json_other_groups['default_groups']); + $user_privacy->json_profile_groups = $migrate($user_privacy->json_profile_groups); + $user_privacy->json_torrent_groups = $migrate($user_privacy->json_torrent_groups); + $user_privacy->json_forum_groups = $migrate($user_privacy->json_forum_groups); + $user_privacy->json_bon_groups = $migrate($user_privacy->json_bon_groups); + $user_privacy->json_comment_groups = $migrate($user_privacy->json_comment_groups); + $user_privacy->json_wishlist_groups = $migrate($user_privacy->json_wishlist_groups); + $user_privacy->json_follower_groups = $migrate($user_privacy->json_follower_groups); + $user_privacy->json_achievement_groups = $migrate($user_privacy->json_achievement_groups); + $user_privacy->json_rank_groups = $migrate($user_privacy->json_rank_groups); + $user_privacy->json_request_groups = $migrate($user_privacy->json_request_groups); + $user_privacy->json_other_groups = $migrate($user_privacy->json_other_groups); $user_privacy->save(); } }