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) { $title = 'جزئیات مدیر'; $loggedInAdmin = auth('admin')->user(); $canEditSensitiveFields = $loggedInAdmin->isSuperAdmin() && $loggedInAdmin->id !== $admin->id; $showReadonlySensitiveFields = $loggedInAdmin->id === $admin->id; $adminRoles = AdminRole::cases(); $adminStatuses = AdminStatus::cases(); $admin->load([ 'avatar.file', 'permissions', ]); return view('admin.admins.edit', compact( 'title', 'admin', 'adminRoles', 'adminStatuses', 'canEditSensitiveFields', 'showReadonlySensitiveFields' )); } public function update(AdminUpdateRequest $request,Admin $admin) { $data = $request->validated(); $newAvatarPath = null; $oldFile = null; DB::beginTransaction(); try { $updateData = [ 'first_name' => $data['first_name'], 'last_name' => $data['last_name'], 'username' => $data['username'], 'email' => $data['email'] ?? null, 'mobile' => $data['mobile'] ?? null, ]; if (!empty($data['password'])) { $updateData['password'] = Hash::make($data['password']); } $loggedInAdmin = auth('admin')->user(); $canEditSensitiveFields = $loggedInAdmin->isSuperAdmin() && $loggedInAdmin->id !== $admin->id; if ($canEditSensitiveFields) { if (array_key_exists('role', $data)) { $updateData['role'] = $data['role']; } if (array_key_exists('status', $data)) { $updateData['status'] = $data['status']; } } $admin->update($updateData); if ($canEditSensitiveFields && array_key_exists('permissions', $data)) { $admin->permissions()->delete(); if (!$admin->isSuperAdmin()) { foreach ($data['permissions'] ?? [] as $permission) { $admin->permissions()->create([ 'permission' => $permission, ]); } } } if ($request->hasFile('image')) { $oldAvatar = $admin->avatar() ->with('file') ->first(); $oldFile = $oldAvatar?->file; $image = $data['image']; $imageName = $admin->id . '_' . time() . rand(11111, 99999) . '.' . $image->extension(); $newAvatarPath = $image->storeAs( 'admin_avatars', $imageName, 'public' ); $file = File::create([ 'name' => $imageName, 'size' => $image->getSize(), 'original_name' => $image->getClientOriginalName(), 'path' => $newAvatarPath, 'extension' => $image->extension(), ]); if ($oldAvatar) { $oldAvatar->update([ 'file_id' => $file->id, ]); } else { AdminAvatar::create([ 'admin_id' => $admin->id, 'file_id' => $file->id, ]); } } DB::commit(); if ($oldFile) { deleteFile($oldFile); } $redirectRoute = $loggedInAdmin->isSuperAdmin() ? 'admin.admins.index' : 'admin.profile.index'; return redirect() ->route($redirectRoute) ->with('success', 'اطلاعات مدیر با موفقیت ویرایش شد.'); } catch (\Exception $exception) { DB::rollBack(); if ($newAvatarPath && Storage::disk('public')->exists($newAvatarPath)) { Storage::disk('public')->delete($newAvatarPath); } Log::error($exception); return back() ->withInput() ->with('error', 'ویرایش مدیر با خطا مواجه شد.'); } } 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', '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', 'حذف دائمی مدیر با خطا مواجه شد.'); } } }