X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/dabe79a438f22612e7d68c8d1de7817505b59b93..refs/pull/3693/head:/app/Settings/SettingService.php diff --git a/app/Settings/SettingService.php b/app/Settings/SettingService.php index 1c053b384..f2c4c8305 100644 --- a/app/Settings/SettingService.php +++ b/app/Settings/SettingService.php @@ -1,5 +1,8 @@ -localCache[$key]; } - $value = $this->getValueFromStore($key, $default); + $value = $this->getValueFromStore($key) ?? $default; $formatted = $this->formatValue($value, $default); $this->localCache[$key] = $formatted; + return $formatted; } /** * Get a value from the session instead of the main store option. - * @param $key - * @param bool $default - * @return mixed */ - protected function getFromSession($key, $default = false) + protected function getFromSession(string $key, $default = false) { $value = session()->get($key, $default); - $formatted = $this->formatValue($value, $default); - return $formatted; + + return $this->formatValue($value, $default); } /** * Get a user-specific setting from the database or cache. - * @param \BookStack\Auth\User $user - * @param $key - * @param bool $default - * @return bool|string */ - public function getUser($user, $key, $default = false) + public function getUser(User $user, string $key, $default = null) { + if (is_null($default)) { + $default = config('setting-defaults.user.' . $key, false); + } + if ($user->isDefault()) { return $this->getFromSession($key, $default); } + return $this->get($this->userKey($user->id, $key), $default); } /** * Get a value for the current logged-in user. - * @param $key - * @param bool $default - * @return bool|string */ - public function getForCurrentUser($key, $default = false) + public function getForCurrentUser(string $key, $default = null) { return $this->getUser(user(), $key, $default); } @@ -92,11 +85,9 @@ class SettingService /** * Gets a setting value from the cache or database. * Looks at the system defaults if not cached or in database. - * @param $key - * @param $default - * @return mixed + * Returns null if nothing is found. */ - protected function getValueFromStore($key, $default) + protected function getValueFromStore(string $key) { // Check the cache $cacheKey = $this->cachePrefix . $key; @@ -109,18 +100,23 @@ class SettingService $settingObject = $this->getSettingObjectByKey($key); if ($settingObject !== null) { $value = $settingObject->value; + + if ($settingObject->type === 'array') { + $value = json_decode($value, true) ?? []; + } + $this->cache->forever($cacheKey, $value); + return $value; } - return $default; + return null; } /** * Clear an item from the cache completely. - * @param $key */ - protected function clearFromCache($key) + protected function clearFromCache(string $key) { $cacheKey = $this->cachePrefix . $key; $this->cache->forget($cacheKey); @@ -130,18 +126,14 @@ class SettingService } /** - * Format a settings value - * @param $value - * @param $default - * @return mixed + * Format a settings value. */ protected function formatValue($value, $default) { // Change string booleans to actual booleans if ($value === 'true') { $value = true; - } - if ($value === 'false') { + } elseif ($value === 'false') { $value = false; } @@ -149,104 +141,107 @@ class SettingService if ($value === '') { $value = $default; } + return $value; } /** * Checks if a setting exists. - * @param $key - * @return bool */ - public function has($key) + public function has(string $key): bool { $setting = $this->getSettingObjectByKey($key); - return $setting !== null; - } - /** - * Check if a user setting is in the database. - * @param $key - * @return bool - */ - public function hasUser($key) - { - return $this->has($this->userKey($key)); + return $setting !== null; } /** * Add a setting to the database. - * @param $key - * @param $value - * @return bool + * Values can be an array or a string. */ - public function put($key, $value) + public function put(string $key, $value): bool { - $setting = $this->setting->firstOrNew([ - 'setting_key' => $key + $setting = $this->setting->newQuery()->firstOrNew([ + 'setting_key' => $key, ]); + $setting->type = 'string'; + + if (is_array($value)) { + $setting->type = 'array'; + $value = $this->formatArrayValue($value); + } + $setting->value = $value; $setting->save(); $this->clearFromCache($key); + return true; } + /** + * Format an array to be stored as a setting. + * Array setting types are expected to be a flat array of child key=>value array items. + * This filters out any child items that are empty. + */ + protected function formatArrayValue(array $value): string + { + $values = collect($value)->values()->filter(function (array $item) { + return count(array_filter($item)) > 0; + }); + + return json_encode($values); + } + /** * Put a user-specific setting into the database. - * @param \BookStack\Auth\User $user - * @param $key - * @param $value - * @return bool */ - public function putUser($user, $key, $value) + public function putUser(User $user, string $key, string $value): bool { if ($user->isDefault()) { - return session()->put($key, $value); + session()->put($key, $value); + + return true; } + return $this->put($this->userKey($user->id, $key), $value); } /** * Convert a setting key into a user-specific key. - * @param $key - * @return string */ - protected function userKey($userId, $key = '') + protected function userKey(string $userId, string $key = ''): string { return 'user:' . $userId . ':' . $key; } /** * Removes a setting from the database. - * @param $key - * @return bool */ - public function remove($key) + public function remove(string $key): void { $setting = $this->getSettingObjectByKey($key); if ($setting) { $setting->delete(); } $this->clearFromCache($key); - return true; } /** * Delete settings for a given user id. - * @param $userId - * @return mixed */ - public function deleteUserSettings($userId) + public function deleteUserSettings(string $userId) { - return $this->setting->where('setting_key', 'like', $this->userKey($userId) . '%')->delete(); + return $this->setting->newQuery() + ->where('setting_key', 'like', $this->userKey($userId) . '%') + ->delete(); } /** * Gets a setting model from the database for the given key. - * @param $key - * @return mixed */ - protected function getSettingObjectByKey($key) + protected function getSettingObjectByKey(string $key): ?Setting { - return $this->setting->where('setting_key', '=', $key)->first(); + return $this->setting->newQuery() + ->where('setting_key', '=', $key)->first(); } }