latest()->paginate(10); $newsEnabled = Setting::get('news_enabled', 'on') === 'on'; return view('admin.news.index', compact('newsList', 'newsEnabled')); } public function toggleVisibility() { $current = Setting::get('news_enabled', 'on'); $newValue = $current === 'on' ? 'off' : 'on'; Setting::set('news_enabled', $newValue, 'news'); $status = $newValue === 'on' ? 'ativado' : 'desativado'; return redirect()->route('admin.news.index')->with('success', "Módulo de Notícias {$status} com sucesso."); } public function create() { return view('admin.news.create'); } public function store(Request $request) { $request->validate([ 'title' => 'required|string|max:255', 'slug' => 'required|string|max:255|unique:news', 'summary' => 'nullable|string|max:500', 'content' => 'nullable|string', 'author' => 'nullable|string|max:255', 'featured_image' => 'nullable|image|max:5120|mimes:jpeg,png,jpg,gif,webp', 'published_at' => 'nullable|date', 'seo_title' => 'nullable|string|max:255', 'seo_description' => 'nullable|string|max:500', 'seo_keywords' => 'nullable|string|max:255', ], [ 'featured_image.mimes' => 'A imagem deve ser do tipo: JPEG, PNG, JPG, GIF ou WebP.', ]); $data = $request->except('featured_image'); $data['active'] = true; $data['user_id'] = Auth::id(); if ($request->hasFile('featured_image')) { $data['featured_image'] = $request->file('featured_image')->store('news/featured', 'public'); } $news = News::create($data); /** @var \App\Models\User $user */ $user = Auth::user(); $admins = User::where('user_type', 'Admin')->where('id', '!=', $user->id)->get(); Notification::send($admins, new NewsActionNotification($news, $user, 'created')); return redirect()->route('admin.news.index')->with('success', 'Notícia criada com sucesso.'); } public function edit(News $news) { $news->load('images'); return view('admin.news.edit', compact('news')); } public function update(Request $request, News $news) { $request->validate([ 'title' => 'required|string|max:255', 'slug' => 'required|string|max:255|unique:news,slug,' . $news->id, 'summary' => 'nullable|string|max:500', 'content' => 'nullable|string', 'author' => 'nullable|string|max:255', 'featured_image' => 'nullable|image|max:5120', 'active' => 'required|boolean', 'published_at' => 'nullable|date', 'seo_title' => 'nullable|string|max:255', 'seo_description' => 'nullable|string|max:500', 'seo_keywords' => 'nullable|string|max:255', ]); $data = $request->except('featured_image'); if ($request->hasFile('featured_image')) { // Delete old featured image if ($news->featured_image) { Storage::disk('public')->delete($news->featured_image); } $data['featured_image'] = $request->file('featured_image')->store('news/featured', 'public'); } $news->update($data); /** @var \App\Models\User $user */ $user = Auth::user(); $admins = User::where('user_type', 'Admin')->where('id', '!=', $user->id)->get(); Notification::send($admins, new NewsActionNotification($news, $user, 'updated')); return redirect()->route('admin.news.index')->with('success', 'Notícia atualizada com sucesso.'); } public function destroy(News $news) { // Delete featured image if ($news->featured_image) { Storage::disk('public')->delete($news->featured_image); } // Delete all additional images foreach ($news->images as $image) { Storage::disk('public')->delete($image->file_path); } $news->delete(); return redirect()->route('admin.news.index')->with('success', 'Notícia excluída com sucesso.'); } // Featured Image Management public function removeFeaturedImage(News $news) { if ($news->featured_image) { Storage::disk('public')->delete($news->featured_image); $news->update(['featured_image' => null]); } return redirect()->back()->with('success', 'Imagem principal removida.'); } // Additional Images Management public function uploadImage(Request $request, News $news) { $request->validate([ 'images' => 'required|array|min:1|max:10', 'images.*' => 'image|max:5120|mimes:jpeg,png,jpg,gif,webp', // 5MB each ], [ 'images.max' => 'Máximo de 10 imagens permitidas.', 'images.*.mimes' => 'As imagens devem ser do tipo: JPEG, PNG, JPG, GIF ou WebP.', ]); $order = $news->images()->count() + 1; $count = 0; foreach ($request->file('images') as $file) { $path = $file->store('news/' . $news->id, 'public'); NewsImage::create([ 'news_id' => $news->id, 'file_path' => $path, 'order' => $order++, ]); $count++; } /** @var \App\Models\User $user */ $user = Auth::user(); $admins = User::where('user_type', 'Admin')->where('id', '!=', $user->id)->get(); Notification::send($admins, new NewsActionNotification($news, $user, 'photo_added')); $message = $count === 1 ? 'Imagem adicionada à notícia.' : "{$count} imagens adicionadas à notícia."; return redirect()->back()->with('success', $message); } public function updateImage(Request $request, NewsImage $image) { $request->validate([ 'description' => 'nullable|string|max:255', 'order' => 'required|integer', ]); $image->update($request->only('description', 'order')); return redirect()->back()->with('success', 'Imagem atualizada.'); } public function deleteImage(NewsImage $image) { $news = $image->news; Storage::disk('public')->delete($image->file_path); $image->delete(); /** @var \App\Models\User $user */ $user = Auth::user(); $admins = User::where('user_type', 'Admin')->where('id', '!=', $user->id)->get(); Notification::send($admins, new NewsActionNotification($news, $user, 'photo_deleted')); return redirect()->back()->with('success', 'Imagem removida.'); } }