Passed
Pull Request — master (#16)
by Chris
01:37
created

SwiftypeCredentials::getAPIKey()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
<?php
2
3
namespace Ichaber\SSSwiftype\Service;
4
5
use Psr\Log\LoggerInterface;
6
use SilverStripe\Core\Extensible;
7
use SilverStripe\Core\Injector\Injectable;
8
use SilverStripe\Core\Injector\Injector;
9
use SilverStripe\SiteConfig\SiteConfig;
10
11
/**
12
 * Credit: [Bernard Hamlin](https://github.com/blueo) and [Mojmir Fendek](https://github.com/mfendeksilverstripe)
13
 *
14
 * Class SwiftypeCredentials
15
 *
16
 * @package Ichaber\SSSwiftype\Service
17
 */
18
class SwiftypeCredentials
19
{
20
    use Extensible;
21
    use Injectable;
22
23
    /**
24
     * @var bool
25
     */
26
    private $enabled = false;
27
28
    /**
29
     * @var string|null
30
     */
31
    private $engineSlug;
32
33
    /**
34
     * @var string|null
35
     */
36
    private $domainID;
37
38
    /**
39
     * @var string|null
40
     */
41
    private $apiKey;
42
43
    /**
44
     * @var string|null
45
     */
46
    private $message;
47
48
    /**
49
     * @return bool
50
     */
51
    public function isEnabled(): bool
52
    {
53
        return $this->enabled;
54
    }
55
56
    /**
57
     * @param bool|null $enabled
58
     */
59
    public function setEnabled(?bool $enabled): void
60
    {
61
        $this->enabled = (bool) $enabled;
62
    }
63
64
    /**
65
     * @return string|null
66
     */
67
    public function getEngineSlug(): ?string
68
    {
69
        return $this->engineSlug;
70
    }
71
72
    /**
73
     * @param string|null $engineSlug
74
     */
75
    public function setEngineSlug(?string $engineSlug): void
76
    {
77
        $this->engineSlug = $engineSlug;
78
    }
79
80
    /**
81
     * @return string|null
82
     */
83
    public function getDomainID(): ?string
84
    {
85
        return $this->domainID;
86
    }
87
88
    /**
89
     * @param string|null $domainID
90
     */
91
    public function setDomainID(?string $domainID): void
92
    {
93
        $this->domainID = $domainID;
94
    }
95
96
    /**
97
     * @return string|null
98
     */
99
    public function getAPIKey(): ?string
100
    {
101
        return $this->apiKey;
102
    }
103
104
    /**
105
     * @param string|null $apiKey
106
     */
107
    public function setAPIKey(?string $apiKey): void
108
    {
109
        $this->apiKey = $apiKey;
110
    }
111
112
    /**
113
     * @return string|null
114
     */
115
    public function getMessage(): ?string
116
    {
117
        return $this->message;
118
    }
119
120
    /**
121
     * @param string $message
122
     */
123
    public function setMessage(string $message): void
124
    {
125
        $this->message = $message;
126
    }
127
128
    /**
129
     * Gets the Swiftype credentials
130
     *
131
     * @param mixed|null $additionalData If set, we assume that you want to populate your Credentials through extension
132
     * @return void
133
     */
134
    public function __construct($additionalData = null)
135
    {
136
        $logger = Injector::inst()->get(LoggerInterface::class);
137
138
        if ($additionalData !== null) {
139
            // You've supplied the class with $additionalData, so, please populate your Credentials data through the
140
            // populateCredentials extensions point. It will have access to your $additionalData also
141
            $this->invokeWithExtensions('populateCredentials', $additionalData);
142
        } else {
143
            // Default functionality is to grab Credentials from SiteConfig
144
            /** @var SiteConfig $config */
145
            $config = SiteConfig::current_site_config();
146
147
            // You might want to implement this via Environment variables or something. Just make sure SiteConfig has
148
            // access to that variable, and return it here
149
            $this->setEnabled((bool) $config->relField('SwiftypeEnabled'));
150
151
            // If you have multiple Engines per site (maybe you use Fluent with a different Engine on each Locale), then
152
            // this provides some basic ability to have different credentials returned based on the application state
153
            $this->setEngineSlug($config->relField('SwiftypeEngineSlug'));
154
            $this->setDomainID($config->relField('SwiftypeDomainID'));
155
            $this->setAPIKey($config->relField('SwiftypeAPIKey'));
156
        }
157
158
        if (!$this->isEnabled()) {
159
            return;
160
        }
161
162
        if (!$this->getEngineSlug()) {
163
            $this->disable(
164
                'Swiftype Engine Slug value has not been set. Settings > Swiftype Search > Swiftype Engine Slug',
165
                $logger
166
            );
167
168
            return;
169
        }
170
171
        if (!$this->getDomainID()) {
172
            $this->disable(
173
                'Swiftype Domain ID has not been set. Settings > Swiftype Search > Swiftype Domain ID',
174
                $logger
175
            );
176
177
            return;
178
        }
179
180
        if (!$this->getAPIKey()) {
181
            $this->disable(
182
                'Swiftype API Key has not been set. Settings > Swiftype Search > Swiftype Production API Key',
183
                $logger
184
            );
185
186
            return;
187
        }
188
    }
189
190
    /**
191
     * @param string $message
192
     * @param LoggerInterface $logger
193
     */
194
    protected function disable(string $message, LoggerInterface $logger): void
195
    {
196
        $trace = debug_backtrace();
197
198
        // array_shift for adding context (for RaygunHandler) by using the last item on the stack trace.
199
        $logger->warning($message, array_shift($trace));
200
201
        $this->setMessage($message);
202
        $this->setEnabled(false);
203
    }
204
}
205