Skip to content

Commit 801f22e

Browse files
committed
GetAvailabilityParametersFactory added
1 parent bfedaa2 commit 801f22e

2 files changed

Lines changed: 190 additions & 0 deletions

File tree

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace TK\SDK\ValueObject\Factory;
5+
6+
use TK\SDK\ValueObject\GetAvailabilityParameters;
7+
use TK\SDK\ValueObject\Location;
8+
use TK\SDK\ValueObject\DepartureDateTime;
9+
use TK\SDK\ValueObject\OriginDestinationInformation;
10+
use TK\SDK\ValueObject\PassengerTypeQuantity;
11+
use DateTimeImmutable;
12+
use TK\SDK\Exception\InvalidArgumentException;
13+
14+
final class GetAvailabilityParametersFactory implements ValueObjectFactoryInterface
15+
{
16+
/**
17+
* @param array $parameters
18+
* @return GetAvailabilityParameters
19+
* @throws \Exception
20+
*/
21+
public static function createFromArray(array $parameters) : GetAvailabilityParameters
22+
{
23+
$originDestinationInformations = [];
24+
foreach ($parameters['OriginDestinationInformation'] as $originDestinationInformation) {
25+
$originLocation = new Location(
26+
$originDestinationInformation['OriginLocation']['LocationCode'],
27+
$originDestinationInformation['OriginLocation']['MultiAirportCityInd']
28+
);
29+
$destinationLocation = new Location(
30+
$originDestinationInformation['DestinationLocation']['LocationCode'],
31+
$originDestinationInformation['DestinationLocation']['MultiAirportCityInd']
32+
);
33+
$departureDateTime = (new DepartureDateTime(
34+
DateTimeImmutable::createFromFormat('dM', $originDestinationInformation['DepartureDateTime']['Date']),
35+
$originDestinationInformation['DepartureDateTime']['WindowAfter'],
36+
$originDestinationInformation['DepartureDateTime']['WindowBefore']
37+
))->withDateFormat('dM');
38+
$originDestinationInformationObject = new OriginDestinationInformation(
39+
$departureDateTime,
40+
$originLocation,
41+
$destinationLocation
42+
);
43+
if (array_key_exists('CabinPreferences', $originDestinationInformation)) {
44+
foreach ($originDestinationInformation['CabinPreferences'] as $cabinPreference) {
45+
$originDestinationInformationObject = $originDestinationInformationObject
46+
->withCabinPreferences($cabinPreference['Cabin']);
47+
}
48+
}
49+
$originDestinationInformations[] = $originDestinationInformationObject;
50+
}
51+
$passengerTypeQuantityObject = new PassengerTypeQuantity();
52+
foreach ($parameters['PassengerTypeQuantity'] as $passengerTypeQuantity) {
53+
$passengerTypeQuantityObject->withQuantity(
54+
$passengerTypeQuantity['Code'],
55+
$passengerTypeQuantity['Quantity']
56+
);
57+
}
58+
$getAvailabilityParameters = new GetAvailabilityParameters(
59+
$parameters['ReducedDataIndicator'],
60+
$parameters['RoutingType'],
61+
$passengerTypeQuantityObject
62+
);
63+
64+
if (array_key_exists('TargetSource', $parameters)) {
65+
$getAvailabilityParameters = $getAvailabilityParameters->withTargetSource();
66+
}
67+
foreach ($originDestinationInformations as $originDestinationInformationObject) {
68+
$getAvailabilityParameters = $getAvailabilityParameters->withOriginDestinationInformation($originDestinationInformationObject);
69+
}
70+
return $getAvailabilityParameters;
71+
}
72+
73+
/**
74+
* @param string $json
75+
* @return GetAvailabilityParameters
76+
* @throws InvalidArgumentException
77+
* @throws \Exception
78+
*/
79+
public static function createFromJson(string $json) : GetAvailabilityParameters
80+
{
81+
$parameters = json_decode($json, (bool) JSON_OBJECT_AS_ARRAY);
82+
if (json_last_error() !== JSON_ERROR_NONE) {
83+
throw new InvalidArgumentException(
84+
'GetAvailabilityParametersFactory Error: ' . json_last_error_msg()
85+
);
86+
}
87+
return self::createFromArray($parameters);
88+
}
89+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace TK\Test\Unit\Factory;
5+
6+
use TK\SDK\ValueObject\Factory\GetAvailabilityParametersFactory;
7+
use TK\SDK\ValueObject\GetAvailabilityParameters;
8+
class GetAvailabilityParametersFactoryTest extends \Codeception\Test\Unit
9+
{
10+
/**
11+
* @var \UnitTester
12+
*/
13+
protected $tester;
14+
15+
protected function _before()
16+
{
17+
}
18+
19+
protected function _after()
20+
{
21+
}
22+
23+
/**
24+
* @test
25+
* @throws \Exception
26+
*/
27+
public function shouldReturnGetAvailabilityParameters() : void
28+
{
29+
$json =<<<JSON
30+
{
31+
"ReducedDataIndicator":false,
32+
"RoutingType":"r",
33+
"PassengerTypeQuantity":[
34+
{
35+
"Code":"adult",
36+
"Quantity":1
37+
},
38+
{
39+
"Code":"child",
40+
"Quantity":1
41+
},
42+
{
43+
"Code":"infant",
44+
"Quantity":0
45+
}
46+
],
47+
"OriginDestinationInformation":[
48+
{
49+
"DepartureDateTime":{
50+
"WindowAfter":"P0D",
51+
"WindowBefore":"P0D",
52+
"Date":"14OCT"
53+
},
54+
"OriginLocation":{
55+
"LocationCode":"IST",
56+
"MultiAirportCityInd":true
57+
},
58+
"DestinationLocation":{
59+
"LocationCode":"ESB",
60+
"MultiAirportCityInd":true
61+
},
62+
"CabinPreferences":[
63+
{
64+
"Cabin":"ECONOMY"
65+
},
66+
{
67+
"Cabin":"BUSINESS"
68+
}
69+
]
70+
},
71+
{
72+
"DepartureDateTime":{
73+
"WindowAfter":"P0D",
74+
"WindowBefore":"P0D",
75+
"Date":"09JAN"
76+
},
77+
"OriginLocation":{
78+
"LocationCode":"ESB",
79+
"MultiAirportCityInd":false
80+
},
81+
"DestinationLocation":{
82+
"LocationCode":"IST",
83+
"MultiAirportCityInd":false
84+
},
85+
"CabinPreferences":[
86+
{
87+
"Cabin":"ECONOMY"
88+
},
89+
{
90+
"Cabin":"BUSINESS"
91+
}
92+
]
93+
}
94+
]
95+
}
96+
JSON;
97+
$parameterObject = GetAvailabilityParametersFactory::createFromJson($json);
98+
$this->assertInstanceOf(GetAvailabilityParameters::class, $parameterObject);
99+
$this->assertEquals(json_decode($json, true), $parameterObject->getValue());
100+
}
101+
}

0 commit comments

Comments
 (0)