<?php namespace Pterodactyl\Repositories\Eloquent; use Pterodactyl\Models\Setting; use Pterodactyl\Contracts\Repository\SettingsRepositoryInterface; class SettingsRepository extends EloquentRepository implements SettingsRepositoryInterface { /** * @var array */ private static $cache = []; /** * @var array */ private static $databaseMiss = []; /** * Return the model backing this repository. * * @return string */ public function model() { return Setting::class; } /** * Store a new persistent setting in the database. * * @throws \Pterodactyl\Exceptions\Model\DataValidationException * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException */ public function set(string $key, string $value = null) { // Clear item from the cache. $this->clearCache($key); $this->withoutFreshModel()->updateOrCreate(['key' => $key], ['value' => $value ?? '']); self::$cache[$key] = $value; } /** * Retrieve a persistent setting from the database. * * @param mixed $default * * @return mixed */ public function get(string $key, $default = null) { // If item has already been requested return it from the cache. If // we already know it is missing, immediately return the default value. if (array_key_exists($key, self::$cache)) { return self::$cache[$key]; } elseif (array_key_exists($key, self::$databaseMiss)) { return value($default); } $instance = $this->getBuilder()->where('key', $key)->first(); if (is_null($instance)) { self::$databaseMiss[$key] = true; return value($default); } return self::$cache[$key] = $instance->value; } /** * Remove a key from the database cache. */ public function forget(string $key) { $this->clearCache($key); $this->deleteWhere(['key' => $key]); } /** * Remove a key from the cache. */ private function clearCache(string $key) { unset(self::$cache[$key], self::$databaseMiss[$key]); } }