Completed
Pull Request — master (#116)
by
unknown
02:19
created

Sensor::getUpdatedAtHumanAttribute()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 7
Ratio 100 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 7
loc 7
ccs 0
cts 4
cp 0
rs 9.4285
cc 2
eloc 5
nc 2
nop 0
crap 6
1
<?php
2
3
namespace App;
4
5
use Illuminate\Database\Eloquent\Model;
6
use Spatie\Activitylog\Traits\LogsActivity;
7
use Illuminate\Support\Facades\Auth;
8
9
class Sensor extends Model 
10
{
11
    use LogsActivity;
12
13
    protected $table = 'sensors';
14
15
    /**
16
     * Update the updated_at and created_at timestamps?
17
     *
18
     * @var array
19
     */
20
    public $timestamps = false;
21
22
    /**
23
     * The attributes that are mass assignable.
24
     *
25
     * @var array
26
     */
27
    protected $fillable = array('device_id', 'name', 'type');
28
29
    /**
30
     * The attributes that are visible.
31
     *
32
     * @var array
33
     */
34
    protected $visible = array('id', 'device_id', 'name', 'type');
35
36
    /**
37
     * The attributes to log in the Activity Log
38
     *
39
     * @var array
40
     */
41
    protected static $logAttributes = array('id', 'device_id', 'name', 'type');
42
43
    /**
44
     * Only log those that have actually changed after the update.
45
     *
46
     * @var array
47
     */
48
    protected static $logOnlyDirty = true;
49
50
    /**
51
     * Get the device associated with the sensor.
52
     */
53
    public function device()
54
    {
55
        return $this->belongsTo('App\Device');
56
    }
57
58
    /**
59
     * Get the sensor data associated with the sensor.
60
     */
61
    public function data()
62
    {
63
        return $this->hasMany('App\SensorData');
64
    }
65
    
66
    /**
67
     * Get the latest sensor data entry associated with the sensor.
68
     */
69
    public function getLatestDataAttribute()
70
    {
71
        return SensorData::whereRaw('id = (SELECT MAX(id)
72
                                                    FROM sensor_data
73
                                                    WHERE sensor_id = ?)', [$this->id])->first() ?? (object)[];
74
    }
75
    
76
    /**
77
     * Get the last hour's sensor data averaged by the minute for the sensor.
78
     */
79
    public function getLastHourMinutelyAvgDataAttribute()
80
    {
81
        return $this->hasMany('App\SensorData')
82
            ->selectRaw("DATE_FORMAT(created_at, '%Y-%m-%d %H:%i') AS date, AVG(value) AS value")
83
            ->whereRaw("created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)")
84
            ->groupBy("date")
85
            ->get();
86
    }
87
    
88
    /**
89
     * Get the last day's sensor data averaged hourly for the sensor.
90
     */
91
    public function getLastDayHourlyAvgDataAttribute()
92
    {
93
        return $this->hasMany('App\SensorData')
94
            ->selectRaw("DATE_FORMAT(created_at, '%Y-%m-%d %H') AS date, AVG(value) AS value")
95
            ->whereRaw("created_at > DATE_SUB(NOW(), INTERVAL 1 DAY)")
96
            ->groupBy("date")
97
            ->get();
98
    }
99
    
100
    /**
101
     * Get the last weeks's sensor data averaged daily for the sensor.
102
     */
103
    public function getLastWeekDailyAvgDataAttribute()
104
    {
105
        return $this->hasMany('App\SensorData')
106
            ->selectRaw("DATE_FORMAT(created_at, '%Y-%m-%d') AS date, AVG(value) AS value")
107
            ->whereRaw("created_at > DATE_SUB(NOW(), INTERVAL 7 DAY)")
108
            ->groupBy("date")
109
            ->get();
110
    }
111
    
112
    /**
113
     * Get the last months's sensor data averaged daily for the sensor.
114
     */
115
    public function getLastMonthDailyAvgDataAttribute()
116
    {
117
        return $this->hasMany('App\SensorData')
118
            ->selectRaw("DATE_FORMAT(created_at, '%Y-%m-%d') AS date, AVG(value) AS value")
119
            ->whereRaw("created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)")
120
            ->groupBy("date")
121
            ->get();
122
    }
123
    
124
    /**
125
     * Get the last year's sensor data averaged monthly for the sensor.
126
     */
127
    public function getLastYearMonthlyAvgDataAttribute()
128
    {
129
        return $this->hasMany('App\SensorData')
130
            ->selectRaw("DATE_FORMAT(created_at, '%Y-%m') AS date, AVG(value) AS value")
131
            ->whereRaw("created_at > DATE_SUB(NOW(), INTERVAL 1 YEAR)")
132
            ->groupBy("date")
133
            ->get();
134
    }
135
    
136
    /**
137
     * Accessor: Get the sensor's last update time in seconds/minutes/hours since update or converted to user
138
     * friendly readable format.
139
     * If the time is less then a day old then display time since it last updated
140
     * If the time is greater then a day old then display the time in the format of Month day, year 12hour:mins am/pm
141
     * and using the user's preferred timezone
142
     *
143
     *
144
     * @return string
145
     */
146 View Code Duplication
    public function getUpdatedAtHumanAttribute()
147
    {
148
        if ($this->updated_at->diffInDays() > 0)
149
            return $this->updated_at->setTimezone(Auth::user()->timezone)->format('M d, Y h:i a');
0 ignored issues
show
Bug introduced by
Accessing timezone on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
150
        else
151
            return $this->updated_at->diffForHumans();
152
    }
153
    
154
    /**
155
     * Accessor: Get the sensor's creation time in seconds/minutes/hours since update or converted to user
156
     * friendly readable format.
157
     * If the time is less then a day old then display time since creation
158
     * If the time is greater then a day old then display the time in the format of Month day, year 12hour:mins am/pm
159
     * and using the user's preferred timezone
160
     *
161
     *
162
     * @return string
163
     */
164 View Code Duplication
    public function getCreatedAtHumanAttribute()
165
    {
166
        if ($this->created_at->diffInDays() > 0)
167
            return $this->created_at->setTimezone(Auth::user()->timezone)->format('M d, Y h:i a');
0 ignored issues
show
Bug introduced by
Accessing timezone on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
168
        else
169
            return $this->created_at->diffForHumans();
170
    }
171
}