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;
}
/**
*/
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 [];
}
}