From f751def2fdb974bd59eda6778e7382b85c76ec67 Mon Sep 17 00:00:00 2001 From: Alex Justesen Date: Mon, 24 Nov 2025 10:30:49 -0500 Subject: [PATCH] Add dispatched_by field to results and update related logic (#2431) Co-authored-by: Alex Justesen <1144087+alexjustesen@users.noreply.github.com> --- app/Actions/Ookla/RunSpeedtest.php | 3 ++- .../Controllers/Api/V1/SpeedtestController.php | 1 + app/Http/Resources/V1/ResultResource.php | 1 + app/Livewire/Topbar/RunSpeedtestAction.php | 1 + app/Models/Result.php | 9 +++++++++ ...1719_add_dispatched_by_to_results_table.php | 18 ++++++++++++++++++ 6 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 database/migrations/2025_11_24_151719_add_dispatched_by_to_results_table.php diff --git a/app/Actions/Ookla/RunSpeedtest.php b/app/Actions/Ookla/RunSpeedtest.php index 0d6a87a8..c3814310 100644 --- a/app/Actions/Ookla/RunSpeedtest.php +++ b/app/Actions/Ookla/RunSpeedtest.php @@ -23,13 +23,14 @@ class RunSpeedtest { use AsAction; - public function handle(bool $scheduled = false, ?int $serverId = null): mixed + public function handle(bool $scheduled = false, ?int $serverId = null, ?int $dispatchedBy = null): mixed { $result = Result::create([ 'data->server->id' => $serverId, 'service' => ResultService::Ookla, 'status' => ResultStatus::Waiting, 'scheduled' => $scheduled, + 'dispatched_by' => $dispatchedBy, ]); SpeedtestWaiting::dispatch($result); diff --git a/app/Http/Controllers/Api/V1/SpeedtestController.php b/app/Http/Controllers/Api/V1/SpeedtestController.php index a0b00a37..19519f61 100644 --- a/app/Http/Controllers/Api/V1/SpeedtestController.php +++ b/app/Http/Controllers/Api/V1/SpeedtestController.php @@ -38,6 +38,7 @@ class SpeedtestController extends ApiController $result = RunSpeedtestAction::run( serverId: $request->input('server_id'), + dispatchedBy: $request->user()->id, ); return $this->sendResponse( diff --git a/app/Http/Resources/V1/ResultResource.php b/app/Http/Resources/V1/ResultResource.php index e0071029..069a90e7 100644 --- a/app/Http/Resources/V1/ResultResource.php +++ b/app/Http/Resources/V1/ResultResource.php @@ -34,6 +34,7 @@ class ResultResource extends JsonResource 'healthy' => $this->healthy, 'status' => $this->status, 'scheduled' => $this->scheduled, + 'dispatched_by' => $this->dispatched_by, 'comments' => $this->comments, 'data' => $this->data, 'created_at' => $this->created_at->toDateTimestring(), diff --git a/app/Livewire/Topbar/RunSpeedtestAction.php b/app/Livewire/Topbar/RunSpeedtestAction.php index b6e77b29..ad8c0527 100644 --- a/app/Livewire/Topbar/RunSpeedtestAction.php +++ b/app/Livewire/Topbar/RunSpeedtestAction.php @@ -53,6 +53,7 @@ class RunSpeedtestAction extends Component implements HasActions, HasForms RunSpeedtest::run( serverId: $serverId, + dispatchedBy: Auth::id(), ); Notification::make() diff --git a/app/Models/Result.php b/app/Models/Result.php index 3ac4caa7..bba1a37d 100644 --- a/app/Models/Result.php +++ b/app/Models/Result.php @@ -9,6 +9,7 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Prunable; +use Illuminate\Database\Eloquent\Relations\BelongsTo; class Result extends Model { @@ -45,4 +46,12 @@ class Result extends Model { return static::where('created_at', '<=', now()->subDays(config('speedtest.prune_results_older_than'))); } + + /** + * Get the user who dispatched this speedtest. + */ + public function dispatchedBy(): BelongsTo + { + return $this->belongsTo(User::class, 'dispatched_by'); + } } diff --git a/database/migrations/2025_11_24_151719_add_dispatched_by_to_results_table.php b/database/migrations/2025_11_24_151719_add_dispatched_by_to_results_table.php new file mode 100644 index 00000000..473c9b77 --- /dev/null +++ b/database/migrations/2025_11_24_151719_add_dispatched_by_to_results_table.php @@ -0,0 +1,18 @@ +foreignId('dispatched_by')->nullable()->constrained('users')->nullOnDelete(); + }); + } +};