. */ declare(strict_types=1); namespace FireflyIII\Support; use Cache; use Exception; use FireflyIII\Models\Preference; use FireflyIII\User; use Illuminate\Support\Collection; use Log; use Session; /** * Class Preferences. */ class Preferences { /** * @param User $user * @param string $search * * @return Collection */ public function beginsWith(User $user, string $search): Collection { $set = Preference::where('user_id', $user->id)->where('name', 'LIKE', $search . '%')->get(); return $set; } /** * @param $name * * @return bool */ public function delete(string $name): bool { $fullName = sprintf('preference%s%s', auth()->user()->id, $name); if (Cache::has($fullName)) { Cache::forget($fullName); } try { Preference::where('user_id', auth()->user()->id)->where('name', $name)->delete(); } catch (Exception $e) { // don't care. } return true; } /** * @param string $name * * @return Collection */ public function findByName(string $name): Collection { return Preference::where('name', $name)->get(); } /** * @param $name * @param null $default * * @return \FireflyIII\Models\Preference|null */ public function get($name, $default = null) { /** @var User $user */ $user = auth()->user(); if (null === $user) { return $default; } return $this->getForUser($user, $name, $default); } /** * @param \FireflyIII\User $user * @param array $list * * @return array */ public function getArrayForUser(User $user, array $list): array { $result = []; $preferences = Preference::where('user_id', $user->id)->whereIn('name', $list)->get(['id', 'name', 'data']); /** @var Preference $preference */ foreach ($preferences as $preference) { $result[$preference->name] = $preference->data; } foreach ($list as $name) { if (!isset($result[$name])) { $result[$name] = null; } } return $result; } /** * @param \FireflyIII\User $user * @param string $name * @param null|string $default * * @return \FireflyIII\Models\Preference|null */ public function getForUser(User $user, $name, $default = null) { $fullName = sprintf('preference%s%s', $user->id, $name); if (Cache::has($fullName)) { return Cache::get($fullName); } $preference = Preference::where('user_id', $user->id)->where('name', $name)->first(['id', 'name', 'data']); if (null !== $preference && null === $preference->data) { try { $preference->delete(); } catch (Exception $e) { Log::debug(sprintf('Could not delete preference #%d', $preference->id)); } $preference = null; } if (null !== $preference) { Cache::forever($fullName, $preference); return $preference; } // no preference found and default is null: if (null === $default) { // return NULL return null; } return $this->setForUser($user, $name, $default); } /** * @return string */ public function lastActivity(): string { $lastActivity = microtime(); $preference = $this->get('lastActivity', microtime()); if (null !== $preference && null !== $preference->data) { $lastActivity = $preference->data; } if (\is_array($lastActivity)) { $lastActivity = implode(',', $lastActivity); } return md5($lastActivity); } /** * @return bool */ public function mark(): bool { $this->set('lastActivity', microtime()); Session::forget('first'); return true; } /** * @param $name * @param $value * * @return Preference */ public function set($name, $value): Preference { $user = auth()->user(); if (null === $user) { // make new preference, return it: $pref = new Preference; $pref->name = $name; $pref->data = $value; return $pref; } return $this->setForUser(auth()->user(), $name, $value); } /** * @param \FireflyIII\User $user * @param $name * @param mixed $value * * @return Preference */ public function setForUser(User $user, $name, $value): Preference { $fullName = sprintf('preference%s%s', $user->id, $name); Cache::forget($fullName); $pref = Preference::where('user_id', $user->id)->where('name', $name)->first(['id', 'name', 'data']); if (null !== $pref) { $pref->data = $value; $pref->save(); Cache::forever($fullName, $pref); return $pref; } $pref = new Preference; $pref->name = $name; $pref->data = $value; $pref->user()->associate($user); $pref->save(); Cache::forever($fullName, $pref); return $pref; } }