Completed
Push — master ( 3bf34d...a84a03 )
by ARCANEDEV
13s queued 11s
created

Metric   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 134
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 95.83%

Importance

Changes 0
Metric Value
dl 0
loc 134
c 0
b 0
f 0
wmc 8
lcom 1
cbo 4
ccs 23
cts 24
cp 0.9583
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A title() 0 6 1
A getRequest() 0 4 1
A setRequest() 0 6 1
A resolve() 0 14 2
result() 0 1 ?
A toArray() 0 8 1
A getQuery() 0 7 2
1
<?php namespace Arcanedev\LaravelMetrics\Metrics;
2
3
use Arcanedev\LaravelMetrics\Concerns\ConvertsToArray;
4
use Arcanedev\LaravelMetrics\Contracts\Metric as MetricContract;
5
use Arcanedev\LaravelMetrics\Metrics\Concerns\HasCachedResults;
6
use Illuminate\Database\Eloquent\Builder;
7
use Illuminate\Http\Request;
8
use Illuminate\Support\Str;
9
use Illuminate\Support\Traits\Macroable;
10
11
/**
12
 * Class     Metric
13
 *
14
 * @package  Arcanedev\LaravelMetrics\Metrics
15
 * @author   ARCANEDEV <[email protected]>
16
 */
17
abstract class Metric implements MetricContract
18
{
19
    /* -----------------------------------------------------------------
20
     |  Traits
21
     | -----------------------------------------------------------------
22
     */
23
24
    use Macroable,
25
        ConvertsToArray,
26
        HasCachedResults;
27
28
    /* -----------------------------------------------------------------
29
     |  Properties
30
     | -----------------------------------------------------------------
31
     */
32
33
    /**
34
     * The Http request instance.
35
     *
36
     * @var \Illuminate\Http\Request
37
     */
38
    protected $request;
39
40
    /* -----------------------------------------------------------------
41
     |  Getters & Setters
42
     | -----------------------------------------------------------------
43
     */
44
45
    /**
46
     * Get the metric's title.
47
     *
48
     * @return string
49
     */
50 6
    public function title(): string
51
    {
52 6
        $class = class_basename(static::class);
53
54 6
        return Str::title(Str::snake($class, ' '));
55
    }
56
57
    /**
58
     * Get the Http request instance.
59
     *
60
     * @return \Illuminate\Http\Request
61
     */
62 50
    public function getRequest()
63
    {
64 50
        return $this->request;
65
    }
66
67
    /**
68
     * Set the Http request instance.
69
     *
70
     * @param  \Illuminate\Http\Request  $request
71
     *
72
     * @return $this
73
     */
74 50
    public function setRequest(Request $request)
1 ignored issue
show
Bug introduced by
You have injected the Request via parameter $request. This is generally not recommended as there might be multiple instances during a request cycle (f.e. when using sub-requests). Instead, it is recommended to inject the RequestStack and retrieve the current request each time you need it via getCurrentRequest().
Loading history...
75
    {
76 50
        $this->request = $request;
77
78 50
        return $this;
79
    }
80
81
    /* -----------------------------------------------------------------
82
     |  Main Methods
83
     | -----------------------------------------------------------------
84
     */
85
86
    /**
87
     * Resolve & calculate the metric.
88
     *
89
     * @param  \Illuminate\Http\Request  $request
90
     *
91
     * @return \Arcanedev\LaravelMetrics\Results\Result|mixed
92
     */
93 50
    public function resolve(Request $request)
94
    {
95 50
        $this->setRequest($request);
96
97
        $callback = function () use ($request) {
98 46
            return app()->call([$this, 'calculate'], [
99 46
                'request' => $this->getRequest(),
100
            ]);
101 50
        };
102
103 50
        return ($cacheFor = $this->cacheFor())
104 4
            ? $this->cacheResult($cacheFor, $callback)
105 50
            : $callback();
106
    }
107
108
    /**
109
     * Make a new result instance.
110
     *
111
     * @param  mixed|null  $value
112
     *
113
     * @return \Arcanedev\LaravelMetrics\Results\Result
114
     */
115
    abstract protected function result($value = null);
116
117
    /* -----------------------------------------------------------------
118
     |  Other Methods
119
     | -----------------------------------------------------------------
120
     */
121
122
    /**
123
     * Get the instance as an array.
124
     *
125
     * @return array
126
     */
127 6
    public function toArray(): array
128
    {
129
        return [
130 6
            'class' => static::class,
131 6
            'type'  => $this->type(),
132 6
            'title' => $this->title(),
133
        ];
134
    }
135
136
    /**
137
     * Get the query builder.
138
     *
139
     * @param  \Illuminate\Database\Eloquent\Builder|string  $model
140
     *
141
     * @return \Illuminate\Database\Eloquent\Builder
142
     */
143 46
    protected static function getQuery($model): Builder
144
    {
145 46
        if ($model instanceof Builder)
146
            return $model;
147
148 46
        return (new $model)->newQuery();
149
    }
150
}
151