Issues (7)

src/BlameableTrait.php (6 issues)

1
<?php
2
3
namespace RichanFongdasen\EloquentBlameable;
4
5
use Illuminate\Database\Eloquent\Builder;
6
use Illuminate\Database\Eloquent\Model;
7
use Illuminate\Database\Eloquent\Relations\BelongsTo;
8
use Illuminate\Database\Eloquent\SoftDeletes;
9
10
trait BlameableTrait
11
{
12
    /**
13
     * Get any of override 'blameable attributes'.
14
     *
15
     * @return array
16
     */
17
    public function blameable(): array
18
    {
19
        if (property_exists($this, 'blameable')) {
20
            return (array) static::$blameable;
21
        }
22
23
        return [];
24
    }
25
26
    /**
27
     * Boot the Blameable service by attaching
28
     * a new observer into the current model object.
29
     *
30
     * @return void
31
     */
32
    public static function bootBlameableTrait(): void
33
    {
34
        static::observe(app(BlameableObserver::class));
35
    }
36
37
    /**
38
     * Build blameable query scope.
39
     *
40
     * @param \Illuminate\Database\Eloquent\Builder $query
41
     * @param mixed                                 $userId
42
     * @param string                                $key
43
     *
44
     * @return \Illuminate\Database\Eloquent\Builder
45
     */
46
    private function buildBlameableScope(Builder $query, $userId, $key): Builder
47
    {
48
        if ($userId instanceof Model) {
49
            $userId = $userId->getKey();
50
        }
51
52
        return $query->where($this->getTable().'.'.app(BlameableService::class)->getConfiguration($this, $key), $userId);
0 ignored issues
show
It seems like getTable() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

52
        return $query->where($this->/** @scrutinizer ignore-call */ getTable().'.'.app(BlameableService::class)->getConfiguration($this, $key), $userId);
Loading history...
$this of type RichanFongdasen\EloquentBlameable\BlameableTrait is incompatible with the type Illuminate\Database\Eloquent\Model expected by parameter $model of RichanFongdasen\Eloquent...ice::getConfiguration(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

52
        return $query->where($this->getTable().'.'.app(BlameableService::class)->getConfiguration(/** @scrutinizer ignore-type */ $this, $key), $userId);
Loading history...
53
    }
54
55
    /**
56
     * Get the user who created the record.
57
     *
58
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
59
     */
60
    public function creator(): BelongsTo
61
    {
62
        return $this->belongsTo(
63
            app(BlameableService::class)->getConfiguration($this, 'user'),
0 ignored issues
show
$this of type RichanFongdasen\EloquentBlameable\BlameableTrait is incompatible with the type Illuminate\Database\Eloquent\Model expected by parameter $model of RichanFongdasen\Eloquent...ice::getConfiguration(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

63
            app(BlameableService::class)->getConfiguration(/** @scrutinizer ignore-type */ $this, 'user'),
Loading history...
64
            app(BlameableService::class)->getConfiguration($this, 'createdBy')
65
        );
66
    }
67
68
    /**
69
     * Get the user who updated the record for the last time.
70
     *
71
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
72
     */
73
    public function updater(): BelongsTo
74
    {
75
        return $this->belongsTo(
76
            app(BlameableService::class)->getConfiguration($this, 'user'),
0 ignored issues
show
$this of type RichanFongdasen\EloquentBlameable\BlameableTrait is incompatible with the type Illuminate\Database\Eloquent\Model expected by parameter $model of RichanFongdasen\Eloquent...ice::getConfiguration(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

76
            app(BlameableService::class)->getConfiguration(/** @scrutinizer ignore-type */ $this, 'user'),
Loading history...
77
            app(BlameableService::class)->getConfiguration($this, 'updatedBy')
78
        );
79
    }
80
81
    /**
82
     * createdBy Query Scope.
83
     *
84
     * @param \Illuminate\Database\Eloquent\Builder $query
85
     * @param mixed                                 $userId
86
     *
87
     * @return \Illuminate\Database\Eloquent\Builder
88
     */
89
    public function scopeCreatedBy(Builder $query, $userId): Builder
90
    {
91
        return $this->buildBlameableScope($query, $userId, 'createdBy');
92
    }
93
94
    /**
95
     * updatedBy Query Scope.
96
     *
97
     * @param \Illuminate\Database\Eloquent\Builder $query
98
     * @param mixed                                 $userId
99
     *
100
     * @return \Illuminate\Database\Eloquent\Builder
101
     */
102
    public function scopeUpdatedBy(Builder $query, $userId): Builder
103
    {
104
        return $this->buildBlameableScope($query, $userId, 'updatedBy');
105
    }
106
107
    /**
108
     * Silently update the model without firing any
109
     * events.
110
     *
111
     * @return int
112
     */
113
    public function silentUpdate(): int
114
    {
115
        return $this->newQueryWithoutScopes()
116
            ->where($this->getKeyName(), $this->getKey())
0 ignored issues
show
It seems like where() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

116
            ->/** @scrutinizer ignore-call */ where($this->getKeyName(), $this->getKey())
Loading history...
117
            ->getQuery()
0 ignored issues
show
It seems like getQuery() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

117
            ->/** @scrutinizer ignore-call */ getQuery()
Loading history...
118
            ->update($this->getDirty());
119
    }
120
121
    /**
122
     * Confirm if the current model uses SoftDeletes.
123
     *
124
     * @return bool
125
     */
126
    public function useSoftDeletes(): bool
127
    {
128
        return in_array(SoftDeletes::class, class_uses_recursive($this), true);
129
    }
130
131
    /**
132
     * Define an inverse one-to-one or many relationship.
133
     *
134
     * @param string      $related
135
     * @param string|null $foreignKey
136
     * @param string|null $otherKey
137
     * @param string|null $relation
138
     *
139
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
140
     */
141
    abstract public function belongsTo($related, $foreignKey = null, $otherKey = null, $relation = null);
142
143
    /**
144
     * Get the attributes that have been changed since last sync.
145
     *
146
     * @return array
147
     */
148
    abstract public function getDirty();
149
150
    /**
151
     * Get the primary key for the model.
152
     *
153
     * @return string
154
     */
155
    abstract public function getKeyName();
156
157
    /**
158
     * Get the value of the model's primary key.
159
     *
160
     * @return mixed
161
     */
162
    abstract public function getKey();
163
164
    /**
165
     * Get a new query builder that doesn't have any global scopes.
166
     *
167
     * @return \Illuminate\Database\Eloquent\Builder|static
168
     */
169
    abstract public function newQueryWithoutScopes();
170
}
171