diff --git a/app/Api/V1/Controllers/Models/Account/ListController.php b/app/Api/V1/Controllers/Models/Account/ListController.php index 919a48dada..3acdfbc6cf 100644 --- a/app/Api/V1/Controllers/Models/Account/ListController.php +++ b/app/Api/V1/Controllers/Models/Account/ListController.php @@ -25,6 +25,7 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers\Models\Account; use FireflyIII\Api\V1\Controllers\Controller; +use FireflyIII\Api\V1\Requests\Generic\PaginationDateRangeRequest; use FireflyIII\Api\V1\Requests\PaginationRequest; use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Models\Account; @@ -110,7 +111,7 @@ class ListController extends Controller // get list of piggy banks. Count it and split it. $collection = $this->repository->getPiggyBanks($account); $count = $collection->count(); - $piggyBanks = $collection->slice(($page - 1) * $limit, $limit); + $piggyBanks = $collection->slice($offset, $limit); // enrich /** @var User $admin */ @@ -136,16 +137,15 @@ class ListController extends Controller /** * Show all transaction groups related to the account. */ - public function transactions(PaginationRequest $request, Account $account): JsonResponse + public function transactions(PaginationDateRangeRequest $request, Account $account): JsonResponse { [ 'limit' => $limit, - 'offset' => $offset, 'page' => $page, + 'start' => $start, + 'end' => $end, + 'types' => $types, ] = $request->attributes->all(); - - $type = $request->get('type') ?? 'default'; - $types = $this->mapTransactionTypes($type); $manager = $this->getManager(); /** @var User $admin */ @@ -154,15 +154,12 @@ class ListController extends Controller // use new group collector: /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); - $collector->setUser($admin)->setAccounts(new Collection()->push($account)) - ->withAPIInformation()->setLimit($limit)->setPage($page)->setTypes($types) - ; - - if (null !== $this->parameters->get('start')) { - $collector->setStart($this->parameters->get('start')); + $collector->setUser($admin)->setAccounts(new Collection()->push($account))->withAPIInformation()->setLimit($limit)->setPage($page)->setTypes($types); + if (null !== $start) { + $collector->setStart($start); } - if (null !== $this->parameters->get('end')) { - $collector->setEnd($this->parameters->get('end')); + if (null !== $end) { + $collector->setEnd($end); } $paginator = $collector->getPaginatedGroups(); diff --git a/app/Api/V1/Controllers/Models/Account/StoreController.php b/app/Api/V1/Controllers/Models/Account/StoreController.php index bbda9b50ef..3d9addc3c5 100644 --- a/app/Api/V1/Controllers/Models/Account/StoreController.php +++ b/app/Api/V1/Controllers/Models/Account/StoreController.php @@ -81,7 +81,6 @@ class StoreController extends Controller /** @var AccountTransformer $transformer */ $transformer = app(AccountTransformer::class); - $transformer->setParameters($this->parameters); $resource = new Item($account, $transformer, self::RESOURCE_KEY); diff --git a/app/Api/V1/Controllers/Models/Account/UpdateController.php b/app/Api/V1/Controllers/Models/Account/UpdateController.php index 5ae8f5b45d..71cf69152f 100644 --- a/app/Api/V1/Controllers/Models/Account/UpdateController.php +++ b/app/Api/V1/Controllers/Models/Account/UpdateController.php @@ -87,7 +87,6 @@ class UpdateController extends Controller /** @var AccountTransformer $transformer */ $transformer = app(AccountTransformer::class); - $transformer->setParameters($this->parameters); $resource = new Item($account, $transformer, self::RESOURCE_KEY); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); diff --git a/app/Api/V1/Controllers/Models/Attachment/ShowController.php b/app/Api/V1/Controllers/Models/Attachment/ShowController.php index 273c8dc986..8b5099946b 100644 --- a/app/Api/V1/Controllers/Models/Attachment/ShowController.php +++ b/app/Api/V1/Controllers/Models/Attachment/ShowController.php @@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Attachment; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Middleware\ApiDemoUser; +use FireflyIII\Api\V1\Requests\PaginationRequest; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Attachment; use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; @@ -120,8 +121,14 @@ class ShowController extends Controller * * Display a listing of the resource. */ - public function index(): JsonResponse + public function index(PaginationRequest $request): JsonResponse { + [ + 'limit' => $limit, + 'offset' => $offset, + 'page' => $page, + ] = $request->attributes->all(); + if (true === auth()->user()->hasRole('demo')) { Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__)); @@ -130,21 +137,17 @@ class ShowController extends Controller $manager = $this->getManager(); - // types to get, page size: - $pageSize = $this->parameters->get('limit'); - // get list of attachments. Count it and split it. $collection = $this->repository->get(); $count = $collection->count(); - $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); + $attachments = $collection->slice($offset, $limit); // make paginator: - $paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); + $paginator = new LengthAwarePaginator($attachments, $count, $limit, $page); $paginator->setPath(route('api.v1.attachments.index').$this->buildParams()); /** @var AttachmentTransformer $transformer */ $transformer = app(AttachmentTransformer::class); - $transformer->setParameters($this->parameters); $resource = new FractalCollection($attachments, $transformer, 'attachments'); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); @@ -169,7 +172,6 @@ class ShowController extends Controller /** @var AttachmentTransformer $transformer */ $transformer = app(AttachmentTransformer::class); - $transformer->setParameters($this->parameters); $resource = new Item($attachment, $transformer, 'attachments'); diff --git a/app/Api/V1/Controllers/Models/Attachment/StoreController.php b/app/Api/V1/Controllers/Models/Attachment/StoreController.php index a070ff8c5d..77e2060c36 100644 --- a/app/Api/V1/Controllers/Models/Attachment/StoreController.php +++ b/app/Api/V1/Controllers/Models/Attachment/StoreController.php @@ -87,7 +87,6 @@ class StoreController extends Controller /** @var AttachmentTransformer $transformer */ $transformer = app(AttachmentTransformer::class); - $transformer->setParameters($this->parameters); $resource = new Item($attachment, $transformer, 'attachments'); diff --git a/app/Api/V1/Controllers/Models/Attachment/UpdateController.php b/app/Api/V1/Controllers/Models/Attachment/UpdateController.php index c5e2fd2a9c..9945b61697 100644 --- a/app/Api/V1/Controllers/Models/Attachment/UpdateController.php +++ b/app/Api/V1/Controllers/Models/Attachment/UpdateController.php @@ -81,7 +81,6 @@ class UpdateController extends Controller /** @var AttachmentTransformer $transformer */ $transformer = app(AttachmentTransformer::class); - $transformer->setParameters($this->parameters); $resource = new Item($attachment, $transformer, 'attachments'); diff --git a/app/Api/V1/Controllers/Models/AvailableBudget/ShowController.php b/app/Api/V1/Controllers/Models/AvailableBudget/ShowController.php index ee0c01610f..624199c9fa 100644 --- a/app/Api/V1/Controllers/Models/AvailableBudget/ShowController.php +++ b/app/Api/V1/Controllers/Models/AvailableBudget/ShowController.php @@ -25,6 +25,7 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers\Models\AvailableBudget; use FireflyIII\Api\V1\Controllers\Controller; +use FireflyIII\Api\V1\Requests\Generic\PaginationDateRangeRequest; use FireflyIII\Models\AvailableBudget; use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; use FireflyIII\Support\JsonApi\Enrichments\AvailableBudgetEnrichment; @@ -67,19 +68,21 @@ class ShowController extends Controller * * Display a listing of the resource. */ - public function index(): JsonResponse + public function index(PaginationDateRangeRequest $request): JsonResponse { $manager = $this->getManager(); - - // types to get, page size: - $pageSize = $this->parameters->get('limit'); - $start = $this->parameters->get('start'); - $end = $this->parameters->get('end'); + [ + 'limit' => $limit, + 'offset' => $offset, + 'page' => $page, + 'start' => $start, + 'end' => $end, + ] = $request->attributes->all(); // get list of available budgets. Count it and split it. $collection = $this->abRepository->getAvailableBudgetsByDate($start, $end); $count = $collection->count(); - $availableBudgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); + $availableBudgets = $collection->slice($offset, $limit); // enrich /** @var User $admin */ @@ -89,12 +92,11 @@ class ShowController extends Controller $availableBudgets = $enrichment->enrich($availableBudgets); // make paginator: - $paginator = new LengthAwarePaginator($availableBudgets, $count, $pageSize, $this->parameters->get('page')); + $paginator = new LengthAwarePaginator($availableBudgets, $count, $limit, $page); $paginator->setPath(route('api.v1.available-budgets.index').$this->buildParams()); /** @var AvailableBudgetTransformer $transformer */ $transformer = app(AvailableBudgetTransformer::class); - $transformer->setParameters($this->parameters); $resource = new FractalCollection($availableBudgets, $transformer, 'available_budgets'); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); @@ -116,15 +118,12 @@ class ShowController extends Controller /** @var AvailableBudgetTransformer $transformer */ $transformer = app(AvailableBudgetTransformer::class); - $transformer->setParameters($this->parameters); // enrich /** @var User $admin */ $admin = auth()->user(); $enrichment = new AvailableBudgetEnrichment(); $enrichment->setUser($admin); - // $enrichment->setStart($start); - // $enrichment->setEnd($end); $availableBudget = $enrichment->enrichSingle($availableBudget); diff --git a/app/Api/V1/Controllers/Models/Bill/ListController.php b/app/Api/V1/Controllers/Models/Bill/ListController.php index e33c6f5804..f3867841fc 100644 --- a/app/Api/V1/Controllers/Models/Bill/ListController.php +++ b/app/Api/V1/Controllers/Models/Bill/ListController.php @@ -25,6 +25,8 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers\Models\Bill; use FireflyIII\Api\V1\Controllers\Controller; +use FireflyIII\Api\V1\Requests\Generic\PaginationDateRangeRequest; +use FireflyIII\Api\V1\Requests\PaginationRequest; use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Models\Bill; use FireflyIII\Repositories\Bill\BillRepositoryInterface; @@ -71,22 +73,25 @@ class ListController extends Controller * * Display a listing of the resource. */ - public function attachments(Bill $bill): JsonResponse + public function attachments(PaginationRequest $request, Bill $bill): JsonResponse { + [ + 'limit' => $limit, + 'offset' => $offset, + 'page' => $page, + ] = $request->attributes->all(); $manager = $this->getManager(); - $pageSize = $this->parameters->get('limit'); $collection = $this->repository->getAttachments($bill); $count = $collection->count(); - $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); + $attachments = $collection->slice($offset, $limit); // make paginator: - $paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); + $paginator = new LengthAwarePaginator($attachments, $count, $limit, $page); $paginator->setPath(route('api.v1.bills.attachments', [$bill->id]).$this->buildParams()); /** @var AttachmentTransformer $transformer */ $transformer = app(AttachmentTransformer::class); - $transformer->setParameters($this->parameters); $resource = new FractalCollection($attachments, $transformer, 'attachments'); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); @@ -100,25 +105,25 @@ class ListController extends Controller * * List all of them. */ - public function rules(Bill $bill): JsonResponse + public function rules(PaginationRequest $request, Bill $bill): JsonResponse { + [ + 'limit' => $limit, + 'offset' => $offset, + 'page' => $page, + ] = $request->attributes->all(); + $manager = $this->getManager(); - - // types to get, page size: - $pageSize = $this->parameters->get('limit'); - - // get list of budgets. Count it and split it. $collection = $this->repository->getRulesForBill($bill); $count = $collection->count(); - $rules = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); + $rules = $collection->slice($offset, $limit); // make paginator: - $paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page')); + $paginator = new LengthAwarePaginator($rules, $count, $limit, $page); $paginator->setPath(route('api.v1.bills.rules', [$bill->id]).$this->buildParams()); /** @var RuleTransformer $transformer */ $transformer = app(RuleTransformer::class); - $transformer->setParameters($this->parameters); $resource = new FractalCollection($rules, $transformer, 'rules'); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); @@ -131,13 +136,16 @@ class ListController extends Controller * * Show all transactions. */ - public function transactions(Request $request, Bill $bill): JsonResponse + public function transactions(PaginationDateRangeRequest $request, Bill $bill): JsonResponse { - $pageSize = $this->parameters->get('limit'); - $type = $request->get('type') ?? 'default'; - $this->parameters->set('type', $type); + [ + 'limit' => $limit, + 'page' => $page, + 'types' => $types, + 'start' => $start, + 'end' => $end, + ] = $request->attributes->all(); - $types = $this->mapTransactionTypes($this->parameters->get('type')); $manager = $this->getManager(); /** @var User $admin */ @@ -153,18 +161,18 @@ class ListController extends Controller // all info needed for the API: ->withAPIInformation() // set page size: - ->setLimit($pageSize) + ->setLimit($limit) // set page to retrieve - ->setPage($this->parameters->get('page')) + ->setPage($page) // set types of transactions to return. ->setTypes($types) ; - if (null !== $this->parameters->get('start')) { - $collector->setStart($this->parameters->get('start')); + if (null !== $start) { + $collector->setStart($start); } - if (null !== $this->parameters->get('end')) { - $collector->setEnd($this->parameters->get('end')); + if (null !== $end) { + $collector->setEnd($end); } // get paginator. @@ -178,7 +186,6 @@ class ListController extends Controller /** @var TransactionGroupTransformer $transformer */ $transformer = app(TransactionGroupTransformer::class); - $transformer->setParameters($this->parameters); $resource = new FractalCollection($transactions, $transformer, 'transactions'); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); diff --git a/app/Api/V1/Controllers/Models/Bill/ShowController.php b/app/Api/V1/Controllers/Models/Bill/ShowController.php index 396c6e4db8..cdcb67cf9a 100644 --- a/app/Api/V1/Controllers/Models/Bill/ShowController.php +++ b/app/Api/V1/Controllers/Models/Bill/ShowController.php @@ -25,6 +25,9 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers\Models\Bill; use FireflyIII\Api\V1\Controllers\Controller; +use FireflyIII\Api\V1\Requests\DateRangeRequest; +use FireflyIII\Api\V1\Requests\Generic\PaginationDateRangeRequest; +use FireflyIII\Api\V1\Requests\PaginationRequest; use FireflyIII\Models\Bill; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment; @@ -65,28 +68,34 @@ class ShowController extends Controller * * Display a listing of the resource. */ - public function index(): JsonResponse + public function index(PaginationDateRangeRequest $request): JsonResponse { + [ + 'limit' => $limit, + 'offset' => $offset, + 'start' => $start, + 'end' => $end, + 'page' => $page, + ] = $request->attributes->all(); + $this->repository->correctOrder(); $bills = $this->repository->getBills(); $manager = $this->getManager(); - $pageSize = $this->parameters->get('limit'); $count = $bills->count(); - $bills = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); - $paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); + $bills = $bills->slice($offset, $limit); + $paginator = new LengthAwarePaginator($bills, $count, $limit, $page); // enrich /** @var User $admin */ $admin = auth()->user(); $enrichment = new SubscriptionEnrichment(); $enrichment->setUser($admin); - $enrichment->setStart($this->parameters->get('start')); - $enrichment->setEnd($this->parameters->get('end')); + $enrichment->setStart($start); + $enrichment->setEnd($end); $bills = $enrichment->enrich($bills); /** @var BillTransformer $transformer */ $transformer = app(BillTransformer::class); - $transformer->setParameters($this->parameters); $resource = new FractalCollection($bills, $transformer, 'bills'); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); @@ -100,8 +109,13 @@ class ShowController extends Controller * * Show the specified bill. */ - public function show(Bill $bill): JsonResponse + public function show(DateRangeRequest $request, Bill $bill): JsonResponse { + [ + 'start' => $start, + 'end' => $end, + ] = $request->attributes->all(); + $manager = $this->getManager(); // enrich @@ -109,13 +123,12 @@ class ShowController extends Controller $admin = auth()->user(); $enrichment = new SubscriptionEnrichment(); $enrichment->setUser($admin); - $enrichment->setStart($this->parameters->get('start')); - $enrichment->setEnd($this->parameters->get('end')); + $enrichment->setStart($start); + $enrichment->setEnd($end); $bill = $enrichment->enrichSingle($bill); /** @var BillTransformer $transformer */ $transformer = app(BillTransformer::class); - $transformer->setParameters($this->parameters); $resource = new Item($bill, $transformer, 'bills'); diff --git a/app/Api/V1/Requests/Generic/PaginationDateRangeRequest.php b/app/Api/V1/Requests/Generic/PaginationDateRangeRequest.php new file mode 100644 index 0000000000..ed7e2cdd94 --- /dev/null +++ b/app/Api/V1/Requests/Generic/PaginationDateRangeRequest.php @@ -0,0 +1,43 @@ +. + */ + +namespace FireflyIII\Api\V1\Requests\Generic; + +use FireflyIII\Api\V1\Requests\AggregateFormRequest; +use FireflyIII\Api\V1\Requests\DateRangeRequest; +use FireflyIII\Api\V1\Requests\PaginationRequest; +use FireflyIII\Models\Transaction; + +/** + * TODO this class includes an object type filter which should be moved to its own thing. + */ +class PaginationDateRangeRequest extends AggregateFormRequest +{ + #[Override] + protected function getRequests(): array + { + return [ + DateRangeRequest::class, + [ObjectTypeApiRequest::class, 'object_type' => Transaction::class], + [PaginationRequest::class, 'sort_class' => Transaction::class], + ]; + } +} diff --git a/app/Models/BudgetLimit.php b/app/Models/BudgetLimit.php index 6ac0d049f3..bd4c602dd5 100644 --- a/app/Models/BudgetLimit.php +++ b/app/Models/BudgetLimit.php @@ -39,7 +39,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; * * @property TransactionCurrency $transactionCurrency * @property Carbon $start_date - * @property Carbon $end_date + * @property Carbon|null $end_date */ #[ObservedBy([BudgetLimitObserver::class])] class BudgetLimit extends Model