WIP: Extend and improve profile editing

This commit is contained in:
Björn Fromme
2023-10-01 16:39:32 +02:00
parent 6595fbec8a
commit d776d37cd5
27 changed files with 553 additions and 375 deletions
+29 -21
View File
@@ -3,16 +3,15 @@
namespace App\BusProNet;
use App\BusProNet\Model\Address;
use App\BusProNet\Model\BaseDataResponse;
use App\BusProNet\Model\NotificationResponse;
use App\BusProNet\Model\Communication;
use App\BusProNet\Model\CountriesResponse;
use App\BusProNet\Model\Country;
use App\BusProNet\Model\CrmAttribute;
use App\BusProNet\Model\CrmAttributesResponse;
use App\BusProNet\Model\CrmAttributeGroup;
use App\BusProNet\Model\CrmAttributesResponse;
use App\BusProNet\Model\Pickup;
use App\BusProNet\Model\PickupsResponse;
use App\BusProNet\Model\ProfileResponse;
use App\BusProNet\Model\BaseResponse;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ResponseParser
@@ -27,37 +26,46 @@ class ResponseParser
/**
* @throws ResponseParserException
*/
public function parseXmlString(string $content): BaseResponse
public function parseXmlString(string $type, string $content): mixed
{
$xml = simplexml_load_string($content);
$type = (string)$xml->xpath('satz/@typ')[0];
switch ($type) {
case 'HINWEIS':
return $this->createBaseResponse($xml);
case 'KUNDENKONTO':
// Override type when present in XML to catch error responses
$responseType = $type;
$responseTypeXml = $xml->xpath('satz/@typ');
if (0 < count($responseTypeXml)) {
$responseType = (string)$xml->xpath('satz/@typ')[0];
}
switch ($responseType) {
case ApiClient::TYPE_NOTIFICATION:
return $this->createNotificationResponse($xml);
case ApiClient::TYPE_CUSTOMER_DATA:
$subType = (string) $xml->xpath('art')[0];
switch ($subType) {
case 'Adressdaten':
case 'Adressdaten_Ändern':
return $this->createProfileResponse($xml);
case 'SelektionCRM':
case 'SelektionCRM_Ändern':
return $this->createCrmAttributesResponse($xml);
}
case 'STAMMLAENDER':
break;
case ApiClient::TYPE_BASE_DATA_COUNTRIES:
return $this->createCountriesResponse($xml);
case 'STAMMZUSTIEGE':
case ApiClient::TYPE_BASE_DATA_PICKUPS:
return $this->createPickupsResponse($xml);
}
throw new ResponseParserException('Unable to parse XML response');
}
public function createBaseResponse(\SimpleXMLElement $xml): BaseResponse
public function createNotificationResponse(\SimpleXMLElement $xml): NotificationResponse
{
$code = (int) $xml->xpath('satz/nr')[0];
$message = (string) $xml->xpath('satz/text')[0];
return new BaseResponse($code, $message);
return new NotificationResponse($code, $message);
}
public function createProfileResponse(\SimpleXMLElement $xml): ProfileResponse
@@ -163,7 +171,7 @@ class ResponseParser
return $response;
}
public function createCountriesResponse(\SimpleXMLElement $xml): CountriesResponse
public function createCountriesResponse(\SimpleXMLElement $xml): BaseDataResponse
{
$countries = [];
@@ -178,17 +186,17 @@ class ResponseParser
$countries[] = $country;
}
$response = new CountriesResponse();
$response->setCountries($countries);
$response = new BaseDataResponse();
$response->setItems($countries);
return $response;
}
public function createPickupsResponse(\SimpleXMLElement $xml): PickupsResponse
public function createPickupsResponse(\SimpleXMLElement $xml): BaseDataResponse
{
$pickups = [];
foreach ($xml->xpath('zustiege/zustieg') as $item) {
foreach ($xml->xpath('zustieg') as $item) {
$pickup = new Pickup();
$pickup
->setId((int)$item->attributes()['id'])
@@ -200,8 +208,8 @@ class ResponseParser
$pickups[] = $pickup;
}
$response = new PickupsResponse();
$response->setPickups($pickups);
$response = new BaseDataResponse();
$response->setItems($pickups);
return $response;
}