Completed
Pull Request — master (#4)
by Morten Poul
11:21
created

WebhookValidator   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 34
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 13
dl 0
loc 34
rs 10
c 2
b 0
f 0
wmc 3

3 Methods

Rating   Name   Duplication   Size   Complexity  
A validateFromRequest() 0 10 1
A __construct() 0 3 1
A validate() 0 10 1
1
<?php
2
3
namespace Signifly\Shopify\Webhooks;
4
5
use Illuminate\Http\Request;
6
use Signifly\Shopify\Exceptions\WebhookFailed;
7
use Signifly\Shopify\Support\VerifiesWebhooks;
8
9
class WebhookValidator
10
{
11
    use VerifiesWebhooks;
12
13
    private SecretProvider $secretProvider;
14
15
    public function __construct(SecretProvider $secretProvider)
16
    {
17
        $this->secretProvider = $secretProvider;
18
    }
19
20
    public function validate(string $signature, string $domain, string $data): void
21
    {
22
        // Validate webhook secret presence
23
        $secret = $this->secretProvider->getSecret($domain);
24
        throw_if(empty($secret), WebhookFailed::missingSigningSecret());
25
26
        // Validate webhook signature
27
        throw_unless(
28
            $this->isWebhookSignatureValid($signature, $data, $secret),
29
            WebhookFailed::invalidSignature($signature)
30
        );
31
    }
32
33
    public function validateFromRequest(Request $request): void
34
    {
35
        // Validate signature presence
36
        $signature = $request->shopifyHmacSignature();
37
        throw_unless($signature, WebhookFailed::missingSignature());
38
39
        // Validate topic presence
40
        throw_unless($request->shopifyTopic(), WebhookFailed::missingTopic());
41
42
        $this->validate($signature, $request->shopifyShopDomain(), $request->getContent());
43
    }
44
}
45