Expand config API endpoint.

This commit is contained in:
James Cole
2018-12-09 06:39:56 +01:00
parent 05b0425929
commit 2a68ce6c90
5 changed files with 142 additions and 21 deletions

View File

@@ -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');

View File

@@ -0,0 +1,83 @@
<?php
/**
* ConfigurationRequest.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
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'];
}
}

View File

@@ -0,0 +1,51 @@
<?php
/**
* ConfigurationName.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -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,
],

View File

@@ -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']);
}
);