Passed
Pull Request — master (#5)
by Steven
02:22
created

AllowedRecipientsSanitiser::sanitisePhoneNumber()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 6
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Digitonic\Validation\Services;
4
5
use libphonenumber\NumberParseException;
6
use libphonenumber\PhoneNumberUtil;
7
use libphonenumber\PhoneNumberFormat;
8
9
class AllowedRecipientsSanitiser
10
{
11
    protected $libPhoneNumber;
12
13 4
    public function __construct()
14
    {
15 4
        $this->libPhoneNumber = PhoneNumberUtil::getInstance();
16 4
    }
17
18
    /**
19
     * Get formatted phone number in E.164 standard without (+).
20
     * This method will return false if the number is not valid.
21
     *
22
     * @param string $phoneNumber
23
     *
24
     * @return mixed
25
     */
26 1
    public function getFormattedNumber(string $phoneNumber)
27
    {
28 1
        $phoneNumberObject = $this->getPhoneNumberObject($phoneNumber);
29
30 1
        if ($phoneNumberObject) {
31 1
            if (in_array(
32 1
                $this->libPhoneNumber->getRegionCodeForNumber($phoneNumberObject),
33 1
                config('digitonic.validation.allowed_mobile_origins')
34
            )) {
35
                // Format number to E.164 standard and remove '+'
36 1
                $formattedPhone = str_replace(
37 1
                    '+',
38 1
                    '',
39 1
                    $this->libPhoneNumber->format($phoneNumberObject, PhoneNumberFormat::E164)
40
                );
41
42 1
                return $formattedPhone;
43
            }
44
        }
45
46 1
        return false;
47
    }
48
49
    /**
50
     * Get phoneNumberObject.
51
     *
52
     * @param string $phoneNumber
53
     *
54
     * @return mixed
55
     */
56 3
    public function getPhoneNumberObject(string $phoneNumber)
57
    {
58
        try {
59 3
            if (!preg_match('/[A-Za-z]/', $phoneNumber)) {
60 3
                $phoneNumberObject = $this->libPhoneNumber->parse($this->sanitisePhoneNumber($phoneNumber), null);
61 3
                if ($this->libPhoneNumber->isPossibleNumber($phoneNumberObject)) {
62 3
                    return $phoneNumberObject;
63
                }
64
            }
65 1
        } catch (NumberParseException $exception) {
66
            // Do nothing
67
        }
68
69 2
        return false;
70
    }
71
72
    /**
73
     * @param string $phoneNumber
74
     * @return string
75
     */
76 4
    public function sanitisePhoneNumber(string $phoneNumber): string
77
    {
78 4
        $phoneNumber = $this->getDigits($phoneNumber);
79
80 4
        return $this->formatNumber($phoneNumber);
81
    }
82
83
    /**
84
     * @param string $phoneNumber
85
     * @return string
86
     */
87 4
    protected function getDigits(string $phoneNumber): string
88
    {
89 4
        return preg_replace('#\D+#', '', $phoneNumber);
90
    }
91
92
    /**
93
     * @param string $phoneNumber
94
     * @return string
95
     */
96 4
    protected function formatNumber(string $phoneNumber): string
97
    {
98
        // Format UK numbers starting with 07 or 7
99 4
        preg_match('/^0*(7\d{9})$/', $phoneNumber, $outputUkPhone);
100
101 4
        if ($outputUkPhone) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $outputUkPhone of type string[] is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
102 4
            return '+44' . $outputUkPhone[1];
103
        }
104
105 4
        return '+' . $phoneNumber;
106
    }
107
}
108