Skip to content

Commit 2f7c26f

Browse files
committed
Added support for Taxonomy Facets.
1 parent e85f541 commit 2f7c26f

File tree

3 files changed

+342
-0
lines changed

3 files changed

+342
-0
lines changed
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
<?php
2+
3+
namespace Olsgreen\AutoTrader\Api\Builders;
4+
5+
use Olsgreen\AutoTrader\Api\Enums\VehicleTypes;
6+
7+
class TaxonomyFacetRequestBuilder extends AbstractBuilder
8+
{
9+
protected $vehicleType;
10+
11+
protected $makeId;
12+
13+
protected $modelId;
14+
15+
protected $generationId;
16+
17+
public function getVehicleType(): ?string
18+
{
19+
return $this->vehicleType;
20+
}
21+
22+
public function setVehicleType(string $vehicleType): TaxonomyFacetRequestBuilder
23+
{
24+
$typesList = new VehicleTypes();
25+
26+
if (!$typesList->contains($vehicleType)) {
27+
throw new \Exception(
28+
sprintf(
29+
'You tried to set invalid vehicle type. [%s]',
30+
$vehicleType
31+
)
32+
);
33+
}
34+
35+
$this->vehicleType = $vehicleType;
36+
37+
return $this;
38+
}
39+
40+
public function getMakeId(): ?string
41+
{
42+
return $this->makeId;
43+
}
44+
45+
public function setMakeId(string $makeId): TaxonomyFacetRequestBuilder
46+
{
47+
$this->makeId = $makeId;
48+
49+
return $this;
50+
}
51+
52+
public function getModelId(): ?string
53+
{
54+
return $this->modelId;
55+
}
56+
57+
public function setModelId(string $modelId): TaxonomyFacetRequestBuilder
58+
{
59+
$this->modelId = $modelId;
60+
61+
return $this;
62+
}
63+
64+
public function getGenerationId(): ?string
65+
{
66+
return $this->generationId;
67+
}
68+
69+
public function setGenerationId(string $generationId): TaxonomyFacetRequestBuilder
70+
{
71+
$this->generationId = $generationId;
72+
73+
return $this;
74+
}
75+
76+
public function validate(): bool
77+
{
78+
$setKeys = array_filter(['vehicleType', 'makeId', 'modelId', 'generationId'], function ($key) {
79+
return !empty($this->$key);
80+
});
81+
82+
if (empty($setKeys)) {
83+
throw new \InvalidArgumentException(
84+
'You must specify one of the following vehicleType, makeId, modelId, generationId.'
85+
);
86+
}
87+
88+
return parent::validate();
89+
}
90+
91+
public function toArray(): array
92+
{
93+
$this->validate();
94+
95+
return $this->filterPrepareOutput([
96+
'vehicleType' => $this->vehicleType,
97+
'makeId' => $this->makeId,
98+
'modelId' => $this->modelId,
99+
'generationId' => $this->generationId,
100+
]);
101+
}
102+
}

src/Api/Taxonomy.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,4 +139,9 @@ public function prices(string $advertiserId, string $derivativeId, string $effec
139139
$options
140140
);
141141
}
142+
143+
public function facets(): TaxonomyFacets
144+
{
145+
return new TaxonomyFacets($this->client);
146+
}
142147
}

src/Api/TaxonomyFacets.php

Lines changed: 235 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,235 @@
1+
<?php
2+
3+
namespace Olsgreen\AutoTrader\Api;
4+
5+
use Olsgreen\AutoTrader\Api\Builders\TaxonomyFacetRequestBuilder;
6+
7+
/**
8+
* @see https://developers.autotrader.co.uk/api#taxonomy-facets
9+
*
10+
* ALL methods must provide a request parameter including one of:
11+
*
12+
* vehicleType, makeId, modelId, generationId
13+
*/
14+
class TaxonomyFacets extends AbstractApi
15+
{
16+
/**
17+
* Retrieve available fuel types for a given set of parameters.
18+
*
19+
* @param string $advertiserId
20+
* @param array|TaxonomyFacetRequestBuilder $request
21+
* @return array
22+
*/
23+
public function fuelTypes(string $advertiserId, $request): array
24+
{
25+
return $this->facet('fuelTypes', $advertiserId, $request);
26+
}
27+
28+
/**
29+
* Retrieve available transmission types for a given set of parameters.
30+
*
31+
* @param string $advertiserId
32+
* @param array|TaxonomyFacetRequestBuilder $request
33+
* @return array
34+
*/
35+
public function transmissionTypes(string $advertiserId, $request): array
36+
{
37+
return $this->facet('transmissionTypes', $advertiserId, $request);
38+
}
39+
40+
41+
/**
42+
* Retrieve available body types for a given set of parameters.
43+
*
44+
* @param string $advertiserId
45+
* @param array|TaxonomyFacetRequestBuilder $request
46+
* @return array
47+
*/
48+
public function bodyTypes(string $advertiserId, $request): array
49+
{
50+
return $this->facet('bodyTypes', $advertiserId, $request);
51+
}
52+
53+
/**
54+
* Retrieve available trims for a given set of parameters.
55+
*
56+
* @param string $advertiserId
57+
* @param array|TaxonomyFacetRequestBuilder $request
58+
* @return array
59+
*/
60+
public function trims(string $advertiserId, $request): array
61+
{
62+
return $this->facet('trims', $advertiserId, $request);
63+
}
64+
65+
/**
66+
* Retrieve available doors for a given set of parameters.
67+
*
68+
* @param string $advertiserId
69+
* @param array|TaxonomyFacetRequestBuilder $request
70+
* @return array
71+
*/
72+
public function doors(string $advertiserId, $request): array
73+
{
74+
return $this->facet('doors', $advertiserId, $request);
75+
}
76+
77+
/**
78+
* Retrieve available drivetrains for a given set of parameters.
79+
*
80+
* @param string $advertiserId
81+
* @param array|TaxonomyFacetRequestBuilder $request
82+
* @return array
83+
*/
84+
public function drivetrains(string $advertiserId, $request): array
85+
{
86+
return $this->facet('drivetrains', $advertiserId, $request);
87+
}
88+
89+
/**
90+
* Retrieve available body types for a given set of parameters.
91+
*
92+
* @param string $advertiserId
93+
* @param array|TaxonomyFacetRequestBuilder $request
94+
* @return array
95+
*/
96+
public function wheelbaseTypes(string $advertiserId, $request): array
97+
{
98+
return $this->facet('wheelbaseTypes', $advertiserId, $request);
99+
}
100+
101+
/**
102+
* Retrieve available cab types for a given set of parameters.
103+
*
104+
* @param string $advertiserId
105+
* @param array|TaxonomyFacetRequestBuilder $request
106+
* @return array
107+
*/
108+
public function cabTypes(string $advertiserId, $request): array
109+
{
110+
return $this->facet('cabTypes', $advertiserId, $request);
111+
}
112+
113+
/**
114+
* Retrieve available axle configurations for a given set of parameters.
115+
*
116+
* @param string $advertiserId
117+
* @param array|TaxonomyFacetRequestBuilder $request
118+
* @return array
119+
*/
120+
public function axleConfigurations(string $advertiserId, $request): array
121+
{
122+
return $this->facet('axleConfigurations', $advertiserId, $request);
123+
}
124+
125+
/**
126+
* Retrieve available badge engine sizes for a given set of parameters.
127+
*
128+
* @param string $advertiserId
129+
* @param array|TaxonomyFacetRequestBuilder $request
130+
* @return array
131+
*/
132+
public function badgeEngineSizes(string $advertiserId, $request): array
133+
{
134+
return $this->facet('badgeEngineSizes', $advertiserId, $request);
135+
}
136+
137+
/**
138+
* Retrieve available styles for a given set of parameters.
139+
*
140+
* @param string $advertiserId
141+
* @param array|TaxonomyFacetRequestBuilder $request
142+
* @return array
143+
*/
144+
public function styles(string $advertiserId, $request): array
145+
{
146+
return $this->facet('styles', $advertiserId, $request);
147+
}
148+
149+
/**
150+
* Retrieve available sub styles for a given set of parameters.
151+
*
152+
* @param string $advertiserId
153+
* @param array|TaxonomyFacetRequestBuilder $request
154+
* @return array
155+
*/
156+
public function subStyles(string $advertiserId, $request): array
157+
{
158+
return $this->facet('subStyles', $advertiserId, $request);
159+
}
160+
161+
/**
162+
* Retrieve available end layouts for a given set of parameters.
163+
*
164+
* @param string $advertiserId
165+
* @param array|TaxonomyFacetRequestBuilder $request
166+
* @return array
167+
*/
168+
public function endLayouts(string $advertiserId, $request): array
169+
{
170+
return $this->facet('endLayouts', $advertiserId, $request);
171+
}
172+
173+
/**
174+
* Retrieve available bedroom layouts for a given set of parameters.
175+
*
176+
* @param string $advertiserId
177+
* @param array|TaxonomyFacetRequestBuilder $request
178+
* @return array
179+
*/
180+
public function bedroomLayouts(string $advertiserId, $request): array
181+
{
182+
return $this->facet('bedroomLayouts', $advertiserId, $request);
183+
}
184+
185+
/**
186+
* Retrieve available facet items for a given set of parameters.
187+
*
188+
* @param string $name
189+
* @param string $advertiserId
190+
* @param array|TaxonomyFacetRequestBuilder $request
191+
* @return array
192+
*/
193+
public function facet(string $name, string $advertiserId, $request) : array
194+
{
195+
$availableFacets = [
196+
'fuelTypes',
197+
'transmissionTypes',
198+
'bodyTypes',
199+
'trims',
200+
'doors',
201+
'drivetrains',
202+
'wheelbaseTypes',
203+
'cabTypes',
204+
'axleConfigurations',
205+
'badgeEngineSizes',
206+
'styles',
207+
'subStyles',
208+
'endLayouts',
209+
'bedroomLayouts',
210+
];
211+
212+
if (!in_array($name, $availableFacets)) {
213+
throw new \InvalidArgumentException(
214+
'The $name argument must be one of ' . implode(', ', $availableFacets)
215+
);
216+
}
217+
218+
if (!($request instanceof TaxonomyFacetRequestBuilder)) {
219+
if (is_array($request)) {
220+
$request = TaxonomyFacetRequestBuilder::create($request);
221+
}
222+
223+
// Throw an invalid argument exception if it's anything else.
224+
else {
225+
throw new \InvalidArgumentException(
226+
'The $request argument must be an array or TaxonomyFacetRequestBuilder.'
227+
);
228+
}
229+
}
230+
231+
$options = array_merge($request->toArray(), ['advertiserId' => $advertiserId]);
232+
233+
return $this->_get('/taxonomy/' . $name, $options);
234+
}
235+
}

0 commit comments

Comments
 (0)