diff --git a/app/Helpers/Number.php b/app/Helpers/Number.php new file mode 100644 index 000000000..2f9c3c386 --- /dev/null +++ b/app/Helpers/Number.php @@ -0,0 +1,25 @@ + ['Bps', 'Kbps', 'Mbps', 'Gbps', 'Tbps', 'Pbps', 'Ebps', 'Zbps', 'Ybps'], + default => ['B', 'Kb', 'Mb', 'Gb', 'Tb', 'Pb', 'Eb', 'Zb', 'Yb'] + }; + + for ($i = 0; ($bits / 1024) > 0.9 && ($i < count($units) - 1); $i++) { + $bits /= 1024; + } + + return sprintf('%s %s', static::format($bits, $precision, $maxPrecision), $units[$i]); + } +} diff --git a/app/Models/Result.php b/app/Models/Result.php index 1d7a592ef..9500cf9e0 100644 --- a/app/Models/Result.php +++ b/app/Models/Result.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Events\ResultCreated; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Arr; @@ -106,4 +107,28 @@ public function getJitterData(): array 'ping' => $data['ping']['jitter'] ?? null, ]; } + + /** + * Get the result's download in bits. + */ + protected function downloadBits(): Attribute + { + return Attribute::make( + get: fn (mixed $value): ?string => ! blank($this->download) && is_numeric($this->download) + ? number_format(num: $this->download * 8, decimals: 0, thousands_separator: '') + : null, + ); + } + + /** + * Get the result's upload in bits. + */ + protected function uploadBits(): Attribute + { + return Attribute::make( + get: fn (mixed $value): ?string => ! blank($this->upload) && is_numeric($this->upload) + ? number_format(num: $this->upload * 8, decimals: 0, thousands_separator: '') + : null, + ); + } }