namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Models\User; use App\Models\Notification; use App\Jobs\SendBulkNotification; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; class BroadcastController extends Controller { public function index() { $recentBroadcasts = Notification::where('type', 'broadcast') ->latest() ->limit(10) ->get(); $stats = [ 'total_users' => User::count(), 'active_users' => User::where('status', 'active')->count(), 'verified_users' => User::whereNotNull('email_verified_at')->count(), ]; return view('admin.broadcast.index', compact('recentBroadcasts', 'stats')); } public function send(Request $request) { $validator = Validator::make($request->all(), [ 'title' => 'required|string|max:255', 'message' => 'required|string', 'type' => 'required|in:info,success,warning,danger', 'target' => 'required|in:all,active,verified,custom', 'user_ids' => 'required_if:target,custom|array', 'user_ids.*' => 'exists:users,id', 'send_email' => 'boolean', 'send_push' => 'boolean', 'schedule' => 'nullable|date|after:now', ]); if ($validator->fails()) { return back()->withErrors($validator)->withInput(); } // Determine target users $userQuery = User::query(); switch ($request->target) { case 'active': $userQuery->where('status', 'active'); break; case 'verified': $userQuery->whereNotNull('email_verified_at'); break; case 'custom': $userQuery->whereIn('id', $request->user_ids); break; } $userCount = $userQuery->count(); if ($userCount === 0) { return back()->with('error', 'No users match the selected target.')->withInput(); } // Create broadcast record $broadcast = Notification::create([ 'type' => 'broadcast', 'title' => $request->title, 'message' => $request->message, 'data' => [ 'target' => $request->target, 'type' => $request->type, 'send_email' => $request->boolean('send_email'), 'send_push' => $request->boolean('send_push'), 'user_count' => $userCount, 'scheduled_for' => $request->schedule, ], 'created_by' => auth()->guard('admin')->id(), ]); // Dispatch job if ($request->schedule) { SendBulkNotification::dispatch($broadcast, $userQuery->pluck('id')->toArray()) ->delay($request->schedule); $message = "Broadcast scheduled for " . \Carbon\Carbon::parse($request->schedule)->format('M d, Y H:i'); } else { SendBulkNotification::dispatch($broadcast, $userQuery->pluck('id')->toArray()); $message = "Broadcast sent to {$userCount} users."; } // Log activity auth()->guard('admin')->user()->logActivity( 'Sent broadcast: ' . $request->title, ['target' => $request->target, 'user_count' => $userCount] ); return redirect()->route('admin.broadcast.history')->with('success', $message); } public function history(Request $request) { $broadcasts = Notification::where('type', 'broadcast') ->latest() ->paginate(20); return view('admin.broadcast.history', compact('broadcasts')); } public function preview(Request $request) { $request->validate([ 'title' => 'required|string', 'message' => 'required|string', 'type' => 'required|in:info,success,warning,danger', ]); return view('admin.broadcast.preview', [ 'title' => $request->title, 'message' => $request->message, 'type' => $request->type, ]); } }