LinkController::show()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 15
ccs 8
cts 8
cp 1
rs 9.7666
c 0
b 0
f 0
cc 2
nc 2
nop 1
crap 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace MuhamedDidovic\Shortener\Controllers;
6
7
use Illuminate\Http\Request;
8
use Illuminate\Routing\Controller as BaseController;
9
use MuhamedDidovic\Shortener\Models\Link;
10
use MuhamedDidovic\Shortener\Traits\Response;
11
12
/**
13
 * Class LinkController.
14
 */
15
class LinkController extends BaseController
16
{
17
    use Response;
18
19
    /**
20
     * @param Request $request
21
     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\JsonResponse|\Illuminate\Http\Response
22
     */
23 4
    public function show(Request $request)
24
    {
25 4
        $code = $request->get('code');
26
27 4
        $link = Link::byCode($code)->first();
28
29 4
        if ($link === null) {
30 1
            return response(null, 404);
31
        }
32
33 3
        $link->increment('used_count');
34 3
        $link->touchTimestamp('last_used');
35
36 3
        return $this->linkResponse($link);
37
    }
38
39
    /**
40
     * @param Request $request
41
     * @return \Illuminate\Http\JsonResponse
42
     */
43 7
    public function store(Request $request)
44
    {
45 7
        $request->validate([
46
            'url' => [
47 7
                'required',
48
                'regex:#((https?|ftp)://(\S*?\.\S*?))([\s)\[\]{},;"\':<]|\.\s|$)#i',
49
            ],
50
        ], [
51 7
            'url.required'   => 'Please enter a URL to shorten.',
52
            'url.regex' => 'Hmm, that doesn\'t look like a valid URL.',
53
        ]);
54
55 5
        $link = Link::firstOrNew([
56 5
            'original_url' => $request->get('url'),
57
        ]);
58
59 5
        if (! $link->exists) {
60 4
            $link->save();
61
        }
62
63 5
        $link->increment('requested_count');
64 5
        $link->touchTimestamp('last_requested');
65
66 5
        return $this->linkResponse($link);
67
    }
68
}
69