From 93a03386780a37613cd41770913dfa0b649c2a23 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 23 Jul 2020 19:34:17 +0200 Subject: [PATCH] Expand autocomplete for #3150 --- .../Autocomplete/TransactionController.php | 54 +++++++++++++++++-- routes/api.php | 1 + 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/app/Api/V1/Controllers/Autocomplete/TransactionController.php b/app/Api/V1/Controllers/Autocomplete/TransactionController.php index 5f8277fea3..5ec26f3b7e 100644 --- a/app/Api/V1/Controllers/Autocomplete/TransactionController.php +++ b/app/Api/V1/Controllers/Autocomplete/TransactionController.php @@ -28,8 +28,10 @@ use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; +use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; use FireflyIII\User; use Illuminate\Http\JsonResponse; +use Illuminate\Support\Collection; /** * Class TransactionController @@ -37,7 +39,8 @@ use Illuminate\Http\JsonResponse; class TransactionController extends Controller { - private JournalRepositoryInterface $repository; + private JournalRepositoryInterface $repository; + private TransactionGroupRepositoryInterface $groupRepository; /** * TransactionController constructor. @@ -48,9 +51,11 @@ class TransactionController extends Controller $this->middleware( function ($request, $next) { /** @var User $user */ - $user = auth()->user(); - $this->repository = app(JournalRepositoryInterface::class); + $user = auth()->user(); + $this->repository = app(JournalRepositoryInterface::class); + $this->groupRepository = app(TransactionGroupRepositoryInterface::class); $this->repository->setUser($user); + $this->groupRepository->setUser($user); return $next($request); } @@ -83,4 +88,47 @@ class TransactionController extends Controller return response()->json($array); } + + /** + * Searches in the titles of all transaction journals. + * The result is limited to the top 15 unique results. + * + * If the query is numeric, it will append the journal with that particular ID. + * + * @param AutocompleteRequest $request + * + * @return JsonResponse + */ + public function allJournalsWithID(AutocompleteRequest $request): JsonResponse + { + $data = $request->getData(); + $array = []; + $result = new Collection; + + + if (is_numeric($data['query'])) { + // search for group, not journal. + $firstResult = $this->groupRepository->find((int) $data['query']); + if (null !== $firstResult) { + // group may contain multiple journals, each a result: + foreach ($firstResult->transactionJournals as $journal) { + $result->push($journal); + } + } + } + if (!is_numeric($data['query'])) { + $result = $this->repository->searchJournalDescriptions($data['query'], $data['limit']); + } + + /** @var TransactionJournal $journal */ + foreach ($result as $journal) { + $array[] = [ + 'id' => $journal->id, + 'name' => printf('#%d: %s', $journal->id, $journal->description), + 'description' => $journal->description, + ]; + } + + return response()->json($array); + } } diff --git a/routes/api.php b/routes/api.php index c99ea380e6..cec3f11385 100644 --- a/routes/api.php +++ b/routes/api.php @@ -72,6 +72,7 @@ Route::group( Route::get('piggy-banks-with-balance', ['uses' => 'PiggyBankController@piggyBanksWithBalance', 'as' => 'piggy-banks-with-balance']); Route::get('tags', ['uses' => 'TagController@tags', 'as' => 'tags']); Route::get('transactions', ['uses' => 'TransactionController@transactions', 'as' => 'transactions']); + Route::get('transactions-with-id', ['uses' => 'TransactionController@transactionsWithID', 'as' => 'transactions-with-id']); Route::get('transaction-types', ['uses' => 'TransactionTypeController@transactionTypes', 'as' => 'transaction-types']); } );