diff --git a/app/Api/V1/Controllers/ConfigurationController.php b/app/Api/V1/Controllers/ConfigurationController.php index c21b430b0c..b3b3ab803f 100644 --- a/app/Api/V1/Controllers/ConfigurationController.php +++ b/app/Api/V1/Controllers/ConfigurationController.php @@ -23,12 +23,12 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers; +use FireflyIII\Api\V1\Requests\ConfigurationRequest; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Configuration; use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\User; use Illuminate\Http\JsonResponse; -use Illuminate\Http\Request; /** * Class ConfigurationController. @@ -78,31 +78,17 @@ class ConfigurationController extends Controller /** * Update the configuration. * - * @param Request $request + * @param ConfigurationRequest $request + * @param string $name * * @return JsonResponse * @throws FireflyException * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function update(Request $request): JsonResponse + public function update(ConfigurationRequest $request, string $name): JsonResponse { - $name = $request->get('name'); - $value = $request->get('value'); - $valid = ['is_demo_site', 'permission_update_check', 'single_user_mode']; - if (!\in_array($name, $valid, true)) { - throw new FireflyException('You cannot edit this configuration value.'); - } - $configValue = ''; - switch ($name) { - case 'is_demo_site': - case 'single_user_mode': - $configValue = 'true' === $value; - break; - case 'permission_update_check': - $configValue = (int)$value >= -1 && (int)$value <= 1 ? (int)$value : -1; - break; - } - app('fireflyconfig')->set($name, $configValue); + $data = $request->getAll(); + app('fireflyconfig')->set($name, $data['value']); $configData = $this->getConfigData(); return response()->json(['data' => $configData], 200)->header('Content-Type', 'application/vnd.api+json'); diff --git a/app/Api/V1/Requests/ConfigurationRequest.php b/app/Api/V1/Requests/ConfigurationRequest.php new file mode 100644 index 0000000000..b22491dfa6 --- /dev/null +++ b/app/Api/V1/Requests/ConfigurationRequest.php @@ -0,0 +1,83 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Api\V1\Requests; + +use FireflyIII\Rules\IsBoolean; + +/** + * Class ConfigurationRequest + */ +class ConfigurationRequest extends Request +{ + + /** + * Authorize logged in users. + * + * @return bool + */ + public function authorize(): bool + { + // Only allow authenticated users + return auth()->check(); + } + + /** + * Get all data from the request. + * + * @return array + */ + public function getAll(): array + { + $name = $this->route()->parameter('configName'); + switch ($name) { + case 'is_demo_site': + case 'single_user_mode': + return ['value' => $this->boolean('value')]; + case 'permission_update_check': + return ['value' => $this->integer('value')]; + } + + return ['value' => $this->string('value')]; + } + + /** + * The rules that the incoming request must be matched against. + * + * @return array + */ + public function rules(): array + { + $name = $this->route()->parameter('configName'); + switch ($name) { + case 'is_demo_site': + case 'single_user_mode': + return ['value' => ['required', new IsBoolean]]; + case 'permission_update_check': + return ['value' => 'required|numeric|between:-1,1']; + } + + return ['value' => 'required']; + } +} diff --git a/app/Support/Binder/ConfigurationName.php b/app/Support/Binder/ConfigurationName.php new file mode 100644 index 0000000000..f075f0d9f2 --- /dev/null +++ b/app/Support/Binder/ConfigurationName.php @@ -0,0 +1,51 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Support\Binder; + + +use Illuminate\Routing\Route; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; + +/** + * Class ConfigurationName + */ +class ConfigurationName implements BinderInterface +{ + + /** + * @param string $value + * @param Route $route + * + * @return string + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException + */ + public static function routeBinder(string $value, Route $route): string + { + $accepted = ['is_demo_site', 'permission_update_check', 'single_user_mode']; + if (\in_array($value, $accepted, true)) { + return $value; + } + throw new NotFoundHttpException; + } +} \ No newline at end of file diff --git a/config/firefly.php b/config/firefly.php index 7ff78eeee1..50d2aa7994 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -326,6 +326,7 @@ return [ 'unfinishedJournal' => \FireflyIII\Support\Binder\UnfinishedJournal::class, 'cliToken' => \FireflyIII\Support\Binder\CLIToken::class, 'tagOrId' => \FireflyIII\Support\Binder\TagOrId::class, + 'configName' => \FireflyIII\Support\Binder\ConfigurationName::class, ], diff --git a/routes/api.php b/routes/api.php index a522de9f89..352c58e0a9 100644 --- a/routes/api.php +++ b/routes/api.php @@ -130,7 +130,7 @@ Route::group( // Configuration API routes: Route::get('', ['uses' => 'ConfigurationController@index', 'as' => 'index']); - Route::post('', ['uses' => 'ConfigurationController@update', 'as' => 'update']); + Route::post('{configName}', ['uses' => 'ConfigurationController@update', 'as' => 'update']); } );