Completed
Push — master ( 7f461a...32d8c5 )
by Timur
02:27
created

Forge::get()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.2
c 0
b 0
f 0
cc 4
eloc 6
nc 3
nop 1
1
<?php
2
3
namespace Laravel\Forge;
4
5
use Iterator;
6
use ArrayAccess;
7
use Laravel\Forge\Servers\Factory;
8
use Laravel\Forge\Traits\LazyIterator;
9
use Laravel\Forge\Traits\LazyArrayAccess;
10
use GuzzleHttp\Exception\RequestException;
11
use Laravel\Forge\Traits\AbstractCollection;
12
use Laravel\Forge\Exceptions\Servers\ServerWasNotFoundException;
13
14
class Forge implements ArrayAccess, Iterator
15
{
16
    use AbstractCollection, LazyIterator, LazyArrayAccess;
17
18
    /**
19
     * API provider.
20
     *
21
     * @var \Laravel\Forge\ApiProvider
22
     */
23
    protected $api;
24
25
    /**
26
     * Servers [id => name] map.
27
     *
28
     * @var array
29
     */
30
    protected $serversMap = [];
31
32
    /**
33
     * Single servers cache.
34
     *
35
     * @var array
36
     */
37
    protected $serversCache = [];
38
39
    /**
40
     * Create new Servers manager instance.
41
     *
42
     * @param \Laravel\Forge\ApiProvider $api
43
     */
44
    public function __construct(ApiProvider $api)
45
    {
46
        $this->api = $api;
47
    }
48
49
    /**
50
     * @{inheritdocs}
51
     */
52
    public function lazyLoad()
53
    {
54
        $response = $this->api->getClient()->request('GET', 'servers');
55
        $data = json_decode((string) $response->getBody(), true);
56
57
        $this->items = [];
58
        $this->serversMap = [];
59
60
        if (empty($data['servers'])) {
61
            return $this->items;
62
        }
63
64
        foreach ($data['servers'] as $server) {
65
            $this->items[$server['name']] = new Server($this->api, $server);
66
            $this->serversMap[$server['id']] = $server['name'];
67
        }
68
69
        return $this->items;
70
    }
71
72
    /**
73
     * Generate items keys.
74
     */
75
    public function generateKeys()
76
    {
77
        $this->keys = array_keys($this->items);
78
    }
79
80
    /**
81
     * Initialize servers factory.
82
     *
83
     * @return \Laravel\Forge\Servers\Factory
84
     */
85
    public function create()
86
    {
87
        return new Factory($this->api);
88
    }
89
90
    /**
91
     * Returns single server.
92
     *
93
     * @param int $serverId
94
     *
95
     * @return \Laravel\Forge\Server
96
     */
97
    public function get(int $serverId)
98
    {
99
        if ($this->lazyLoadInitiated() && isset($this->serversMap[$serverId])) {
100
            return $this->items[$this->serversMap[$serverId]];
101
        } elseif (isset($this->serversCache[$serverId])) {
102
            return $this->serversCache[$serverId];
103
        }
104
105
        return $this->loadSingleServer($serverId);
106
    }
107
108
    /**
109
     * Load single server from API and save it to memory cache.
110
     *
111
     * @param int $serverId
112
     *
113
     * @throws \Laravel\Forge\Exceptions\Servers\ServerWasNotFoundException
114
     *
115
     * @return \Laravel\Forge\Server
116
     */
117
    protected function loadSingleServer(int $serverId)
118
    {
119
        try {
120
            $response = $this->api->getClient()->request('GET', 'servers/'.$serverId);
121
        } catch (RequestException $e) {
122
            if ($e->getResponse()->getStatusCode() === 404) {
123
                throw new ServerWasNotFoundException('Server #'.$serverId.' was not found.', 404);
124
            }
125
126
            throw $e;
127
        }
128
129
        return $this->serversCache[$serverId] = Server::createFromResponse($response, $this->api);
130
    }
131
}
132