FeedbackController::store()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 1
Metric Value
cc 1
eloc 6
c 3
b 0
f 1
nc 1
nop 1
dl 0
loc 11
rs 10
1
<?php
2
3
namespace Mydnic\Kustomer\Http\Controllers;
4
5
use Illuminate\Support\Str;
6
use Illuminate\Http\Request;
7
use Mydnic\Kustomer\Feedback;
8
use Illuminate\Validation\Rule;
9
use Illuminate\Routing\Controller;
10
use Illuminate\Support\Facades\Storage;
11
use Mydnic\Kustomer\Events\NewFeedback;
12
13
class FeedbackController extends Controller
14
{
15
    public function store(Request $request)
16
    {
17
        $data = $this->validates($request);
18
19
        $feedback = $this->storeFeedback($data, $request);
20
21
        $this->dispatchEvent($feedback);
22
23
        return response()->json([
24
            'created' => true
25
        ], 201);
26
    }
27
28
    private function validates(Request $request)
29
    {
30
        return $request->validate([
31
            'type' => [
32
                'required', Rule::in(array_keys(config('kustomer.feedbacks'))),
33
            ],
34
            'message' => 'required',
35
            'viewport' => 'array',
36
        ]);
37
    }
38
39
    private function storeFeedback($data, Request $request)
40
    {
41
        $feedback = new Feedback;
42
        $feedback->type = $data['type'];
43
        $feedback->message = $data['message'];
44
        $feedback->user_info = $this->gatherUserInfo($request);
45
        $feedback->save();
46
47
        return $feedback;
48
    }
49
50
    private function gatherUserInfo(Request $request)
51
    {
52
        return [
53
            'url' => $request->server('HTTP_REFERER'),
54
            'language' => $request->getPreferredLanguage(),
55
            'agent' => $request->server('HTTP_USER_AGENT'),
56
            'viewport' => $request->viewport,
57
            'screenshot' => $this->saveScreenshot($request->screenshot),
58
            'user_id' => auth()->check() ? auth()->id() : null,
59
        ];
60
    }
61
62
    private function dispatchEvent(Feedback $feedback)
63
    {
64
        event(new NewFeedback($feedback));
65
    }
66
67
    private function saveScreenshot($base64Screenshot = null)
68
    {
69
        if ($base64Screenshot and config('kustomer.screenshot')) {
70
            $image = $base64Screenshot;
71
            $image = str_replace('data:image/png;base64,', '', $image);
72
            $image = str_replace(' ', '+', $image);
73
            $imageName = microtime(true) . Str::random(4) . '.' . 'png';
74
            if (Storage::put('screenshots/' . $imageName, base64_decode($image))) {
75
                return 'screenshots/' . $imageName;
76
            }
77
        }
78
79
        return null;
80
    }
81
}
82