Add DiskSpaceService and DiskSpaceBar component for monitoring disk usage
Implement DiskSpaceService to provide snapshots of disk space usage, including total, free, and used bytes, as well as human-readable formats. Create DiskSpaceBar component to display disk usage information in the UI, including a progress bar that visually represents used space. Update app layout to include the DiskSpaceBar and add tests to ensure functionality of the disk space service and its integration in the layout.
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Number;
|
||||
|
||||
class DiskSpaceService
|
||||
{
|
||||
/**
|
||||
* Snapshot of free/used space for the recordings storage volume.
|
||||
*
|
||||
* @return array{
|
||||
* total_bytes: int,
|
||||
* free_bytes: int,
|
||||
* used_bytes: int,
|
||||
* used_percent: float,
|
||||
* free_percent: float,
|
||||
* total_human: string,
|
||||
* free_human: string,
|
||||
* used_human: string
|
||||
* }|null
|
||||
*/
|
||||
public function snapshot(?string $path = null): ?array
|
||||
{
|
||||
$path ??= Storage::disk('local')->path('');
|
||||
|
||||
/** @var array{total_bytes: int, free_bytes: int, used_bytes: int, used_percent: float, free_percent: float, total_human: string, free_human: string, used_human: string}|null */
|
||||
return Cache::remember(
|
||||
'disk-space:'.md5($path),
|
||||
now()->addSeconds(30),
|
||||
fn () => $this->measure($path),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array{
|
||||
* total_bytes: int,
|
||||
* free_bytes: int,
|
||||
* used_bytes: int,
|
||||
* used_percent: float,
|
||||
* free_percent: float,
|
||||
* total_human: string,
|
||||
* free_human: string,
|
||||
* used_human: string
|
||||
* }|null
|
||||
*/
|
||||
private function measure(string $path): ?array
|
||||
{
|
||||
$total = @disk_total_space($path);
|
||||
$free = @disk_free_space($path);
|
||||
|
||||
if ($total === false || $free === false || $total <= 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$totalBytes = (int) $total;
|
||||
$freeBytes = (int) max(0, $free);
|
||||
$usedBytes = (int) max(0, $totalBytes - $freeBytes);
|
||||
$usedPercent = round(($usedBytes / $totalBytes) * 100, 1);
|
||||
$freePercent = round(($freeBytes / $totalBytes) * 100, 1);
|
||||
|
||||
return [
|
||||
'total_bytes' => $totalBytes,
|
||||
'free_bytes' => $freeBytes,
|
||||
'used_bytes' => $usedBytes,
|
||||
'used_percent' => $usedPercent,
|
||||
'free_percent' => $freePercent,
|
||||
'total_human' => Number::fileSize($totalBytes, precision: 1),
|
||||
'free_human' => Number::fileSize($freeBytes, precision: 1),
|
||||
'used_human' => Number::fileSize($usedBytes, precision: 1),
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user