From 5874633a774f88efb416a12cb20befbd5f4f0213 Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Tue, 20 Sep 2022 12:43:16 +0200 Subject: [PATCH] fix: [internal] Extracting periodic setting for user --- app/Controller/UsersController.php | 2 +- app/Model/User.php | 63 ++++++++++++++++-------------- 2 files changed, 35 insertions(+), 30 deletions(-) diff --git a/app/Controller/UsersController.php b/app/Controller/UsersController.php index 420216280..aa979430a 100644 --- a/app/Controller/UsersController.php +++ b/app/Controller/UsersController.php @@ -2780,7 +2780,7 @@ class UsersController extends AppController } } - $user['periodic_settings'] = $this->User->extractPeriodicSettingForUser($user); + $user['periodic_settings'] = $this->User->extractPeriodicSettingForUser($user['id']); $this->request->data = $user; $this->loadModel('Attribute'); $distributionData = $this->Attribute->fetchDistributionData($user); diff --git a/app/Model/User.php b/app/Model/User.php index f0ca00e6d..0f9e78f53 100644 --- a/app/Model/User.php +++ b/app/Model/User.php @@ -1641,11 +1641,17 @@ class User extends AppModel return substr(hash('sha256', "{$user['id']}|$salt"), 0, 8); } - public function extractPeriodicSettingForUser($user, $decode=false): array + /** + * @param int $userId + * @param bool $decode + * @return array + * @throws JsonException + */ + public function extractPeriodicSettingForUser($userId, $decode = false): array { - $filter_names = ['orgc_id', 'distribution', 'sharing_group_id', 'event_info', 'tags', 'trending_for_tags', 'include_correlations']; - $filter_to_decode = ['tags', 'trending_for_tags', ]; - $default_periodic_settings = [['value' => [ + $filterNames = ['orgc_id', 'distribution', 'sharing_group_id', 'event_info', 'tags', 'trending_for_tags', 'include_correlations']; + $filterToDecode = ['tags', 'trending_for_tags']; + $defaultPeriodicSettings = [ 'orgc_id' => '', 'distribution' => -1, 'sharing_group_id' => '', @@ -1653,34 +1659,33 @@ class User extends AppModel 'tags' => '[]', 'trending_for_tags' => '[]', 'include_correlations' => '', - ]]]; - if (is_numeric($user)) { - $user = $this->find('first', [ - 'recursive' => -1, - 'conditions' => ['User.id' => $user], - 'contain' => [ - 'UserSetting', - ] - ]); + ]; + + $periodicSettings = $this->UserSetting->find('first', [ + 'recursive' => -1, + 'conditions' => [ + 'user_id' => $userId, + 'setting' => self::PERIODIC_USER_SETTING_KEY, + ], + 'fields' => ['value'], + ]); + if (empty($periodicSettings)) { + $periodicSettings = $defaultPeriodicSettings; + } else { + $periodicSettings = $periodicSettings['UserSetting']['value']; } - $periodic_settings = array_values(array_filter($user['UserSetting'], function ($userSetting) { - return $userSetting['setting'] == self::PERIODIC_USER_SETTING_KEY; - })); - if (empty($periodic_settings)) { - $periodic_settings = $default_periodic_settings; + $periodicSettingsIndexed = []; + foreach ($filterNames as $filterName) { + $periodicSettingsIndexed[$filterName] = $periodicSettings[$filterName] ?? $defaultPeriodicSettings[$filterName]; } - $periodic_settings_indexed = []; - if (!empty($periodic_settings)) { - foreach ($filter_names as $filter_name) { - $periodic_settings_indexed[$filter_name] = $periodic_settings[0]['value'][$filter_name] ?? $default_periodic_settings[0]['value'][$filter_name]; + if ($decode) { + foreach ($filterToDecode as $filter) { + if (!empty($periodicSettingsIndexed[$filter])) { + $periodicSettingsIndexed[$filter] = JsonTool::decode($periodicSettingsIndexed[$filter]); + } } } - foreach ($filter_to_decode as $filter) { - if (!empty($decode) && !empty($periodic_settings_indexed[$filter])) { - $periodic_settings_indexed[$filter] = JsonTool::decode($periodic_settings_indexed[$filter]); - } - } - return $periodic_settings_indexed; + return $periodicSettingsIndexed; } public function getUsablePeriodicSettingForUser(array $periodicSettings, $period='daily'): array @@ -1766,7 +1771,7 @@ class User extends AppModel } App::import('Tools', 'SendEmail'); $emailTemplate = $this->prepareEmailTemplate($period); - $periodicSettings = $this->extractPeriodicSettingForUser($user, true); + $periodicSettings = $this->extractPeriodicSettingForUser($user_id, true); $filters = $this->getUsablePeriodicSettingForUser($periodicSettings, $period); $filtersForRestSearch = $filters; // filters for restSearch are slightly different than fetchEvent $filters['last'] = $this->resolveTimeDelta($filters['last']);