diff --git a/app/Http/Controllers/CompanyController.php b/app/Http/Controllers/CompanyController.php index 32c90ed43d02..75f6457a404b 100644 --- a/app/Http/Controllers/CompanyController.php +++ b/app/Http/Controllers/CompanyController.php @@ -207,7 +207,7 @@ class CompanyController extends BaseController $company = CreateCompany::dispatchNow($request->all(), auth()->user()->company()->account); - $company->saveSettings($request->input('settings')); + $company->saveSettings($request->input('settings'), $company); $this->uploadLogo($request->file('company_logo'), $company, $company); @@ -411,7 +411,7 @@ class CompanyController extends BaseController { $company = $this->company_repo->save($request->all(), $company); - $company->saveSettings($request->input('settings')); + $company->saveSettings($request->input('settings'), $company); $this->uploadLogo($request->file('company_logo'), $company, $company); diff --git a/app/Http/ValidationRules/ValidSettingsRule.php b/app/Http/ValidationRules/ValidSettingsRule.php index b78989f805d4..ce336d464d11 100644 --- a/app/Http/ValidationRules/ValidSettingsRule.php +++ b/app/Http/ValidationRules/ValidSettingsRule.php @@ -13,7 +13,7 @@ namespace App\Http\ValidationRules; use App\Libraries\MultiDB; use App\Models\User; -use App\Utils\Traits\CompanySettingsSaver; +use App\Utils\Traits\SettingsSaver; use Illuminate\Contracts\Validation\Rule; /** @@ -22,7 +22,7 @@ use Illuminate\Contracts\Validation\Rule; */ class ValidSettingsRule implements Rule { - use CompanySettingsSaver; + use SettingsSaver; /** * @param string $attribute * @param mixed $value diff --git a/app/Models/Company.php b/app/Models/Company.php index 357c0b4aa4f4..a35a9d72e1f4 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -30,7 +30,7 @@ use App\Models\TaxRate; use App\Models\Timezone; use App\Models\Traits\AccountTrait; use App\Models\User; -use App\Utils\Traits\CompanySettingsSaver; +use App\Utils\Traits\SettingsSaver; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Log; @@ -40,7 +40,7 @@ class Company extends BaseModel { use PresentableTrait; use MakesHash; - use CompanySettingsSaver; + use SettingsSaver; protected $presenter = 'App\Models\Presenters\CompanyPresenter'; diff --git a/app/Utils/Traits/CompanySettingsSaver.php b/app/Utils/Traits/SettingsSaver.php similarity index 69% rename from app/Utils/Traits/CompanySettingsSaver.php rename to app/Utils/Traits/SettingsSaver.php index 1235f1099525..52345c211522 100644 --- a/app/Utils/Traits/CompanySettingsSaver.php +++ b/app/Utils/Traits/SettingsSaver.php @@ -14,19 +14,27 @@ namespace App\Utils\Traits; use App\DataMapper\CompanySettings; /** - * Class CompanySettingsSaver + * Class SettingsSaver * @package App\Utils\Traits */ -trait CompanySettingsSaver +trait SettingsSaver { - public function saveSettings($settings) + /** + * Saves a setting object + * + * Works for groups|clients|companies + * @param array $settings The request input settings array + * @param object $entity The entity which the settings belongs to + * @return void + */ + public function saveSettings($settings, $entity) { if(!$settings) return; - $company_settings = $this->settings; + $entity_settings = $this->settings; //unset protected properties. foreach(CompanySettings::$protected_fields as $field) @@ -36,12 +44,21 @@ trait CompanySettingsSaver //iterate through set properties with new values; foreach($settings as $key => $value) - $company_settings->{$key} = $value; + $entity_settings->{$key} = $value; - $this->settings = $company_settings; - $this->save(); + $entity->settings = $entity_settings; + $entity->save(); } + /** + * Used for custom validation of inbound + * settings request. + * + * Returns an array of errors, or boolean TRUE + * on successful validation + * @param array $settings The request() settings array + * @return array|bool Array on failure, boolean TRUE on success + */ public function validateSettings($settings) { $settings = (object)$settings; @@ -75,7 +92,18 @@ trait CompanySettingsSaver return true; } - private function checkSettingType($settings) + /** + * Checks the settings object for + * correct property types. + * + * The method will drop invalid types from + * the object and will also settype() the property + * so that it can be saved cleanly + * + * @param array $settings The settings request() array + * @return object stdClass object + */ + private function checkSettingType($settings) : \stdClass { $settings = (object)$settings; $casts = CompanySettings::$casts; @@ -114,7 +142,13 @@ trait CompanySettingsSaver } - private function checkAttribute($key, $value) + /** + * Type checks a object property. + * @param string $key The type + * @param string $value The object property + * @return bool TRUE if the property is the expected type + */ + private function checkAttribute($key, $value) :bool { switch ($key) { @@ -138,7 +172,7 @@ trait CompanySettingsSaver json_decode($string); return (json_last_error() == JSON_ERROR_NONE); default: - return $value; + return false; } } diff --git a/tests/Feature/CompanySettingsTest.php b/tests/Feature/CompanySettingsTest.php index 88db0779f9b7..30fedf1f37b8 100644 --- a/tests/Feature/CompanySettingsTest.php +++ b/tests/Feature/CompanySettingsTest.php @@ -22,7 +22,7 @@ use Tests\TestCase; /** * @test - * @covers App\Utils\Traits\CompanySettingsSaver + * @covers App\Utils\Traits\SettingsSaver */ class CompanySettingsTest extends TestCase {