Add single fetch
This commit is contained in:
parent
75983ebb4b
commit
7a290a105f
15
src/Api.php
15
src/Api.php
|
@ -6,6 +6,7 @@ use Carbon\Carbon;
|
||||||
use Exception;
|
use Exception;
|
||||||
use Illuminate\Http\Client\PendingRequest;
|
use Illuminate\Http\Client\PendingRequest;
|
||||||
use Illuminate\Http\Client\Response;
|
use Illuminate\Http\Client\Response;
|
||||||
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
use Illuminate\Support\LazyCollection;
|
use Illuminate\Support\LazyCollection;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
|
@ -83,6 +84,20 @@ class Api
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<string, mixed> $payload
|
||||||
|
*
|
||||||
|
* @return Collection<int, MemberEntry>
|
||||||
|
*/
|
||||||
|
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
|
public function deleteMember(int $id): void
|
||||||
{
|
{
|
||||||
$this->assertLoggedIn();
|
$this->assertLoggedIn();
|
||||||
|
|
|
@ -6,6 +6,7 @@ use DateTimeInterface;
|
||||||
use Spatie\LaravelData\Casts\Cast;
|
use Spatie\LaravelData\Casts\Cast;
|
||||||
use Spatie\LaravelData\Casts\DateTimeInterfaceCast;
|
use Spatie\LaravelData\Casts\DateTimeInterfaceCast;
|
||||||
use Spatie\LaravelData\Casts\Uncastable;
|
use Spatie\LaravelData\Casts\Uncastable;
|
||||||
|
use Spatie\LaravelData\Exceptions\CannotCastDate;
|
||||||
use Spatie\LaravelData\Support\DataProperty;
|
use Spatie\LaravelData\Support\DataProperty;
|
||||||
|
|
||||||
class CarbonCast implements Cast
|
class CarbonCast implements Cast
|
||||||
|
@ -24,6 +25,14 @@ class CarbonCast implements Cast
|
||||||
return null;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,11 +2,15 @@
|
||||||
|
|
||||||
namespace Zoomyboy\LaravelNami\Data;
|
namespace Zoomyboy\LaravelNami\Data;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
use Spatie\LaravelData\Attributes\MapInputName;
|
use Spatie\LaravelData\Attributes\MapInputName;
|
||||||
use Spatie\LaravelData\Attributes\WithCast;
|
use Spatie\LaravelData\Attributes\WithCast;
|
||||||
|
use Spatie\LaravelData\Attributes\WithTransformer;
|
||||||
use Spatie\LaravelData\Data;
|
use Spatie\LaravelData\Data;
|
||||||
|
use Zoomyboy\LaravelNami\Casters\CarbonCast;
|
||||||
use Zoomyboy\LaravelNami\Casters\StringCast;
|
use Zoomyboy\LaravelNami\Casters\StringCast;
|
||||||
use Zoomyboy\LaravelNami\Tests\Factories\MemberEntryRequestFactory;
|
use Zoomyboy\LaravelNami\Tests\Factories\MemberEntryRequestFactory;
|
||||||
|
use Zoomyboy\LaravelNami\Transformers\CarbonTransformer;
|
||||||
|
|
||||||
class MemberEntry extends Data
|
class MemberEntry extends Data
|
||||||
{
|
{
|
||||||
|
@ -23,6 +27,14 @@ class MemberEntry extends Data
|
||||||
|
|
||||||
#[MapInputName('entries_gruppierungId')]
|
#[MapInputName('entries_gruppierungId')]
|
||||||
public int $groupId,
|
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 MemberEntryRequestFactory::new();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<string, string>
|
||||||
|
*/
|
||||||
|
public function with(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'birthday_human' => $this->birthday?->format('d.m.Y'),
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,14 +3,15 @@
|
||||||
namespace Zoomyboy\LaravelNami\Fakes;
|
namespace Zoomyboy\LaravelNami\Fakes;
|
||||||
|
|
||||||
use Illuminate\Support\Facades\Http;
|
use Illuminate\Support\Facades\Http;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
use Zoomyboy\LaravelNami\Data\MemberEntry;
|
use Zoomyboy\LaravelNami\Data\MemberEntry;
|
||||||
|
|
||||||
class SearchFake extends Fake
|
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) {
|
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=100') {
|
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);
|
return $this->errorResponse($error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -19,17 +20,22 @@ class SearchFake extends Fake
|
||||||
/**
|
/**
|
||||||
* @param array<int, MemberEntry> $data
|
* @param array<int, MemberEntry> $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) {
|
Http::fake(function ($request) use ($page, $start, $data, $perPage) {
|
||||||
if ($request->url() === 'https://nami.dpsg.de/ica/rest/nami/search-multi/result-list?searchedValues='.rawurlencode('{}').'&page='.$page.'&start='.$start.'&limit=100') {
|
if (Str::endsWith($request->url(), '&page='.$page.'&start='.$start.'&limit='.$perPage)) {
|
||||||
return $this->collection(collect($data)->map(fn ($member) => [
|
return $this->collection(collect($data)->map(fn ($member) => $member));
|
||||||
'id' => $member->id,
|
|
||||||
'entries_gruppierungId' => $member->groupId,
|
|
||||||
'entries_nachname' => $member->lastname,
|
|
||||||
'entries_vorname' => $member->firstname,
|
|
||||||
]));
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<int, MemberEntry> $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;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,7 +62,7 @@ class SearchTest extends TestCase
|
||||||
public function testItThrowsExceptionWhenSearchFails(): void
|
public function testItThrowsExceptionWhenSearchFails(): void
|
||||||
{
|
{
|
||||||
$this->withoutExceptionHandling()->expectException(NotSuccessfulException::class);
|
$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();
|
$this->login()->search([])->first();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue