Completed
Push — master ( e4f693...42687c )
by Petre
09:13
created

SitemapResourceValidator::validate()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 12
ccs 9
cts 9
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 9
nc 1
nop 1
crap 1
1
<?php
2
declare(strict_types = 1);
3
4
namespace DL\SitemapBundle\Service;
5
6
use DL\SitemapBundle\Definition\SitemapResource;
7
use DL\SitemapBundle\Enum\ChangeFrequencyEnum;
8
use DL\SitemapBundle\Exception\SitemapException;
9
10
/**
11
 * Handles the validation of sitemap resources.
12
 *
13
 * @package DL\SitemapBundle\Service
14
 * @author  Petre Pătrașc <[email protected]>
15
 */
16
class SitemapResourceValidator
17
{
18
    /**
19
     * Validate a sitemap resource.
20
     *
21
     * @param SitemapResource $resource
22
     *
23
     * @return bool
24
     * @throws SitemapException
25
     */
26 10
    public function validate(SitemapResource $resource): bool
27
    {
28 10
        $this->validateEmptyTitle($resource);
29 9
        $this->validateEmptyLocation($resource);
30 8
        $this->validateEmptyChangeFrequency($resource);
31 7
        $this->validateEmptyPriority($resource);
32 6
        $this->validateInvalidPriority($resource);
33 4
        $this->validateInvalidChangeFrequency($resource);
34 3
        $this->validateInvalidLocation($resource);
35
36 1
        return true;
37
    }
38
39
    /**
40
     * Retrieve a list of the valid change frequencies.
41
     *
42
     * @return array
43
     */
44 4
    private function getValidChangeFrequencies(): array
45
    {
46
        return [
47 4
            ChangeFrequencyEnum::ALWAYS,
48
            ChangeFrequencyEnum::HOURLY,
49
            ChangeFrequencyEnum::DAILY,
50
            ChangeFrequencyEnum::WEEKLY,
51
            ChangeFrequencyEnum::MONTHLY,
52
            ChangeFrequencyEnum::YEARLY,
53
            ChangeFrequencyEnum::NEVER,
54
        ];
55
    }
56
57
    /**
58
     * @param SitemapResource $resource
59
     *
60
     * @throws SitemapException
61
     */
62 10
    private function validateEmptyTitle(SitemapResource $resource)
63
    {
64 10
        if ('' === trim($resource->getTitle())) {
65 1
            throw new SitemapException('No title provided for the sitemap resource');
66
        }
67 9
    }
68
69
    /**
70
     * @param SitemapResource $resource
71
     *
72
     * @throws SitemapException
73
     */
74 9
    private function validateEmptyLocation(SitemapResource $resource)
75
    {
76 9
        if ('' === trim($resource->getLocation())) {
77 1
            throw new SitemapException('No location provided for the sitemap resource');
78
        }
79 8
    }
80
81
    /**
82
     * @param SitemapResource $resource
83
     *
84
     * @throws SitemapException
85
     */
86 8
    private function validateEmptyChangeFrequency(SitemapResource $resource)
87
    {
88 8
        if ('' === trim($resource->getChangeFrequency())) {
89 1
            throw new SitemapException('No change frequency provided for the sitemap resource');
90
        }
91 7
    }
92
93
    /**
94
     * @param SitemapResource $resource
95
     *
96
     * @throws SitemapException
97
     */
98 7
    private function validateEmptyPriority(SitemapResource $resource)
99
    {
100 7
        if (-1 == $resource->getPriority()) {
101 1
            throw new SitemapException('No priority provided for the sitemap resource');
102
        }
103 6
    }
104
105
    /**
106
     * @param SitemapResource $resource
107
     *
108
     * @throws SitemapException
109
     */
110 6
    private function validateInvalidPriority(SitemapResource $resource)
111
    {
112 6
        if ($resource->getPriority() < 0.0 || $resource->getPriority() > 1.0) {
113 2
            throw new SitemapException("Sitemap resource priority should be between 0.0 and 1.0." .
114 2
                " {$resource->getPriority()} provided.");
115
        }
116 4
    }
117
118
    /**
119
     * @param SitemapResource $resource
120
     *
121
     * @throws SitemapException
122
     */
123 4
    private function validateInvalidChangeFrequency(SitemapResource $resource)
124
    {
125 4
        if (false === in_array($resource->getChangeFrequency(), $this->getValidChangeFrequencies())) {
126 1
            throw new SitemapException("Invalid sitemap change frequency provided: {$resource->getChangeFrequency()}");
127
        }
128 3
    }
129
130
    /**
131
     * @param SitemapResource $resource
132
     *
133
     * @throws SitemapException
134
     */
135 3
    private function validateInvalidLocation(SitemapResource $resource)
136
    {
137 3
        if (false === filter_var($resource->getLocation(), FILTER_VALIDATE_URL)) {
138 2
            throw new SitemapException("Invalid absolute location: {$resource->getLocation()}");
139
        }
140 1
    }
141
}
142