authorizeWrite('gruppi'); $request->validate([ 'avatar' => 'required|image|mimes:jpeg,png,gif,webp|max:2048', ]); $existing = $gruppo->avatar; if ($existing) { if ($existing->file_path && Storage::disk('local')->exists($existing->file_path)) { Storage::disk('local')->delete($existing->file_path); } $existing->delete(); } $file = $request->file('avatar'); $path = $file->store('avatars/gruppi', 'local'); $documento = Documento::create([ 'user_id' => auth()->id(), 'nome_file' => $file->getClientOriginalName(), 'file_path' => $path, 'tipologia' => 'avatar', 'visibilita' => 'gruppo', 'visibilita_target_id' => $gruppo->id, 'visibilita_target_type' => Gruppo::class, 'mime_type' => $file->getMimeType(), 'dimensione' => $file->getSize(), ]); $gruppo->avatar()->save($documento); return response()->json(['success' => true, 'avatar_url' => $documento->file_path]); } public function show(Gruppo $gruppo) { $this->authorizeRead('gruppi'); $avatar = $gruppo->avatar; if (!$avatar || !$avatar->file_path || !Storage::disk('local')->exists($avatar->file_path)) { abort(404); } $fullPath = Storage::disk('local')->path($avatar->file_path); return response()->file($fullPath, ['Content-Type' => $avatar->mime_type]); } public function destroy(Gruppo $gruppo) { $this->authorizeWrite('gruppi'); $avatar = $gruppo->avatar; if ($avatar) { if ($avatar->file_path && Storage::disk('local')->exists($avatar->file_path)) { Storage::disk('local')->delete($avatar->file_path); } $avatar->delete(); } return response()->json(['success' => true]); } }