Ad FakeMember
This commit is contained in:
parent
a39c8513c9
commit
53dcda68fc
42
src/Api.php
42
src/Api.php
|
@ -29,29 +29,39 @@ class Api {
|
||||||
return Backend::init($this->cookie);
|
return Backend::init($this->cookie);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function findNr($nr) {
|
public function findNr(int $nr): Member
|
||||||
return $this->search(['mitgliedsNummber' => $nr]);
|
{
|
||||||
|
return $this->find(['mitgliedsNummber' => $nr]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function search($payload) {
|
/**
|
||||||
$url = self::$url.'/ica/rest/nami/search-multi/result-list?searchedValues='.rawurlencode(json_encode($payload)).'&page=1&start=0&limit=10';
|
* @param array<string, mixed> $payload
|
||||||
|
*/
|
||||||
|
public function find(array $payload): ?Member
|
||||||
|
{
|
||||||
|
return $this->search($payload)->first();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<string, mixed> $payload
|
||||||
|
* @return Collection<int, Member>
|
||||||
|
*/
|
||||||
|
public function search(array $payload): Collection
|
||||||
|
{
|
||||||
|
$url = self::$url.'/ica/rest/nami/search-multi/result-list?searchedValues='.rawurlencode(json_encode($payload) ?: '[]').'&page=1&start=0&limit=10';
|
||||||
$response = $this->http()->get($url);
|
$response = $this->http()->get($url);
|
||||||
|
|
||||||
if ($response->json()['success'] === true) {
|
if ($response->json()['success'] !== true) {
|
||||||
|
|
||||||
if (!count($response->json()['data'])) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
$data = collect($response->json()['data'][0])->mapWithKeys(function($value, $key) {
|
|
||||||
return [ str_replace('entries_', '', $key) => $value ];
|
|
||||||
});
|
|
||||||
|
|
||||||
return Member::fromNami($data);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->exception('Search failed', ['url' => $url], $response->json());
|
$this->exception('Search failed', ['url' => $url], $response->json());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return collect($response->json()['data'])->map(function($member) {
|
||||||
|
return Member::fromNami(collect($member)->mapWithKeys(function($value, $key) {
|
||||||
|
return [ str_replace('entries_', '', (string) $key) => $value ];
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
protected function loggedInAlready(): bool {
|
protected function loggedInAlready(): bool {
|
||||||
return $this->loggedIn !== null;
|
return $this->loggedIn !== null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,9 +69,13 @@ class NamiGuard {
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$api = Nami::login($credentials['mglnr'], $credentials['password']);
|
$api = Nami::login($credentials['mglnr'], $credentials['password']);
|
||||||
|
$user = $api->findNr($credentials['mglnr']);
|
||||||
|
|
||||||
$payload = [
|
$payload = [
|
||||||
'credentials' => $credentials
|
'credentials' => $credentials,
|
||||||
|
'firstname' => $user->firstname,
|
||||||
|
'lastname' => $user->lastname,
|
||||||
|
'group_id' => $user->group_id,
|
||||||
];
|
];
|
||||||
|
|
||||||
$this->setUser(NamiUser::fromPayload($payload));
|
$this->setUser(NamiUser::fromPayload($payload));
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace Zoomyboy\LaravelNami\Backend;
|
namespace Zoomyboy\LaravelNami\Backend;
|
||||||
|
|
||||||
|
use GuzzleHttp\Promise\FulfilledPromise;
|
||||||
use GuzzleHttp\Psr7\Response as GuzzleResponse;
|
use GuzzleHttp\Psr7\Response as GuzzleResponse;
|
||||||
use Illuminate\Http\Client\Response;
|
use Illuminate\Http\Client\Response;
|
||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Support\Facades\Cache;
|
||||||
|
@ -148,30 +149,185 @@ class FakeBackend {
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function notAuthorizedResponse() {
|
|
||||||
return $this->response([
|
|
||||||
'success' => true,
|
|
||||||
'data' => null,
|
|
||||||
'responseType' => 'ERROR',
|
|
||||||
'message' => 'Session expired',
|
|
||||||
'title' => 'Exception',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function response($data) {
|
public function response($data) {
|
||||||
return new Response(new GuzzleResponse(200, [], json_encode($data)));
|
return new Response(new GuzzleResponse(200, [], json_encode($data)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $mglnr
|
* @param string $mglnr
|
||||||
* @param array<int, array> $groups
|
|
||||||
*/
|
*/
|
||||||
public function fakeLogin(string $mglnr, array $groups): void
|
public function fakeLogin(string $mglnr): self
|
||||||
{
|
{
|
||||||
app(LoginFake::class)->succeeds($mglnr);
|
app(LoginFake::class)->succeeds($mglnr);
|
||||||
foreach ($groups as $group) {
|
|
||||||
GroupFake::addGroup($group);
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $mitgliedsNr
|
||||||
|
* @param array <string, mixed> $data
|
||||||
|
*/
|
||||||
|
public function addSearch(int $mitgliedsNr, array $data): self
|
||||||
|
{
|
||||||
|
Http::fake(function($request) use ($data, $mitgliedsNr) {
|
||||||
|
if ($request->url() === 'https://nami.dpsg.de/ica/rest/nami/search-multi/result-list?searchedValues='.rawurlencode(json_encode(['mitgliedsNummber' => $mitgliedsNr]) ?: '{}').'&page=1&start=0&limit=10') {
|
||||||
|
$content = [
|
||||||
|
'success' => true,
|
||||||
|
'data' => [$data],
|
||||||
|
'responseType' => 'OK',
|
||||||
|
'totalEntries' => 1,
|
||||||
|
];
|
||||||
|
return Http::response(json_encode($content) ?: '{}', 200);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<int, array{name: string, id: int}> $data
|
||||||
|
*/
|
||||||
|
public function fakeNationalities(array $data): self
|
||||||
|
{
|
||||||
|
Http::fake(function($request) use ($data) {
|
||||||
|
if ($request->url() === 'https://nami.dpsg.de/ica/rest/baseadmin/staatsangehoerigkeit') {
|
||||||
|
return $this->dataResponse($data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<string, string> $data
|
||||||
|
*/
|
||||||
|
public function fakeMember(array $data): self
|
||||||
|
{
|
||||||
|
Http::fake(function($request) use ($data) {
|
||||||
|
if ($request->url() === 'https://nami.dpsg.de/ica/rest/nami/search-multi/result-list?searchedValues='.rawurlencode('[]').'&page=1&start=0&limit=10') {
|
||||||
|
return Http::response(json_encode([
|
||||||
|
'success' => true,
|
||||||
|
'data' => [[
|
||||||
|
'entries_id' => $data['id'],
|
||||||
|
'entries_gruppierungId' => $data['gruppierungId'],
|
||||||
|
]]
|
||||||
|
]) ?: '{}', 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request->url() === "https://nami.dpsg.de/ica/rest/nami/mitglied/filtered-for-navigation/gruppierung/gruppierung/{$data['gruppierungId']}/{$data['id']}") {
|
||||||
|
$content = [
|
||||||
|
'success' => true,
|
||||||
|
'data' => $data,
|
||||||
|
];
|
||||||
|
|
||||||
|
return Http::response(json_encode($content) ?: '{}', 200);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<int, array{name: string, id: int}> $data
|
||||||
|
*/
|
||||||
|
public function fakeCountries(array $data): self
|
||||||
|
{
|
||||||
|
Http::fake(function($request) use ($data) {
|
||||||
|
if ($request->url() === 'https://nami.dpsg.de/ica/rest/baseadmin/land') {
|
||||||
|
return $this->dataResponse($data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<int, array{name: string, id: int}> $data
|
||||||
|
*/
|
||||||
|
public function fakeGenders(array $data): self
|
||||||
|
{
|
||||||
|
Http::fake(function($request) use ($data) {
|
||||||
|
if ($request->url() === 'https://nami.dpsg.de/ica/rest/baseadmin/geschlecht') {
|
||||||
|
return $this->dataResponse($data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<int, array{name: string, id: int}> $data
|
||||||
|
*/
|
||||||
|
public function fakeRegions(array $data): self
|
||||||
|
{
|
||||||
|
Http::fake(function($request) use ($data) {
|
||||||
|
if ($request->url() === 'https://nami.dpsg.de/ica/rest/baseadmin/region') {
|
||||||
|
return $this->dataResponse($data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $groupId
|
||||||
|
* @param array<int, array{name: string, id: int}> $data
|
||||||
|
*/
|
||||||
|
public function fakeActivities(int $groupId, array $data): self
|
||||||
|
{
|
||||||
|
Http::fake(function($request) use ($data, $groupId) {
|
||||||
|
if ($request->url() === "https://nami.dpsg.de/ica/rest/nami/taetigkeitaufgruppierung/filtered/gruppierung/gruppierung/{$groupId}") {
|
||||||
|
return $this->dataResponse($data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $groupId
|
||||||
|
* @param array<int, array<int, array{name: string, id: int}>> $data
|
||||||
|
*/
|
||||||
|
public function fakeSubactivities($matches): self
|
||||||
|
{
|
||||||
|
Http::fake(function($request) use ($matches) {
|
||||||
|
foreach ($matches as $activityId => $data) {
|
||||||
|
if ($request->url() === "https://nami.dpsg.de/ica/rest/nami/untergliederungauftaetigkeit/filtered/untergliederung/taetigkeit/{$activityId}") {
|
||||||
|
return $this->dataResponse($data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $groupId
|
||||||
|
* @param array<int, array{name: string, id: int}> $data
|
||||||
|
*/
|
||||||
|
public function fakeFees(int $groupId, array $data): self
|
||||||
|
{
|
||||||
|
Http::fake(function($request) use ($data, $groupId) {
|
||||||
|
if ($request->url() === "https://nami.dpsg.de/ica/rest/namiBeitrag/beitragsartmgl/gruppierung/{$groupId}") {
|
||||||
|
return $this->dataResponse($data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<int, array{name: string, id: int}> $data
|
||||||
|
*/
|
||||||
|
public function fakeConfessions(array $data): self
|
||||||
|
{
|
||||||
|
Http::fake(function($request) use ($data) {
|
||||||
|
if ($request->url() === "https://nami.dpsg.de/ica/rest/baseadmin/konfession") {
|
||||||
|
return $this->dataResponse($data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function fakeFailedLogin(string $mglnr): void
|
public function fakeFailedLogin(string $mglnr): void
|
||||||
|
@ -179,7 +335,8 @@ class FakeBackend {
|
||||||
app(LoginFake::class)->fails($mglnr);
|
app(LoginFake::class)->fails($mglnr);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function asForm() {
|
public function asForm(): self
|
||||||
|
{
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,4 +344,19 @@ class FakeBackend {
|
||||||
throw new \Exception('no handler found for URL '.$url);
|
throw new \Exception('no handler found for URL '.$url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<int, array{name: string, id: int}> $data
|
||||||
|
*/
|
||||||
|
private function dataResponse(array $data): FulfilledPromise
|
||||||
|
{
|
||||||
|
$content = [
|
||||||
|
'success' => true,
|
||||||
|
'data' => collect($data)->map(fn ($item) => ['descriptor' => $item['name'], 'id' => $item['id'], 'name' => ''])->toArray(),
|
||||||
|
'responseType' => 'OK',
|
||||||
|
'totalEntries' => count ($data),
|
||||||
|
];
|
||||||
|
|
||||||
|
return Http::response(json_encode($content) ?: '{}', 200);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,24 +2,33 @@
|
||||||
|
|
||||||
namespace Zoomyboy\LaravelNami;
|
namespace Zoomyboy\LaravelNami;
|
||||||
|
|
||||||
|
use Cache;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
use Illuminate\Contracts\Auth\Authenticatable;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Cache;
|
|
||||||
|
|
||||||
class NamiUser implements Authenticatable {
|
class NamiUser implements Authenticatable {
|
||||||
|
|
||||||
public $mglnr;
|
public $mglnr;
|
||||||
public $password;
|
public $password;
|
||||||
|
public string $firstname;
|
||||||
|
public string $lastname;
|
||||||
|
public int $group_id;
|
||||||
|
|
||||||
public function __construct($attributes) {
|
public function __construct($attributes) {
|
||||||
$this->mglnr = $attributes['mglnr'];
|
$this->mglnr = $attributes['mglnr'];
|
||||||
$this->password = $attributes['password'];
|
$this->password = $attributes['password'];
|
||||||
|
$this->firstname = $attributes['firstname'];
|
||||||
|
$this->lastname = $attributes['lastname'];
|
||||||
|
$this->group_id = $attributes['group_id'];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function fromPayload($payload) {
|
public static function fromPayload($payload) {
|
||||||
$user = new static([
|
$user = new static([
|
||||||
'mglnr' => data_get($payload, 'credentials.mglnr'),
|
'mglnr' => data_get($payload, 'credentials.mglnr'),
|
||||||
'password' => data_get($payload, 'credentials.password'),
|
'password' => data_get($payload, 'credentials.password'),
|
||||||
|
'firstname' => data_get($payload, 'firstname'),
|
||||||
|
'lastname' => data_get($payload, 'lastname'),
|
||||||
|
'group_id' => data_get($payload, 'group_id'),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return $user;
|
return $user;
|
||||||
|
@ -30,7 +39,7 @@ class NamiUser implements Authenticatable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getNamiGroupId() {
|
public function getNamiGroupId() {
|
||||||
return $this->api()->findNr($this->mglnr)->group_id;
|
return $this->group_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getAuthIdentifierName() {
|
public function getAuthIdentifierName() {
|
||||||
|
@ -42,15 +51,11 @@ class NamiUser implements Authenticatable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getFirstname() {
|
public function getFirstname() {
|
||||||
return Cache::remember('member-'.$this->mglnr.'-firstname', 3600, function() {
|
return $this->firstname;
|
||||||
return $this->api()->findNr($this->mglnr)->firstname;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLastname() {
|
public function getLastname() {
|
||||||
return Cache::remember('member-'.$this->mglnr.'-lastname', 3600, function() {
|
return $this->firstname;
|
||||||
return $this->api()->findNr($this->mglnr)->lastname;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getAuthIdentifier() {
|
public function getAuthIdentifier() {
|
||||||
|
|
Loading…
Reference in New Issue