Files

114 lines
2.4 KiB
PHP

<?php
namespace App\Models;
use App\Enums\MediaDiskEnum;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
class Medium extends Model
{
use HasFactory;
protected $fillable = [
'filename',
'disk',
'path',
'size',
'url',
'mime_type'
];
protected $casts = [
'disk' => MediaDiskEnum::class,
];
public function getFullUrlAttribute()
{
if ($this->disk === MediaDiskEnum::Public) {
return Storage::disk('public')->path($this->path);
}elseif($this->disk === MediaDiskEnum::Private){
return Storage::disk('private')->path($this->path);
}
return $this->url ?? null;
}
public function getStorageDisk()
{
return Storage::disk($this->disk?->value ?? 'public');
}
public function exists()
{
return $this->getStorageDisk()->exists($this->path);
}
public function getContents()
{
return $this->getStorageDisk()->get($this->path);
}
public function deleteFile()
{
if ($this->exists()) {
return $this->getStorageDisk()->delete($this->path);
}
return false;
}
public function getHumanSizeAttribute()
{
$bytes = $this->size;
$units = ['B', 'KB', 'MB', 'GB', 'TB'];
for ($i = 0; $bytes > 1024 && $i < count($units) - 1; $i++) {
$bytes /= 1024;
}
return round($bytes, 2) . ' ' . $units[$i];
}
public function isPublic()
{
return $this->disk === MediaDiskEnum::Public;
}
public function isPrivate()
{
return $this->disk === MediaDiskEnum::Private;
}
public function assignments()
{
return $this->hasMany(MediaAssignment::class , 'media_id' , 'id');
}
public function reports()
{
return $this->morphedByMany(
\App\Models\Report::class,
'mediable',
'media_assignments',
'media_id',
'mediable_id'
);
}
public function documents()
{
return $this->morphedByMany(
\App\Models\Document::class,
'mediable',
'media_assignments',
'media_id',
'mediable_id'
);
}
public function users()
{
return $this->hasMany(User::class , 'media_id' , 'id');
}
}