Helpers::httpResponse()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 8
c 1
b 0
f 0
dl 0
loc 12
rs 10
cc 2
nc 2
nop 4
1
<?php
2
3
namespace Ikechukwukalu\Requirepin\Traits;
4
5
use Ikechukwukalu\Requirepin\Services\ThrottleRequestsService;
6
use Illuminate\Http\JsonResponse;
7
use Illuminate\Http\Request;
8
use Illuminate\Http\RedirectResponse;
9
use Illuminate\Http\Response;
10
use Illuminate\Support\Facades\Response as ResponseFacade;
11
use Stevebauman\Location\Facades\Location;
12
13
trait Helpers {
14
15
    public ThrottleRequestsService $throttleRequestsService;
16
17
    public function __construct()
18
    {
19
        $this->throttleRequestsService = new ThrottleRequestsService(
20
            config('requirepin.login.max_attempts', 3),
21
            config('requirepin.login.delay_minutes', 1)
22
        );
23
    }
24
25
    /**
26
     * HTTP Response.
27
     *
28
     * @param \Illuminate\Http\Request $request
29
     * @param string $status
30
     * @param int $status_code
31
     * @param array $data
32
     *
33
     * @return \Illuminate\Http\JsonResponse
34
     * @return \Illuminate\Http\RedirectResponse
35
     * @return \Illuminate\Http\Response
36
     */
37
    public function httpResponse(Request $request, string $status, int $status_code, $data = null): RedirectResponse|JsonResponse|Response
38
    {
39
        if ($this->shouldResponseBeJson($request)) {
40
            return ResponseFacade::json([
41
                'status' => $status,
42
                'status_code' => $status_code,
43
                'data' => $data
44
            ], $status_code);
45
        }
46
47
        return back()->with('return_payload', json_encode([
0 ignored issues
show
Bug Best Practice introduced by
The expression return back()->with('ret... $status_code, $data))) returns the type Illuminate\Http\RedirectResponse which is incompatible with the documented return type Illuminate\Http\JsonResponse.
Loading history...
48
            $status, $status_code, $data]));
49
    }
50
51
    /**
52
     * Get User IP.
53
     *
54
     * @param \Illuminate\Http\Request $request
55
     *
56
     * @return string
57
     */
58
    public function getUserIp(Request $request): string
59
    {
60
        if ($position = Location::get()) {
61
            return $position->ip;
62
        }
63
64
        $server_keys = [
65
                        'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR',
66
                        'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP',
67
                        'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED',
68
                        'REMOTE_ADDR'
69
                    ];
70
71
        foreach ($server_keys as $key){
72
            if (array_key_exists($key, $_SERVER) === true) {
73
                foreach (explode(',', $_SERVER[$key]) as $ip) {
74
                    $ip = trim($ip); // just to be safe
75
76
                    if (filter_var($ip, FILTER_VALIDATE_IP,
77
                        FILTER_FLAG_NO_PRIV_RANGE |
78
                        FILTER_FLAG_NO_RES_RANGE) !== false
79
                    ) {
80
                        return $ip;
81
                    }
82
                }
83
            }
84
        }
85
86
        return $request->ip(); // it will return server ip when no client ip found
0 ignored issues
show
Bug Best Practice introduced by
The expression return $request->ip() could return the type null which is incompatible with the type-hinted return string. Consider adding an additional type-check to rule them out.
Loading history...
87
    }
88
89
    /**
90
     * Unknown Error Response.
91
     *
92
     * @param \Illuminate\Http\Request $request
93
     *
94
     * @return \Illuminate\Http\JsonResponse
95
     * @return \Illuminate\Http\RedirectResponse
96
     * @return \Illuminate\Http\Response
97
     */
98
    public function unknownErrorResponse(Request $request): RedirectResponse|JsonResponse|Response
99
    {
100
        $data = ['message' =>
101
        trans('requirepin::general.unknown_error')];
102
103
        return $this->httpResponse($request,
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->httpRespon...ral.fail'), 422, $data) also could return the type Illuminate\Http\RedirectResponse which is incompatible with the documented return type Illuminate\Http\JsonResponse.
Loading history...
104
            trans('requirepin::general.fail'), 422, $data);
105
    }
106
107
    /**
108
     * HTTP Response.
109
     *
110
     * @param \Illuminate\Http\Request $request
111
     * @param string $trans
112
     *
113
     * @return null
114
     * @return array
115
     */
116
    public function requestAttempts(Request $request, string $trans = 'requirepin::auth.throttle'): ?array
117
    {
118
        if ($this->throttleRequestsService->hasTooManyAttempts($request)) {
119
            $this->throttleRequestsService->_fireLockoutEvent($request);
120
121
            return ["message" => trans($trans,
122
                        ['seconds' =>
123
                            $this->throttleRequestsService->_limiter()
124
                            ->availableIn(
125
                                    $this->throttleRequestsService
126
                                        ->_throttleKey($request)
127
                                )
128
                        ])
129
                    ];
130
        }
131
132
        $this->throttleRequestsService->incrementAttempts($request);
133
134
        return null;
135
    }
136
137
    public function shouldResponseBeJson(Request $request): bool
138
    {
139
        return $request->wantsJson() || $request->ajax();
140
    }
141
142
    public function pinRequiredRoute(Request $request): string
143
    {
144
        $prefix = explode('/', $request->route()->getPrefix())[0];
0 ignored issues
show
Bug introduced by
It seems like $request->route()->getPrefix() can also be of type null; however, parameter $string of explode() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

144
        $prefix = explode('/', /** @scrutinizer ignore-type */ $request->route()->getPrefix())[0];
Loading history...
145
146
        if ($prefix === 'api' || $prefix === 'test') {
147
            return 'pinRequired';
148
        }
149
150
        return 'pinRequiredWeb';
151
    }
152
153
}
154