From: Vincent Vanwaelscappel Date: Tue, 16 Jun 2020 15:29:25 +0000 (+0200) Subject: wip #3711 @1 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=2b8b0816cd51fde45688d352e73738a95a63d0d2;p=cubedesigners_userdatabase.git wip #3711 @1 --- diff --git a/src/Permissions.php b/src/Permissions.php index 96b4392..e50c39f 100644 --- a/src/Permissions.php +++ b/src/Permissions.php @@ -4,59 +4,93 @@ namespace Cubedesigners\UserDatabase; class Permissions { - protected static $_dataOk = false; - /** - * @var array[] - */ - protected static $_companyUsers = []; - /** - * @var int[] - */ - protected static $_usersCompany = []; + protected static $_data = false; - /** - * @var array[] - */ - protected static $_managedCompanies = []; - - protected static $_companyManagedBy = []; - - protected function _getData() + public static function _getData() { - if (self::$_dataOk) { - return; + if (self::$_data !== false) { + return self::$_data; } - self::$_dataOk = true; - foreach (User::all() as $user) { - if (!isset(self::$_companyUsers[$user->company])) { - self::$_companyUsers[$user->company] = []; + $cacheKey = 'cubedesigners_userdatabase_permissions_data'; + + \Barryvdh\Debugbar\Facade::startMeasure($cacheKey, 'Build permissions tree'); + self::$_data = cache()->remember($cacheKey, 86400, function () { + + set_time_limit(0); + + $data = [ + 'companyUsers' => [], + 'usersCompany' => [], + 'companyManagedBy' => [], + 'managedCompanies' => [], + 'managedUsers' => [], + ]; + + foreach (User::all() as $user) { + if (!isset($data['companyUsers'][$user->company])) { + $data['companyUsers'][$user->company] = []; + } + + $data['companyUsers'][$user->company][] = $user->id; + $data['usersCompany'][$user->id] = $user->company; } - self::$_companyUsers[$user->company][] = $user->id; - self::$_usersCompany[$user->id] = $user->company; - } + foreach (Company::all() as $company) { + if (!$company->admin || !isset($data['usersCompany'][$company->admin])) { + continue; + } + $adminCompany = $data['usersCompany'][$company->admin]; - foreach (Company::all() as $company) { - $adminCompany = self::getCompanyByUser($company->admin); - if ($company->id !== $adminCompany) { - self::$_companyManagedBy[$company->id] = [$adminCompany]; + $data['companyManagedBy'][$company->id] = [$adminCompany, $company->id]; } - } - for ($i = 0; $i <= 3; $i++) { - foreach (self::$_companyManagedBy as $company => $admins) { + for ($i = 0; $i <= 3; $i++) { + foreach ($data['companyManagedBy'] as $company => $admins) { + foreach ($admins as $admin) { + if ($admin === $company) { + continue; + } + if (isset($data['companyManagedBy'][$admin])) { + $data['companyManagedBy'][$company] = array_unique(array_merge($data['companyManagedBy'][$admin], $data['companyManagedBy'][$company]), SORT_REGULAR); + } + } + } + } + + foreach ($data['companyManagedBy'] as $company => $admins) { foreach ($admins as $admin) { - if (isset(self::$_companyManagedBy[$admin])) { - self::$_companyManagedBy[$company] = array_unique(array_merge(self::$_companyManagedBy[$admin], self::$_companyManagedBy[$company]), SORT_REGULAR); + if (!isset($data['managedCompanies'][$admin])) { + $data['managedCompanies'][$admin] = []; } + $data['managedCompanies'][$admin][] = $company; } } - } - dd(self::$_companyManagedBy); + foreach ($data['companyUsers'] as $company => $users) { + if (!isset($data['managedCompanies'][$company])) { + continue; + } + $managedUsers = []; + foreach ($data['managedCompanies'][$company] as $managedCompany) { + if (!isset($data['companyUsers'][$managedCompany])) { + continue; + } + $managedUsers = array_merge($managedUsers, $data['companyUsers'][$managedCompany]); + } + foreach ($users as $user) { + if (!isset($data['managedUsers'][$user])) { + $data['managedUsers'][$user] = []; + } + $data['managedUsers'][$user] = array_merge($data['managedUsers'][$user], $managedUsers); + } + } + return $data; + }); + \Barryvdh\Debugbar\Facade::stopMeasure($cacheKey); + return self::$_data; } /** @@ -65,26 +99,37 @@ class Permissions */ public static function getUsersByCompany($company) { - self::_getData(); - return self::$_companyUsers[$company]; + $data = self::_getData(); + if (isset($data['companyUsers'][$company])) { + return $data['companyUsers'][$company]; + } + return []; } /** * @param integer $user - * @return integer + * @return integer|null */ public static function getCompanyByUser($user) { - self::_getData(); - return self::$_usersCompany[$user]; + $data = self::_getData(); + if (isset($data['usersCompany'][$user])) { + return $data['usersCompany'][$user]; + } + return null; } + /** - * @param integer $user + * @param $user integer * @return array */ - public static function getWorkmates($user) + public static function getManagedUsers($user) { - return self::getUsersByCompany(self::getCompanyByUser($user)); + $data = self::_getData(); + if (isset($data['managedUsers'][$user])) { + return $data['managedUsers'][$user]; + } + return []; } } diff --git a/src/User.php b/src/User.php index 9f4e0f2..5f818e5 100644 --- a/src/User.php +++ b/src/User.php @@ -59,9 +59,23 @@ class User extends CubistMagicAuthenticatable 'tab' => 'Settings']); } + public function getNameAttribute() + { + return trim($this->firstname . ' ' . $this->lastname); + } + + public function getCompanyWithNameAttribute() + { + $name = $this->name; + if ($name === '') { + return $this->companyName; + } + return $this->companyName . ' - ' . $this->name; + } + public function getNameWithCompanyAttribute() { - $name = trim($this->firstname . ' ' . $this->lastname); + $name = $this->name; if ($name === '') { return $this->companyName; } @@ -84,4 +98,10 @@ class User extends CubistMagicAuthenticatable return self::$_companyNames[$id]; } + public function getManagedUsers() + { + return Permissions::getManagedUsers($this->id); + } + + }