Completed
Branch master (8e0976)
by Adam
04:13
created

SetupGuestCookie::handle()   A

Complexity

Conditions 4
Paths 2

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
nc 2
nop 2
dl 0
loc 16
rs 9.7333
c 0
b 0
f 0
1
<?php
2
3
namespace Coyote\Http\Middleware;
4
5
use Closure;
6
use Illuminate\Http\Request;
7
use Ramsey\Uuid\Uuid;
8
9
class SetupGuestCookie
10
{
11
    /**
12
     * Handle an incoming request.
13
     *
14
     * @param  \Illuminate\Http\Request $request
15
     * @param  \Closure $next
16
     * @return mixed
17
     */
18
    public function handle(Request $request, Closure $next)
19
    {
20
        // establish quest id
21
        $guestId = $this->getGuestIdValue($request);
22
        // cookie value
23
        $cookie = $request->cookie(config('session.guest_cookie'));
24
25
        /** @var \Illuminate\Http\Response $response */
26
        $response = $next($request);
27
28
        if (method_exists($response, 'cookie') && ($cookie === null || $cookie !== $guestId)) {
29
            $response->cookie(config('session.guest_cookie'), $guestId, 525948); // 1 year
30
        }
31
32
        return $response;
33
    }
34
35
    /**
36
     * @param Request $request
37
     * @return string
38
     */
39
    private function getGuestIdValue(Request $request): string
40
    {
41
        // get guest_id from session. this does not require additional query to redis.
42
        // this value can be null if session does not exist.
43
        $guestId = $request->session()->get('guest_id');
44
45
        // cookie was removed or this is users' first visit
46
        if ($guestId === null) {
47
            if (!empty($request->user())) {
48
                $guestId = $request->user()->guest_id;
49
            } elseif ($request->hasCookie(config('session.guest_cookie'))) {
50
                $guestId = $request->cookie(config('session.guest_cookie'));
51
            } else {
52
                $guestId = (string) Uuid::uuid4();
53
            }
54
55
            $request->session()->put('guest_id', $guestId);
56
        }
57
58
        // validate registered user's guest_id with the one from session.
59
        // why? previously user could use website as anonymous user.
60
        if (!empty($request->user()) && $request->user()->guest_id !== $guestId) {
61
            $guestId = $request->user()->guest_id;
62
            $request->session()->put('guest_id', $guestId);
63
        }
64
65
        return $guestId;
66
    }
67
}
68