Passed
Push — master ( 313b1a...9e2dac )
by Clement
03:49
created

FeedbackController::saveScreenshot()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

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