*/ protected $fillable = [ 'is_anonymous', 'model_class', 'model_id', 'event', 'data', 'created_at', ]; /** * The attributes that should be cast. * * @var array */ protected $casts = [ 'is_anonymous' => 'bool', 'event' => ActivityLogsEventEnum::class, 'data' => 'json', 'created_at' => 'datetime', ]; // * METHODS /** * Add new activity to the activity logs list. * * @param \Illuminate\Database\Eloquent\Model $model * @param \App\Enums\ActivityLogs\ActivityLogsEventEnum $eventEnum * @return void */ public static function addActivity(Model $model, ActivityLogsEventEnum $eventEnum): void { $isAnonymous = true; /** @var \Illuminate\Database\Eloquent\Model|null */ $userModel = auth('backend')->user(); if (is_object($userModel)) { $userModel = $userModel->getKeyForSelectQuery(); $isAnonymous = false; } $activity = new self(); $activity->user_id = $userModel; $activity->is_console = app()->runningInConsole(); $activity->is_anonymous = $isAnonymous; $activity->model_class = \get_class($model); $activity->model_id = $model->getKey(); $activity->event = $eventEnum; $activity->data = static::getChangedColumns($activity, $model, $eventEnum); // @phpstan-ignore-next-line $activity->created_at = now(); $activity->saveOrFail(); } /** * Get old, new columns that has changed. * * @param self $activity * @param \Illuminate\Database\Eloquent\Model $model * @param \App\Enums\ActivityLogs\ActivityLogsEventEnum $eventEnum * @return array */ public static function getChangedColumns(self $activity, Model $model, ActivityLogsEventEnum $eventEnum): array { $modelClassName = $activity->model_class; /** Get type of each fields of the target model */ $targetModel = $activity->model_class::where( (new $modelClassName())->getRouteKeyName(), $activity->model_id )->first(); if ($targetModel != null) { // phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed $targetModelTypes = collect($targetModel->toArray()) ->map(function ($field, $fieldIndex) use ($targetModel) { return Schema::getColumnType($targetModel->getTable(), $fieldIndex); })->toArray(); // phpcs:enable /** Return old, new and type of values changed */ return ($eventEnum === ActivityLogsEventEnum::updated) ? array_intersect_key($targetModelTypes, $model->getChanges()) : []; } return []; } // * RELATIONS /** * User BelongsTo relation. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class); } /** * StaticPage BelongsTo relation. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function staticPage(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(StaticPage::class); } /** * Settings BelongsTo relation. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function settings(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Settings::class); } /** * Range BelongsTo relation. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function range(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Range::class); } /** * Product BelongsTo relation. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function product(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Product::class); } /** * Prize BelongsTo relation. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function prize(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Prize::class); } /** * Participation BelongsTo relation. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function participation(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Participation::class); } /** * InstantWin BelongsTo relation. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function instantWin(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(InstantWin::class); } /** * FaqTheme BelongsTo relation. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function faqTheme(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(FaqTheme::class); } /** * FaqQuestion BelongsTo relation. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function faqQuestion(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(FaqQuestion::class); } /** * Discount BelongsTo relation. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function discount(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Discount::class); } /** * Customer BelongsTo relation. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function customer(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Customer::class); } /** * Code BelongsTo relation. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function code(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Code::class); } /** * BannedIp BelongsTo relation. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function bannedIp(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(BannedIp::class); } }