81 lines
2 KiB
PHP
81 lines
2 KiB
PHP
<?php
|
|
|
|
namespace Convoy\Models;
|
|
|
|
use Carbon\Carbon;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
use Illuminate\Database\Eloquent\Relations\MorphTo;
|
|
use LogicException;
|
|
|
|
class ActivityLog extends Model
|
|
{
|
|
public $timestamps = false;
|
|
|
|
protected $guarded = [
|
|
'id',
|
|
'timestamp',
|
|
];
|
|
|
|
protected $casts = [
|
|
'properties' => 'collection',
|
|
'timestamp' => 'datetime',
|
|
];
|
|
|
|
protected $with = ['subjects'];
|
|
|
|
public static array $validationRules = [
|
|
'event' => ['required', 'string'],
|
|
'batch' => ['nullable', 'uuid'],
|
|
'ip' => ['required', 'string'],
|
|
'description' => ['nullable', 'string'],
|
|
'properties' => ['array'],
|
|
];
|
|
|
|
public function actor(): MorphTo
|
|
{
|
|
$morph = $this->morphTo();
|
|
if (method_exists($morph, 'withTrashed')) {
|
|
return $morph->withTrashed();
|
|
}
|
|
|
|
return $morph;
|
|
}
|
|
|
|
public function subjects(): HasMany
|
|
{
|
|
return $this->hasMany(ActivityLogSubject::class);
|
|
}
|
|
|
|
public function scopeForEvent(Builder $builder, string $action): Builder
|
|
{
|
|
return $builder->where('event', $action);
|
|
}
|
|
|
|
/**
|
|
* Scopes a query to only return results where the actor is a given model.
|
|
*/
|
|
public function scopeForActor(Builder $builder, Model $actor): Builder
|
|
{
|
|
return $builder->whereMorphedTo('actor', $actor);
|
|
}
|
|
|
|
/**
|
|
* Returns models to be pruned.
|
|
*
|
|
* @see https://laravel.com/docs/9.x/eloquent#pruning-models
|
|
*/
|
|
public function prunable(): ActivityLog
|
|
{
|
|
if (is_null(config('activity.prune_days'))) {
|
|
throw new LogicException(
|
|
'Cannot prune activity logs: no "prune_days" configuration value is set.',
|
|
);
|
|
}
|
|
|
|
return static::where(
|
|
'created_at', '<=', Carbon::now()->subDays(config('activity.prune_days')),
|
|
);
|
|
}
|
|
}
|