diff --git a/app/Api/V2/Controllers/Autocomplete/AccountController.php b/app/Api/V2/Controllers/Autocomplete/AccountController.php index 0ed4ada106..3f583d3ca3 100644 --- a/app/Api/V2/Controllers/Autocomplete/AccountController.php +++ b/app/Api/V2/Controllers/Autocomplete/AccountController.php @@ -55,8 +55,8 @@ class AccountController extends Controller $userGroup = $this->validateUserGroup($request); $this->repository = app(AccountRepositoryInterface::class); $this->repository->setUserGroup($userGroup); - $this->default = app('amount')->getDefaultCurrency(); - $this->converter = app(ExchangeRateConverter::class); + $this->default = app('amount')->getDefaultCurrency(); + $this->converter = app(ExchangeRateConverter::class); return $next($request); } @@ -64,18 +64,15 @@ class AccountController extends Controller } /** - * Documentation for this endpoint: - * TODO list of checks - * 1. use dates from ParameterBag - * 2. Request validates dates - * 3. Request includes user_group_id - * 4. Endpoint is documented. - * 5. Collector uses user_group_id + * Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getAccountsAC + * @param AutocompleteRequest $request + * + * @return JsonResponse */ public function accounts(AutocompleteRequest $request): JsonResponse { $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 = []; /** @var Account $account */ @@ -94,12 +91,12 @@ class AccountController extends Controller 'id' => (string) $account->id, 'title' => $account->name, 'meta' => [ - 'type' => $account->accountType->type, - 'currency_id' => null === $currency ? null : (string) $currency->id, - 'currency_code' => $currency?->code, - 'currency_symbol' => $currency?->symbol, - 'currency_decimal' => $currency?->decimal_places, - 'account_balances' => $this->getAccountBalances($account), + 'type' => $account->accountType->type, + 'currency_id' => null === $currency ? null : (string) $currency->id, + 'currency_code' => $currency?->code, + 'currency_symbol' => $currency?->symbol, + 'currency_decimal_places' => $currency?->decimal_places, + 'account_balances' => $this->getAccountBalances($account), ], ]; } @@ -129,17 +126,17 @@ class AccountController extends Controller $currency = $balance->transactionCurrency; return [ - 'title' => $balance->title, - 'native_amount' => $this->converter->convert($currency, $this->default, today(), $balance->balance), - 'amount' => app('steam')->bcround($balance->balance, $currency->decimal_places), - 'currency_id' => (string) $currency->id, - 'currency_code' => $currency->code, - 'currency_symbol' => $currency->symbol, - 'currency_decimal_places' => $currency->decimal_places, - 'native_currency_id' => (string) $this->default->id, - 'native_currency_code' => $this->default->code, - 'native_currency_symbol' => $this->default->symbol, - 'native_currency_decimal' => $this->default->decimal_places, + 'title' => $balance->title, + 'native_amount' => $this->converter->convert($currency, $this->default, today(), $balance->balance), + 'amount' => app('steam')->bcround($balance->balance, $currency->decimal_places), + 'currency_id' => (string) $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'native_currency_id' => (string) $this->default->id, + 'native_currency_code' => $this->default->code, + 'native_currency_symbol' => $this->default->symbol, + 'native_currency_decimal_places' => $this->default->decimal_places, ]; } } diff --git a/app/Api/V2/Controllers/Autocomplete/CategoryController.php b/app/Api/V2/Controllers/Autocomplete/CategoryController.php index cb4abf6fe5..cf0d761e07 100644 --- a/app/Api/V2/Controllers/Autocomplete/CategoryController.php +++ b/app/Api/V2/Controllers/Autocomplete/CategoryController.php @@ -53,13 +53,10 @@ class CategoryController extends Controller } /** - * Documentation for this endpoint: - * TODO list of checks - * 1. use dates from ParameterBag - * 2. Request validates dates - * 3. Request includes user_group_id - * 4. Endpoint is documented. - * 5. Collector uses user_group_id + * Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getCategoriesAC + * @param AutocompleteRequest $request + * + * @return JsonResponse */ public function categories(AutocompleteRequest $request): JsonResponse { diff --git a/app/Api/V2/Controllers/Autocomplete/TagController.php b/app/Api/V2/Controllers/Autocomplete/TagController.php index 5762cc2249..58a0864731 100644 --- a/app/Api/V2/Controllers/Autocomplete/TagController.php +++ b/app/Api/V2/Controllers/Autocomplete/TagController.php @@ -53,13 +53,10 @@ class TagController extends Controller } /** - * Documentation for this endpoint: - * TODO list of checks - * 1. use dates from ParameterBag - * 2. Request validates dates - * 3. Request includes user_group_id - * 4. Endpoint is documented. - * 5. Collector uses user_group_id + * Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getTagsAC + * @param AutocompleteRequest $request + * + * @return JsonResponse */ public function tags(AutocompleteRequest $request): JsonResponse { diff --git a/app/Api/V2/Controllers/Autocomplete/TransactionController.php b/app/Api/V2/Controllers/Autocomplete/TransactionController.php index 85fe587d1c..2e5a488855 100644 --- a/app/Api/V2/Controllers/Autocomplete/TransactionController.php +++ b/app/Api/V2/Controllers/Autocomplete/TransactionController.php @@ -53,13 +53,10 @@ class TransactionController extends Controller } /** - * Documentation for this endpoint: - * TODO list of checks - * 1. use dates from ParameterBag - * 2. Request validates dates - * 3. Request includes user_group_id - * 4. Endpoint is documented. - * 5. Collector uses user_group_id + * Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getTransactionsAC + * @param AutocompleteRequest $request + * + * @return JsonResponse */ public function transactionDescriptions(AutocompleteRequest $request): JsonResponse { diff --git a/app/Api/V2/Controllers/Chart/AccountController.php b/app/Api/V2/Controllers/Chart/AccountController.php index 109751e091..ecbf54952c 100644 --- a/app/Api/V2/Controllers/Chart/AccountController.php +++ b/app/Api/V2/Controllers/Chart/AccountController.php @@ -27,7 +27,6 @@ namespace FireflyIII\Api\V2\Controllers\Chart; use Carbon\Carbon; use FireflyIII\Api\V2\Controllers\Controller; use FireflyIII\Api\V2\Request\Chart\DashboardChartRequest; -use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; @@ -47,7 +46,6 @@ class AccountController extends Controller use ValidatesUserGroupTrait; private AccountRepositoryInterface $repository; - protected array $acceptedRoles = [UserRoleEnum::READ_ONLY]; public function __construct() { @@ -75,7 +73,6 @@ class AccountController extends Controller * * @throws FireflyException * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function dashboard(DashboardChartRequest $request): JsonResponse { diff --git a/app/Api/V2/Request/Autocomplete/AutocompleteRequest.php b/app/Api/V2/Request/Autocomplete/AutocompleteRequest.php index 0d340b405c..c5027aa2d4 100644 --- a/app/Api/V2/Request/Autocomplete/AutocompleteRequest.php +++ b/app/Api/V2/Request/Autocomplete/AutocompleteRequest.php @@ -27,14 +27,13 @@ use Carbon\Carbon; use Carbon\Exceptions\InvalidFormatException; use FireflyIII\JsonApi\Rules\IsValidFilter; use FireflyIII\JsonApi\Rules\IsValidPage; -use FireflyIII\Models\AccountType; use FireflyIII\Support\Http\Api\AccountFilter; use FireflyIII\Support\Request\ChecksLogin; use FireflyIII\Support\Request\ConvertsDataTypes; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Support\Facades\Log; use LaravelJsonApi\Core\Query\QueryParameters; use LaravelJsonApi\Validation\Rule as JsonApiRule; -use Illuminate\Support\Facades\Log; /** * Class AutocompleteRequest @@ -61,9 +60,12 @@ class AutocompleteRequest extends FormRequest Log::debug(sprintf('Invalid date format in autocomplete request. Using today: %s', $e->getMessage())); $date = today(); } - $query = $queryParameters->filter()?->value('query', '') ?? ''; - $size = (int) ($queryParameters->page()['size'] ?? 50); - $accountTypes = $this->getAccountTypeParameter($queryParameters->filter()?->value('account_types', '') ?? ''); + $query = $queryParameters->filter()?->value('query', []) ?? []; + $query = is_string($query) ? [$query] : $query; + $size = (int) ($queryParameters->page()['size'] ?? 50); + $accountTypeRequest = $queryParameters->filter()?->value('account_types', []) ?? []; + $accountTypeRequest = is_string($accountTypeRequest) ? [$accountTypeRequest] : $accountTypeRequest; + $accountTypes = $this->getAccountTypeParameter($accountTypeRequest); return [ '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 { diff --git a/app/Repositories/UserGroups/Account/AccountRepository.php b/app/Repositories/UserGroups/Account/AccountRepository.php index 32d3d266d2..615df5fcde 100644 --- a/app/Repositories/UserGroups/Account/AccountRepository.php +++ b/app/Repositories/UserGroups/Account/AccountRepository.php @@ -292,7 +292,7 @@ class AccountRepository implements AccountRepositoryInterface 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 $dbQuery = $this->userGroup->accounts() @@ -302,14 +302,17 @@ class AccountRepository implements AccountRepositoryInterface ->orderBy('accounts.name', 'ASC') ->with(['accountType']) ; - if ('' !== $query) { + if (count($query) > 0) { // split query on spaces just in case: - // TODO this will always fail because it searches for AND. - $parts = explode(' ', $query); - foreach ($parts as $part) { - $search = sprintf('%%%s%%', $part); - $dbQuery->where('name', 'LIKE', $search); - } + $dbQuery->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); + } + } + }); } if (0 !== count($types)) { $dbQuery->leftJoin('account_types', 'accounts.account_type_id', '=', 'account_types.id'); diff --git a/app/Repositories/UserGroups/Account/AccountRepositoryInterface.php b/app/Repositories/UserGroups/Account/AccountRepositoryInterface.php index 0374ed2174..dfcd0b6f3f 100644 --- a/app/Repositories/UserGroups/Account/AccountRepositoryInterface.php +++ b/app/Repositories/UserGroups/Account/AccountRepositoryInterface.php @@ -80,7 +80,7 @@ interface AccountRepositoryInterface */ 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; diff --git a/app/Repositories/UserGroups/Category/CategoryRepository.php b/app/Repositories/UserGroups/Category/CategoryRepository.php index fb31ebd368..3223b70fed 100644 --- a/app/Repositories/UserGroups/Category/CategoryRepository.php +++ b/app/Repositories/UserGroups/Category/CategoryRepository.php @@ -24,17 +24,27 @@ declare(strict_types=1); namespace FireflyIII\Repositories\UserGroups\Category; use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait; +use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Support\Collection; class CategoryRepository implements CategoryRepositoryInterface { use UserGroupTrait; - public function searchCategory(string $query, int $limit): Collection + public function searchCategory(array $query, int $limit): Collection { $search = $this->userGroup->categories(); - if ('' !== $query) { - $search->where('name', 'LIKE', sprintf('%%%s%%', $query)); + if (count($query) > 0) { + // 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(); diff --git a/app/Repositories/UserGroups/Category/CategoryRepositoryInterface.php b/app/Repositories/UserGroups/Category/CategoryRepositoryInterface.php index cd60c32523..60e374b909 100644 --- a/app/Repositories/UserGroups/Category/CategoryRepositoryInterface.php +++ b/app/Repositories/UserGroups/Category/CategoryRepositoryInterface.php @@ -30,5 +30,5 @@ interface CategoryRepositoryInterface /** * 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; } diff --git a/app/Repositories/UserGroups/Journal/JournalRepository.php b/app/Repositories/UserGroups/Journal/JournalRepository.php index 3d9a77b6c8..3b6a925730 100644 --- a/app/Repositories/UserGroups/Journal/JournalRepository.php +++ b/app/Repositories/UserGroups/Journal/JournalRepository.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\Repositories\UserGroups\Journal; use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait; +use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Support\Collection; /** @@ -33,15 +34,24 @@ class JournalRepository implements JournalRepositoryInterface { 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') ; - if ('' !== $search) { - $query->where('description', 'LIKE', sprintf('%%%s%%', $search)); + if (count($query) > 0) { + // 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(); } } diff --git a/app/Repositories/UserGroups/Journal/JournalRepositoryInterface.php b/app/Repositories/UserGroups/Journal/JournalRepositoryInterface.php index 7e2c8c0c72..942a066e8a 100644 --- a/app/Repositories/UserGroups/Journal/JournalRepositoryInterface.php +++ b/app/Repositories/UserGroups/Journal/JournalRepositoryInterface.php @@ -34,7 +34,7 @@ interface JournalRepositoryInterface /** * 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; } diff --git a/app/Repositories/UserGroups/Tag/TagRepository.php b/app/Repositories/UserGroups/Tag/TagRepository.php index f455989de0..487902bf32 100644 --- a/app/Repositories/UserGroups/Tag/TagRepository.php +++ b/app/Repositories/UserGroups/Tag/TagRepository.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\Repositories\UserGroups\Tag; use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait; +use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Support\Collection; /** @@ -33,11 +34,20 @@ class TagRepository implements TagRepositoryInterface { use UserGroupTrait; - public function searchTag(string $query, int $limit): Collection + public function searchTag(array $query, int $limit): Collection { - $search = $this->user->tags(); - if ('' !== $query) { - $search->where('tag', 'LIKE', sprintf('%%%s%%', $query)); + $search = $this->userGroup->tags(); + if (count($query) > 0) { + // 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.*']); diff --git a/app/Repositories/UserGroups/Tag/TagRepositoryInterface.php b/app/Repositories/UserGroups/Tag/TagRepositoryInterface.php index e001333113..d7e849c512 100644 --- a/app/Repositories/UserGroups/Tag/TagRepositoryInterface.php +++ b/app/Repositories/UserGroups/Tag/TagRepositoryInterface.php @@ -30,5 +30,5 @@ interface TagRepositoryInterface /** * 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; }