laravel-nami-api/src/Api.php

228 lines
8.2 KiB
PHP
Raw Normal View History

2020-06-27 23:45:49 +02:00
<?php
namespace Zoomyboy\LaravelNami;
use Log;
2020-06-27 23:45:49 +02:00
use App\Conf;
use Illuminate\Support\Str;
2020-06-27 23:45:49 +02:00
use App\Nami\Exceptions\TooManyLoginAttemptsException;
use Illuminate\Support\Facades\Http;
2020-06-28 00:12:36 +02:00
use Illuminate\Support\Collection;
2021-05-13 23:25:00 +02:00
use Zoomyboy\LaravelNami\Backend\Backend;
2020-06-27 23:45:49 +02:00
2021-05-13 23:25:00 +02:00
class Api {
2020-06-27 23:45:49 +02:00
public $cookie;
public $loggedIn = null;
public static $url = 'https://nami.dpsg.de';
public function __construct() {
$this->cookie = new \GuzzleHttp\Cookie\CookieJar();
}
2021-05-13 23:25:00 +02:00
public function http() {
return Backend::cookie($this->cookie);
2020-06-27 23:45:49 +02:00
}
public function setUser(NamiUser $user) {
$this->user = $user;
return $this;
}
protected function loggedInAlready(): bool {
return $this->loggedIn !== null;
}
public function login($mglnr = null, $password = null, $groupid = null): self {
if ($this->loggedIn) { return $this; }
$mglnr = $mglnr ?: config('nami.auth.mglnr');
$password = $password ?: config('nami.auth.password');
$groupid = $groupid ?: config('nami.auth.groupid');
Http::withOptions(['cookies' => $this->cookie])->get(self::$url.'/ica/pages/login.jsp');
$response = Http::asForm()->withOptions(['cookies' => $this->cookie])->post(self::$url.'/ica/rest/nami/auth/manual/sessionStartup', [
'Login' => 'API',
'redirectTo' => './app.jsp',
'username' => $mglnr,
'password' => $password
])->json();
if ($response['statusCode'] !== 0) {
$e = new LoginException();
$e->setResponse($response);
throw $e;
}
$this->loggedIn = $mglnr;
return $this;
}
2020-06-29 00:30:57 +02:00
public function membersOf($groupId): Collection {
return collect($this->http()->get(self::$url.'/ica/rest/nami/mitglied/filtered-for-navigation/gruppierung/gruppierung/'.$groupId.'/flist')->json()['data']);
}
2020-07-15 22:55:52 +02:00
public function putMember(Member $member) {
$this->http()->put(self::$url.'/ica/rest/nami/mitglied/filtered-for-navigation/gruppierung/gruppierung/'.$member->group_id.'/'.$member->id, [
'vorname' => $member->firstname,
'nachname' => $member->lastname,
2021-04-11 16:58:10 +02:00
'spitzname' => $member->nickname ?: '',
'geschlechtId' => $member->gender_id ?: Gender::getNullValue(),
2020-07-15 22:55:52 +02:00
]);
}
2020-07-04 20:47:30 +02:00
public function membershipsOf($memberId): Collection {
$url = self::$url.'/ica/rest/nami/zugeordnete-taetigkeiten/filtered-for-navigation/gruppierung-mitglied/mitglied/'.$memberId.'/flist';
$r = $this->http()->get($url);
2020-07-05 10:56:43 +02:00
Logger::http($url, $r, 'Memberships from '.$memberId, ['memberId' => $memberId]);
if (!isset($r->json()['data'])) {
return collect([]);
}
return collect($r->json()['data']);
2020-07-04 20:47:30 +02:00
}
2020-07-04 21:23:10 +02:00
public function subactivitiesOf($activityId) {
return collect($this->http()->get(self::$url.'/ica/rest/nami/untergliederungauftaetigkeit/filtered/untergliederung/taetigkeit/'.$activityId)->json()['data'])->map(function($subactivity) {
return Subactivity::fromNami($subactivity);
});;
}
2020-07-04 20:47:30 +02:00
public function membership($memberId, $membershipId) {
$url = self::$url.'/ica/rest/nami/zugeordnete-taetigkeiten/filtered-for-navigation/gruppierung-mitglied/mitglied/'.$memberId.'/'.$membershipId;
$response = $this->http()->get($url);
2020-07-05 10:56:43 +02:00
Logger::http($url, $response, 'Single Membership '.$membershipId.' from '.$memberId, ['memberId' => $memberId]);
2020-07-04 20:47:30 +02:00
return $response->json()['data'];
}
2020-06-29 00:30:57 +02:00
public function member($groupId, $memberId) {
$url = self::$url.'/ica/rest/nami/mitglied/filtered-for-navigation/gruppierung/gruppierung/'.$groupId.'/'.$memberId;
$response = $this->http()->get($url);
2020-07-05 10:56:43 +02:00
Logger::http($url, $response, 'Show member '.$memberId, ['memberId' => $memberId]);
if($response->json()['success'] === false && Str::startsWith($response['message'], 'Access denied')) {
return $this->singleMemberFallback($groupId, $memberId);
}
if($response->json()['success'] === false && Str::startsWith($response['message'], 'Sicherheitsverletzung: Zugriff')) {
return $this->singleMemberFallback($groupId, $memberId);
}
if ($response->json()['success'] === true) {
return $response->json()['data'];
} else {
$e = new NamiException('Fetch von Mitglied fehlgeschlagen');
$e->setData([
'response' => $response->body(),
'url' => $url
]);
throw $e;
}
2020-06-29 00:30:57 +02:00
}
2020-06-28 00:12:36 +02:00
public function hasGroup($groupId): bool {
return $this->groups()->search(function($group) use ($groupId) {
return $group->id == $groupId;
}) !== false;
}
2020-06-27 23:45:49 +02:00
2020-06-29 00:30:57 +02:00
public function groups($parentGroupId = null): Collection {
2020-07-04 17:50:55 +02:00
return collect($this->http()->get(self::$url.'/ica/rest/nami/gruppierungen/filtered-for-navigation/gruppierung/node/'.($parentGroupId ?: 'root'))->json()['data'])->map(function($group) use ($parentGroupId) {
return Group::fromResponse($group, $parentGroupId);
2020-06-28 00:12:36 +02:00
});
2020-06-27 23:45:49 +02:00
}
public function group($groupId): Group {
2020-06-28 02:11:23 +02:00
return $this->groups()->first(function($group) use ($groupId) {
return $group->id == $groupId;
});
}
public function subgroupsOf($groupId) {
return $this->groups($groupId);
}
2020-06-29 23:12:16 +02:00
public function genders(): Collection {
return collect($this->http()->get(self::$url."/ica/rest/baseadmin/geschlecht")['data'])->map(function($gender) {
return Gender::fromNami($gender);
2021-04-11 16:45:37 +02:00
})->filter(fn($gender) => !$gender->isNull);
2020-06-29 23:12:16 +02:00
}
2020-06-29 23:42:48 +02:00
public function nationalities(): Collection {
return collect($this->http()->get(self::$url."/ica/rest/baseadmin/staatsangehoerigkeit")['data'])->map(function($gender) {
return Nationality::fromNami($gender);
});
}
2021-04-10 00:38:45 +02:00
public function countries() {
return collect($this->http()->get(self::$url."/ica/rest/baseadmin/land")['data'])->map(function($country) {
return Country::fromNami($country);
});
}
2021-04-10 00:48:04 +02:00
public function regions() {
return collect($this->http()->get(self::$url."/ica/rest/baseadmin/region")['data'])->map(function($region) {
return Region::fromNami($region);
});
}
2021-04-10 00:28:19 +02:00
public function feesOf($groupid) {
return collect($this->http()->get(self::$url."/ica/rest/namiBeitrag/beitragsartmgl/gruppierung/{$groupid}")['data'])->map(function($fee) {
return Fee::fromNami($fee);
});
}
2020-06-30 00:01:17 +02:00
public function confessions(): Collection {
return collect($this->http()->get(self::$url."/ica/rest/baseadmin/konfession")['data'])->map(function($gender) {
return Confession::fromNami($gender);
});
}
2020-07-04 21:23:10 +02:00
public function activities($groupId) {
return collect($this->http()->get(self::$url."/ica/rest/nami/taetigkeitaufgruppierung/filtered/gruppierung/gruppierung/".$groupId)['data'])->map(function($activity) {
return Activity::fromNami($activity);
});
}
2020-08-15 02:03:11 +02:00
public function memberOverviewOf($groupId) {
$url = self::$url.'/ica/rest/nami/mitglied/filtered-for-navigation/gruppierung/gruppierung/'.$groupId.'/flist';
$response = $this->http()->get($url);
return collect($response['data'])->map(function($member) use ($groupId) {
$member = collect($member)->mapWithKeys(function($value, $key) {
return [ str_replace('entries_', '', $key) => $value ];
});
$member['gruppierungId'] = $groupId;
return $member;
});
}
private function singleMemberFallback($groupId, $memberId) {
$url = self::$url.'/ica/rest/nami/mitglied/filtered-for-navigation/gruppierung/gruppierung/'.$groupId.'/flist';
$response = $this->http()->get($url);
$member = collect($response['data'])->first(function($member) use ($memberId) {
return $member['id'] == $memberId;
});
$member = collect($member)->mapWithKeys(function($value, $key) {
return [ str_replace('entries_', '', $key) => $value ];
});
2020-07-04 13:07:58 +02:00
$member['gruppierungId'] = $groupId;
return $member->toArray();
}
2020-06-27 23:45:49 +02:00
}
2021-05-13 23:02:05 +02:00