Scrutinizer GitHub App not installed

We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.

Install GitHub App

Completed
Push — v4dot1 ( cabaa1...a767a2 )
by Cristian
17:12 queued 11:01
created

FetchOperation::fetch()   C

Complexity

Conditions 12
Paths 193

Size

Total Lines 51
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 1 Features 0
Metric Value
cc 12
eloc 27
c 2
b 1
f 0
nc 193
nop 1
dl 0
loc 51
rs 6.1916

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Backpack\CRUD\app\Http\Controllers\Operations;
4
5
use Illuminate\Support\Facades\Route;
6
use Illuminate\Support\Str;
7
8
trait FetchOperation
9
{
10
    /**
11
     * Define which routes are needed for this operation.
12
     *
13
     * @param string $segment    Name of the current entity (singular). Used as first URL segment.
14
     * @param string $routeName  Prefix of the route name.
15
     * @param string $controller Name of the current CrudController.
16
     */
17
    protected function setupFetchOperationRoutes($segment, $routeName, $controller)
18
    {
19
        // get all method names on the current model that start with "fetch" (ex: fetchCategory)
20
        // if a method that looks like that is present, it means we need to add the routes that fetch that entity
21
        preg_match_all('/(?<=^|;)fetch([^;]+?)(;|$)/', implode(';', get_class_methods($this)), $matches);
22
23
        if (count($matches[1])) {
24
            foreach ($matches[1] as $methodName) {
25
                Route::post($segment.'/fetch/'.Str::kebab($methodName), [
26
                    'uses'      => $controller.'@fetch'.$methodName,
27
                    'operation' => 'FetchOperation',
28
                ]);
29
            }
30
        }
31
    }
32
33
    /**
34
     * Gets items from database and returns to selects.
35
     *
36
     * @param string|array $arg
37
     * @return void
38
     */
39
    private function fetch($arg)
40
    {
41
        // get the actual words that were used to search for an item (the search term / search string)
42
        $search_string = request()->input('q') ?? false;
43
44
        // if the Class was passed as the sole argument, use that as the configured Model
45
        // otherwise assume the arguments are actually the configuration array
46
        $config = [];
47
48
        if (! is_array($arg)) {
49
            if (! class_exists($arg)) {
50
                return response()->json(['error' => 'Class: '.$arg.' does not exists'], 500);
0 ignored issues
show
Bug Best Practice introduced by
The expression return response()->json(...does not exists'), 500) returns the type Illuminate\Http\JsonResponse which is incompatible with the documented return type void.
Loading history...
51
            }
52
            $config['model'] = $arg;
53
        } else {
54
            $config = $arg;
55
        }
56
57
        $model_instance = new $config['model'];
58
        // set configuration defaults
59
        $config['paginate'] = isset($config['paginate']) ? $config['paginate'] : 10;
60
        $config['searchable_attributes'] = $config['searchable_attributes'] ?? $model_instance->identifiableAttribute();
61
        $config['query'] = isset($config['query']) && is_callable($config['query']) ? $config['query']($config['model']) : $model_instance; // if a closure that has been passed as "query", use the closure - otherwise use the model
62
63
        // FetchOperation sends an empty query to retrieve the default entry for select when field is not nullable.
64
        // Also sends an empty query in case we want to load all entities to emulate non-ajax fields
65
        // when using InlineCreate.
66
67
        if ($search_string === false) {
68
            return ($config['paginate'] !== false) ?
69
            $config['query']->paginate($config['paginate']) :
70
            $config['query']->get();
71
        }
72
73
        $textColumnTypes = ['string', 'json_string', 'text'];
74
        // for each searchable attribute, add a WHERE clause
75
        foreach ((array) $config['searchable_attributes'] as $k => $searchColumn) {
76
            $operation = ($k == 0) ? 'where' : 'orWhere';
77
            $columnType = $config['query']->getColumnType($searchColumn);
78
79
            if (in_array($columnType, $textColumnTypes)) {
80
                $config['query'] = $config['query']->{$operation}($searchColumn, 'LIKE', '%'.$search_string.'%');
81
            } else {
82
                $config['query'] = $config['query']->{$operation}($searchColumn, $search_string);
83
            }
84
        }
85
86
        // return the results with or without pagination
87
        return ($config['paginate'] !== false) ?
88
                    $config['query']->paginate($config['paginate']) :
89
                    $config['query']->get();
90
    }
91
}
92