Completed
Push — master ( 973ecf...810d10 )
by Xavier
01:42
created

ApiDataFetcher   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 83
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 7
dl 0
loc 83
ccs 27
cts 27
cp 1
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A getErrors() 0 3 1
A getData() 0 13 1
A instantiateResource() 0 3 1
A __construct() 0 4 1
A getPromises() 0 12 2
A getResourceAtIndex() 0 3 1
1
<?php
2
3
namespace PubPeerFoundation\PublicationDataExtractor;
4
5
use Generator;
6
use GuzzleHttp\Psr7;
7
use GuzzleHttp\Promise\EachPromise;
8
use Psr\Http\Message\ResponseInterface;
9
use GuzzleHttp\Exception\RequestException;
10
use GrahamCampbell\GuzzleFactory\GuzzleFactory;
11
use PubPeerFoundation\PublicationDataExtractor\Helpers\ClassHelper;
12
use PubPeerFoundation\PublicationDataExtractor\Resources\Resource;
13
use PubPeerFoundation\PublicationDataExtractor\Identifiers\Identifier;
14
15
class ApiDataFetcher
16
{
17
    protected $identifier;
18
19
    protected $client;
20
21
    protected $resources = [];
22
23 3
    public $apiData;
24
25 3
    protected $errors = [];
26 3
27 3
    public function __construct(Identifier $identifier)
28
    {
29
        $this->identifier = $identifier;
30
        $this->client = GuzzleFactory::make(compact('headers'), 100);
31
    }
32 3
33
    /**
34 3
     * Get data from API calls promises.
35 3
     */
36 3
    public function getData(): void
37 3
    {
38 3
        (new EachPromise($this->getPromises(), [
39 3
            'concurrency' => 3,
40 3
            'fulfilled' => function (ResponseInterface $response, $index) {
41 3
                $this->apiData[] = $this->getResourceAtIndex($index)
42 3
                    ->getDataFrom((string) $response->getBody());
43
            },
44
            'rejected' => function (RequestException $exception, $index) {
45
                $resourceName = ClassHelper::get_class_name($this->getResourceAtIndex($index));
46
                $this->errors[$resourceName] = $exception->getCode();
47
            },
48
        ]))->promise()->wait();
49 3
    }
50
51 3
    /**
52 3
     * Get list of API calls promises.
53
     *
54 3
     * @return Generator
55 3
     */
56 3
    protected function getPromises(): Generator
57 3
    {
58
        foreach ($this->identifier->getRelatedResources() as $resourceClass) {
59
            $resource = $this->instantiateResource($resourceClass);
60 3
61
            $promise = $this->client->requestAsync(
62 3
                'GET',
63
                $resource->getApiUrl(),
64
                $resource->getRequestOptions()
65
            );
66
67
            yield $promise;
68
        }
69
    }
70
71 3
    public function getErrors(): array
72
    {
73 3
        return $this->errors;
74
    }
75
76
    /**
77
     * Get resource instance from resources array.
78
     *
79
     * @param int $index
80
     *
81
     * @return resource
82
     */
83 3
    protected function getResourceAtIndex(int $index): Resource
84
    {
85 3
        return $this->resources[$index];
86
    }
87
88
    /**
89
     * Create and store an instance of the Resource class.
90
     *
91
     * @param string $resourceClass
92
     *
93
     * @return resource
94
     */
95
    protected function instantiateResource($resourceClass): Resource
96
    {
97
        return $this->resources[] = new $resourceClass($this->identifier);
98
    }
99
}
100