namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Models\User; use App\Models\Order; use App\Models\Transaction; use App\Exports\UsersExport; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\DB; use Maatwebsite\Excel\Facades\Excel; class UserController extends Controller { public function index(Request $request) { $query = User::with(['wallet']); // Search if ($request->has('search')) { $search = $request->search; $query->where(function($q) use ($search) { $q->where('username', 'like', "%{$search}%") ->orWhere('email', 'like', "%{$search}%") ->orWhere('first_name', 'like', "%{$search}%") ->orWhere('last_name', 'like', "%{$search}%") ->orWhere('phone', 'like', "%{$search}%"); }); } // Filter by status if ($request->has('status') && $request->status != 'all') { $query->where('status', $request->status); $query->where('username', 'like', "%{$search}%") } // Filter by date range if ($request->has('date_from')) { $query->whereDate('created_at', '>=', $request->date_from); } if ($request->has('date_to')) { $query->whereDate('created_at', '<=', $request->date_to); } // Sort $sortField = $request->get('sort', 'created_at'); $sortDirection = $request->get('direction', 'desc'); $query->orderBy($sortField, $sortDirection); $users = $query->paginate(20); // Statistics $stats = [ 'total' => User::count(), 'active' => User::where('status', 'active')->count(), 'suspended' => User::where('status', 'suspended')->count(), 'banned' => User::where('status', 'banned')->count(), 'verified' => User::whereNotNull('email_verified_at')->count(), 'unverified' => User::whereNull('email_verified_at')->count(), ]; return view('admin.users.index', compact('users', 'stats')); } public function show(User $user) { $user->load(['wallet', 'orders' => function($q) { $q->latest()->limit(10); }, 'transactions' => function($q) { $q->latest()->limit(10); }]); $stats = [ 'total_orders' => $user->orders()->count(), 'total_spent' => $user->orders()->where('status', 'completed')->sum('price'), 'total_deposits' => $user->transactions()->where('type', 'deposit')->where('status', 'completed')->sum('amount'), 'total_withdrawals' => $user->transactions()->where('type', 'withdrawal')->where('status', 'completed')->sum('amount'), 'referral_count' => $user->referrals()->count(), 'referral_earnings' => $user->referral_earnings, ]; $recentActivity = DB::table('activity_logs') ->where('causer_type', User::class) ->where('causer_id', $user->id) ->latest() ->limit(20) ->get(); return view('admin.users.show', compact('user', 'stats', 'recentActivity')); } public function create() { return view('admin.users.create'); } public function store(Request $request) { $request->validate([ 'username' => 'required|string|min:3|max:50|unique:users', 'email' => 'required|email|max:255|unique:users', 'password' => 'required|string|min:8|confirmed', 'first_name' => 'nullable|string|max:50', 'last_name' => 'nullable|string|max:50', 'phone' => 'nullable|string|max:20', 'country' => 'nullable|string|max:50', 'status' => 'required|in:active,inactive,suspended,banned', ]); $user = User::create([ 'username' => $request->username, 'email' => $request->email, 'password' => Hash::make($request->password), 'first_name' => $request->first_name, 'last_name' => $request->last_name, 'phone' => $request->phone, 'country' => $request->country, 'status' => $request->status, 'email_verified_at' => $request->verified ? now() : null, ]); $user->generateReferralCode(); // Log activity auth()->guard('admin')->user()->logActivity( 'Created user: ' . $user->username, ['user_id' => $user->id] ); return redirect()->route('admin.users.show', $user) ->with('success', 'User created successfully.'); } public function edit(User $user) { return view('admin.users.edit', compact('user')); } public function update(Request $request, User $user) { $request->validate([ 'username' => 'required|string|min:3|max:50|unique:users,username,' . $user->id, 'email' => 'required|email|max:255|unique:users,email,' . $user->id, 'first_name' => 'nullable|string|max:50', 'last_name' => 'nullable|string|max:50', 'phone' => 'nullable|string|max:20', 'country' => 'nullable|string|max:50', 'city' => 'nullable|string|max:50', 'address' => 'nullable|string|max:500', 'status' => 'required|in:active,inactive,suspended,banned', ]); $oldData = $user->only(['username', 'email', 'status']); $user->update($request->only([ 'username', 'email', 'first_name', 'last_name', 'phone', 'country', 'city', 'address', 'status' ])); // Log activity auth()->guard('admin')->user()->logActivity( 'Updated user: ' . $user->username, [ 'user_id' => $user->id, 'old' => $oldData, 'new' => $request->only(['username', 'email', 'status']) ] ); return redirect()->route('admin.users.show', $user) ->with('success', 'User updated successfully.'); } public function updatePassword(Request $request, User $user) { $request->validate([ 'password' => 'required|string|min:8|confirmed', ]); $user->update([ 'password' => Hash::make($request->password), ]); // Log activity auth()->guard('admin')->user()->logActivity( 'Changed password for user: ' . $user->username, ['user_id' => $user->id] ); return back()->with('success', 'Password updated successfully.'); } public function ban(User $user, Request $request) { $request->validate([ 'reason' => 'required|string|max:500', ]); $oldStatus = $user->status; $user->update(['status' => 'banned']); // Log activity auth()->guard('admin')->user()->logActivity( 'Banned user: ' . $user->username, [ 'user_id' => $user->id, 'reason' => $request->reason, 'old_status' => $oldStatus ] ); // Create system notification for user $user->notifications()->create([ 'type' => 'account_banned', 'title' => 'Account Banned', 'message' => 'Your account has been banned. Reason: ' . $request->reason, ]); return back()->with('success', 'User banned successfully.'); } public function unban(User $user) { $oldStatus = $user->status; $user->update(['status' => 'active']); // Log activity auth()->guard('admin')->user()->logActivity( 'Unbanned user: ' . $user->username, [ 'user_id' => $user->id, 'old_status' => $oldStatus ] ); // Create system notification for user $user->notifications()->create([ 'type' => 'account_unbanned', 'title' => 'Account Reactivated', 'message' => 'Your account has been reactivated.', ]); return back()->with('success', 'User unbanned successfully.'); } public function suspend(User $user, Request $request) { $request->validate([ 'reason' => 'required|string|max:500', ]); $oldStatus = $user->status; $user->update(['status' => 'suspended']); // Log activity auth()->guard('admin')->user()->logActivity( 'Suspended user: ' . $user->username, [ 'user_id' => $user->id, 'reason' => $request->reason, 'old_status' => $oldStatus ] ); // Create system notification for user $user->notifications()->create([ 'type' => 'account_suspended', 'title' => 'Account Suspended', 'message' => 'Your account has been suspended. Reason: ' . $request->reason, ]); return back()->with('success', 'User suspended successfully.'); } public function verifyEmail(User $user) { $user->update(['email_verified_at' => now()]); // Log activity auth()->guard('admin')->user()->logActivity( 'Verified email for user: ' . $user->username, ['user_id' => $user->id] ); return back()->with('success', 'Email verified successfully.'); } public function impersonate(User $user) { session()->put('impersonate', $user->id); return redirect()->route('dashboard') ->with('info', 'You are now impersonating ' . $user->username); } public function stopImpersonate() { session()->forget('impersonate'); return redirect()->route('admin.dashboard') ->with('info', 'You have stopped impersonating.'); } public function export(Request $request) { $request->validate([ 'format' => 'required|in:csv,xlsx', 'date_from' => 'nullable|date', 'date_to' => 'nullable|date', 'status' => 'nullable|in:active,inactive,suspended,banned,all', ]); $filename = 'users_export_' . now()->format('Y_m_d_His'); // Log activity auth()->guard('admin')->user()->logActivity( 'Exported users', ['format' => $request->format, 'filters' => $request->except('_token')] ); if ($request->format == 'csv') { return Excel::download(new UsersExport($request), $filename . '.csv'); } return Excel::download(new UsersExport($request), $filename . '.xlsx'); } public function destroy(User $user) { if ($user->orders()->exists() || $user->transactions()->exists()) { return back()->with('error', 'Cannot delete user with existing orders or transactions.'); } $username = $user->username; $user->delete(); // Log activity auth()->guard('admin')->user()->logActivity( 'Deleted user: ' . $username, ['user_id' => $user->id] ); return redirect()->route('admin.users.index') ->with('success', 'User deleted successfully.'); } public function bulkAction(Request $request) { $request->validate([ 'action' => 'required|in:activate,suspend,ban,delete', 'user_ids' => 'required|array', 'user_ids.*' => 'exists:users,id', ]); $count = count($request->user_ids); switch ($request->action) { case 'activate': User::whereIn('id', $request->user_ids)->update(['status' => 'active']); $message = "{$count} users activated successfully."; break; case 'suspend': User::whereIn('id', $request->user_ids)->update(['status' => 'suspended']); $message = "{$count} users suspended successfully."; break; case 'ban': User::whereIn('id', $request->user_ids)->update(['status' => 'banned']); $message = "{$count} users banned successfully."; break; case 'delete': // Check if users have orders/transactions $users = User::whereIn('id', $request->user_ids)->get(); foreach ($users as $user) { if ($user->orders()->exists() || $user->transactions()->exists()) { return back()->with('error', 'Cannot delete users with existing orders or transactions.'); } } User::whereIn('id', $request->user_ids)->delete(); $message = "{$count} users deleted successfully."; break; } // Log activity auth()->guard('admin')->user()->logActivity( 'Bulk action: ' . $request->action, ['user_ids' => $request->user_ids, 'count' => $count] ); return back()->with('success', $message); } }