Permitir que los estudiantes suban materiales sin que la biblioteca se vuelva un cajon de sastre ni se expongan paths del server.
restriccion: Todos los listados, busquedas y endpoints de descarga deben respetar el gate is_approved. Path del archivo y nombre original se guardan por separado para que la URL publica nunca filtre la estructura de disco.
Resource tiene is_approved (default false), file_path (lado server, opaco) y file_name (solo display). Cada scope de lista/busqueda en Livewire agrega where('is_approved', true). El flujo de upload notifica a coordinadores, que aprueban con un click. La busqueda sobre titulo/descripcion/materia es un solo query con debounce de Livewire.
public function render()
{
$resources = Resource::with('user')
->where('is_approved', true)
->when($this->search, function ($query) {
$query->where(function ($q) {
$q->where('title', 'like', '%' . $this->search . '%')
->orWhere('description','like', '%' . $this->search . '%')
->orWhere('subject', 'like', '%' . $this->search . '%');
});
})
->latest()
->paginate(20);
return view('livewire.resources.resource-list', compact('resources'));
}