Passed
Push — main ( 36e409...b1e3f6 )
by Yaroslav
02:51
created

ResourceController   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 59
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 6
eloc 33
c 2
b 0
f 0
dl 0
loc 59
ccs 40
cts 40
cp 1
rs 10

1 Method

Rating   Name   Duplication   Size   Complexity  
B __invoke() 0 53 6
1
<?php
2
3
namespace NovaListCard\Http\Controllers;
4
5
use Carbon\Carbon;
6
use Illuminate\Routing\Controller;
7
use Illuminate\Support\Facades\Cache;
8
use Illuminate\Support\Facades\Response;
9
use NovaListCard\Http\Requests\CardRequest;
10
11
/**
12
 * @psalm-suppress UndefinedClass
13
 */
14
class ResourceController extends Controller
15
{
16
    /**
17
     * @param \NovaListCard\Http\Requests\CardRequest $cardRequest
18
     * @return mixed
19
     */
20 4
    public function __invoke(CardRequest $cardRequest)
21
    {
22
23 4
        $callback = function () use ($cardRequest) {
24 4
            if (!$cardRequest->cardResource()) {
25 1
                return Response::json([
26 1
                    'message' => __('Card not found'),
27 1
                ], 404);
28
            }
29
30 3
            return $cardRequest->cardResource()::indexQuery(
31 3
                $cardRequest,
32 3
                $cardRequest->prepareQuery()
33 3
            )
34 3
                ->get()
35 3
                ->mapInto($cardRequest->cardResource())
36 3
                ->filter(function ($resource) use ($cardRequest) {
37 3
                    return $resource->authorizedToView($cardRequest);
38 3
                })
39 3
                ->map(callback: function ($resource) use ($cardRequest) {
40 3
                    $data = [
41 3
                        'title' => $resource->title(),
42 3
                        'url'   => route('nova.pages.detail', [$resource::uriKey(), $resource->getKey()]),
43 3
                    ];
44
45 3
                    $card = $cardRequest->card();
46
47 3
                    if ($card->valueColumn) {
48 3
                        $value         = $resource->resource->{$card->valueColumn};
49 3
                        $data['value'] = match ($card->valueFormatter) {
50 3
                            'datetime' => Carbon::parse($value)->format($card->valueFormat),
51 3
                            'integer'  => (int)$value,
52 3
                            default    => $value,
53 3
                        };
54
                    }
55
56 3
                    if ($card->timestampColumn) {
57 1
                        $data['timestamp'] = $resource->resource->{$card->timestampColumn}?->format($card->timestampFormat ?: 'Y-m-d');
58
                    }
59
60 3
                    return $data;
61 3
                });
62 4
        };
63
64 4
        if ($cacheFor = $cardRequest->card()?->cacheFor()) {
65 1
            return Cache::remember(
66 1
                $cardRequest->card()->getCacheKey($cardRequest),
67 1
                $cacheFor,
68 1
                $callback
69 1
            );
70
        }
71
72 3
        return call_user_func($callback);
73
    }
74
}
75