ldc-gen-game-web/app/Models/ActivityLog.php
2024-02-15 15:53:36 +01:00

273 lines
8.8 KiB
PHP

<?php
namespace App\Models;
use App\Enums\ActivityLogs\ActivityLogsEventEnum;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Schema;
/**
* @property string $model Target model.
* @property string $model_id Id of the target model.
* @property \App\Enums\ActivityLogs\ActivityLogsEventEnum $event Event of this activity (ActivityLogsEventEnum).
* @property array $data Changes.
* @property-read \Illuminate\Support\Carbon $created_at Created date.
*
* @property-read \App\Models\User $user User BelongsTo relation.
* @property-read \App\Models\StaticPage $staticPage StaticPage BelongsTo relation.
* @property-read \App\Models\Settings $settings Settings BelongsTo relation.
* @property-read \App\Models\Range $range Range BelongsTo relation.
* @property-read \App\Models\Product $product Product BelongsTo relation.
* @property-read \App\Models\Prize $prize Prize BelongsTo relation.
* @property-read \App\Models\Participation $participation Participation BelongsTo relation.
* @property-read \App\Models\InstantWin $instantWin InstantWin BelongsTo relation.
* @property-read \App\Models\FaqTheme $faqTheme FaqTheme BelongsTo relation.
* @property-read \App\Models\FaqQuestion $faqQuestion FaqQuestion BelongsTo relation.
* @property-read \App\Models\Discount $discount Discount BelongsTo relation.
* @property-read \App\Models\Customer $customer Customer BelongsTo relation.
* @property-read \App\Models\Code $code Code BelongsTo relation.
* @property-read \App\Models\BannedIp $bannedIp BannedIp BelongsTo relation.
*/
class ActivityLog extends Model
{
use HasFactory;
use Notifiable;
/**
* Indicates if the model should be timestamped.
*
* @var boolean
*/
public $timestamps = false;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'is_anonymous',
'model_class',
'model_id',
'event',
'data',
'created_at',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
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);
}
}