CredentialsDetector::detect()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 9
c 1
b 0
f 0
nc 3
nop 1
dl 0
loc 15
rs 9.9666
1
<?php
2
3
namespace ArgentCrusade\Stronghold;
4
5
use Illuminate\Http\Request;
6
use Illuminate\Support\Facades\Validator;
7
use Propaganistas\LaravelPhone\PhoneNumber;
8
9
class CredentialsDetector
10
{
11
    /**
12
     * Detect authentication method.
13
     *
14
     * @param Request $request
15
     *
16
     * @return CredentialsDetectorResult
17
     */
18
    public function detect(Request $request)
19
    {
20
        if ($this->validates($request, ['email' => $this->emailValidationRule($request)])) {
21
            return new CredentialsDetectorResult(
22
                CredentialsDetectorResult::EMAIL,
23
                $request->input('email')
24
            );
25
        } elseif ($this->validates($request, ['phone' => $this->phoneValidationRule($request)])) {
26
            return new CredentialsDetectorResult(
27
                CredentialsDetectorResult::PHONE,
28
                $this->formatPhone($request->input('phone'))
29
            );
30
        }
31
32
        throw new \InvalidArgumentException('Unknown authentication type.');
33
    }
34
35
    /**
36
     * Email field validation rules.
37
     *
38
     * @param Request $request
39
     *
40
     * @return string
41
     */
42
    protected function emailValidationRule(Request $request)
43
    {
44
        return 'required|string|email';
45
    }
46
47
    /**
48
     * Phone field validation rules.
49
     *
50
     * @param Request $request
51
     *
52
     * @return string
53
     */
54
    protected function phoneValidationRule(Request $request)
55
    {
56
        return 'required|string|phone:RU';
57
    }
58
59
    /**
60
     * Determines whether the given request validates agains given rules.
61
     *
62
     * @param Request $request
63
     * @param array   $rules
64
     *
65
     * @return bool
66
     */
67
    protected function validates(Request $request, array $rules)
68
    {
69
        /** @var \Illuminate\Validation\Validator $validator */
70
        $validator = Validator::make($request->all(), $rules);
71
72
        return $validator->passes();
73
    }
74
75
    /**
76
     * Format given phone number into E.164 format.
77
     *
78
     * @param string $number
79
     *
80
     * @return string
81
     */
82
    protected function formatPhone(string $number)
83
    {
84
        try {
85
            return PhoneNumber::make($number)->formatE164();
86
        } catch (\Exception $e) {
87
            return $number;
88
        }
89
    }
90
}
91