Completed
Push — master ( eeaba4...acdf48 )
by Timur
02:32
created

ServersFactory::applyDefaultCredential()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 10
rs 9.4285
cc 2
eloc 5
nc 2
nop 1
1
<?php
2
3
namespace Laravel\Forge\Servers;
4
5
use Laravel\Forge\Server;
6
use Laravel\Forge\ApiProvider;
7
use Laravel\Forge\Servers\Providers\Aws;
8
use Laravel\Forge\Servers\Providers\Custom;
9
use Laravel\Forge\Servers\Providers\Linode;
10
use Laravel\Forge\Servers\Providers\Provider;
11
use Laravel\Forge\Servers\Providers\DigitalOcean;
12
13
class ServersFactory
14
{
15
    /**
16
     * API Provider.
17
     *
18
     * @var \Laravel\Forge\ApiProvider
19
     */
20
    protected $api;
21
22
    /**
23
     * Default credentials for different providers.
24
     *
25
     * @var array
26
     */
27
    protected static $defaultCredentials = [];
28
29
    /**
30
     * Create new instance.
31
     *
32
     * @param \Laravel\Forge\ApiProvider
33
     */
34
    public function __construct(ApiProvider $api)
35
    {
36
        $this->api = $api;
37
    }
38
39
    /**
40
     * Set default credential ID for given provider.
41
     *
42
     * @param string $provider
43
     * @param int    $credentialId
44
     */
45
    public static function setDefaultCredential(string $provider, int $credentialId)
46
    {
47
        static::$defaultCredentials[$provider] = $credentialId;
48
    }
49
50
    /**
51
     * Remove default credential for given provider or for all providers.
52
     *
53
     * @param string $provider = null
54
     */
55
    public function resetDefaultCredential(string $provider = null)
56
    {
57
        if (is_null($provider)) {
58
            static::$defaultCredentials = [];
59
60
            return;
61
        }
62
63
        unset(static::$defaultCredentials[$provider]);
64
    }
65
66
    /**
67
     * Create new DigitalOcean droplet.
68
     *
69
     * @param string $name
70
     *
71
     * @return \Laravel\Forge\Servers\ServerBuilder
72
     */
73
    public function droplet(string $name)
74
    {
75
        return $this->applyDefaultCredential(
76
            (new DigitalOcean($this->api))->identifiedAs($name)
77
        );
78
    }
79
80
    /**
81
     * Creates new Linode server.
82
     *
83
     * @param string $name
84
     *
85
     * @return \Laravel\Forge\Servers\ServerBuilder
86
     */
87
    public function linode(string $name)
88
    {
89
        return $this->applyDefaultCredential(
90
            (new Linode($this->api))->identifiedAs($name)
91
        );
92
    }
93
94
    /**
95
     * Creates new AWS server.
96
     *
97
     * @param string $name
98
     *
99
     * @return \Laravel\Forge\Servers\ServerBuilder
100
     */
101
    public function aws(string $name)
102
    {
103
        return $this->applyDefaultCredential(
104
            (new Aws($this->api))->identifiedAs($name)
105
        );
106
    }
107
108
    /**
109
     * Creates new custom server.
110
     *
111
     * @param string $name
112
     *
113
     * @return \Laravel\Forge\Servers\ServerBuilder
114
     */
115
    public function custom(string $name)
116
    {
117
        return (new Custom($this->api))->identifiedAs($name);
118
    }
119
120
    /**
121
     * Create new server from raw payload data.
122
     *
123
     * @param array $payload
124
     *
125
     * @throws \GuzzleHttp\Exception\RequestException
126
     *
127
     * @return \Laravel\Forge\Server
128
     */
129
    public function server(array $payload)
130
    {
131
        ksort($payload);
132
133
        $response = $this->api->getClient()->request('POST', 'servers', [
134
            'form_params' => $payload,
135
        ]);
136
137
        return Server::createFromResponse($response, $this->api);
138
    }
139
140
    /**
141
     * Apply default credential ID for given provider (if exists).
142
     *
143
     * @param \Laravel\Forge\Servers\Providers\Provider $provider
144
     *
145
     * @return \Laravel\Forge\Servers\Providers\Provider
146
     */
147
    protected function applyDefaultCredential(Provider $provider): Provider
148
    {
149
        if (!empty(static::$defaultCredentials[$provider->provider()])) {
150
            $provider->usingCredential(
151
                static::$defaultCredentials[$provider->provider()]
152
            );
153
        }
154
155
        return $provider;
156
    }
157
}
158