Completed
Pull Request — master (#41)
by Gawain
06:07
created

TimeLimitedQueue::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 5
ccs 4
cts 4
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 2
crap 1
1
<?php
2
3
namespace Genkgo\Mail\Queue;
4
5
use Genkgo\Mail\MessageInterface;
6
use Genkgo\Mail\Transport\QueueIfFailedTransport;
7
8
/**
9
 * Class TimeLimitedQueue
10
 * @package Genkgo\Mail\Queue
11
 */
12
final class TimeLimitedQueue implements QueueInterface
13
{
14
    /**
15
     * @var QueueInterface
16
     */
17
    private $decoratedQueue;
18
    /**
19
     * @var int
20
     */
21
    private $timeLimit;
22
23 4
    public function __construct(QueueInterface $queue, int $timeLimit)
24
    {
25 4
        $this->decoratedQueue = $queue;
26 4
        $this->timeLimit = $timeLimit;
27 4
    }
28
29
    /**
30
     * {@inheritdoc}
31
     */
32 1
    public function store(MessageInterface $message): void
33
    {
34 1
        $this->decoratedQueue->store($message);
35 1
    }
36
37
    /**
38
     * {@inheritdoc}
39
     */
40 3
    public function fetch(): MessageInterface
41
    {
42 3
        while ($message = $this->decoratedQueue->fetch()) {
43 3
           if ($this->hasMessageExpired($message)) {
44 1
               continue;
45
           }
46 3
           break;
47
        }
48
49 3
        return $message;
50
    }
51
52
    /**
53
     * @param MessageInterface $message
54
     * @return bool
55
     */
56 3
    private function hasMessageExpired(MessageInterface $message): bool
57
    {
58 3
        if ($this->timeLimit === 0) {
59 2
            return false;
60
        }
61 1
        if ($this->getSubmissionTimestamp($message) + $this->timeLimit > \time()) {
62 1
            return false;
63
        }
64
65 1
        return true;
66
    }
67
68
    /**
69
     * @param MessageInterface $message
70
     * @return int
71
     */
72 1
    private function getSubmissionTimestamp(MessageInterface $message): int
73
    {
74 1
        $queuedAt = $message->getHeader(QueueIfFailedTransport::QUEUED_HEADER);
75
76 1
        return (int) \strtotime(reset($queuedAt)->getValue()->getRaw());
77
    }
78
}
79