Completed
Pull Request — develop (#688)
by Alejandro
05:47
created

ShortUrlEdit   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 91
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 32
c 1
b 0
f 0
dl 0
loc 91
ccs 35
cts 35
cp 1
rs 10
wmc 15

12 Methods

Rating   Name   Duplication   Size   Complexity  
A hasValidSince() 0 3 1
A validSince() 0 3 1
A getOptionalIntFromInputFilter() 0 4 2
A longUrl() 0 3 1
A __construct() 0 2 1
A maxVisits() 0 3 1
A validateAndInit() 0 16 2
A hasMaxVisits() 0 3 1
A fromRawData() 0 5 1
A hasValidUntil() 0 3 1
A validUntil() 0 3 1
A hasLongUrl() 0 3 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Shlinkio\Shlink\Core\Model;
6
7
use Cake\Chronos\Chronos;
8
use Shlinkio\Shlink\Core\Exception\ValidationException;
9
use Shlinkio\Shlink\Core\Validation\ShortUrlMetaInputFilter;
10
11
use function array_key_exists;
12
use function Shlinkio\Shlink\Core\parseDateField;
13
14
final class ShortUrlEdit
15
{
16
    private bool $longUrlPropWasProvided = false;
17
    private ?string $longUrl = null;
18
    private bool $validSincePropWasProvided = false;
19
    private ?Chronos $validSince = null;
20
    private bool $validUntilPropWasProvided = false;
21
    private ?Chronos $validUntil = null;
22
    private bool $maxVisitsPropWasProvided = false;
23
    private ?int $maxVisits = null;
24
25
    // Enforce named constructors
26
    private function __construct()
27
    {
28
    }
29
30
    /**
31
     * @throws ValidationException
32
     */
33 2
    public static function fromRawData(array $data): self
34
    {
35 2
        $instance = new self();
36 2
        $instance->validateAndInit($data);
37 1
        return $instance;
38
    }
39
40
    /**
41
     * @throws ValidationException
42
     */
43 2
    private function validateAndInit(array $data): void
44
    {
45 2
        $inputFilter = new ShortUrlMetaInputFilter($data);
46 2
        if (! $inputFilter->isValid()) {
47 1
            throw ValidationException::fromInputFilter($inputFilter);
48
        }
49
50 1
        $this->longUrlPropWasProvided = array_key_exists(ShortUrlMetaInputFilter::LONG_URL, $data);
51 1
        $this->validSincePropWasProvided = array_key_exists(ShortUrlMetaInputFilter::VALID_SINCE, $data);
52 1
        $this->validUntilPropWasProvided = array_key_exists(ShortUrlMetaInputFilter::VALID_UNTIL, $data);
53 1
        $this->maxVisitsPropWasProvided = array_key_exists(ShortUrlMetaInputFilter::MAX_VISITS, $data);
54
55 1
        $this->longUrl = $inputFilter->getValue(ShortUrlMetaInputFilter::LONG_URL);
56 1
        $this->validSince = parseDateField($inputFilter->getValue(ShortUrlMetaInputFilter::VALID_SINCE));
57 1
        $this->validUntil = parseDateField($inputFilter->getValue(ShortUrlMetaInputFilter::VALID_UNTIL));
58 1
        $this->maxVisits = $this->getOptionalIntFromInputFilter($inputFilter, ShortUrlMetaInputFilter::MAX_VISITS);
59
    }
60
61 1
    private function getOptionalIntFromInputFilter(ShortUrlMetaInputFilter $inputFilter, string $fieldName): ?int
62
    {
63 1
        $value = $inputFilter->getValue($fieldName);
64 1
        return $value !== null ? (int) $value : null;
65
    }
66
67 2
    public function longUrl(): ?string
68
    {
69 2
        return $this->longUrl;
70
    }
71
72 2
    public function hasLongUrl(): bool
73
    {
74 2
        return $this->longUrlPropWasProvided && $this->longUrl !== null;
75
    }
76
77 2
    public function validSince(): ?Chronos
78
    {
79 2
        return $this->validSince;
80
    }
81
82 2
    public function hasValidSince(): bool
83
    {
84 2
        return $this->validSincePropWasProvided;
85
    }
86
87 2
    public function validUntil(): ?Chronos
88
    {
89 2
        return $this->validUntil;
90
    }
91
92 2
    public function hasValidUntil(): bool
93
    {
94 2
        return $this->validUntilPropWasProvided;
95
    }
96
97 2
    public function maxVisits(): ?int
98
    {
99 2
        return $this->maxVisits;
100
    }
101
102 2
    public function hasMaxVisits(): bool
103
    {
104 2
        return $this->maxVisitsPropWasProvided;
105
    }
106
}
107