diff --git a/app/Api/V1/Controllers/Models/Account/ListController.php b/app/Api/V1/Controllers/Models/Account/ListController.php index b230572b93..c63a3a9251 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\PaginationRequest; use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Models\Account; use FireflyIII\Repositories\Account\AccountRepositoryInterface; @@ -69,22 +70,25 @@ class ListController extends Controller ); } - public function attachments(Account $account): JsonResponse + public function attachments(Account $account, PaginationRequest $request): JsonResponse { $manager = $this->getManager(); - $pageSize = $this->parameters->get('limit'); + [ + 'limit' => $limit, + 'offset' => $offset, + 'page' => $page, + ] = $request->attributes->all(); $collection = $this->repository->getAttachments($account); $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.accounts.attachments', [$account->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)); diff --git a/app/Factory/AttachmentFactory.php b/app/Factory/AttachmentFactory.php index 421af6dca2..74e8643886 100644 --- a/app/Factory/AttachmentFactory.php +++ b/app/Factory/AttachmentFactory.php @@ -84,8 +84,10 @@ class AttachmentFactory return $attachment; } - public function setUser(User $user): void + public function setUser(User $user): static { $this->user = $user; + + return $this; } } diff --git a/tests/integration/Api/Models/Account/ListControllerTest.php b/tests/integration/Api/Models/Account/ListControllerTest.php new file mode 100644 index 0000000000..269234e54b --- /dev/null +++ b/tests/integration/Api/Models/Account/ListControllerTest.php @@ -0,0 +1,88 @@ +. + */ + +declare(strict_types=1); + +namespace Tests\integration\Api\Models\Account; + +use FireflyIII\Enums\AccountTypeEnum; +use FireflyIII\Factory\AttachmentFactory; +use FireflyIII\Models\Account; +use FireflyIII\Models\Category; +use FireflyIII\User; +use Illuminate\Foundation\Testing\RefreshDatabase; +use Tests\integration\TestCase; + +/** + * @internal + * + * @covers \FireflyIII\Api\V1\Controllers\Models\Account\ListController + */ +final class ListControllerTest extends TestCase +{ + use RefreshDatabase; + private User $user; + private Account $account; + + protected function setUp(): void + { + parent::setUp(); + + $this->user = $this->createAuthenticatedUser(); + $this->actingAs($this->user); + + $this->account = Account::factory()->for($this->user)->withType(AccountTypeEnum::ASSET)->create(); + app(AttachmentFactory::class)->setUser($this->user)->create([ + 'filename' => 'test 1', + 'title' => 'test 1', + 'attachable_type' => Account::class, + 'attachable_id' => $this->account->id, + ]); + app(AttachmentFactory::class)->setUser($this->user)->create([ + 'filename' => 'test 2', + 'title' => 'test 2', + 'attachable_type' => Account::class, + 'attachable_id' => $this->account->id, + ]); + } + + public function testIndex(): void + { + $this->actingAs($this->user); + $response = $this->getJson(route('api.v1.accounts.attachments', ['account' => $this->account->id])); + $response->assertStatus(200); + $response->assertJson([ + 'meta' => ['pagination' => ['total' => 2, 'total_pages' => 1]], + ]); + } + + public function testIndexCanChangePageSize(): void + { + $this->actingAs($this->user); + $response = $this->getJson(route('api.v1.accounts.attachments', ['account' => $this->account->id, 'limit' => 1])); + $response->assertStatus(200); + $response->assertJson([ + 'meta' => ['pagination' => ['total' => 2, 'total_pages' => 2]], + ]); + } +}