feat: inspect device logs

feat: create DeviceLog model on log request

feat: implement logs route, logs view

feat: implement details on device log

timezone, latest 50 log items

sort by latest device timestamp

cleanup job

add tests
This commit is contained in:
Benjamin Nussbaum 2025-06-01 22:08:37 +02:00
parent 04d089c445
commit c045dc1e85
12 changed files with 425 additions and 0 deletions

View file

@ -0,0 +1,31 @@
<?php
namespace App\Jobs;
use App\Models\Device;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\DB;
class CleanupDeviceLogsJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Execute the job.
*/
public function handle(): void
{
Device::each(function ($device) {
$keepIds = $device->logs()->latest('device_timestamp')->take(50)->pluck('id');
// Delete all other logs for this device
$device->logs()
->whereNotIn('id', $keepIds)
->delete();
});
}
}

View file

@ -142,4 +142,9 @@ class Device extends Model
{
return $this->belongsTo(Firmware::class, 'update_firmware_id');
}
public function logs(): HasMany
{
return $this->hasMany(DeviceLog::class);
}
}

27
app/Models/DeviceLog.php Normal file
View file

@ -0,0 +1,27 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class DeviceLog extends Model
{
use HasFactory;
protected $guarded = ['id'];
public function device(): BelongsTo
{
return $this->belongsTo(Device::class);
}
protected function casts(): array
{
return [
'log_entry' => 'array',
'device_timestamp' => 'datetime',
];
}
}