AmazonSqsDriver::push()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 13
ccs 0
cts 13
cp 0
rs 9.4286
cc 1
eloc 8
nc 1
nop 1
crap 2
1
<?php
2
3
namespace Zenstruck\Queue\Driver;
4
5
use Aws\Sqs\SqsClient;
6
use Zenstruck\Queue\Driver;
7
use Zenstruck\Queue\Job;
8
use Zenstruck\Queue\Payload;
9
10
/**
11
 * @author Kevin Bond <[email protected]>
12
 */
13
class AmazonSqsDriver implements Driver
14
{
15
    private $client;
16
    private $queueUrl;
17
18
    /**
19
     * @param SqsClient $client
20
     * @param string    $queueUrl
21
     */
22
    public function __construct(SqsClient $client, $queueUrl)
23
    {
24
        $this->client = $client;
25
        $this->queueUrl = $queueUrl;
26
    }
27
28
    /**
29
     * {@inheritdoc}
30
     */
31
    public function push(Payload $payload)
32
    {
33
        $this->client->sendMessage([
34
            'QueueUrl' => $this->queueUrl,
35
            'MessageBody' => json_encode($payload),
36
            'MessageAttributes' => [
37
                'metadata' => [
38
                    'StringValue' => $payload->metadata(),
39
                    'DataType' => 'String',
40
                ],
41
            ],
42
        ]);
43
    }
44
45
    /**
46
     * {@inheritdoc}
47
     */
48
    public function pop()
49
    {
50
        $result = $this->client->receiveMessage([
51
            'QueueUrl' => $this->queueUrl,
52
            'MaxNumberOfMessages' => 1,
53
            'AttributeNames' => ['ApproximateReceiveCount'],
54
        ]);
55
56
        $rawPayload = $result->toArray();
57
58
        if (!isset($rawPayload['Messages'][0])) {
59
            return null;
60
        }
61
62
        $message = $rawPayload['Messages'][0];
63
64
        if (null === $payload = Payload::fromJson($message['Body'])) {
65
            // can't handle - requeue
66
            return null;
67
        }
68
69
        return new Job($payload, (int) $message['Attributes']['ApproximateReceiveCount'], $message['ReceiptHandle']);
70
    }
71
72
    /**
73
     * {@inheritdoc}
74
     */
75
    public function release(Job $job)
76
    {
77
        // noop - AmazonSQS auto releases jobs that aren't deleted.
78
    }
79
80
    /**
81
     * {@inheritdoc}
82
     */
83
    public function delete(Job $job)
84
    {
85
        $this->client->deleteMessage([
86
            'QueueUrl' => $this->queueUrl,
87
            'ReceiptHandle' => $job->id(),
88
        ]);
89
    }
90
}
91