feat: paginate workshops and videos pages
This commit is contained in:
@@ -10,6 +10,8 @@ class Video extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
protected $table = 'videos';
|
||||
|
||||
// Campos que podem ser preenchidos
|
||||
protected $fillable = [
|
||||
'title',
|
||||
'description',
|
||||
@@ -18,14 +20,68 @@ class Video extends Model
|
||||
'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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
11
plataforma-tutorias/app/Models/VideoView.php
Normal file
11
plataforma-tutorias/app/Models/VideoView.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class VideoView extends Model
|
||||
{
|
||||
protected $fillable = ['user_id', 'video_id', 'watched_at'];
|
||||
}
|
||||
Reference in New Issue
Block a user