]> _ Git - cubedesigners_userdatabase.git/commitdiff
wip #3711 @1
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 16 Jun 2020 15:29:25 +0000 (17:29 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 16 Jun 2020 15:29:25 +0000 (17:29 +0200)
src/Permissions.php
src/User.php

index 96b43925c856f46fdf80d8c9984ebc12a968119a..e50c39f11d5bfe9c62e603264a704821262ed1c3 100644 (file)
@@ -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 [];
     }
 }
index 9f4e0f243ca8392cc7c5719b86bd3058bf1368d3..5f818e5d7f781441c506c34910d1ef4eac2c38c4 100644 (file)
@@ -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);
+    }
+
+
 }