diff --git a/src/Api.php b/src/Api.php index 957fe91..1802232 100644 --- a/src/Api.php +++ b/src/Api.php @@ -6,6 +6,7 @@ use Carbon\Carbon; use Exception; use Illuminate\Http\Client\PendingRequest; use Illuminate\Http\Client\Response; +use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; use Illuminate\Support\LazyCollection; use Illuminate\Support\Str; @@ -83,6 +84,20 @@ class Api ); } + /** + * @param array $payload + * + * @return Collection + */ + public function pageSearch(array $payload, int $page, int $perPage): LengthAwarePaginator + { + $start = ($page - 1) * $perPage; + $response = $this->http()->get($this->url.'/ica/rest/nami/search-multi/result-list?searchedValues='.rawurlencode(json_encode((object) $payload) ?: '{}').'&page='.$page.'&start='.$start.'&limit='.$perPage); + $items = collect($response->json()['data'])->map(fn ($member) => MemberEntry::from($member)); + + return new LengthAwarePaginator($items, $response->json('totalEntries'), $perPage, $page, []); + } + public function deleteMember(int $id): void { $this->assertLoggedIn(); diff --git a/src/Casters/CarbonCast.php b/src/Casters/CarbonCast.php index f2d73ef..812d3b5 100644 --- a/src/Casters/CarbonCast.php +++ b/src/Casters/CarbonCast.php @@ -6,6 +6,7 @@ use DateTimeInterface; use Spatie\LaravelData\Casts\Cast; use Spatie\LaravelData\Casts\DateTimeInterfaceCast; use Spatie\LaravelData\Casts\Uncastable; +use Spatie\LaravelData\Exceptions\CannotCastDate; use Spatie\LaravelData\Support\DataProperty; class CarbonCast implements Cast @@ -24,6 +25,14 @@ class CarbonCast implements Cast return null; } - return (new DateTimeInterfaceCast($this->format, null, null, null))->cast($property, $value, $context); + try { + return (new DateTimeInterfaceCast($this->format, null, null, null))->cast($property, $value, $context); + } catch (CannotCastDate $e) { + if (!$property->type->isNullable) { + throw $e; + } + + return null; + } } } diff --git a/src/Data/MemberEntry.php b/src/Data/MemberEntry.php index eb12f96..dd122ec 100644 --- a/src/Data/MemberEntry.php +++ b/src/Data/MemberEntry.php @@ -2,11 +2,15 @@ namespace Zoomyboy\LaravelNami\Data; +use Carbon\Carbon; use Spatie\LaravelData\Attributes\MapInputName; use Spatie\LaravelData\Attributes\WithCast; +use Spatie\LaravelData\Attributes\WithTransformer; use Spatie\LaravelData\Data; +use Zoomyboy\LaravelNami\Casters\CarbonCast; use Zoomyboy\LaravelNami\Casters\StringCast; use Zoomyboy\LaravelNami\Tests\Factories\MemberEntryRequestFactory; +use Zoomyboy\LaravelNami\Transformers\CarbonTransformer; class MemberEntry extends Data { @@ -23,6 +27,14 @@ class MemberEntry extends Data #[MapInputName('entries_gruppierungId')] public int $groupId, + + #[MapInputName('entries_geburtsDatum')] + #[WithCast(CarbonCast::class, format: 'Y-m-d H:i:s')] + #[WithTransformer(CarbonTransformer::class, format: 'Y-m-d H:i:s')] + public ?Carbon $birthday, + + #[MapInputName('entries_stufe')] + public ?string $agegroup, ) { } @@ -30,4 +42,14 @@ class MemberEntry extends Data { return MemberEntryRequestFactory::new(); } + + /** + * @return array + */ + public function with(): array + { + return [ + 'birthday_human' => $this->birthday?->format('d.m.Y'), + ]; + } } diff --git a/src/Fakes/SearchFake.php b/src/Fakes/SearchFake.php index df43807..c3a7083 100644 --- a/src/Fakes/SearchFake.php +++ b/src/Fakes/SearchFake.php @@ -3,14 +3,15 @@ namespace Zoomyboy\LaravelNami\Fakes; use Illuminate\Support\Facades\Http; +use Illuminate\Support\Str; use Zoomyboy\LaravelNami\Data\MemberEntry; class SearchFake extends Fake { - public function fetchFails(int $page, int $start, ?string $error = 'wrong message'): void + public function fetchFails(int $page, int $start, int $perPage, ?string $error = 'wrong message'): void { - Http::fake(function ($request) use ($error, $page, $start) { - if ($request->url() === 'https://nami.dpsg.de/ica/rest/nami/search-multi/result-list?searchedValues='.rawurlencode('{}').'&page='.$page.'&start='.$start.'&limit=100') { + Http::fake(function ($request) use ($error, $page, $start, $perPage) { + if ($request->url() === 'https://nami.dpsg.de/ica/rest/nami/search-multi/result-list?searchedValues='.rawurlencode('{}').'&page='.$page.'&start='.$start.'&limit='.$perPage) { return $this->errorResponse($error); } }); @@ -19,17 +20,22 @@ class SearchFake extends Fake /** * @param array $data */ - public function fetches(int $page, int $start, array $data): void + public function fetches(int $page, int $start, int $perPage, array $data): void { - Http::fake(function ($request) use ($page, $start, $data) { - if ($request->url() === 'https://nami.dpsg.de/ica/rest/nami/search-multi/result-list?searchedValues='.rawurlencode('{}').'&page='.$page.'&start='.$start.'&limit=100') { - return $this->collection(collect($data)->map(fn ($member) => [ - 'id' => $member->id, - 'entries_gruppierungId' => $member->groupId, - 'entries_nachname' => $member->lastname, - 'entries_vorname' => $member->firstname, - ])); + Http::fake(function ($request) use ($page, $start, $data, $perPage) { + if (Str::endsWith($request->url(), '&page='.$page.'&start='.$start.'&limit='.$perPage)) { + return $this->collection(collect($data)->map(fn ($member) => $member)); } }); } + + /** + * @param array $data + */ + public function assertFetched(int $page, int $start, int $perPage, array $data): void + { + Http::assertSent(function ($request) use ($page, $start, $perPage, $data) { + return $request->url() === 'https://nami.dpsg.de/ica/rest/nami/search-multi/result-list?searchedValues='.rawurlencode(json_encode((object) $data)).'&page='.$page.'&start='.$start.'&limit='.$perPage; + }); + } } diff --git a/tests/Unit/SearchTest.php b/tests/Unit/SearchTest.php index 400c200..dbf1cbe 100644 --- a/tests/Unit/SearchTest.php +++ b/tests/Unit/SearchTest.php @@ -62,7 +62,7 @@ class SearchTest extends TestCase public function testItThrowsExceptionWhenSearchFails(): void { $this->withoutExceptionHandling()->expectException(NotSuccessfulException::class); - app(SearchFake::class)->fetchFails($page = 1, $start = 0, 'unknown error'); + app(SearchFake::class)->fetchFails($page = 1, $start = 0, $perPage = 100, 'unknown error'); $this->login()->search([])->first(); }