Add missing API endpoints.

This commit is contained in:
James Cole 2020-07-31 06:19:48 +02:00
parent 93856a3c57
commit eabda85b1e
No known key found for this signature in database
GPG Key ID: B5669F9493CDE38D
8 changed files with 64 additions and 27 deletions

View File

@ -80,9 +80,10 @@ class TransactionController extends Controller
/** @var TransactionJournal $journal */ /** @var TransactionJournal $journal */
foreach ($filtered as $journal) { foreach ($filtered as $journal) {
$array[] = [ $array[] = [
'id' => $journal->id, 'id' => $journal->id,
'name' => $journal->description, 'transaction_group_id' => $journal->transaction_group_id,
'description' => $journal->description, '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 * @param AutocompleteRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
public function allJournalsWithID(AutocompleteRequest $request): JsonResponse public function transactionsWithID(AutocompleteRequest $request): JsonResponse
{ {
$data = $request->getData(); $data = $request->getData();
$array = [];
$result = new Collection; $result = new Collection;
if (is_numeric($data['query'])) { if (is_numeric($data['query'])) {
// search for group, not journal. // search for group, not journal.
$firstResult = $this->groupRepository->find((int) $data['query']); $firstResult = $this->groupRepository->find((int) $data['query']);
@ -120,12 +113,16 @@ class TransactionController extends Controller
$result = $this->repository->searchJournalDescriptions($data['query'], $data['limit']); $result = $this->repository->searchJournalDescriptions($data['query'], $data['limit']);
} }
// limit and unique
$array = [];
/** @var TransactionJournal $journal */ /** @var TransactionJournal $journal */
foreach ($result as $journal) { foreach ($result as $journal) {
$array[] = [ $array[] = [
'id' => $journal->id, 'id' => $journal->id,
'name' => printf('#%d: %s', $journal->id, $journal->description), 'transaction_group_id' => $journal->transaction_group_id,
'description' => $journal->description, 'name' => sprintf('#%d: %s', $journal->transaction_group_id, $journal->description),
'description' => sprintf('#%d: %s', $journal->transaction_group_id, $journal->description),
]; ];
} }

View File

@ -40,6 +40,7 @@ use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\AttachmentTransformer; use FireflyIII\Transformers\AttachmentTransformer;
use FireflyIII\Transformers\PiggyBankEventTransformer; use FireflyIII\Transformers\PiggyBankEventTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer; use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\Transformers\TransactionLinkTransformer;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@ -57,12 +58,9 @@ class TransactionController extends Controller
{ {
use TransactionFilter; use TransactionFilter;
/** @var TransactionGroupRepositoryInterface Group repository. */ private TransactionGroupRepositoryInterface $groupRepository;
private $groupRepository; private JournalAPIRepositoryInterface $journalAPIRepository;
/** @var JournalAPIRepositoryInterface Journal API repos */ private JournalRepositoryInterface $repository;
private $journalAPIRepository;
/** @var JournalRepositoryInterface The journal repository */
private $repository;
/** /**
* TransactionController constructor. * TransactionController constructor.
@ -112,6 +110,29 @@ class TransactionController extends Controller
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); 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. * Remove the specified resource from storage.
* *

View File

@ -43,9 +43,7 @@ use League\Fractal\Resource\Item;
*/ */
class UserController extends Controller class UserController extends Controller
{ {
private UserRepositoryInterface $repository;
/** @var UserRepositoryInterface The user repository */
private $repository;
/** /**
* UserController constructor. * UserController constructor.

View File

@ -121,4 +121,14 @@ class JournalAPIRepository implements JournalAPIRepositoryInterface
{ {
$this->user = $user; $this->user = $user;
} }
/**
* @inheritDoc
*/
public function getJournalLinks(TransactionJournal $journal): Collection
{
$collection = $journal->destJournalLinks()->get();
return $journal->sourceJournalLinks()->get()->merge($collection);
}
} }

View File

@ -51,6 +51,15 @@ interface JournalAPIRepositoryInterface
*/ */
public function getAttachments(TransactionJournal $journal): Collection; 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. * Get all piggy bank events for a journal.
* *

View File

@ -28,6 +28,7 @@ use FireflyIII\User;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Log; use Log;
use Str;
/** /**
* Class UserRepository. * Class UserRepository.
@ -327,7 +328,7 @@ class UserRepository implements UserRepositoryInterface
'blocked' => $data['blocked'] ?? false, 'blocked' => $data['blocked'] ?? false,
'blocked_code' => $data['blocked_code'] ?? null, 'blocked_code' => $data['blocked_code'] ?? null,
'email' => $data['email'], 'email' => $data['email'],
'password' => str_random(24), 'password' => Str::random(24),
] ]
); );
$role = $data['role'] ?? ''; $role = $data['role'] ?? '';

View File

@ -66,7 +66,7 @@ function makeAutoComplete() {
} }
}, },
remote: { remote: {
url: acURI + '?search=%QUERY&uid=' + uid, url: acURI + '?query=%QUERY&uid=' + uid,
wildcard: '%QUERY', wildcard: '%QUERY',
filter: function (list) { filter: function (list) {
return $.map(list, function (item) { return $.map(list, function (item) {
@ -85,4 +85,4 @@ function selectedJournal(event, journal) {
$('#journal-selection').show(); $('#journal-selection').show();
$('#selected-journal').html('<a href="' + groupURI.replace('%GROUP%', journal.transaction_group_id) + '">' + journal.description + '</a>').show(); $('#selected-journal').html('<a href="' + groupURI.replace('%GROUP%', journal.transaction_group_id) + '">' + journal.description + '</a>').show();
$('input[name="opposing"]').val(journal.id); $('input[name="opposing"]').val(journal.id);
} }

View File

@ -481,6 +481,7 @@ Route::group(
Route::get('{transactionGroup}', ['uses' => 'TransactionController@show', 'as' => 'show']); Route::get('{transactionGroup}', ['uses' => 'TransactionController@show', 'as' => 'show']);
Route::get('{transactionGroup}/attachments', ['uses' => 'TransactionController@attachments', 'as' => 'attachments']); 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}/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::put('{transactionGroup}', ['uses' => 'TransactionController@update', 'as' => 'update']);
Route::delete('{transactionGroup}/{transactionJournal}', ['uses' => 'TransactionController@deleteJournal', 'as' => 'delete-journal']); Route::delete('{transactionGroup}/{transactionJournal}', ['uses' => 'TransactionController@deleteJournal', 'as' => 'delete-journal']);
Route::delete('{transactionGroup}', ['uses' => 'TransactionController@delete', 'as' => 'delete']); Route::delete('{transactionGroup}', ['uses' => 'TransactionController@delete', 'as' => 'delete']);