Completed
Pull Request — master (#514)
by Ako
05:41
created

LogsActivity::shouldSubmitEmptyLogs()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
nc 2
nop 0
dl 0
loc 4
ccs 2
cts 2
cp 1
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Spatie\Activitylog\Traits;
4
5
use Illuminate\Support\Arr;
6
use Illuminate\Support\Collection;
7
use Spatie\Activitylog\ActivityLogger;
8
use Illuminate\Database\Eloquent\Model;
9
use Illuminate\Database\Eloquent\SoftDeletes;
10
use Spatie\Activitylog\ActivitylogServiceProvider;
11
use Illuminate\Database\Eloquent\Relations\MorphMany;
12
13
trait LogsActivity
14
{
15
    use DetectsChanges;
16
17
    protected $enableLoggingModelsEvents = true;
18
19 164
    protected static function bootLogsActivity()
20
    {
21
        static::eventsToBeRecorded()->each(function ($eventName) {
22
            return static::$eventName(function (Model $model) use ($eventName) {
23 160
                if (! $model->shouldLogEvent($eventName)) {
24 12
                    return;
25
                }
26
27 156
                $description = $model->getDescriptionForEvent($eventName);
28
29 156
                $logName = $model->getLogNameToUse($eventName);
30
31 156
                if ($description == '') {
32
                    return;
33
                }
34
35 156
                $attrs = $model->attributeValuesToBeLogged($eventName);
36 156
37 156
                if ($model->isLogEmpty($attrs) && ! $model->shouldSubmitEmptyLogs()) {
38 156
                    return;
39
                }
40 156
41 4
                $logger = app(ActivityLogger::class)
42
                    ->useLog($logName)
43
                    ->performedOn($model)
44 156
                    ->withProperties($attrs);
45 164
46 164
                if (method_exists($model, 'tapActivity')) {
47 164
                    $logger->tap([$model, 'tapActivity'], $eventName);
48
                }
49 12
50
                $logger->log($description);
51 12
            });
52
        });
53 12
    }
54
55
    public function shouldSubmitEmptyLogs(): bool
56 4
    {
57
        return ! isset(static::$submitEmptyLogs) ? true : static::$submitEmptyLogs;
58 4
    }
59
60 4
    public function isLogEmpty($attrs): bool
61
    {
62
        return empty($attrs['attributes'] ?? []) && empty($attrs['old'] ?? []);
63 24
    }
64
65 24
    public function disableLogging()
66
    {
67
        $this->enableLoggingModelsEvents = false;
68 152
69
        return $this;
70 152
    }
71
72
    public function enableLogging()
73 152
    {
74
        $this->enableLoggingModelsEvents = true;
75 152
76 4
        return $this;
77
    }
78
79 148
    public function activities(): MorphMany
80
    {
81
        return $this->morphMany(ActivitylogServiceProvider::determineActivityModel(), 'subject');
0 ignored issues
show
Bug introduced by
It seems like morphMany() must be provided by classes using this trait. How about adding it as abstract method to this trait?

This check looks for methods that are used by a trait but not required by it.

To illustrate, let’s look at the following code example

trait Idable {
    public function equalIds(Idable $other) {
        return $this->getId() === $other->getId();
    }
}

The trait Idable provides a method equalsId that in turn relies on the method getId(). If this method does not exist on a class mixing in this trait, the method will fail.

Adding the getId() as an abstract method to the trait will make sure it is available.

Loading history...
82
    }
83
84
    public function getDescriptionForEvent(string $eventName): string
85 164
    {
86
        return $eventName;
87 164
    }
88
89
    public function getLogNameToUse(string $eventName = ''): string
0 ignored issues
show
Unused Code introduced by
The parameter $eventName is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
90
    {
91 164
        if (isset(static::$logName)) {
92 164
            return static::$logName;
93
        }
94
95
        return config('activitylog.default_log_name');
96
    }
97 164
98 64
    /*
99
     * Get the event names that should be recorded.
100
     */
101 164
    protected static function eventsToBeRecorded(): Collection
102
    {
103
        if (isset(static::$recordEvents)) {
104 156
            return collect(static::$recordEvents);
105
        }
106 156
107 156
        $events = collect([
108
            'created',
109
            'updated',
110
            'deleted',
111
        ]);
112
113 160
        if (collect(class_uses_recursive(static::class))->contains(SoftDeletes::class)) {
114
            $events->push('restored');
115 160
        }
116 8
117
        return $events;
118
    }
119 156
120 24
    public function attributesToBeIgnored(): array
121
    {
122
        if (! isset(static::$ignoreChangedAttributes)) {
123 156
            return [];
124 4
        }
125 4
126
        return static::$ignoreChangedAttributes;
127
    }
128
129
    protected function shouldLogEvent(string $eventName): bool
130 156
    {
131
        if (! $this->enableLoggingModelsEvents) {
132
            return false;
133
        }
134
135
        if (! in_array($eventName, ['created', 'updated'])) {
136
            return true;
137
        }
138
139
        if (Arr::has($this->getDirty(), 'deleted_at')) {
0 ignored issues
show
Bug introduced by
It seems like getDirty() must be provided by classes using this trait. How about adding it as abstract method to this trait?

This check looks for methods that are used by a trait but not required by it.

To illustrate, let’s look at the following code example

trait Idable {
    public function equalIds(Idable $other) {
        return $this->getId() === $other->getId();
    }
}

The trait Idable provides a method equalsId that in turn relies on the method getId(). If this method does not exist on a class mixing in this trait, the method will fail.

Adding the getId() as an abstract method to the trait will make sure it is available.

Loading history...
140
            if ($this->getDirty()['deleted_at'] === null) {
0 ignored issues
show
Bug introduced by
It seems like getDirty() must be provided by classes using this trait. How about adding it as abstract method to this trait?

This check looks for methods that are used by a trait but not required by it.

To illustrate, let’s look at the following code example

trait Idable {
    public function equalIds(Idable $other) {
        return $this->getId() === $other->getId();
    }
}

The trait Idable provides a method equalsId that in turn relies on the method getId(). If this method does not exist on a class mixing in this trait, the method will fail.

Adding the getId() as an abstract method to the trait will make sure it is available.

Loading history...
141
                return false;
142
            }
143
        }
144
145
        //do not log update event if only ignored attributes are changed
146
        return (bool) count(Arr::except($this->getDirty(), $this->attributesToBeIgnored()));
0 ignored issues
show
Bug introduced by
It seems like getDirty() must be provided by classes using this trait. How about adding it as abstract method to this trait?

This check looks for methods that are used by a trait but not required by it.

To illustrate, let’s look at the following code example

trait Idable {
    public function equalIds(Idable $other) {
        return $this->getId() === $other->getId();
    }
}

The trait Idable provides a method equalsId that in turn relies on the method getId(). If this method does not exist on a class mixing in this trait, the method will fail.

Adding the getId() as an abstract method to the trait will make sure it is available.

Loading history...
147
    }
148
}
149