Clean up API routes

This commit is contained in:
James Cole 2024-10-20 17:55:06 +02:00
parent 6ff84b8e90
commit acadc89eaa
No known key found for this signature in database
GPG Key ID: B49A324B7EAD6D80
5 changed files with 69 additions and 94 deletions

View File

@ -49,7 +49,7 @@ class AutocompleteRequest extends FormRequest
public function getParameters(): array public function getParameters(): array
{ {
$array = [ $array = [
'date' => $this->date('date'), 'date' => $this->convertDateTime('date'),
'query' => $this->clearString((string) $this->get('query')), 'query' => $this->clearString((string) $this->get('query')),
'size' => $this->integerFromValue('size'), 'size' => $this->integerFromValue('size'),
'page' => $this->integerFromValue('page'), 'page' => $this->integerFromValue('page'),

View File

@ -24,8 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V2\Request\Chart; namespace FireflyIII\Api\V2\Request\Chart;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\JsonApi\Rules\IsValidFilter;
use FireflyIII\Rules\IsFilterValueIn;
use FireflyIII\Support\Http\Api\ParsesQueryFilters; use FireflyIII\Support\Http\Api\ParsesQueryFilters;
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use FireflyIII\Support\Request\ChecksLogin; use FireflyIII\Support\Request\ChecksLogin;
@ -33,8 +31,6 @@ use FireflyIII\Support\Request\ConvertsDataTypes;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Validation\Validator; use Illuminate\Validation\Validator;
use LaravelJsonApi\Core\Query\QueryParameters;
use LaravelJsonApi\Validation\Rule as JsonApiRule;
/** /**
* Class ChartRequest * Class ChartRequest
@ -50,52 +46,29 @@ class ChartRequest extends FormRequest
public function getParameters(): array public function getParameters(): array
{ {
$queryParameters = QueryParameters::cast($this->all()); //$queryParameters = QueryParameters::cast($this->all());
return [ return [
'start' => $this->dateOrToday($queryParameters, 'start')->startOfDay(), 'start' => $this->convertDateTime('start')?->startOfDay(),
'end' => $this->dateOrToday($queryParameters, 'end')->endOfDay(), 'end' => $this->convertDateTime('end')?->endOfDay(),
'preselected' => $this->stringFromQueryParams($queryParameters, 'preselected', 'empty'), 'preselected' => $this->convertString('preselected', 'empty'),
'period' => $this->stringFromFilterParams($queryParameters, 'period', '1M'), 'period' => $this->convertString('period', '1M'),
'accounts' => $this->arrayOfStrings($queryParameters, 'accounts'), 'accounts' => $this->arrayFromValue($this->get('accounts')),
// preselected heeft maar een paar toegestane waardes, dat moet ook goed gaan.
// 'query' => $this->arrayOfStrings($queryParameters, 'query'),
// 'size' => $this->integerFromQueryParams($queryParameters,'size', 50),
// 'account_types' => $this->getAccountTypeParameter($this->arrayOfStrings($queryParameters, 'account_types')),
]; ];
// collect accounts based on this list?
} }
// return [
// 'accounts' => $this->getAccountList(),
// 'preselected' => $this->convertString('preselected'),
// ];
// }
/** /**
* The rules that the incoming request must be matched against. * The rules that the incoming request must be matched against.
*/ */
public function rules(): array public function rules(): array
{ {
return [ return [
'fields' => JsonApiRule::notSupported(), 'start' => 'required|date|after:1900-01-01|before:2099-12-31|before_or_equal:end',
'filter' => ['nullable', 'array', 'end' => 'required|date|after:1900-01-01|before:2099-12-31|after_or_equal:start',
new IsValidFilter(['start', 'end', 'preselected', 'accounts', 'period']), 'preselected' => sprintf('nullable|in:%s', implode(',', config('firefly.preselected_accounts'))),
new IsFilterValueIn('preselected', config('firefly.preselected_accounts')), 'period' => sprintf('nullable|in:%s', implode(',', config('firefly.valid_view_ranges'))),
], 'accounts.*' => 'exists:accounts,id',
'include' => JsonApiRule::notSupported(),
'page' => JsonApiRule::notSupported(),
'sort' => JsonApiRule::notSupported(),
// 'start' => 'required|date|after:1900-01-01|before:2099-12-31',
// 'end' => 'required|date|after_or_equal:start|before:2099-12-31|after:1900-01-01',
]; ];
// return [
// 'start' => 'required|date|after:1900-01-01|before:2099-12-31',
// 'end' => 'required|date|after_or_equal:start|before:2099-12-31|after:1900-01-01',
// 'preselected' => sprintf('in:%s', implode(',', config('firefly.preselected_accounts'))),
// 'accounts.*' => 'exists:accounts,id',
// ];
} }
public function withValidator(Validator $validator): void public function withValidator(Validator $validator): void

View File

@ -36,10 +36,12 @@ trait CollectsAccountsFromFilter
$collection = new Collection(); $collection = new Collection();
// always collect from the query parameter, even when it's empty. // always collect from the query parameter, even when it's empty.
foreach ($queryParameters['accounts'] as $accountId) { if (null !== $queryParameters['accounts']) {
$account = $this->repository->find((int) $accountId); foreach ($queryParameters['accounts'] as $accountId) {
if (null !== $account) { $account = $this->repository->find((int) $accountId);
$collection->push($account); if (null !== $account) {
$collection->push($account);
}
} }
} }

View File

@ -105,11 +105,11 @@ trait ConvertsDataTypes
/** /**
* Return string value. * Return string value.
*/ */
public function convertString(string $field): string public function convertString(string $field, string $default = ''): string
{ {
$entry = $this->get($field); $entry = $this->get($field);
if (!is_scalar($entry)) { if (!is_scalar($entry)) {
return ''; return $default;
} }
return (string)$this->clearString((string)$entry); return (string)$this->clearString((string)$entry);

View File

@ -47,9 +47,9 @@ Route::group(
], ],
static function (): void { static function (): void {
Route::get('accounts', ['uses' => 'AccountController@accounts', 'as' => 'accounts']); Route::get('accounts', ['uses' => 'AccountController@accounts', 'as' => 'accounts']);
Route::get('categories', ['uses' => 'CategoryController@categories', 'as' => 'categories']); //Route::get('categories', ['uses' => 'CategoryController@categories', 'as' => 'categories']);
Route::get('tags', ['uses' => 'TagController@tags', 'as' => 'tags']); //Route::get('tags', ['uses' => 'TagController@tags', 'as' => 'tags']);
Route::get('transaction-descriptions', ['uses' => 'TransactionController@transactionDescriptions', 'as' => 'transaction-descriptions']); //Route::get('transaction-descriptions', ['uses' => 'TransactionController@transactionDescriptions', 'as' => 'transaction-descriptions']);
} }
); );
@ -58,12 +58,12 @@ Route::group(
[ [
'namespace' => 'FireflyIII\Api\V2\Controllers\Chart', 'namespace' => 'FireflyIII\Api\V2\Controllers\Chart',
'prefix' => 'v2/chart', 'prefix' => 'v2/chart',
'as' => 'api.v1.chart.', 'as' => 'api.v2.chart.',
], ],
static function (): void { static function (): void {
Route::get('account/dashboard', ['uses' => 'AccountController@dashboard', 'as' => 'account.dashboard']); //Route::get('account/dashboard', ['uses' => 'AccountController@dashboard', 'as' => 'account.dashboard']);
Route::get('budget/dashboard', ['uses' => 'BudgetController@dashboard', 'as' => 'budget.dashboard']); //Route::get('budget/dashboard', ['uses' => 'BudgetController@dashboard', 'as' => 'budget.dashboard']);
Route::get('category/dashboard', ['uses' => 'CategoryController@dashboard', 'as' => 'category.dashboard']); //Route::get('category/dashboard', ['uses' => 'CategoryController@dashboard', 'as' => 'category.dashboard']);
Route::get('balance/balance', ['uses' => 'BalanceController@balance', 'as' => 'balance.balance']); Route::get('balance/balance', ['uses' => 'BalanceController@balance', 'as' => 'balance.balance']);
} }
); );
@ -77,7 +77,7 @@ Route::group(
'as' => 'api.v2.summary.', 'as' => 'api.v2.summary.',
], ],
static function (): void { static function (): void {
Route::get('basic', ['uses' => 'BasicController@basic', 'as' => 'basic']); //Route::get('basic', ['uses' => 'BasicController@basic', 'as' => 'basic']);
} }
); );
// V2 API route for all kinds of Transaction lists. // V2 API route for all kinds of Transaction lists.
@ -91,11 +91,11 @@ Route::group(
], ],
static function (): void { static function (): void {
// basic list // basic list
Route::get('transactions', ['uses' => 'TransactionController@list', 'as' => 'transactions.list']); //Route::get('transactions', ['uses' => 'TransactionController@list', 'as' => 'transactions.list']);
// list by parent or related object. // list by parent or related object.
// note how the check is done on the user group, not the user itself. // note how the check is done on the user group, not the user itself.
Route::get('accounts/{userGroupAccount}/transactions', ['uses' => 'AccountController@list', 'as' => 'accounts.transactions']); //Route::get('accounts/{userGroupAccount}/transactions', ['uses' => 'AccountController@list', 'as' => 'accounts.transactions']);
} }
); );
@ -109,7 +109,7 @@ Route::group(
'as' => 'api.v2.net-worth.', 'as' => 'api.v2.net-worth.',
], ],
static function (): void { static function (): void {
Route::get('', ['uses' => 'NetWorthController@get', 'as' => 'index']); //Route::get('', ['uses' => 'NetWorthController@get', 'as' => 'index']);
} }
); );
@ -135,10 +135,10 @@ Route::group(
'as' => 'api.v2.subscriptions.', 'as' => 'api.v2.subscriptions.',
], ],
static function (): void { static function (): void {
Route::get('', ['uses' => 'IndexController@index', 'as' => 'index']); // Route::get('', ['uses' => 'IndexController@index', 'as' => 'index']);
Route::get('{userGroupBill}', ['uses' => 'ShowController@show', 'as' => 'show']); // Route::get('{userGroupBill}', ['uses' => 'ShowController@show', 'as' => 'show']);
Route::get('sum/paid', ['uses' => 'SumController@paid', 'as' => 'sum.paid']); // Route::get('sum/paid', ['uses' => 'SumController@paid', 'as' => 'sum.paid']);
Route::get('sum/unpaid', ['uses' => 'SumController@unpaid', 'as' => 'sum.unpaid']); // Route::get('sum/unpaid', ['uses' => 'SumController@unpaid', 'as' => 'sum.unpaid']);
} }
); );
@ -150,7 +150,7 @@ Route::group(
'as' => 'api.v2.piggy-banks.', 'as' => 'api.v2.piggy-banks.',
], ],
static function (): void { static function (): void {
Route::get('', ['uses' => 'IndexController@index', 'as' => 'index']); // Route::get('', ['uses' => 'IndexController@index', 'as' => 'index']);
} }
); );
@ -162,7 +162,7 @@ Route::group(
'as' => 'api.v2.currencies.', 'as' => 'api.v2.currencies.',
], ],
static function (): void { static function (): void {
Route::get('', ['uses' => 'IndexController@index', 'as' => 'index']); // Route::get('', ['uses' => 'IndexController@index', 'as' => 'index']);
} }
); );
@ -174,9 +174,9 @@ Route::group(
'as' => 'api.v2.transactions.', 'as' => 'api.v2.transactions.',
], ],
static function (): void { static function (): void {
Route::post('', ['uses' => 'StoreController@post', 'as' => 'store']); // Route::post('', ['uses' => 'StoreController@post', 'as' => 'store']);
Route::get('{userGroupTransaction}', ['uses' => 'ShowController@show', 'as' => 'show']); // Route::get('{userGroupTransaction}', ['uses' => 'ShowController@show', 'as' => 'show']);
Route::put('{userGroupTransaction}', ['uses' => 'UpdateController@update', 'as' => 'update']); // Route::put('{userGroupTransaction}', ['uses' => 'UpdateController@update', 'as' => 'update']);
} }
); );
// infinite (transactions) list: // infinite (transactions) list:
@ -187,7 +187,7 @@ Route::group(
'as' => 'api.v2.infinite.transactions.', 'as' => 'api.v2.infinite.transactions.',
], ],
static function (): void { static function (): void {
Route::get('', ['uses' => 'TransactionController@infiniteList', 'as' => 'list']); // Route::get('', ['uses' => 'TransactionController@infiniteList', 'as' => 'list']);
} }
); );
@ -199,11 +199,11 @@ Route::group(
'as' => 'api.v2.budgets', 'as' => 'api.v2.budgets',
], ],
static function (): void { static function (): void {
Route::get('', ['uses' => 'Budget\IndexController@index', 'as' => 'index']); // Route::get('', ['uses' => 'Budget\IndexController@index', 'as' => 'index']);
Route::get('{budget}', ['uses' => 'Budget\ShowController@show', 'as' => 'show']); // Route::get('{budget}', ['uses' => 'Budget\ShowController@show', 'as' => 'show']);
Route::get('{budget}/limits', ['uses' => 'BudgetLimit\IndexController@index', 'as' => 'budget-limits.index']); // Route::get('{budget}/limits', ['uses' => 'BudgetLimit\IndexController@index', 'as' => 'budget-limits.index']);
Route::get('sum/budgeted', ['uses' => 'Budget\SumController@budgeted', 'as' => 'sum.budgeted']); // Route::get('sum/budgeted', ['uses' => 'Budget\SumController@budgeted', 'as' => 'sum.budgeted']);
Route::get('sum/spent', ['uses' => 'Budget\SumController@spent', 'as' => 'sum.spent']); // Route::get('sum/spent', ['uses' => 'Budget\SumController@spent', 'as' => 'sum.spent']);
// Route::get('{budget}/budgeted', ['uses' => 'Budget\ShowController@budgeted', 'as' => 'budget.budgeted']); // Route::get('{budget}/budgeted', ['uses' => 'Budget\ShowController@budgeted', 'as' => 'budget.budgeted']);
// Route::get('{budget}/spent', ['uses' => 'Budget\ShowController@spent', 'as' => 'budget.spent']); // Route::get('{budget}/spent', ['uses' => 'Budget\ShowController@spent', 'as' => 'budget.spent']);
} }
@ -217,7 +217,7 @@ Route::group(
'as' => 'api.v2.system.', 'as' => 'api.v2.system.',
], ],
static function (): void { static function (): void {
Route::get('preferences/{preference}', ['uses' => 'PreferencesController@get', 'as' => 'preferences.get']); // Route::get('preferences/{preference}', ['uses' => 'PreferencesController@get', 'as' => 'preferences.get']);
} }
); );
@ -229,32 +229,32 @@ Route::group(
'as' => 'api.v2.user-groups.', 'as' => 'api.v2.user-groups.',
], ],
static function (): void { static function (): void {
Route::get('', ['uses' => 'IndexController@index', 'as' => 'index']); // Route::get('', ['uses' => 'IndexController@index', 'as' => 'index']);
Route::post('', ['uses' => 'StoreController@store', 'as' => 'store']); // Route::post('', ['uses' => 'StoreController@store', 'as' => 'store']);
Route::get('{userGroup}', ['uses' => 'ShowController@show', 'as' => 'show']); // Route::get('{userGroup}', ['uses' => 'ShowController@show', 'as' => 'show']);
Route::put('{userGroup}', ['uses' => 'UpdateController@update', 'as' => 'update']); // Route::put('{userGroup}', ['uses' => 'UpdateController@update', 'as' => 'update']);
Route::post('{userGroup}/use', ['uses' => 'UpdateController@useUserGroup', 'as' => 'use']); // Route::post('{userGroup}/use', ['uses' => 'UpdateController@useUserGroup', 'as' => 'use']);
Route::put('{userGroup}/update-membership', ['uses' => 'UpdateController@updateMembership', 'as' => 'updateMembership']); // Route::put('{userGroup}/update-membership', ['uses' => 'UpdateController@updateMembership', 'as' => 'updateMembership']);
Route::delete('{userGroup}', ['uses' => 'DestroyController@destroy', 'as' => 'destroy']); // Route::delete('{userGroup}', ['uses' => 'DestroyController@destroy', 'as' => 'destroy']);
} }
); );
// V2 JSON API ROUTES // V2 JSON API ROUTES
JsonApiRoute::server('v2')->prefix('v2') //JsonApiRoute::server('v2')->prefix('v2')
->resources(function (ResourceRegistrar $server): void { // ->resources(function (ResourceRegistrar $server): void {
// ACCOUNTS // // ACCOUNTS
$server->resource('accounts', AccountController::class) // $server->resource('accounts', AccountController::class)
->relationships(function (Relationships $relations): void { // ->relationships(function (Relationships $relations): void {
$relations->hasOne('user')->readOnly(); // $relations->hasOne('user')->readOnly();
}) // })
; // ;
//
// USERS // // USERS
$server->resource('users', JsonApiController::class)->readOnly()->relationships(function (Relationships $relations): void { // $server->resource('users', JsonApiController::class)->readOnly()->relationships(function (Relationships $relations): void {
$relations->hasMany('accounts')->readOnly(); // $relations->hasMany('accounts')->readOnly();
}); // });
}) // })
; //;
/* /*
* ____ ____ __ .______ ______ __ __ .___________. _______ _______. * ____ ____ __ .______ ______ __ __ .___________. _______ _______.