Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
19 / 19
100.00% covered (success)
100.00%
1 / 1
CRAP
100.00% covered (success)
100.00%
1 / 1
LogEntry
100.00% covered (success)
100.00%
19 / 19
100.00% covered (success)
100.00%
1 / 1
4
100.00% covered (success)
100.00%
1 / 1
 filter
100.00% covered (success)
100.00%
19 / 19
100.00% covered (success)
100.00%
1 / 1
4
1<?php
2
3declare(strict_types=1);
4
5namespace Engelsystem\Models;
6
7use Carbon\Carbon;
8use Engelsystem\Models\User\User;
9use Engelsystem\Models\User\UsesUserModel;
10use Illuminate\Database\Eloquent\Builder;
11use Illuminate\Database\Eloquent\Collection;
12use Illuminate\Database\Eloquent\Factories\HasFactory;
13use Illuminate\Database\Query\Builder as QueryBuilder;
14use Illuminate\Support\Collection as SupportCollection;
15
16/**
17 * @property int         $id
18 * @property int|null    $user_id
19 * @property string      $level
20 * @property string      $message
21 * @property string      $url
22 * @property Carbon|null $created_at
23 *
24 * @property-read User|null $user
25 *
26 * @method static QueryBuilder|LogEntry[] whereId($value)
27 * @method static QueryBuilder|LogEntry[] whereLevel($value)
28 * @method static QueryBuilder|LogEntry[] whereMessage($value)
29 * @method static QueryBuilder|LogEntry[] whereUrl($value)
30 * @method static QueryBuilder|LogEntry[] whereCreatedAt($value)
31 */
32class LogEntry extends BaseModel
33{
34    use UsesUserModel;
35    use HasFactory;
36
37    /** @var bool enable timestamps for created_at */
38    public $timestamps = true; // phpcs:ignore
39
40    /** @var null Disable updated_at */
41    public const UPDATED_AT = null;
42
43    /** @var array Default attributes */
44    protected $attributes = [ // phpcs:ignore
45        'user_id' => null,
46    ];
47
48    /** @var array<string, string> */
49    protected $casts = [ // phpcs:ignore
50        'user_id' => 'integer',
51    ];
52
53    /**
54     * The attributes that are mass assignable.
55     */
56    protected $fillable = [ // phpcs:ignore
57        'level',
58        'message',
59        'url',
60        'user_id',
61    ];
62
63    /**
64     * @return Builder[]|Collection|SupportCollection|LogEntry[]
65     */
66    public static function filter(
67        ?string $keyword = null,
68        ?int $userId = null,
69        ?string $level = null
70    ): array | Collection | SupportCollection {
71        $query = self::with(['user', 'user.personalData', 'user.state'])
72            ->orderByDesc('created_at')
73            ->orderByDesc('id')
74            ->limit(10000);
75
76        if (!empty($userId)) {
77            $query->where(function (Builder $query) use ($userId): void {
78                $user = User::findOrFail($userId);
79                $query->where('user_id', $userId)
80                    ->orWhere('message', 'like', '%' . $user->name . ' (' . $userId . ')%');
81            });
82        }
83
84        if (!empty($level)) {
85            $query->where('level', '=', $level);
86        }
87
88        if (!empty($keyword)) {
89            $query
90                ->where(function (Builder $query) use ($keyword): void {
91                    $query->where('message', 'LIKE', '%' . $keyword . '%')
92                        ->orWhere('url', 'LIKE', '%' . $keyword . '%');
93                });
94        }
95
96        return $query->get();
97    }
98}