Files
2026-05-27 09:30:13 +01:00

88 lines
2.5 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\Category;
class Video extends Model
{
use HasFactory;
protected $table = 'videos';
// Campos que podem ser preenchidos
protected $fillable = [
'title',
'description',
'url',
'thumbnail',
'duration',
'tags',
'is_active',
'order',
];
// Ordem dos vídeos
protected static function booted() {
static::creating(function ($video) {
if(!$video->order){
$video->order = static::max('order') + 1;
} else {
// Se definiu uma ordem já ocupada, empurra os outros
static::where('order', '>=', $video->order)
->increment('order');
}
});
static::updating(function ($video) {
if ($video->isDirty('order')) { // ← só age se a ordem foi alterada
$oldOrder = $video->getOriginal('order'); // ← ordem antiga
$newOrder = $video->order; // ← ordem nova
// Se a ordem for menor que 1, define como 1
if ($newOrder < 1) {
$video->order = 1;
$newOrder = 1;
}
if ($newOrder > $oldOrder) {
// Moveu para baixo — fecha o espaço antigo
static::where('order', '>', $oldOrder)
->where('order', '<=', $newOrder)
->decrement('order');
} else {
// Moveu para cima — abre espaço na nova posição
static::where('order', '>=', $newOrder)
->where('order', '<', $oldOrder)
->increment('order');
}
}
});
}
// Converte o campo is_active para boolean
protected $casts = [
'is_active' => 'boolean',
];
// Um vídeo pode ter várias categorias
public function categories()
{
return $this->belongsToMany(Category::class, 'video_category');
}
// Um vídeo pode ter várias visualizações
public function views()
{
return $this->hasMany(VideoView::class);
}
// Verifica se um vídeo foi assistido por um utilizador
public function isWatchedBy(User $user): bool
{
return $this->views()->where('user_id', $user->id)->exists();
}
}