Completed
Push — master ( 975260...d54b82 )
by Alejandro
05:50 queued 10s
created

ShortUrlMeta::parseDateField()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 4.074

Importance

Changes 0
Metric Value
cc 4
nc 3
nop 1
dl 0
loc 12
rs 9.8666
c 0
b 0
f 0
ccs 5
cts 6
cp 0.8333
crap 4.074
1
<?php
2
declare(strict_types=1);
3
4
namespace Shlinkio\Shlink\Core\Model;
5
6
use Shlinkio\Shlink\Core\Exception\ValidationException;
7
use Shlinkio\Shlink\Core\Validation\ShortUrlMetaInputFilter;
8
9
final class ShortUrlMeta
10
{
11
    /**
12
     * @var \DateTime|null
13
     */
14
    private $validSince;
15
    /**
16
     * @var \DateTime|null
17
     */
18
    private $validUntil;
19
    /**
20
     * @var string|null
21
     */
22
    private $customSlug;
23
    /**
24
     * @var int|null
25
     */
26
    private $maxVisits;
27
28
    // Force named constructors
29 12
    private function __construct()
30
    {
31 12
    }
32
33
    /**
34
     * @param array $data
35
     * @return ShortUrlMeta
36
     * @throws ValidationException
37
     */
38 5
    public static function createFromRawData(array $data): self
39
    {
40 5
        $instance = new self();
41 5
        $instance->validate($data);
42 2
        return $instance;
43
    }
44
45
    /**
46
     * @param string|\DateTimeInterface|null $validSince
47
     * @param string|\DateTimeInterface|null $validUntil
48
     * @param string|null $customSlug
49
     * @param int|null $maxVisits
50
     * @return ShortUrlMeta
51
     * @throws ValidationException
52
     */
53 7
    public static function createFromParams(
54
        $validSince = null,
55
        $validUntil = null,
56
        $customSlug = null,
57
        $maxVisits = null
58
    ): self {
59
        // We do not type hint the arguments because that will be done by the validation process
60 7
        $instance = new self();
61 7
        $instance->validate([
62 7
            ShortUrlMetaInputFilter::VALID_SINCE => $validSince,
63 7
            ShortUrlMetaInputFilter::VALID_UNTIL => $validUntil,
64 7
            ShortUrlMetaInputFilter::CUSTOM_SLUG => $customSlug,
65 7
            ShortUrlMetaInputFilter::MAX_VISITS => $maxVisits,
66
        ]);
67 7
        return $instance;
68
    }
69
70
    /**
71
     * @param array $data
72
     * @throws ValidationException
73
     */
74 12
    private function validate(array $data): void
75
    {
76 12
        $inputFilter = new ShortUrlMetaInputFilter($data);
77 12
        if (! $inputFilter->isValid()) {
78 3
            throw ValidationException::fromInputFilter($inputFilter);
79
        }
80
81 9
        $this->validSince = $this->parseDateField($inputFilter->getValue(ShortUrlMetaInputFilter::VALID_SINCE));
82 9
        $this->validUntil = $this->parseDateField($inputFilter->getValue(ShortUrlMetaInputFilter::VALID_UNTIL));
83 9
        $this->customSlug = $inputFilter->getValue(ShortUrlMetaInputFilter::CUSTOM_SLUG);
84 9
        $this->maxVisits = $inputFilter->getValue(ShortUrlMetaInputFilter::MAX_VISITS);
85 9
        $this->maxVisits = $this->maxVisits !== null ? (int) $this->maxVisits : null;
86 9
    }
87
88
    /**
89
     * @param string|\DateTime|null $date
90
     * @return \DateTime|null
91
     */
92 9
    private function parseDateField($date): ?\DateTime
93
    {
94 9
        if ($date === null || $date instanceof \DateTime) {
95 8
            return $date;
96
        }
97
98 2
        if (\is_string($date)) {
99 2
            return new \DateTime($date);
100
        }
101
102
        return null;
103
    }
104
105
    /**
106
     * @return \DateTime|null
107
     */
108 7
    public function getValidSince(): ?\DateTime
109
    {
110 7
        return $this->validSince;
111
    }
112
113 2
    public function hasValidSince(): bool
114
    {
115 2
        return $this->validSince !== null;
116
    }
117
118
    /**
119
     * @return \DateTime|null
120
     */
121 7
    public function getValidUntil(): ?\DateTime
122
    {
123 7
        return $this->validUntil;
124
    }
125
126 2
    public function hasValidUntil(): bool
127
    {
128 2
        return $this->validUntil !== null;
129
    }
130
131
    /**
132
     * @return null|string
133
     */
134 6
    public function getCustomSlug()
135
    {
136 6
        return $this->customSlug;
137
    }
138
139 1
    public function hasCustomSlug(): bool
140
    {
141 1
        return $this->customSlug !== null;
142
    }
143
144
    /**
145
     * @return int|null
146
     */
147 7
    public function getMaxVisits()
148
    {
149 7
        return $this->maxVisits;
150
    }
151
152 2
    public function hasMaxVisits(): bool
153
    {
154 2
        return $this->maxVisits !== null;
155
    }
156
}
157