Passed
Pull Request — master (#20)
by Hilmi Erdem
10:06
created

OtpToken::createdAt()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
<?php
2
/*
3
 * Copyright (c) 2021. Hilmi Erdem Keren
4
 * license MIT
5
 */
6
7
namespace Erdemkeren\Otp;
8
9
use Carbon\Carbon;
10
11
class OtpToken
12
{
13
    public function __construct(private array $attributes)
14
    {
15
        if (! array_key_exists('created_at', $this->attributes)) {
16
            $this->attributes['created_at'] = $this->getNow();
17
            $this->attributes['updated_at'] = $this->getNow();
18
        }
19
    }
20
21
    public function plainText(): ?string
22
    {
23
        return $this->getAttributeValue('plain_text');
24
    }
25
26
    public function cipherText(): string
27
    {
28
        return $this->getAttributeValue('cipher_text');
29
    }
30
31
    public function format(): string
32
    {
33
        return $this->getAttributeValue('format');
34
    }
35
36
    public function expiryTime(): int
37
    {
38
        return $this->getAttributeValue('expiry_time');
39
    }
40
41
    public function timeLeft(): int
42
    {
43
        return $this->getNow()->diffInSeconds($this->expiresAt(), false);
44
    }
45
46
    public function expiresAt(): Carbon
47
    {
48
        return (clone $this->createdAt())->addSeconds($this->expiryTime());
49
    }
50
51
    public function authenticableId(): int|string
52
    {
53
        return $this->getAttributeValue('authenticable_id');
54
    }
55
56
    public function createdAt(): Carbon
57
    {
58
        return new Carbon($this->getAttributeValue('created_at'));
59
    }
60
61
    public function updatedAt(): Carbon
62
    {
63
        return new Carbon($this->getAttributeValue('updated_at'));
64
    }
65
66
    public function extend(int $secs): self
67
    {
68
        return new static(array_merge($this->attributes, [
69
            'expiry_time' => $this->expiryTime() + $secs,
70
            'updated_at' => $this->getNow(),
71
        ]));
72
    }
73
74
    public function refresh(): self
75
    {
76
        return $this->extend($this->getNow()->diffInSeconds($this->updatedAt()));
77
    }
78
79
    public function invalidate(): self
80
    {
81
        return new static(array_merge($this->attributes, [
82
            'expiry_time' => 0,
83
            'updated_at' => $this->getNow(),
84
        ]));
85
    }
86
87
    public function expired(): bool
88
    {
89
        return $this->timeLeft() <= 0;
90
    }
91
92
    public function withoutPlainText(): self
93
    {
94
        return new static(array_filter(array_merge($this->attributes, [
95
            'plain_text' => null,
96
        ])));
97
    }
98
99
    public function toArray(): array
100
    {
101
        return $this->attributes;
102
    }
103
104
    private function getNow(): Carbon
105
    {
106
        return Carbon::now();
107
    }
108
109
    private function getAttributeValue(string $key): mixed
110
    {
111
        return array_key_exists($key, $this->attributes)
112
            ? $this->attributes[$key]
113
            : null;
114
    }
115
}
116