AdresseProvider::searchCsv()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 19
ccs 11
cts 11
cp 1
rs 9.6333
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
1
<?php
2
3
/*
4
 * This file is part of the geo-api-library package.
5
 *
6
 * (c) 2020 WEBEWEB
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace WBW\Library\GeoAPI\Provider;
13
14
use GuzzleHttp\Exception\GuzzleException;
15
use WBW\Library\Core\Argument\Helper\ArrayHelper;
16
use WBW\Library\Core\Exception\ApiException;
17
use WBW\Library\GeoAPI\Request\Adresse\ReverseCsvRequest;
18
use WBW\Library\GeoAPI\Request\Adresse\ReverseRequest;
19
use WBW\Library\GeoAPI\Request\Adresse\SearchCsvRequest;
20
use WBW\Library\GeoAPI\Request\Adresse\SearchRequest;
21
use WBW\Library\GeoAPI\Response\Adresse\ReverseCsvResponse;
22
use WBW\Library\GeoAPI\Response\Adresse\SearchCsvResponse;
23
use WBW\Library\GeoAPI\Serializer\AdresseRequestSerializer;
24
use WBW\Library\GeoAPI\Serializer\AdresseResponseDeserializer;
25
use WBW\Library\GeoJSON\Model\FeatureCollection;
26
27
/**
28
 * Adresse provider.
29
 *
30
 * @author webeweb <https://github.com/webeweb/>
31
 * @package WBW\Library\GeoAPI\Provider
32
 */
33
class AdresseProvider extends AbstractProvider {
34
35
    /**
36
     * Endpoint path.
37
     *
38
     * @var string
39
     */
40
    const ENDPOINT_PATH = "https://api-adresse.data.gouv.fr";
41
42
    /**
43
     * Add an array.
44
     *
45
     * @param array $post The POST.
46
     * @param string $name The name.
47
     * @param array $data The data.
48
     * @return void
49
     */
50 10
    protected function appendArray(array &$post, string $name, array $data): void {
51
52 10
        if (0 === count($data)) {
53 5
            return;
54
        }
55
56 5
        foreach ($data as $current) {
57 4
            $post[] = [
58 5
                "name"     => $name,
59 5
                "contents" => $current,
60
            ];
61
        }
62 5
    }
63
64
    /**
65
     * {@inheritDoc}
66
     */
67 30
    public function getEndpointPath(): string {
68 30
        return self::ENDPOINT_PATH;
69
    }
70
71
    /**
72
     * Reverse.
73
     *
74
     * @param ReverseRequest $request The reverse request.
75
     * @return FeatureCollection|null Returns the reverse response in case of success, null otherwise.
76
     * @throws GuzzleException Throws a Guzzle exception if an error occurs.
77
     * @throws ApiException Throws an API exception if an error occurs.
78
     */
79 5
    public function reverse(ReverseRequest $request): ?FeatureCollection {
80
81 5
        $queryData = AdresseRequestSerializer::serializeReverseRequest($request);
82
83 5
        $rawResponse = $this->callApi($request, $queryData);
84
85 5
        return AdresseResponseDeserializer::deserializeReverseResponse($rawResponse);
86
    }
87
88
    /**
89
     * Reverse CSV.
90
     *
91
     * @param ReverseCsvRequest $request The reverse CSV request.
92
     * @return ReverseCsvResponse Returns the reverse CSV response.
93
     * @throws GuzzleException Throws a Guzzle exception if an error occurs.
94
     * @throws ApiException Throws an API exception if an error occurs.
95
     */
96 5
    public function reverseCsv(ReverseCsvRequest $request): ReverseCsvResponse {
97
98 5
        $queryData = AdresseRequestSerializer::serializeReverseCsvRequest($request);
99
100 5
        $filename = realpath($queryData["data"]);
101 1
        $postData = [
102
            [
103 5
                "name"     => "data",
104 5
                "contents" => fopen($filename, "r"),
105 5
                "filename" => basename($filename),
106
            ],
107
        ];
108
109 5
        $rawResponse = $this->callApi($request, [], $postData);
110
111 5
        return AdresseResponseDeserializer::deserializeReverseCsvResponse($rawResponse);
112
    }
113
114
    /**
115
     * Search.
116
     *
117
     * @param SearchRequest $request The search request.
118
     * @return FeatureCollection|null Returns the search response in case of success, null otherwise.
119
     * @throws GuzzleException Throws a Guzzle exception if an error occurs.
120
     * @throws ApiException Throws an API exception if an error occurs.
121
     */
122 5
    public function search(SearchRequest $request): FeatureCollection {
123
124 5
        $queryData = AdresseRequestSerializer::serializeSearchRequest($request);
125
126 5
        $rawResponse = $this->callApi($request, $queryData);
127
128 5
        return AdresseResponseDeserializer::deserializeSearchResponse($rawResponse);
129
    }
130
131
    /**
132
     * Search CSV.
133
     *
134
     * @param SearchCsvRequest $request The search CSV request.
135
     * @return SearchCsvResponse Returns the search CSV response.
136
     * @throws GuzzleException Throws a Guzzle exception if an error occurs.
137
     * @throws ApiException Throws an API exception if an error occurs.
138
     */
139 10
    public function searchCsv(SearchCsvRequest $request): SearchCsvResponse {
140
141 10
        $queryData = AdresseRequestSerializer::serializeSearchCsvRequest($request);
142
143 10
        $filename = realpath($queryData["data"]);
144 2
        $postData = [
145
            [
146 10
                "name"     => "data",
147 10
                "contents" => fopen($filename, "r"),
148 10
                "filename" => basename($filename),
149
            ],
150
        ];
151 10
        $this->appendArray($postData, "columns", ArrayHelper::get($queryData, "columns", []));
152 10
        $this->appendArray($postData, "result_columns", ArrayHelper::get($queryData, "result_columns", []));
153
154 10
        $rawResponse = $this->callApi($request, [], $postData);
155
156 10
        return AdresseResponseDeserializer::deserializeSearchCsvResponse($rawResponse);
157
    }
158
}