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

SwiftypeCrawler   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 144
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 58
c 1
b 0
f 0
dl 0
loc 144
rs 10
wmc 12

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 2
B send() 0 74 6
A addMessage() 0 3 1
A getLogger() 0 7 2
A getMessages() 0 3 1
1
<?php
2
3
namespace Ichaber\SSSwiftype\Service;
4
5
use GuzzleHttp\Client;
6
use Psr\Log\LoggerInterface;
7
use SilverStripe\Core\Injector\Injectable;
8
use SilverStripe\Core\Injector\Injector;
9
use Throwable;
10
11
/**
12
 * Credit: [Bernard Hamlin](https://github.com/blueo) and [Mojmir Fendek](https://github.com/mfendeksilverstripe)
13
 *
14
 * Class SwiftypeCrawler
15
 *
16
 * @package Ichaber\SSSwiftype\Service
17
 */
18
class SwiftypeCrawler
19
{
20
    use Injectable;
21
22
    const SWIFTYPE_API = 'https://api.swiftype.com/api/v1/engines/%s/domains/%s/crawl_url.json';
23
24
    /**
25
     * @var Client
26
     */
27
    private $client;
28
29
    /**
30
     * @var LoggerInterface
31
     */
32
    private $logger;
33
34
    /**
35
     * @var array
36
     */
37
    private $messages = [];
38
39
    /**
40
     * Crawler constructor.
41
     *
42
     * @param Client|null $client
43
     */
44
    public function __construct(?Client $client = null)
45
    {
46
        if ($client === null) {
47
            $client = new Client();
48
        }
49
50
        $this->client = $client;
51
    }
52
53
    /**
54
     * Crawls a page based on the locale
55
     *
56
     * @param string $url
57
     * @param mixed|null $additionalData If set, we assume that you want to populate your Credentials through extension
58
     * @return bool
59
     */
60
    public function send(string $url, $additionalData = null): bool
61
    {
62
        $credentials = SwiftypeCredentials::create($additionalData);
63
        if (!$credentials->isEnabled()) {
64
            $message = 'No Swiftype crawler credentials';
65
66
            $this->addMessage($message);
67
            $this->getLogger()->alert($message);
68
69
            return false;
70
        }
71
72
        $swiftypeEndpoint = sprintf(
73
            self::SWIFTYPE_API,
74
            $credentials->getEngineSlug(),
75
            $credentials->getDomainID()
76
        );
77
78
        try {
79
            $response = $this->client->put(
80
                $swiftypeEndpoint,
81
                [
82
                    'headers' => [
83
                        'Content-Type' => 'application/json',
84
                    ],
85
                    'body' => json_encode([
86
                        'auth_token' => $credentials->getAPIKey(),
87
                        'url' => $url,
88
                    ]),
89
                ]
90
            );
91
92
            $contents = $response->getBody()->getContents();
93
        } catch (Throwable $e) {
94
            $message = sprintf('Exception %s for url: %s message: %s', get_class($e), $url, $e->getMessage());
95
96
            $this->addMessage($message);
97
            $this->getLogger()->alert($message);
98
99
            return false;
100
        }
101
102
        // invalid response code
103
        if (strpos((string) $response->getStatusCode(), '2') !== 0) {
104
            $message = sprintf(
105
                "Swiftype Crawl request failed - invalid response code \n%s\n%s\n%s",
106
                $response->getStatusCode(),
107
                json_encode($response->getHeaders()),
108
                $contents
109
            );
110
111
            $this->addMessage($message);
112
            $this->getLogger()->alert($message);
113
114
            return false;
115
        }
116
117
        // invalid response data
118
        $data = json_decode($contents, true);
119
        if ($data && array_key_exists('error', $data)) {
120
            $message = sprintf(
121
                "Swiftype Crawl request failed - invalid response data \n%s\n%s\n%s",
122
                $response->getStatusCode(),
123
                json_encode($response->getHeaders()),
124
                $contents
125
            );
126
127
            $this->addMessage($message);
128
            $this->getLogger()->alert($message);
129
130
            return false;
131
        }
132
133
        return true;
134
    }
135
136
    /**
137
     * @return array
138
     */
139
    public function getMessages(): array
140
    {
141
        return $this->messages;
142
    }
143
144
    /**
145
     * @return LoggerInterface
146
     */
147
    protected function getLogger(): LoggerInterface
148
    {
149
        if (!$this->logger) {
150
            $this->logger = Injector::inst()->get(LoggerInterface::class);
151
        }
152
153
        return $this->logger;
154
    }
155
156
    /**
157
     * @param string $message
158
     */
159
    protected function addMessage(string $message): void
160
    {
161
        $this->messages[] = $message;
162
    }
163
}
164