From 2f9fcbd42e5bdf536ad2a5f63ed8860abc0143df Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 30 Jan 2023 19:50:27 +1100 Subject: [PATCH] Ensure companies have the correct size when there are heterogeneous user permissions --- app/Repositories/UserRepository.php | 34 +++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/app/Repositories/UserRepository.php b/app/Repositories/UserRepository.php index 11e315809591..cf66bf09a9ee 100644 --- a/app/Repositories/UserRepository.php +++ b/app/Repositories/UserRepository.php @@ -93,6 +93,7 @@ class UserRepository extends BaseRepository $user->companies()->attach($company->id, $data['company_user']); } else { if (auth()->user()->isAdmin()) { + $cu->fill($data['company_user']); $cu->restore(); $cu->tokens()->restore(); @@ -117,6 +118,8 @@ class UserRepository extends BaseRepository } $user->restore(); + $this->verifyCorrectCompanySizeForPermissions($user); + return $user->fresh(); } @@ -211,4 +214,35 @@ class UserRepository extends BaseRepository event(new UserWasRestored($user, auth()->user(), auth()->user()->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); } + + + /** + * If we have multiple users in the system, + * and there are some that are not admins, + * we force all companies to large to ensure + * the queries are appropriate for all users + * + * @param User $user + * @return void + */ + private function verifyCorrectCompanySizeForPermissions(User $user): void + { + + if(Ninja::isSelfHost() || (Ninja::isHosted() && $user->account->isEnterpriseClient())) + { + + $user->account() + ->whereHas('companies', function ($query){ + $query->where('is_large',0); + }) + ->whereHas('company_users', function ($query){ + $query->where('is_admin', 0); + }) + ->cursor()->each(function ($account){ + $account->companies()->update(['is_large' => true]); + }); + + } + + } }