X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/2c3fb557d6098301f6549fae69ccb1f19d8572b8..refs/pull/711/head:/app/Services/SettingService.php diff --git a/app/Services/SettingService.php b/app/Services/SettingService.php index b7215f524..7ec3ef93a 100644 --- a/app/Services/SettingService.php +++ b/app/Services/SettingService.php @@ -1,26 +1,34 @@ -setting = $setting; + $this->cache = $cache; } /** @@ -32,17 +40,98 @@ class SettingService */ public function get($key, $default = false) { - $setting = $this->getSettingObjectByKey($key); - $value = $setting === null ? null : $setting->value; + if ($default === false) { + $default = config('setting-defaults.' . $key, false); + } + if (isset($this->localCache[$key])) { + return $this->localCache[$key]; + } + + $value = $this->getValueFromStore($key, $default); + $formatted = $this->formatValue($value, $default); + $this->localCache[$key] = $formatted; + return $formatted; + } + + /** + * Get a user-specific setting from the database or cache. + * @param User $user + * @param $key + * @param bool $default + * @return bool|string + */ + public function getUser($user, $key, $default = false) + { + return $this->get($this->userKey($user->id, $key), $default); + } + + /** + * 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 + */ + protected function getValueFromStore($key, $default) + { + // Check for an overriding value + $overrideValue = $this->getOverrideValue($key); + if ($overrideValue !== null) { + return $overrideValue; + } + + // Check the cache + $cacheKey = $this->cachePrefix . $key; + $cacheVal = $this->cache->get($cacheKey, null); + if ($cacheVal !== null) { + return $cacheVal; + } + + // Check the database + $settingObject = $this->getSettingObjectByKey($key); + if ($settingObject !== null) { + $value = $settingObject->value; + $this->cache->forever($cacheKey, $value); + return $value; + } + return $default; + } + + /** + * Clear an item from the cache completely. + * @param $key + */ + protected function clearFromCache($key) + { + $cacheKey = $this->cachePrefix . $key; + $this->cache->forget($cacheKey); + if (isset($this->localCache[$key])) { + unset($this->localCache[$key]); + } + } + + /** + * Format a settings value + * @param $value + * @param $default + * @return mixed + */ + protected function formatValue($value, $default) + { // Change string booleans to actual booleans - if($value === 'true') $value = true; - if($value === 'false') $value = false; + if ($value === 'true') { + $value = true; + } + if ($value === 'false') { + $value = false; + } // Set to default if empty - if($value === '') $value = $default; - - return $value === null ? $default : $value; + if ($value === '') { + $value = $default; + } + return $value; } /** @@ -56,6 +145,16 @@ class SettingService 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)); + } + /** * Add a setting to the database. * @param $key @@ -69,9 +168,32 @@ class SettingService ]); $setting->value = $value; $setting->save(); + $this->clearFromCache($key); return true; } + /** + * Put a user-specific setting into the database. + * @param User $user + * @param $key + * @param $value + * @return bool + */ + public function putUser($user, $key, $value) + { + 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 = '') + { + return 'user:' . $userId . ':' . $key; + } + /** * Removes a setting from the database. * @param $key @@ -83,17 +205,43 @@ class SettingService if ($setting) { $setting->delete(); } + $this->clearFromCache($key); return true; } + /** + * Delete settings for a given user id. + * @param $userId + * @return mixed + */ + public function deleteUserSettings($userId) + { + return $this->setting->where('setting_key', 'like', $this->userKey($userId) . '%')->delete(); + } + /** * Gets a setting model from the database for the given key. * @param $key * @return mixed */ - private function getSettingObjectByKey($key) + protected function getSettingObjectByKey($key) { return $this->setting->where('setting_key', '=', $key)->first(); } -} \ No newline at end of file + + /** + * Returns an override value for a setting based on certain app conditions. + * Used where certain configuration options overrule others. + * Returns null if no override value is available. + * @param $key + * @return bool|null + */ + protected function getOverrideValue($key) + { + if ($key === 'registration-enabled' && config('auth.method') === 'ldap') { + return false; + } + return null; + } +}