From f37aacbcd6221f744019525c5c4d8c11ba9eceb8 Mon Sep 17 00:00:00 2001 From: Shubham Mehrotra Date: Sun, 10 Oct 2021 03:57:37 +0530 Subject: [PATCH 1/7] resolved issue #5209 --- .../src/Http/Controllers/RoleController.php | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/Webkul/User/src/Http/Controllers/RoleController.php b/packages/Webkul/User/src/Http/Controllers/RoleController.php index 19aed719c..b7d15c334 100755 --- a/packages/Webkul/User/src/Http/Controllers/RoleController.php +++ b/packages/Webkul/User/src/Http/Controllers/RoleController.php @@ -21,9 +21,17 @@ class RoleController extends Controller */ protected $roleRepository; + /** + * AdminRepository object + * + * @var \Webkul\User\Repositories\AdminRepository + */ + protected $adminRepository; + /** * Create a new controller instance. * + * @param \Webkul\User\Repositories\AdminRepository $adminRepository * @param \Webkul\User\Repositories\RoleRepository $roleRepository * @return void */ @@ -32,6 +40,8 @@ class RoleController extends Controller $this->middleware('admin'); $this->roleRepository = $roleRepository; + + $this->adminRepository = $adminRepository; $this->_config = request('_config'); } @@ -105,9 +115,28 @@ class RoleController extends Controller 'permission_type' => 'required', ]); + $params = request()->all(); + + // check for other admins if the role has been changed from all to custom + $isChangedFromAll = $params['permission_type'] == "custom" && $this->roleRepository->find($id)->permission_type == 'all'; + + if ($isChangedFromAll) { + $adminCountWithAllAccess = $this->adminRepository->getModel() + ->leftJoin('roles', 'admins.role_id', '=', 'roles.id') + ->where(["roles.permission_type" => "all"]) + ->get() + ->count(); + + if ($adminCountWithAllAccess == 1) { + session()->flash('error', trans('admin::app.response.being-used', ['name' => 'Role', 'source' => 'Admin User'])); + + return redirect()->route($this->_config['redirect']); + } + } + Event::dispatch('user.role.update.before', $id); - $role = $this->roleRepository->update(request()->all(), $id); + $role = $this->roleRepository->update($params, $id); Event::dispatch('user.role.update.after', $role); From a8f2ff074b2fa0ff737389d294109615a8ea3bd0 Mon Sep 17 00:00:00 2001 From: Devansh Date: Tue, 26 Oct 2021 16:38:49 +0530 Subject: [PATCH 2/7] Reflection API Class Added --- .../src/Http/Controllers/RoleController.php | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/Webkul/User/src/Http/Controllers/RoleController.php b/packages/Webkul/User/src/Http/Controllers/RoleController.php index b7d15c334..1eb5ed492 100755 --- a/packages/Webkul/User/src/Http/Controllers/RoleController.php +++ b/packages/Webkul/User/src/Http/Controllers/RoleController.php @@ -3,26 +3,27 @@ namespace Webkul\User\Http\Controllers; use Illuminate\Support\Facades\Event; +use Webkul\User\Repositories\AdminRepository; use Webkul\User\Repositories\RoleRepository; class RoleController extends Controller { /** - * Contains route related configuration + * Contains route related configuration. * * @var array */ protected $_config; /** - * RoleRepository object + * Role repository instance. * * @var \Webkul\User\Repositories\RoleRepository */ protected $roleRepository; /** - * AdminRepository object + * Admin repository instance. * * @var \Webkul\User\Repositories\AdminRepository */ @@ -35,12 +36,14 @@ class RoleController extends Controller * @param \Webkul\User\Repositories\RoleRepository $roleRepository * @return void */ - public function __construct(RoleRepository $roleRepository) - { + public function __construct( + RoleRepository $roleRepository, + AdminRepository $adminRepository + ) { $this->middleware('admin'); $this->roleRepository = $roleRepository; - + $this->adminRepository = $adminRepository; $this->_config = request('_config'); @@ -117,7 +120,9 @@ class RoleController extends Controller $params = request()->all(); - // check for other admins if the role has been changed from all to custom + /** + * Check for other admins if the role has been changed from all to custom. + */ $isChangedFromAll = $params['permission_type'] == "custom" && $this->roleRepository->find($id)->permission_type == 'all'; if ($isChangedFromAll) { @@ -126,7 +131,7 @@ class RoleController extends Controller ->where(["roles.permission_type" => "all"]) ->get() ->count(); - + if ($adminCountWithAllAccess == 1) { session()->flash('error', trans('admin::app.response.being-used', ['name' => 'Role', 'source' => 'Admin User'])); @@ -157,7 +162,7 @@ class RoleController extends Controller if ($role->admins->count() >= 1) { session()->flash('error', trans('admin::app.response.being-used', ['name' => 'Role', 'source' => 'Admin User'])); - } elseif($this->roleRepository->count() == 1) { + } elseif ($this->roleRepository->count() == 1) { session()->flash('error', trans('admin::app.response.last-delete-error', ['name' => 'Role'])); } else { try { @@ -170,11 +175,11 @@ class RoleController extends Controller session()->flash('success', trans('admin::app.response.delete-success', ['name' => 'Role'])); return response()->json(['message' => true], 200); - } catch(\Exception $e) { + } catch (\Exception $e) { session()->flash('error', trans('admin::app.response.delete-failed', ['name' => 'Role'])); } } return response()->json(['message' => false], 400); } -} \ No newline at end of file +} From 5a1090b6488894c7716402721281618757a9d8ca Mon Sep 17 00:00:00 2001 From: Devansh Date: Tue, 26 Oct 2021 16:40:52 +0530 Subject: [PATCH 3/7] Space Added --- packages/Webkul/User/src/Http/Controllers/RoleController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/Webkul/User/src/Http/Controllers/RoleController.php b/packages/Webkul/User/src/Http/Controllers/RoleController.php index 1eb5ed492..7e35b6d7f 100755 --- a/packages/Webkul/User/src/Http/Controllers/RoleController.php +++ b/packages/Webkul/User/src/Http/Controllers/RoleController.php @@ -162,7 +162,7 @@ class RoleController extends Controller if ($role->admins->count() >= 1) { session()->flash('error', trans('admin::app.response.being-used', ['name' => 'Role', 'source' => 'Admin User'])); - } elseif ($this->roleRepository->count() == 1) { + } else if ($this->roleRepository->count() == 1) { session()->flash('error', trans('admin::app.response.last-delete-error', ['name' => 'Role'])); } else { try { From a5470217dfde5405cd4e310a0957660f1d257ad8 Mon Sep 17 00:00:00 2001 From: Devansh Date: Tue, 26 Oct 2021 18:19:00 +0530 Subject: [PATCH 4/7] Changes done --- .../Admin/src/Resources/lang/en/app.php | 1 + .../src/Http/Controllers/RoleController.php | 14 ++---- .../src/Http/Controllers/UserController.php | 47 +++++++++++++------ .../User/src/Repositories/AdminRepository.php | 22 +++++++-- 4 files changed, 54 insertions(+), 30 deletions(-) diff --git a/packages/Webkul/Admin/src/Resources/lang/en/app.php b/packages/Webkul/Admin/src/Resources/lang/en/app.php index 013fe690b..4a3fbbe9d 100755 --- a/packages/Webkul/Admin/src/Resources/lang/en/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/en/app.php @@ -1353,6 +1353,7 @@ return [ 'response' => [ 'being-used' => 'This resource :name is getting used in :source', + 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', 'product-copied' => 'The Product has been copied', 'error-while-copying' => 'Something went wrong while trying to copy the product', 'product-can-not-be-copied' => 'Products of type :type can not be copied', diff --git a/packages/Webkul/User/src/Http/Controllers/RoleController.php b/packages/Webkul/User/src/Http/Controllers/RoleController.php index 7e35b6d7f..d8ef1c6ab 100755 --- a/packages/Webkul/User/src/Http/Controllers/RoleController.php +++ b/packages/Webkul/User/src/Http/Controllers/RoleController.php @@ -125,18 +125,10 @@ class RoleController extends Controller */ $isChangedFromAll = $params['permission_type'] == "custom" && $this->roleRepository->find($id)->permission_type == 'all'; - if ($isChangedFromAll) { - $adminCountWithAllAccess = $this->adminRepository->getModel() - ->leftJoin('roles', 'admins.role_id', '=', 'roles.id') - ->where(["roles.permission_type" => "all"]) - ->get() - ->count(); + if ($isChangedFromAll && $this->adminRepository->countAdminsWithAllAccess() === 1) { + session()->flash('error', trans('admin::app.response.being-used', ['name' => 'Role', 'source' => 'Admin User'])); - if ($adminCountWithAllAccess == 1) { - session()->flash('error', trans('admin::app.response.being-used', ['name' => 'Role', 'source' => 'Admin User'])); - - return redirect()->route($this->_config['redirect']); - } + return redirect()->route($this->_config['redirect']); } Event::dispatch('user.role.update.before', $id); diff --git a/packages/Webkul/User/src/Http/Controllers/UserController.php b/packages/Webkul/User/src/Http/Controllers/UserController.php index 06d58e228..e74204319 100755 --- a/packages/Webkul/User/src/Http/Controllers/UserController.php +++ b/packages/Webkul/User/src/Http/Controllers/UserController.php @@ -3,30 +3,30 @@ namespace Webkul\User\Http\Controllers; use Hash; -use Illuminate\Support\Str; use Illuminate\Support\Facades\Event; +use Illuminate\Support\Str; use Webkul\User\Http\Requests\UserForm; -use Webkul\User\Repositories\RoleRepository; use Webkul\User\Repositories\AdminRepository; +use Webkul\User\Repositories\RoleRepository; class UserController extends Controller { /** - * Contains route related configuration + * Contains route related configuration. * * @var array */ protected $_config; /** - * AdminRepository object + * Admin repository instance. * * @var \Webkul\User\Repositories\AdminRepository */ protected $adminRepository; /** - * RoleRepository object + * Role repository instance. * * @var \Webkul\User\Repositories\RoleRepository */ @@ -42,8 +42,7 @@ class UserController extends Controller public function __construct( AdminRepository $adminRepository, RoleRepository $roleRepository - ) - { + ) { $this->adminRepository = $adminRepository; $this->roleRepository = $roleRepository; @@ -125,21 +124,39 @@ class UserController extends Controller */ public function update(UserForm $request, $id) { - $isPasswordChanged = false; - $data = $request->all(); + $user = $this->adminRepository->find($id); + + /** + * Is password changed. + */ + $isPasswordChanged = false; + if (! $data['password']) { unset($data['password']); } else { $isPasswordChanged = true; + $data['password'] = bcrypt($data['password']); } - if (isset($data['status'])) { - $data['status'] = 1; - } else { - $data['status'] = 0; + /** + * Status update. + */ + $data['status'] = isset($data['status']) ? 1 : 0; + + /** + * Is user with `permission_type` all role changed. + */ + $isRoleChanged = $user->role->permission_type === 'all' + && isset($data['role_id']) + && (int) $data['role_id'] !== $user->role_id; + + if ($isRoleChanged && $this->adminRepository->countAdminsWithAllAccess() === 1) { + session()->flash('error', trans('admin::app.response.single-admin-present')); + + return redirect()->route($this->_config['redirect']); } Event::dispatch('user.admin.update.before', $id); @@ -186,7 +203,7 @@ class UserController extends Controller Event::dispatch('user.admin.delete.after', $id); return response()->json(['message' => true], 200); - } catch (Exception $e) { + } catch (\Exception $e) { session()->flash('error', trans('admin::app.response.delete-failed', ['name' => 'Admin'])); } } @@ -208,7 +225,7 @@ class UserController extends Controller } /** - * destroy current after confirming + * Destroy current after confirming. * * @return \Illuminate\Http\Response */ diff --git a/packages/Webkul/User/src/Repositories/AdminRepository.php b/packages/Webkul/User/src/Repositories/AdminRepository.php index c8cfcf24b..061130d1d 100755 --- a/packages/Webkul/User/src/Repositories/AdminRepository.php +++ b/packages/Webkul/User/src/Repositories/AdminRepository.php @@ -7,12 +7,26 @@ use Webkul\Core\Eloquent\Repository; class AdminRepository extends Repository { /** - * Specify Model class name + * Specify model class name. * * @return mixed */ - function model() + function model(): string { - return 'Webkul\User\Contracts\Admin'; + return \Webkul\User\Contracts\Admin::class; } -} \ No newline at end of file + + /** + * Count admins with all access. + * + * @return int + */ + public function countAdminsWithAllAccess(): int + { + return $this->getModel() + ->leftJoin('roles', 'admins.role_id', '=', 'roles.id') + ->where(["roles.permission_type" => "all"]) + ->get() + ->count(); + } +} From c67f75986a513f1eba8d87ae54b340a42c57501a Mon Sep 17 00:00:00 2001 From: Devansh Date: Tue, 26 Oct 2021 18:50:15 +0530 Subject: [PATCH 5/7] Translation Added --- packages/Webkul/Admin/src/Resources/lang/ar/app.php | 1 + packages/Webkul/Admin/src/Resources/lang/de/app.php | 1 + packages/Webkul/Admin/src/Resources/lang/es/app.php | 5 +++-- packages/Webkul/Admin/src/Resources/lang/fa/app.php | 1 + packages/Webkul/Admin/src/Resources/lang/fr/app.php | 1 + packages/Webkul/Admin/src/Resources/lang/it/app.php | 1 + packages/Webkul/Admin/src/Resources/lang/nl/app.php | 1 + packages/Webkul/Admin/src/Resources/lang/pl/app.php | 1 + packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php | 1 + packages/Webkul/Admin/src/Resources/lang/tr/app.php | 1 + 10 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/Webkul/Admin/src/Resources/lang/ar/app.php b/packages/Webkul/Admin/src/Resources/lang/ar/app.php index e08292b67..9e25c1489 100644 --- a/packages/Webkul/Admin/src/Resources/lang/ar/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/ar/app.php @@ -1337,6 +1337,7 @@ return [ 'response' => [ 'being-used' => ':source في :name يتم استخدام هذا المورد', + 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', 'product-copied' => 'تم نسخ المنتج', 'error-while-copying' => 'خطأ في نسخ المنتج', 'product-can-not-be-copied' => 'لا يمكن نسخ منتجات الحجز', diff --git a/packages/Webkul/Admin/src/Resources/lang/de/app.php b/packages/Webkul/Admin/src/Resources/lang/de/app.php index 06ab2ea20..6b772c2e4 100755 --- a/packages/Webkul/Admin/src/Resources/lang/de/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/de/app.php @@ -1344,6 +1344,7 @@ return [ 'response' => [ 'being-used' => 'Diese Ressource :name wird verwendet in :source', + 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', 'product-copied' => 'Das Produkt wurde kopiert', 'error-while-copying' => 'Fehler beim Kopieren des Produkts', 'product-can-not-be-copied' => 'Produkte vom Typ :type können nicht kopiert werden.', diff --git a/packages/Webkul/Admin/src/Resources/lang/es/app.php b/packages/Webkul/Admin/src/Resources/lang/es/app.php index b6cda5d91..43e7f0095 100644 --- a/packages/Webkul/Admin/src/Resources/lang/es/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/es/app.php @@ -1346,8 +1346,9 @@ return [ 'response' => [ 'being-used' => 'Este recurso: :name está siendo usado en :source', - 'product-copied' => 'El Producto ha sido copiado', - 'error-while-copying' => 'Se produjo un error al intentar copiar el producto', + 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', + 'product-copied' => 'El Producto ha sido copiado', + 'error-while-copying' => 'Se produjo un error al intentar copiar el producto', 'product-can-not-be-copied' => 'Productos del tipo :type no se pueden copiar', 'cannot-delete-default' => 'No puede borrar el canal predeterminado', 'create-success' => ':name :name creado con éxito.', diff --git a/packages/Webkul/Admin/src/Resources/lang/fa/app.php b/packages/Webkul/Admin/src/Resources/lang/fa/app.php index 9e6580c90..9fc2e4776 100644 --- a/packages/Webkul/Admin/src/Resources/lang/fa/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/fa/app.php @@ -1337,6 +1337,7 @@ return [ 'response' => [ 'being-used' => ' مورد استفاده قرار می گیرد :source در :name این منبع', + 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', 'cannot-delete-default' => 'کانال پیش فرض حذف نمی شود', 'create-success' => ' با موفقیت ایجاد شد :name', 'update-success' => ' با موفقیت به روز شد :name', diff --git a/packages/Webkul/Admin/src/Resources/lang/fr/app.php b/packages/Webkul/Admin/src/Resources/lang/fr/app.php index 4b9407ba2..09d56b0e7 100644 --- a/packages/Webkul/Admin/src/Resources/lang/fr/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/fr/app.php @@ -1360,6 +1360,7 @@ return [ 'response' => [ 'being-used' => 'Cette ressource :name est utilisée dans :source', + 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', 'product-copied' => 'Le produit a été copié', 'error-while-copying' => 'Une erreur s\'est produite lors de la tentative de copie du produit', 'product-can-not-be-copied' => 'Les produits de type :type ne peuvent pas être copiés', diff --git a/packages/Webkul/Admin/src/Resources/lang/it/app.php b/packages/Webkul/Admin/src/Resources/lang/it/app.php index 8e8d659c2..0343d217c 100644 --- a/packages/Webkul/Admin/src/Resources/lang/it/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/it/app.php @@ -1340,6 +1340,7 @@ return [ 'response' => [ 'being-used' => 'Questo resource :name is getting used in :source', + 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', 'cannot-delete-default' => 'Non è possibile eliminare il canale di default', 'create-success' => ':name creato con successo.', 'update-success' => ':name aggiornato con successo.', diff --git a/packages/Webkul/Admin/src/Resources/lang/nl/app.php b/packages/Webkul/Admin/src/Resources/lang/nl/app.php index 258d1de9e..d25072c36 100644 --- a/packages/Webkul/Admin/src/Resources/lang/nl/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/nl/app.php @@ -1334,6 +1334,7 @@ return [ 'response' => [ 'being-used' => 'Deze bron :name is wennen :source', + 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', 'cannot-delete-default' => 'Kan het standaardkanaal niet verwijderen', 'create-success' => ':name succesvol gemaakt.', 'update-success' => ':name succesvol geupdatet.', diff --git a/packages/Webkul/Admin/src/Resources/lang/pl/app.php b/packages/Webkul/Admin/src/Resources/lang/pl/app.php index 71032b89a..4112d8c66 100644 --- a/packages/Webkul/Admin/src/Resources/lang/pl/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/pl/app.php @@ -1337,6 +1337,7 @@ return [ 'response' => [ 'being-used' => 'Ten zasób :name est używana w :source', + 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', 'cannot-delete-default' => 'Nie można usunąć domyślnego kanału', 'create-success' => ':name została utworzona pomyślnie.', 'update-success' => ':name została zaktualizowana pomyślnie.', diff --git a/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php b/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php index 0932713d4..718f20f19 100755 --- a/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php @@ -1336,6 +1336,7 @@ return [ 'response' => [ 'being-used' => 'Este recurso :name está sendo usado em :source', + 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', 'cannot-delete-default' => 'Não é possível excluir o canal padrão', 'create-success' => ':name criado com sucesso.', 'update-success' => ':name atualizaco com sucesso.', diff --git a/packages/Webkul/Admin/src/Resources/lang/tr/app.php b/packages/Webkul/Admin/src/Resources/lang/tr/app.php index 261faa3db..5e0569e00 100644 --- a/packages/Webkul/Admin/src/Resources/lang/tr/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/tr/app.php @@ -1324,6 +1324,7 @@ return [ 'response' => [ 'being-used' => ':name isimli kaynak :source isimli kaynakta kullanılıyor.', + 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', 'cannot-delete-default' => 'Varsayılan kanal silinemez.', 'create-success' => ':name başarıyla oluşturuldu.', 'update-success' => ':name başarıyla güncellendi.', From 6c3f106708f2c96a13d396d0791a17a9ff9df026 Mon Sep 17 00:00:00 2001 From: Devansh Date: Wed, 27 Oct 2021 10:57:47 +0530 Subject: [PATCH 6/7] Status Check Added --- .../Admin/src/Resources/lang/ar/app.php | 2 +- .../Admin/src/Resources/lang/de/app.php | 2 +- .../Admin/src/Resources/lang/en/app.php | 2 +- .../Admin/src/Resources/lang/es/app.php | 2 +- .../Admin/src/Resources/lang/fa/app.php | 2 +- .../Admin/src/Resources/lang/fr/app.php | 2 +- .../Admin/src/Resources/lang/it/app.php | 2 +- .../Admin/src/Resources/lang/nl/app.php | 2 +- .../Admin/src/Resources/lang/pl/app.php | 2 +- .../Admin/src/Resources/lang/pt_BR/app.php | 2 +- .../Admin/src/Resources/lang/tr/app.php | 2 +- .../src/Http/Controllers/UserController.php | 101 ++++++++++++------ .../User/src/Http/Requests/UserForm.php | 8 +- .../User/src/Repositories/AdminRepository.php | 17 ++- 14 files changed, 97 insertions(+), 51 deletions(-) diff --git a/packages/Webkul/Admin/src/Resources/lang/ar/app.php b/packages/Webkul/Admin/src/Resources/lang/ar/app.php index 9e25c1489..580d7e3b8 100644 --- a/packages/Webkul/Admin/src/Resources/lang/ar/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/ar/app.php @@ -1337,10 +1337,10 @@ return [ 'response' => [ 'being-used' => ':source في :name يتم استخدام هذا المورد', - 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', 'product-copied' => 'تم نسخ المنتج', 'error-while-copying' => 'خطأ في نسخ المنتج', 'product-can-not-be-copied' => 'لا يمكن نسخ منتجات الحجز', + 'cannot-change' => 'Cannot change the :name.', 'cannot-delete-default' => 'لا يمكن حذف القناة الافتراضية', 'create-success' => 'إنشاء الاسم بنجاح:name', 'update-success' => 'تحديث الاسم بنجاح :name ', diff --git a/packages/Webkul/Admin/src/Resources/lang/de/app.php b/packages/Webkul/Admin/src/Resources/lang/de/app.php index 6b772c2e4..b4f73a226 100755 --- a/packages/Webkul/Admin/src/Resources/lang/de/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/de/app.php @@ -1344,10 +1344,10 @@ return [ 'response' => [ 'being-used' => 'Diese Ressource :name wird verwendet in :source', - 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', 'product-copied' => 'Das Produkt wurde kopiert', 'error-while-copying' => 'Fehler beim Kopieren des Produkts', 'product-can-not-be-copied' => 'Produkte vom Typ :type können nicht kopiert werden.', + 'cannot-change' => 'Cannot change the :name.', 'cannot-delete-default' => 'Der Standardkanal kann nicht gelöscht werden', 'create-success' => ':name erfolgreich erstellt.', 'update-success' => ':name erfolgreich aktualisiert.', diff --git a/packages/Webkul/Admin/src/Resources/lang/en/app.php b/packages/Webkul/Admin/src/Resources/lang/en/app.php index 4a3fbbe9d..a5bd6fc93 100755 --- a/packages/Webkul/Admin/src/Resources/lang/en/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/en/app.php @@ -1353,10 +1353,10 @@ return [ 'response' => [ 'being-used' => 'This resource :name is getting used in :source', - 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', 'product-copied' => 'The Product has been copied', 'error-while-copying' => 'Something went wrong while trying to copy the product', 'product-can-not-be-copied' => 'Products of type :type can not be copied', + 'cannot-change' => 'Cannot change the :name.', 'cannot-delete-default' => 'Cannot delete the default channel', 'create-success' => ':name created successfully.', 'update-success' => ':name updated successfully.', diff --git a/packages/Webkul/Admin/src/Resources/lang/es/app.php b/packages/Webkul/Admin/src/Resources/lang/es/app.php index 43e7f0095..2181e00f0 100644 --- a/packages/Webkul/Admin/src/Resources/lang/es/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/es/app.php @@ -1346,10 +1346,10 @@ return [ 'response' => [ 'being-used' => 'Este recurso: :name está siendo usado en :source', - 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', 'product-copied' => 'El Producto ha sido copiado', 'error-while-copying' => 'Se produjo un error al intentar copiar el producto', 'product-can-not-be-copied' => 'Productos del tipo :type no se pueden copiar', + 'cannot-change' => 'Cannot change the :name.', 'cannot-delete-default' => 'No puede borrar el canal predeterminado', 'create-success' => ':name :name creado con éxito.', 'update-success' => ':name actualizado con éxito.', diff --git a/packages/Webkul/Admin/src/Resources/lang/fa/app.php b/packages/Webkul/Admin/src/Resources/lang/fa/app.php index 9fc2e4776..6b6f79ac4 100644 --- a/packages/Webkul/Admin/src/Resources/lang/fa/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/fa/app.php @@ -1337,7 +1337,7 @@ return [ 'response' => [ 'being-used' => ' مورد استفاده قرار می گیرد :source در :name این منبع', - 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', + 'cannot-change' => 'Cannot change the :name.', 'cannot-delete-default' => 'کانال پیش فرض حذف نمی شود', 'create-success' => ' با موفقیت ایجاد شد :name', 'update-success' => ' با موفقیت به روز شد :name', diff --git a/packages/Webkul/Admin/src/Resources/lang/fr/app.php b/packages/Webkul/Admin/src/Resources/lang/fr/app.php index 09d56b0e7..031d957e4 100644 --- a/packages/Webkul/Admin/src/Resources/lang/fr/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/fr/app.php @@ -1360,10 +1360,10 @@ return [ 'response' => [ 'being-used' => 'Cette ressource :name est utilisée dans :source', - 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', 'product-copied' => 'Le produit a été copié', 'error-while-copying' => 'Une erreur s\'est produite lors de la tentative de copie du produit', 'product-can-not-be-copied' => 'Les produits de type :type ne peuvent pas être copiés', + 'cannot-change' => 'Cannot change the :name.', 'cannot-delete-default' => 'Impossible de supprimer la chaîne par défaut', 'create-success' => ':name créé avec succès.', 'update-success' => ':name mis à jour avec succès.', diff --git a/packages/Webkul/Admin/src/Resources/lang/it/app.php b/packages/Webkul/Admin/src/Resources/lang/it/app.php index 0343d217c..a1e6c1353 100644 --- a/packages/Webkul/Admin/src/Resources/lang/it/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/it/app.php @@ -1340,7 +1340,7 @@ return [ 'response' => [ 'being-used' => 'Questo resource :name is getting used in :source', - 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', + 'cannot-change' => 'Cannot change the :name.', 'cannot-delete-default' => 'Non è possibile eliminare il canale di default', 'create-success' => ':name creato con successo.', 'update-success' => ':name aggiornato con successo.', diff --git a/packages/Webkul/Admin/src/Resources/lang/nl/app.php b/packages/Webkul/Admin/src/Resources/lang/nl/app.php index d25072c36..5d3ef5ff4 100644 --- a/packages/Webkul/Admin/src/Resources/lang/nl/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/nl/app.php @@ -1334,7 +1334,7 @@ return [ 'response' => [ 'being-used' => 'Deze bron :name is wennen :source', - 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', + 'cannot-change' => 'Cannot change the :name.', 'cannot-delete-default' => 'Kan het standaardkanaal niet verwijderen', 'create-success' => ':name succesvol gemaakt.', 'update-success' => ':name succesvol geupdatet.', diff --git a/packages/Webkul/Admin/src/Resources/lang/pl/app.php b/packages/Webkul/Admin/src/Resources/lang/pl/app.php index 4112d8c66..1bb09a780 100644 --- a/packages/Webkul/Admin/src/Resources/lang/pl/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/pl/app.php @@ -1337,7 +1337,7 @@ return [ 'response' => [ 'being-used' => 'Ten zasób :name est używana w :source', - 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', + 'cannot-change' => 'Cannot change the :name.', 'cannot-delete-default' => 'Nie można usunąć domyślnego kanału', 'create-success' => ':name została utworzona pomyślnie.', 'update-success' => ':name została zaktualizowana pomyślnie.', diff --git a/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php b/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php index 718f20f19..6aa9f5397 100755 --- a/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php @@ -1336,7 +1336,7 @@ return [ 'response' => [ 'being-used' => 'Este recurso :name está sendo usado em :source', - 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', + 'cannot-change' => 'Cannot change the :name.', 'cannot-delete-default' => 'Não é possível excluir o canal padrão', 'create-success' => ':name criado com sucesso.', 'update-success' => ':name atualizaco com sucesso.', diff --git a/packages/Webkul/Admin/src/Resources/lang/tr/app.php b/packages/Webkul/Admin/src/Resources/lang/tr/app.php index 5e0569e00..305526fd1 100644 --- a/packages/Webkul/Admin/src/Resources/lang/tr/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/tr/app.php @@ -1324,7 +1324,7 @@ return [ 'response' => [ 'being-used' => ':name isimli kaynak :source isimli kaynakta kullanılıyor.', - 'single-admin-present' => 'Cannot change the role if only one admin with all access is present.', + 'cannot-change' => 'Cannot change the :name.', 'cannot-delete-default' => 'Varsayılan kanal silinemez.', 'create-success' => ':name başarıyla oluşturuldu.', 'update-success' => ':name başarıyla güncellendi.', diff --git a/packages/Webkul/User/src/Http/Controllers/UserController.php b/packages/Webkul/User/src/Http/Controllers/UserController.php index e74204319..901da33f6 100755 --- a/packages/Webkul/User/src/Http/Controllers/UserController.php +++ b/packages/Webkul/User/src/Http/Controllers/UserController.php @@ -124,46 +124,17 @@ class UserController extends Controller */ public function update(UserForm $request, $id) { - $data = $request->all(); + $data = $this->prepareUserData($request, $id); - $user = $this->adminRepository->find($id); - - /** - * Is password changed. - */ - $isPasswordChanged = false; - - if (! $data['password']) { - unset($data['password']); - } else { - $isPasswordChanged = true; - - $data['password'] = bcrypt($data['password']); - } - - /** - * Status update. - */ - $data['status'] = isset($data['status']) ? 1 : 0; - - /** - * Is user with `permission_type` all role changed. - */ - $isRoleChanged = $user->role->permission_type === 'all' - && isset($data['role_id']) - && (int) $data['role_id'] !== $user->role_id; - - if ($isRoleChanged && $this->adminRepository->countAdminsWithAllAccess() === 1) { - session()->flash('error', trans('admin::app.response.single-admin-present')); - - return redirect()->route($this->_config['redirect']); + if ($data instanceof \Illuminate\Http\RedirectResponse) { + return $data; } Event::dispatch('user.admin.update.before', $id); $admin = $this->adminRepository->update($data, $id); - if ($isPasswordChanged) { + if (isset($data['password']) && $data['password']) { Event::dispatch('user.admin.update-password', $admin); } @@ -182,7 +153,7 @@ class UserController extends Controller */ public function destroy($id) { - $user = $this->adminRepository->findOrFail($id); + $this->adminRepository->findOrFail($id); if ($this->adminRepository->count() == 1) { session()->flash('error', trans('admin::app.response.last-delete-error', ['name' => 'Admin'])); @@ -255,4 +226,66 @@ class UserController extends Controller return redirect()->route($this->_config['redirect']); } } + + /** + * Validate user data. + * + * @param \Webkul\User\Http\Requests\UserForm $request + * @param int $id + * @return array|\Illuminate\Http\RedirectResponse + */ + private function prepareUserData(UserForm $request, $id) + { + $data = $request->validated(); + + $user = $this->adminRepository->find($id); + + /** + * Password check. + */ + if (! $data['password']) { + unset($data['password']); + } else { + $data['password'] = bcrypt($data['password']); + } + + /** + * Is user with `permission_type` all changed status. + */ + $data['status'] = isset($data['status']) ? 1 : 0; + + $isStatusChangedToInactive = (int) $data['status'] === 0 && (int) $user->status === 1; + + if ($isStatusChangedToInactive && $this->adminRepository->countAdminsWithAllAccessAndActiveStatus() === 1) { + return $this->cannotChangeRedirectResponse('status'); + } + + /** + * Is user with `permission_type` all role changed. + */ + $isRoleChanged = $user->role->permission_type === 'all' + && isset($data['role_id']) + && (int) $data['role_id'] !== $user->role_id; + + if ($isRoleChanged && $this->adminRepository->countAdminsWithAllAccess() === 1) { + return $this->cannotChangeRedirectResponse('role'); + } + + return $data; + } + + /** + * Cannot change redirect response. + * + * @param string $columnName + * @return \Illuminate\Http\RedirectResponse + */ + private function cannotChangeRedirectResponse(string $columnName): \Illuminate\Http\RedirectResponse + { + session()->flash('error', trans('admin::app.response.cannot-change', [ + 'name' => $columnName + ])); + + return redirect()->route($this->_config['redirect']); + } } diff --git a/packages/Webkul/User/src/Http/Requests/UserForm.php b/packages/Webkul/User/src/Http/Requests/UserForm.php index dd200020b..2aa5bcb14 100755 --- a/packages/Webkul/User/src/Http/Requests/UserForm.php +++ b/packages/Webkul/User/src/Http/Requests/UserForm.php @@ -6,8 +6,6 @@ use Illuminate\Foundation\Http\FormRequest; class UserForm extends FormRequest { - protected $rules; - /** * Determine if the user is authorized to make this request. * @@ -25,7 +23,7 @@ class UserForm extends FormRequest */ public function rules() { - $this->rules = [ + $rules = [ 'name' => 'required', 'email' => 'email|unique:admins,email', 'password' => 'nullable', @@ -35,9 +33,9 @@ class UserForm extends FormRequest ]; if ($this->method() == 'PUT') { - $this->rules['email'] = 'email|unique:admins,email,' . $this->route('id'); + $rules['email'] = 'email|unique:admins,email,' . $this->route('id'); } - return $this->rules; + return $rules; } } diff --git a/packages/Webkul/User/src/Repositories/AdminRepository.php b/packages/Webkul/User/src/Repositories/AdminRepository.php index 061130d1d..db0cb3008 100755 --- a/packages/Webkul/User/src/Repositories/AdminRepository.php +++ b/packages/Webkul/User/src/Repositories/AdminRepository.php @@ -25,7 +25,22 @@ class AdminRepository extends Repository { return $this->getModel() ->leftJoin('roles', 'admins.role_id', '=', 'roles.id') - ->where(["roles.permission_type" => "all"]) + ->where('roles.permission_type', 'all') + ->get() + ->count(); + } + + /** + * Count admins with all access and active status. + * + * @return int + */ + public function countAdminsWithAllAccessAndActiveStatus(): int + { + return $this->getModel() + ->leftJoin('roles', 'admins.role_id', '=', 'roles.id') + ->where('admins.status', 1) + ->where('roles.permission_type', 'all') ->get() ->count(); } From ffa71124056d430cafc5af4ff3fe1d81cda6144b Mon Sep 17 00:00:00 2001 From: Devansh Date: Wed, 27 Oct 2021 11:00:36 +0530 Subject: [PATCH 7/7] Comments Updated --- packages/Webkul/User/src/Http/Controllers/UserController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/Webkul/User/src/Http/Controllers/UserController.php b/packages/Webkul/User/src/Http/Controllers/UserController.php index 901da33f6..0d1901451 100755 --- a/packages/Webkul/User/src/Http/Controllers/UserController.php +++ b/packages/Webkul/User/src/Http/Controllers/UserController.php @@ -228,7 +228,7 @@ class UserController extends Controller } /** - * Validate user data. + * Prepare user data. * * @param \Webkul\User\Http\Requests\UserForm $request * @param int $id