Clean up API

This commit is contained in:
James Cole
2024-05-19 06:36:31 +02:00
parent 93324d1154
commit 6d143f1624
14 changed files with 100 additions and 102 deletions

View File

@@ -55,8 +55,8 @@ class AccountController extends Controller
$userGroup = $this->validateUserGroup($request); $userGroup = $this->validateUserGroup($request);
$this->repository = app(AccountRepositoryInterface::class); $this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUserGroup($userGroup); $this->repository->setUserGroup($userGroup);
$this->default = app('amount')->getDefaultCurrency(); $this->default = app('amount')->getDefaultCurrency();
$this->converter = app(ExchangeRateConverter::class); $this->converter = app(ExchangeRateConverter::class);
return $next($request); return $next($request);
} }
@@ -64,18 +64,15 @@ class AccountController extends Controller
} }
/** /**
* Documentation for this endpoint: * Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getAccountsAC
* TODO list of checks * @param AutocompleteRequest $request
* 1. use dates from ParameterBag *
* 2. Request validates dates * @return JsonResponse
* 3. Request includes user_group_id
* 4. Endpoint is documented.
* 5. Collector uses user_group_id
*/ */
public function accounts(AutocompleteRequest $request): JsonResponse public function accounts(AutocompleteRequest $request): JsonResponse
{ {
$queryParameters = $request->getParameters(); $queryParameters = $request->getParameters();
$result = $this->repository->searchAccount((string) $queryParameters['query'], $queryParameters['account_types'], $queryParameters['size']); $result = $this->repository->searchAccount($queryParameters['query'], $queryParameters['account_types'], $queryParameters['size']);
$return = []; $return = [];
/** @var Account $account */ /** @var Account $account */
@@ -94,12 +91,12 @@ class AccountController extends Controller
'id' => (string) $account->id, 'id' => (string) $account->id,
'title' => $account->name, 'title' => $account->name,
'meta' => [ 'meta' => [
'type' => $account->accountType->type, 'type' => $account->accountType->type,
'currency_id' => null === $currency ? null : (string) $currency->id, 'currency_id' => null === $currency ? null : (string) $currency->id,
'currency_code' => $currency?->code, 'currency_code' => $currency?->code,
'currency_symbol' => $currency?->symbol, 'currency_symbol' => $currency?->symbol,
'currency_decimal' => $currency?->decimal_places, 'currency_decimal_places' => $currency?->decimal_places,
'account_balances' => $this->getAccountBalances($account), 'account_balances' => $this->getAccountBalances($account),
], ],
]; ];
} }
@@ -129,17 +126,17 @@ class AccountController extends Controller
$currency = $balance->transactionCurrency; $currency = $balance->transactionCurrency;
return [ return [
'title' => $balance->title, 'title' => $balance->title,
'native_amount' => $this->converter->convert($currency, $this->default, today(), $balance->balance), 'native_amount' => $this->converter->convert($currency, $this->default, today(), $balance->balance),
'amount' => app('steam')->bcround($balance->balance, $currency->decimal_places), 'amount' => app('steam')->bcround($balance->balance, $currency->decimal_places),
'currency_id' => (string) $currency->id, 'currency_id' => (string) $currency->id,
'currency_code' => $currency->code, 'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol, 'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places, 'currency_decimal_places' => $currency->decimal_places,
'native_currency_id' => (string) $this->default->id, 'native_currency_id' => (string) $this->default->id,
'native_currency_code' => $this->default->code, 'native_currency_code' => $this->default->code,
'native_currency_symbol' => $this->default->symbol, 'native_currency_symbol' => $this->default->symbol,
'native_currency_decimal' => $this->default->decimal_places, 'native_currency_decimal_places' => $this->default->decimal_places,
]; ];
} }
} }

View File

@@ -53,13 +53,10 @@ class CategoryController extends Controller
} }
/** /**
* Documentation for this endpoint: * Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getCategoriesAC
* TODO list of checks * @param AutocompleteRequest $request
* 1. use dates from ParameterBag *
* 2. Request validates dates * @return JsonResponse
* 3. Request includes user_group_id
* 4. Endpoint is documented.
* 5. Collector uses user_group_id
*/ */
public function categories(AutocompleteRequest $request): JsonResponse public function categories(AutocompleteRequest $request): JsonResponse
{ {

View File

@@ -53,13 +53,10 @@ class TagController extends Controller
} }
/** /**
* Documentation for this endpoint: * Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getTagsAC
* TODO list of checks * @param AutocompleteRequest $request
* 1. use dates from ParameterBag *
* 2. Request validates dates * @return JsonResponse
* 3. Request includes user_group_id
* 4. Endpoint is documented.
* 5. Collector uses user_group_id
*/ */
public function tags(AutocompleteRequest $request): JsonResponse public function tags(AutocompleteRequest $request): JsonResponse
{ {

View File

@@ -53,13 +53,10 @@ class TransactionController extends Controller
} }
/** /**
* Documentation for this endpoint: * Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getTransactionsAC
* TODO list of checks * @param AutocompleteRequest $request
* 1. use dates from ParameterBag *
* 2. Request validates dates * @return JsonResponse
* 3. Request includes user_group_id
* 4. Endpoint is documented.
* 5. Collector uses user_group_id
*/ */
public function transactionDescriptions(AutocompleteRequest $request): JsonResponse public function transactionDescriptions(AutocompleteRequest $request): JsonResponse
{ {

View File

@@ -27,7 +27,6 @@ namespace FireflyIII\Api\V2\Controllers\Chart;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Api\V2\Controllers\Controller; use FireflyIII\Api\V2\Controllers\Controller;
use FireflyIII\Api\V2\Request\Chart\DashboardChartRequest; use FireflyIII\Api\V2\Request\Chart\DashboardChartRequest;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
@@ -47,7 +46,6 @@ class AccountController extends Controller
use ValidatesUserGroupTrait; use ValidatesUserGroupTrait;
private AccountRepositoryInterface $repository; private AccountRepositoryInterface $repository;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
public function __construct() public function __construct()
{ {
@@ -75,7 +73,6 @@ class AccountController extends Controller
* *
* @throws FireflyException * @throws FireflyException
* *
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/ */
public function dashboard(DashboardChartRequest $request): JsonResponse public function dashboard(DashboardChartRequest $request): JsonResponse
{ {

View File

@@ -27,14 +27,13 @@ use Carbon\Carbon;
use Carbon\Exceptions\InvalidFormatException; use Carbon\Exceptions\InvalidFormatException;
use FireflyIII\JsonApi\Rules\IsValidFilter; use FireflyIII\JsonApi\Rules\IsValidFilter;
use FireflyIII\JsonApi\Rules\IsValidPage; use FireflyIII\JsonApi\Rules\IsValidPage;
use FireflyIII\Models\AccountType;
use FireflyIII\Support\Http\Api\AccountFilter; use FireflyIII\Support\Http\Api\AccountFilter;
use FireflyIII\Support\Request\ChecksLogin; use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes; use FireflyIII\Support\Request\ConvertsDataTypes;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Log;
use LaravelJsonApi\Core\Query\QueryParameters; use LaravelJsonApi\Core\Query\QueryParameters;
use LaravelJsonApi\Validation\Rule as JsonApiRule; use LaravelJsonApi\Validation\Rule as JsonApiRule;
use Illuminate\Support\Facades\Log;
/** /**
* Class AutocompleteRequest * Class AutocompleteRequest
@@ -61,9 +60,12 @@ class AutocompleteRequest extends FormRequest
Log::debug(sprintf('Invalid date format in autocomplete request. Using today: %s', $e->getMessage())); Log::debug(sprintf('Invalid date format in autocomplete request. Using today: %s', $e->getMessage()));
$date = today(); $date = today();
} }
$query = $queryParameters->filter()?->value('query', '') ?? ''; $query = $queryParameters->filter()?->value('query', []) ?? [];
$size = (int) ($queryParameters->page()['size'] ?? 50); $query = is_string($query) ? [$query] : $query;
$accountTypes = $this->getAccountTypeParameter($queryParameters->filter()?->value('account_types', '') ?? ''); $size = (int) ($queryParameters->page()['size'] ?? 50);
$accountTypeRequest = $queryParameters->filter()?->value('account_types', []) ?? [];
$accountTypeRequest = is_string($accountTypeRequest) ? [$accountTypeRequest] : $accountTypeRequest;
$accountTypes = $this->getAccountTypeParameter($accountTypeRequest);
return [ return [
'date' => $date, 'date' => $date,
@@ -73,28 +75,6 @@ class AutocompleteRequest extends FormRequest
]; ];
} }
// public function getData(): array
// {
//
// return [];
// $types = $this->convertString('types');
// $array = [];
// if ('' !== $types) {
// $array = explode(',', $types);
// }
// $limit = $this->convertInteger('limit');
// $limit = 0 === $limit ? 10 : $limit;
//
// // remove 'initial balance' and another from allowed types. its internal
// $array = array_diff($array, [AccountType::INITIAL_BALANCE, AccountType::RECONCILIATION]);
//
// return [
// 'types' => $array,
// 'query' => $this->convertString('query'),
// 'date' => $this->getCarbonDate('date'),
// 'limit' => $limit,
// ];
// }
public function rules(): array public function rules(): array
{ {

View File

@@ -292,7 +292,7 @@ class AccountRepository implements AccountRepositoryInterface
return $query->get(['accounts.*']); return $query->get(['accounts.*']);
} }
public function searchAccount(string $query, array $types, int $limit): Collection public function searchAccount(array $query, array $types, int $limit): Collection
{ {
// search by group, not by user // search by group, not by user
$dbQuery = $this->userGroup->accounts() $dbQuery = $this->userGroup->accounts()
@@ -302,14 +302,17 @@ class AccountRepository implements AccountRepositoryInterface
->orderBy('accounts.name', 'ASC') ->orderBy('accounts.name', 'ASC')
->with(['accountType']) ->with(['accountType'])
; ;
if ('' !== $query) { if (count($query) > 0) {
// split query on spaces just in case: // split query on spaces just in case:
// TODO this will always fail because it searches for AND. $dbQuery->where(function (EloquentBuilder $q) use ($query) {
$parts = explode(' ', $query); foreach($query as $line) {
foreach ($parts as $part) { $parts = explode(' ', $line);
$search = sprintf('%%%s%%', $part); foreach($parts as $part) {
$dbQuery->where('name', 'LIKE', $search); $search = sprintf('%%%s%%', $part);
} $q->orWhere('name', 'LIKE',$search);
}
}
});
} }
if (0 !== count($types)) { if (0 !== count($types)) {
$dbQuery->leftJoin('account_types', 'accounts.account_type_id', '=', 'account_types.id'); $dbQuery->leftJoin('account_types', 'accounts.account_type_id', '=', 'account_types.id');

View File

@@ -80,7 +80,7 @@ interface AccountRepositoryInterface
*/ */
public function resetAccountOrder(): void; public function resetAccountOrder(): void;
public function searchAccount(string $query, array $types, int $limit): Collection; public function searchAccount(array $query, array $types, int $limit): Collection;
public function setUser(User $user): void; public function setUser(User $user): void;

View File

@@ -24,17 +24,27 @@ declare(strict_types=1);
namespace FireflyIII\Repositories\UserGroups\Category; namespace FireflyIII\Repositories\UserGroups\Category;
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait; use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
class CategoryRepository implements CategoryRepositoryInterface class CategoryRepository implements CategoryRepositoryInterface
{ {
use UserGroupTrait; use UserGroupTrait;
public function searchCategory(string $query, int $limit): Collection public function searchCategory(array $query, int $limit): Collection
{ {
$search = $this->userGroup->categories(); $search = $this->userGroup->categories();
if ('' !== $query) { if (count($query) > 0) {
$search->where('name', 'LIKE', sprintf('%%%s%%', $query)); // split query on spaces just in case:
$search->where(function (EloquentBuilder $q) use ($query) {
foreach($query as $line) {
$parts = explode(' ', $line);
foreach($parts as $part) {
$search = sprintf('%%%s%%', $part);
$q->orWhere('name', 'LIKE',$search);
}
}
});
} }
return $search->take($limit)->get(); return $search->take($limit)->get();

View File

@@ -30,5 +30,5 @@ interface CategoryRepositoryInterface
/** /**
* Search for a category using wild cards. Uses the database, so case sensitive. * Search for a category using wild cards. Uses the database, so case sensitive.
*/ */
public function searchCategory(string $query, int $limit): Collection; public function searchCategory(array $query, int $limit): Collection;
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Repositories\UserGroups\Journal; namespace FireflyIII\Repositories\UserGroups\Journal;
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait; use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
/** /**
@@ -33,15 +34,24 @@ class JournalRepository implements JournalRepositoryInterface
{ {
use UserGroupTrait; use UserGroupTrait;
public function searchJournalDescriptions(string $search, int $limit): Collection public function searchJournalDescriptions(array $query, int $limit): Collection
{ {
$query = $this->userGroup->transactionJournals() $search = $this->userGroup->transactionJournals()
->orderBy('date', 'DESC') ->orderBy('date', 'DESC')
; ;
if ('' !== $search) { if (count($query) > 0) {
$query->where('description', 'LIKE', sprintf('%%%s%%', $search)); // split query on spaces just in case:
$search->where(function (EloquentBuilder $q) use ($query) {
foreach ($query as $line) {
$parts = explode(' ', $line);
foreach ($parts as $part) {
$search = sprintf('%%%s%%', $part);
$q->orWhere('description', 'LIKE', $search);
}
}
});
} }
return $query->take($limit)->get(); return $search->take($limit)->get();
} }
} }

View File

@@ -34,7 +34,7 @@ interface JournalRepositoryInterface
/** /**
* Search in journal descriptions. * Search in journal descriptions.
*/ */
public function searchJournalDescriptions(string $search, int $limit): Collection; public function searchJournalDescriptions(array $query, int $limit): Collection;
public function setUser(User $user): void; public function setUser(User $user): void;
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Repositories\UserGroups\Tag; namespace FireflyIII\Repositories\UserGroups\Tag;
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait; use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
/** /**
@@ -33,11 +34,20 @@ class TagRepository implements TagRepositoryInterface
{ {
use UserGroupTrait; use UserGroupTrait;
public function searchTag(string $query, int $limit): Collection public function searchTag(array $query, int $limit): Collection
{ {
$search = $this->user->tags(); $search = $this->userGroup->tags();
if ('' !== $query) { if (count($query) > 0) {
$search->where('tag', 'LIKE', sprintf('%%%s%%', $query)); // split query on spaces just in case:
$search->where(function (EloquentBuilder $q) use ($query) {
foreach ($query as $line) {
$parts = explode(' ', $line);
foreach ($parts as $part) {
$search = sprintf('%%%s%%', $part);
$q->orWhere('tag', 'LIKE', $search);
}
}
});
} }
return $search->take($limit)->get(['tags.*']); return $search->take($limit)->get(['tags.*']);

View File

@@ -30,5 +30,5 @@ interface TagRepositoryInterface
/** /**
* Find one or more tags based on the query. * Find one or more tags based on the query.
*/ */
public function searchTag(string $query, int $limit): Collection; public function searchTag(array $query, int $limit): Collection;
} }