Test Failed
Push — master ( 803dec...3fd2d6 )
by Hirofumi
05:43
created

Notification::setMetadata()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 0
cts 2
cp 0
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 2
1
<?php
2
declare(strict_types=1);
3
4
namespace Shippinno\Notification\Domain\Model;
5
6
use DateTime;
7
use DateTimeImmutable;
8
use LogicException;
9
10
class Notification
11
{
12
    /**
13
     * @var null|NotificationId
14
     */
15
    protected $notificationId;
16
17
    /**
18
     * @var Destination
19
     */
20
    protected $destination;
21
22
    /**
23
     * @var Subject
24
     */
25
    protected $subject;
26
27
    /**
28
     * @var Body
29
     */
30
    protected $body;
31
32
    /**
33
     * @var null|DeduplicationKey
34
     */
35
    protected $deduplicationKey;
36
37
    /**
38
     * @var array|null
39
     */
40
    protected $metadata;
41
42
    /**
43
     * @var DateTimeImmutable
44
     */
45
    protected $createdAt;
46
47
    /**
48
     * @var null|DateTimeImmutable
49
     */
50
    protected $sentAt;
51
52
    /**
53
     * @var null|DateTimeImmutable
54
     */
55
    protected $failedAt;
56
57
    /**
58
     * @var null|string
59
     */
60
    protected $failedFor;
61
62
    /**
63
     * @var null|DateTimeImmutable
64
     */
65
    protected $lockedAt;
66
67
    /**
68
     * @param Destination $destination
69
     * @param Subject $subject
70
     * @param Body $body
71
     * @param DeduplicationKey|null $deduplicationKey
72
     * @param string|null $templateName
0 ignored issues
show
Bug introduced by
There is no parameter named $templateName. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
73
     * @param array|null $templateVariables
0 ignored issues
show
Bug introduced by
There is no parameter named $templateVariables. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
74
     * @param array|null $metadata
75
     */
76
    public function __construct(
77 16
        Destination $destination,
78
        Subject $subject,
79
        Body $body,
80
        DeduplicationKey $deduplicationKey = null,
81
        array $metadata = null
82
    ) {
83
        $this->destination = $destination;
84 16
        $this->subject = $subject;
85 16
        $this->body = $body;
86 16
        $this->deduplicationKey = $deduplicationKey;
87 16
        $this->metadata = $metadata;
88 16
        $this->createdAt = new DateTimeImmutable;
89 16
        $this->sentAt = null;
90 16
        $this->failedAt = null;
91 16
        $this->failedFor = null;
92 16
        $this->lockedAt = null;
93 16
    }
94 16
95
    /**
96
     * @return null|NotificationId
97
     */
98
    public function notificationId(): ?NotificationId
99 3
    {
100
        return $this->notificationId;
101 3
    }
102
103
    /**
104
     * @return Destination
105
     */
106
    public function destination(): Destination
107 11
    {
108
        return $this->destination;
109 11
    }
110
111
    /**
112
     * @return Subject
113
     */
114
    public function subject(): Subject
115 6
    {
116
        return $this->subject;
117 6
    }
118
119
    /**
120
     * @return Body
121
     */
122
    public function body(): Body
123 4
    {
124
        return $this->body;
125 4
    }
126
127
    /**
128
     * @return null|DeduplicationKey
129
     */
130
    public function deduplicationKey(): ?DeduplicationKey
131 5
    {
132
        return $this->deduplicationKey;
133 5
    }
134
135
    /**
136
     * @return array|null
137
     */
138
    public function metadata(): ?array
139
    {
140
        return $this->metadata;
141
    }
142
143
    /**
144
     * @param array $metadata
145
     */
146
    public function setMetadata(array $metadata): void
147
    {
148
        $this->metadata = $metadata;
149
    }
150
151
    /**
152
     * @param string $key
153
     * @param mixed $value
154
     */
155
    public function addMetadata(string $key, $value): void
156
    {
157
        $this->metadata[$key] = $value;
158
    }
159
160
    /**
161
     * @return DateTimeImmutable
162
     */
163
    public function createdAt(): DateTimeImmutable
164
    {
165 2
        return $this->createdAt;
166
    }
167 2
168 2
    /**
169 2
     * @return DateTimeImmutable|null
170 2
     */
171
    public function sentAt(): ?DateTimeImmutable
172
    {
173
        return $this->sentAt;
174 2
    }
175
176
    /**
177
     * @return bool
178
     */
179
    public function isSent(): bool
180
    {
181 3
        return !is_null($this->sentAt());
182
    }
183 3
184
    /**
185
     * @return void
186
     */
187
    public function markSent(): void
188
    {
189 7
        $this->assertNotSent();
190
        $this->unmarkFailed();
191 7
        $this->sentAt = new DateTimeImmutable;
192
    }
193
194
    /**
195
     * @return DateTimeImmutable|null
196
     */
197 7
    public function failedAt(): ?DateTimeImmutable
198
    {
199 7
        return $this->failedAt;
200
    }
201
202
    /**
203
     * @return null|string
204
     */
205 5
    public function failedFor(): ?string
206
    {
207 5
        return $this->failedFor;
208 5
    }
209 5
210 5
    /**
211
     * @return bool
212
     */
213
    public function isFailed(): bool
214
    {
215 3
        return !is_null($this->failedAt());
216
    }
217 3
218
    /**
219
     * @param string $reason
220
     */
221
    public function markFailed(string $reason): void
222
    {
223 2
        $this->assertNotSent();
224
        $this->failedAt = new DateTimeImmutable;
225 2
        $this->failedFor = $reason;
226
    }
227
228
    /**
229
     * @return void
230
     */
231 3
    public function unmarkFailed(): void
232
    {
233 3
        $this->failedAt = null;
234
        $this->failedFor = null;
235
    }
236
237
    /**
238
     * @return DateTimeImmutable|null
239 3
     */
240
    public function lockedAt(): ?DateTimeImmutable
241 3
    {
242 3
        return $this->lockedAt;
243 3
    }
244 3
245
    /**
246
     * @return bool
247
     */
248
    public function isLocked(): bool
249 5
    {
250
        return !is_null($this->lockedAt());
251 5
    }
252 5
253 5
    /**
254
     * @return void
255
     */
256
    public function lock(): void
257
    {
258 3
        $this->lockedAt = new DateTimeImmutable;
259
    }
260 3
261
    /**
262
     * @return void
263
     */
264
    public function unlock(): void
265
    {
266 3
        $this->lockedAt = null;
267
    }
268 3
269
    /**
270
     * @return bool
271
     */
272
    public function isFresh(): bool
273
    {
274 2
        return !$this->isLocked() && !$this->isFailed() &&  !$this->isSent();
275
    }
276 2
277 2
    /**
278
     * @return void
279
     */
280
    private function assertNotSent(): void
281
    {
282 1
        if ($this->isSent()) {
283
            throw new LogicException(
284 1
                sprintf(
285 1
                    'Notification is already sent: "%s" created at %s',
286
                    $this->subject()->subject(),
287
                    $this->createdAt()->format(DateTime::W3C)
288
                )
289
            );
290 1
        }
291
    }
292 1
293
    /**
294
     * For InMemoryNotificationRepository only.
295
     *
296
     * @param NotificationId $notificationId
297
     */
298 7
    public function setNotificationId(NotificationId $notificationId): void
299
    {
300 7
        $this->notificationId = $notificationId;
301
    }
302
}
303
304