summaryrefslogtreecommitdiff
path: root/src/DTS/Validator.php
blob: a688832737b1ab2e7e6dbfeae3e7ebc1d550b24e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php

declare(strict_types=1);

namespace DTS;

use DTS\Errors;
use DTS\Validated;

class Validator
{
    public Errors $errors;

    public Validated $validated;

    function __construct(array $request) 
    {
        $this->errors = new Errors();

        $this->validated = new Validated();

        $this->validateUrl($request['url'], 8, 512);

        $this->validateTitle($request['title'], 2, 256);

        $this->validateTag($request['tag'], 2, 16);
    }

    private function validateUrl(string $url, int $minLength, int $maxLength): void
    {
        $url = trim($url);

        if (filter_var($url, FILTER_VALIDATE_URL) === false) {
            $this->errors->add('url', 'Must be a URL');
        }

        if (strlen($url) < $minLength  || strlen($url) > $maxLength) {
            $this->errors->add('url', "Must be between $minLength and $maxLength in characters in length");
        }

        if (!$this->errors->has('url')) {
            $this->validated->url = $url;
        }
    }

    private function validateTitle(string $title, int $minLength, int $maxLength): void
    {
        $title = trim($title);

        if ($title === '') {
            return;
        }

        if (strlen($title) < $minLength  || strlen($title) > $maxLength) {
            $this->errors->add('title', "Must be between $minLength and $maxLength in characters in length");
        }

        if (!$this->errors->has('tite')) {
            $this->validated->title = $title;
        }
    }

    private function validateTag(string $tag, int $minLength, int $maxLength): void
    {
        $tag = trim($tag);

        if ($tag === '') {
            return;
        }

        if (strlen($tag) < $minLength  || strlen($tag) > $maxLength) {
            $this->errors->add('tag', "Must be between $minLength and $maxLength in characters in length");
        }
        if (preg_match('/\W/', $tag) === 1) {
            $this->errors->add('tag', 'May only contain word characters');
        }

        if (!$this->errors->has('tag')) {
            $this->validated->tag = strtolower($tag);
        }
    }
}