diff --git a/app/Api/V1/Controllers/Autocomplete/TransactionController.php b/app/Api/V1/Controllers/Autocomplete/TransactionController.php index 5ec26f3b7e..aedee46147 100644 --- a/app/Api/V1/Controllers/Autocomplete/TransactionController.php +++ b/app/Api/V1/Controllers/Autocomplete/TransactionController.php @@ -80,9 +80,10 @@ class TransactionController extends Controller /** @var TransactionJournal $journal */ foreach ($filtered as $journal) { $array[] = [ - 'id' => $journal->id, - 'name' => $journal->description, - 'description' => $journal->description, + 'id' => $journal->id, + 'transaction_group_id' => $journal->transaction_group_id, + 'name' => $journal->description, + 'description' => $journal->description, ]; } @@ -90,22 +91,14 @@ class TransactionController extends Controller } /** - * 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 + public function transactionsWithID(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']); @@ -120,12 +113,16 @@ class TransactionController extends Controller $result = $this->repository->searchJournalDescriptions($data['query'], $data['limit']); } + // limit and unique + $array = []; + /** @var TransactionJournal $journal */ foreach ($result as $journal) { $array[] = [ - 'id' => $journal->id, - 'name' => printf('#%d: %s', $journal->id, $journal->description), - 'description' => $journal->description, + 'id' => $journal->id, + 'transaction_group_id' => $journal->transaction_group_id, + 'name' => sprintf('#%d: %s', $journal->transaction_group_id, $journal->description), + 'description' => sprintf('#%d: %s', $journal->transaction_group_id, $journal->description), ]; } diff --git a/app/Api/V1/Controllers/TransactionController.php b/app/Api/V1/Controllers/TransactionController.php index becaa0af87..25163f8929 100644 --- a/app/Api/V1/Controllers/TransactionController.php +++ b/app/Api/V1/Controllers/TransactionController.php @@ -40,6 +40,7 @@ use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\Transformers\AttachmentTransformer; use FireflyIII\Transformers\PiggyBankEventTransformer; use FireflyIII\Transformers\TransactionGroupTransformer; +use FireflyIII\Transformers\TransactionLinkTransformer; use FireflyIII\User; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -57,12 +58,9 @@ class TransactionController extends Controller { use TransactionFilter; - /** @var TransactionGroupRepositoryInterface Group repository. */ - private $groupRepository; - /** @var JournalAPIRepositoryInterface Journal API repos */ - private $journalAPIRepository; - /** @var JournalRepositoryInterface The journal repository */ - private $repository; + private TransactionGroupRepositoryInterface $groupRepository; + private JournalAPIRepositoryInterface $journalAPIRepository; + private JournalRepositoryInterface $repository; /** * TransactionController constructor. @@ -112,6 +110,29 @@ class TransactionController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); } + /** + * @param TransactionGroup $transactionGroup + * + * @return JsonResponse + * @codeCoverageIgnore + */ + public function transactionLinks(TransactionGroup $transactionGroup): JsonResponse + { + $manager = $this->getManager(); + $journalLinks = new Collection; + foreach ($transactionGroup->transactionJournals as $transactionJournal) { + $journalLinks = $this->journalAPIRepository->getJournalLinks($transactionJournal)->merge($journalLinks); + } + + /** @var TransactionLinkTransformer $transformer */ + $transformer = app(TransactionLinkTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new FractalCollection($journalLinks, $transformer, 'transaction_links'); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); + } + /** * Remove the specified resource from storage. * diff --git a/app/Api/V1/Controllers/UserController.php b/app/Api/V1/Controllers/UserController.php index 5fc610c7f3..37fcbf14b9 100644 --- a/app/Api/V1/Controllers/UserController.php +++ b/app/Api/V1/Controllers/UserController.php @@ -43,9 +43,7 @@ use League\Fractal\Resource\Item; */ class UserController extends Controller { - - /** @var UserRepositoryInterface The user repository */ - private $repository; + private UserRepositoryInterface $repository; /** * UserController constructor. diff --git a/app/Repositories/Journal/JournalAPIRepository.php b/app/Repositories/Journal/JournalAPIRepository.php index 9b51937fb3..5dd293af98 100644 --- a/app/Repositories/Journal/JournalAPIRepository.php +++ b/app/Repositories/Journal/JournalAPIRepository.php @@ -121,4 +121,14 @@ class JournalAPIRepository implements JournalAPIRepositoryInterface { $this->user = $user; } + + /** + * @inheritDoc + */ + public function getJournalLinks(TransactionJournal $journal): Collection + { + $collection = $journal->destJournalLinks()->get(); + + return $journal->sourceJournalLinks()->get()->merge($collection); + } } diff --git a/app/Repositories/Journal/JournalAPIRepositoryInterface.php b/app/Repositories/Journal/JournalAPIRepositoryInterface.php index bfc6c10283..ad6e372987 100644 --- a/app/Repositories/Journal/JournalAPIRepositoryInterface.php +++ b/app/Repositories/Journal/JournalAPIRepositoryInterface.php @@ -51,6 +51,15 @@ interface JournalAPIRepositoryInterface */ public function getAttachments(TransactionJournal $journal): Collection; + /** + * Return all journal links for journal. + * + * @param TransactionJournal $journal + * + * @return Collection + */ + public function getJournalLinks(TransactionJournal $journal): Collection; + /** * Get all piggy bank events for a journal. * diff --git a/app/Repositories/User/UserRepository.php b/app/Repositories/User/UserRepository.php index 0182e82bde..f84ec0e2ed 100644 --- a/app/Repositories/User/UserRepository.php +++ b/app/Repositories/User/UserRepository.php @@ -28,6 +28,7 @@ use FireflyIII\User; use Illuminate\Database\QueryException; use Illuminate\Support\Collection; use Log; +use Str; /** * Class UserRepository. @@ -327,7 +328,7 @@ class UserRepository implements UserRepositoryInterface 'blocked' => $data['blocked'] ?? false, 'blocked_code' => $data['blocked_code'] ?? null, 'email' => $data['email'], - 'password' => str_random(24), + 'password' => Str::random(24), ] ); $role = $data['role'] ?? ''; diff --git a/public/v1/js/ff/transactions/show.js b/public/v1/js/ff/transactions/show.js index 15df60e97a..192a038391 100644 --- a/public/v1/js/ff/transactions/show.js +++ b/public/v1/js/ff/transactions/show.js @@ -66,7 +66,7 @@ function makeAutoComplete() { } }, remote: { - url: acURI + '?search=%QUERY&uid=' + uid, + url: acURI + '?query=%QUERY&uid=' + uid, wildcard: '%QUERY', filter: function (list) { return $.map(list, function (item) { @@ -85,4 +85,4 @@ function selectedJournal(event, journal) { $('#journal-selection').show(); $('#selected-journal').html('' + journal.description + '').show(); $('input[name="opposing"]').val(journal.id); -} \ No newline at end of file +} diff --git a/routes/api.php b/routes/api.php index cec3f11385..e8dd5897ed 100644 --- a/routes/api.php +++ b/routes/api.php @@ -481,6 +481,7 @@ Route::group( Route::get('{transactionGroup}', ['uses' => 'TransactionController@show', 'as' => 'show']); Route::get('{transactionGroup}/attachments', ['uses' => 'TransactionController@attachments', 'as' => 'attachments']); Route::get('{transactionGroup}/piggy_bank_events', ['uses' => 'TransactionController@piggyBankEvents', 'as' => 'piggy_bank_events']); + Route::get('{transactionGroup}/transaction_links', ['uses' => 'TransactionController@transactionLinks', 'as' => 'transaction_links']); Route::put('{transactionGroup}', ['uses' => 'TransactionController@update', 'as' => 'update']); Route::delete('{transactionGroup}/{transactionJournal}', ['uses' => 'TransactionController@deleteJournal', 'as' => 'delete-journal']); Route::delete('{transactionGroup}', ['uses' => 'TransactionController@delete', 'as' => 'delete']);