when($request->filled('search'), function (Builder $query) use ($request) { $search = $request->input('search'); $query->whereAny([ 'first_name', 'last_name', 'username', 'email' ], 'LIKE', "%$search%"); }) ->when($request->filled('sort'), function (Builder $query) use ($request) { $sort = $request->input('sort'); switch ($sort) { case 'name_desc': { $query ->orderByDesc('first_name'); break; } case 'email': { $query ->orderBy('email'); break; } case 'newest': { $query ->orderByDesc('created_at'); break; } case 'name_asc': default: { $query ->orderBy('first_name'); } } }, function (Builder $query) { $query->orderBy('first_name'); }) ->paginate() ->withQueryString(); return view('admin.admins.index', compact('title', 'admins')); } public function edit(Admin $admin) { return view('admin.admins.edit', compact('admin')); } public function create() { $title = 'ایجاد کاربر جدید'; return view('admin.admins.create'); } public function store(AdminStoreRequest $request) { $data = $request->validated(); $avatarPath = null; DB::beginTransaction(); try { $admin = Admin::create([ 'first_name' => $data['first_name'], 'last_name' => $data['last_name'], 'username' => $data['username'], 'email' => $data['email'] ?? null, 'mobile' => $data['mobile'] ?? null, 'password' => Hash::make($data['password']), 'role' => $data['role'], 'status' => $data['status'], ]); if ($request->hasFile('image')) { $image = $request->file('image'); $imageName = $admin->id . '_' . time() . '_' . rand(11111, 99999) . '.' . $image->extension(); $avatarPath = $image->storeAs( 'admin_avatars', $imageName, 'public' ); $file = File::create([ 'name' => $imageName, 'size' => $image->getSize(), 'original_name' => $image->getClientOriginalName(), 'path' => $avatarPath, 'extension' => $image->extension(), ]); AdminAvatar::create([ 'admin_id' => $admin->id, 'file_id' => $file->id, ]); } foreach ($data['permissions'] ?? [] as $permission) { AdminPermission::create([ 'admin_id' => $admin->id, 'permission' => $permission, ]); } DB::commit(); return redirect() ->route('admin.admins.index') ->with('success', 'مدیر جدید با موفقیت ایجاد شد.'); } catch (\Throwable $exception) { DB::rollBack(); if ($avatarPath) { Storage::disk('public')->delete($avatarPath); } Log::error('خطا در ایجاد مدیر جدید', [ 'message' => $exception->getMessage(), 'file' => $exception->getFile(), 'line' => $exception->getLine(), ]); return back() ->withInput( $request->except([ 'password', 'password_confirmation', 'image', ]) ) ->with('error', 'خطایی هنگام ایجاد مدیر رخ داد.'); } } public function destroy(Admin $admin) { if ($admin->id === auth('admin')->id()) { return back()->with('error', 'امکان حذف حساب کاربری خودتان وجود ندارد.'); } try { $admin->delete(); return redirect() ->route('admin.admins.index') ->with('success', 'مدیر با موفقیت به سطل زباله منتقل شد.'); } catch (\Exception $exception) { Log::error('خطا در حذف مدیر', [ 'admin_id' => $admin->id, 'message' => $exception->getMessage(), ]); return back()->with('error', 'خطایی هنگام حذف مدیر رخ داد.'); } } public function trash() { $title = 'مدیران حذف شده'; $admins = Admin::onlyTrashed() ->paginate(); return view('admin.admins.trash' , compact('title' , 'admins')); } public function restore($id) { $admin = Admin::onlyTrashed()->findOrFail($id); $admin->restore(); return redirect() ->route('admin.admins.trash.index') ->with('success', 'مدیر با موفقیت بازیابی شد.'); } public function forceDelete($id) { $admin = Admin::onlyTrashed()->findOrFail($id); $avatar = $admin->avatar()->with('file')->first(); $file = $avatar?->file; DB::beginTransaction(); try { $avatar?->delete(); deleteFile($file); $admin->forceDelete(); DB::commit(); return redirect() ->route('admin.admins.trash.index') ->with('success', 'مدیر و آواتار او برای همیشه حذف شدند.'); } catch (\Exception $exception) { DB::rollBack(); Log::error('خطا در حذف دائمی مدیر', [ 'admin_id' => $admin->id, 'message' => $exception->getMessage(), ]); return back()->with('error', 'حذف دائمی مدیر با خطا مواجه شد.'); } } }