feat: rework logging

This commit is contained in:
llama committed 2023-10-11 22:28:14 +11:00
1 parent 87bdbeee05
commit 2d5991988d
15 files changed
+204 -95

No files matched your search

+22
View File
@@ -0,0 +1,22 @@
<?php
namespace App\Enums;
use App\Traits\EnumOptions;
use App\Traits\EnumValues;
enum LogAction: string
{
use EnumValues;
use EnumOptions;
case CREATE = 'create';
case DELETE = 'delete';
case REQUEST = 'request';
case REJECT = 'reject';
case APPROVE = 'approve';
case SEND = 'send';
case UPDATE = 'update';
case ACCESS = 'access';
}
+13 -6
View File
@@ -2,13 +2,13 @@
namespace App\Http\Controllers\Api;
use App\Enums\LogAction;
use App\Http\Controllers\Controller;
use App\Models\Log;
use App\Models\Quote;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
class WebHookController extends Controller
{
public function webHookSend(string $payload)
@@ -27,8 +27,12 @@ class WebHookController extends Controller
}
Log::create([
'user_id' => auth()?->user()?->id,
'content' => "Quote sent. {$quote}",
'user_id' => auth()?->user()?->id ?? 1,
'loggable_type' => Quote::class,
'loggable_id' => null,
'action' => LogAction::SEND,
'content' => $quote,
'ip' => request()->ip(),
]);
$this->webHookSend($quote);
@@ -39,9 +43,12 @@ class WebHookController extends Controller
$quote = Quote::inRandomOrder()->first();
Log::create([
'user_id' => auth()?->user()?->id,
'quote_id' => $quote->id,
'content' => 'Quote sent.',
'user_id' => auth()?->user()?->id ?? 1,
'loggable_type' => Quote::class,
'loggable_id' => $quote->id,
'action' => LogAction::REQUEST,
'content' => 'Random quote requested',
'ip' => request()->ip(),
]);
$this->webHookSend($quote->quote);
+10 -9
View File
@@ -4,6 +4,7 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\MorphTo;
/**
* @mixin IdeHelperLog
@@ -12,9 +13,11 @@ class Log extends Model
{
protected $fillable = [
'user_id',
'quote_id',
'requested_quote_id',
'loggable_type',
'loggable_id',
'action',
'content',
'ip',
];
public function user(): BelongsTo
@@ -22,13 +25,11 @@ class Log extends Model
return $this->belongsTo(User::class);
}
public function quote(): BelongsTo
/**
* Get the parent loggable model (user, quote or requested quote).
*/
public function loggable(): MorphTo
{
return $this->belongsTo(Quote::class);
}
public function requestedQuote(): BelongsTo
{
return $this->belongsTo(RequestedQuote::class);
return $this->morphTo();
}
}
+22 -11
View File
@@ -2,8 +2,9 @@
namespace App\Models;
use App\Enums\LogAction;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphOne;
use Illuminate\Database\Eloquent\SoftDeletes;
/**
@@ -20,37 +21,47 @@ class Quote extends Model
Log::create([
'user_id' => auth()?->user()?->id,
'quote_id' => $this->id,
'content' => 'Quote requested.',
'loggable_type' => self::class,
'loggable_id' => $this->id,
'action' => LogAction::REQUEST,
'content' => $this->quote,
'ip' => request()->ip(),
]);
}
protected $fillable = [
'user_id',
'quote',
];
public function logs(): hasMany
public function logs(): MorphOne
{
return $this->hasMany(Log::class);
return $this->morphOne(Log::class, 'loggable');
}
public static function boot(): void
{
parent::boot();
self::created(function ($model) {
self::created(function (Quote $model) {
Log::create([
'user_id' => auth()?->user()?->id,
'quote_id' => $model->id,
'content' => 'Quote created.',
'loggable_type' => self::class,
'loggable_id' => $model->id,
'action' => LogAction::CREATE,
'content' => $model->quote,
'ip' => request()->ip(),
]);
});
self::deleted(function ($model) {
self::deleted(function (Quote $model) {
Log::create([
'user_id' => auth()?->user()?->id,
'quote_id' => $model->id,
'content' => 'Quote deleted.',
'loggable_type' => self::class,
'loggable_id' => $model->id,
'action' => LogAction::DELETE,
'content' => $model->quote,
'ip' => request()->ip(),
]);
});
}
+14 -8
View File
@@ -2,8 +2,9 @@
namespace App\Models;
use App\Enums\LogAction;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphOne;
use Illuminate\Database\Eloquent\SoftDeletes;
/**
@@ -15,20 +16,22 @@ class RequestedQuote extends Model
protected $fillable = [
'quote',
'user_id',
];
public function logs(): hasMany
public function logs(): MorphOne
{
return $this->hasMany(Log::class);
return $this->morphOne(Log::class, 'loggable');
}
public function approve(): void
{
Log::create([
'user_id' => auth()?->user()?->id,
'requested_quote_id' => $this->id,
'content' => 'Quote approved.',
'loggable_type' => self::class,
'loggable_id' => $this->id,
'action' => LogAction::APPROVE,
'content' => $this->quote,
'ip' => request()->ip(),
]);
Quote::create([
@@ -42,8 +45,11 @@ class RequestedQuote extends Model
{
Log::create([
'user_id' => auth()?->user()?->id,
'requested_quote_id' => $this->id,
'content' => 'Quote rejected.',
'loggable_type' => self::class,
'loggable_id' => $this->id,
'action' => LogAction::REJECT,
'content' => $this->quote,
'ip' => request()->ip(),
]);
$this->delete();
+18 -10
View File
@@ -2,18 +2,20 @@
namespace App\Models;
use App\Enums\LogAction;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphOne;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
/**
* @mixin IdeHelperUser
*/
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
use HasFactory, Notifiable;
/**
* The model's default values for attributes.
@@ -62,27 +64,33 @@ class User extends Authenticatable
'password' => 'hashed',
];
public function logs(): hasMany
public function logAction(): HasMany
{
return $this->hasMany(Log::class);
}
public function fullName(): string
public function logs(): MorphOne
{
return "{$this->firstname} {$this->lastname}";
return $this->morphOne(Log::class, 'loggable');
}
public function getFullNameAttribute(): string
{
return "$this->firstname $this->lastname";
}
public static function boot(): void
{
parent::boot();
// These will only ever get created by the api/bot.
// If we want to add something like by whom later on,
// we can just append it to the content e.g auth()?->user()?->id ?? 'API'.
self::created(function ($model) {
Log::create([
'user_id' => $model->id,
'content' => 'User created.',
'user_id' => auth()?->user()?->id ?? 1,
'loggable_type' => self::class,
'loggable_id' => $model->id,
'action' => LogAction::CREATE,
'content' => $model->full_name,
'ip' => request()->ip(),
]);
});
}