use Cubedesigners\UserDatabase\Models\Company;
use Cubist\Backpack\Jobs\Base;
+use Illuminate\Support\Facades\DB;
class ApplyPermissionsToUsers extends Base
{
public function handle()
{
- foreach (Company::withoutGlobalScopes()->all() as $company) {
+ $modelType = 'App\\Models\\AuthUser';
+ // Get Roles names
+ $roles = DB::connection('extranet_users')->table('roles')->get();
+ $rolesById = [];
+ $rolesByName = [];
+ foreach ($roles as $role) {
+ $rolesById[$role->id] = $role->name;
+ $rolesByName[$role->name] = $role->id;
+ }
+ $disabledUsers = [];
+
+ $standardRoles = [
+ $rolesByName['extranet:client'],
+ $rolesByName['fluidbook:client'],
+ $rolesByName['fluidbook:client:create'],
+ $rolesByName['fluidbook:reseller'],
+ $rolesByName['fluidbook:reseller:create'],
+ $rolesByName['elearning:user'],
+ ];
+
+ // Get existing models
+ $perms = [];
+ foreach (DB::connection('extranet_users')->table('model_has_roles')->get() as $item) {
+ if (!isset($perms[$item->model_id])) {
+ $perms[$item->model_id] = [];
+ }
+ $perms[$item->model_id][] = $item->role_id;
+ }
+
+
+ $addPermissions = [];
+ $deletePermissions = [];
+
+ $users = [];
+ foreach (Company::withoutGlobalScopes()->get() as $company) {
+ $disabledUsers = array_merge($disabledUsers, array_keys($company->getDisabledUsers()));
+ /** @var $company Company */
if ($company->id == 7) {
+ $cubeUsers = array_keys($company->getEnabledUsers());
continue;
}
- dd($company);
+
+ foreach ($company->getEnabledUsers() as $id => $user) {
+ $p = [$rolesByName['extranet:client']];
+ if ($company->permission_elearning) {
+ $p[] = $rolesByName['elearning:user'];
+ }
+ switch ($company->e1_ws_grade) {
+ case 1:
+ $p[] = $rolesByName['fluidbook:client'];
+ break;
+ case 2:
+ $p[] = $rolesByName['fluidbook:client:create'];
+ break;
+ case 3:
+ $p[] = $rolesByName['fluidbook:reseller'];
+ break;
+ case 4:
+ $p[] = $rolesByName['fluidbook:reseller:create'];
+ break;
+ }
+
+ if (!isset($perms[$id])) {
+ $addPermissions[$id] = $p;
+ } else {
+ $a = array_diff($p, $perms[$id]);
+ $d = array_diff($perms[$id], $p);
+ if (count($a)) {
+ $addPermissions[$id] = $a;
+ }
+ if (count($d)) {
+ $deletePermissions[$id] = $d;
+ }
+ }
+ }
+ }
+
+ // Delete all roles of disabled users
+ DB::connection('extranet_users')->table('model_has_roles')->whereIn('model_id', $disabledUsers)->delete();
+ // Delete all roles not intented to be given to clients users
+ DB::connection('extranet_users')->table('model_has_roles')->whereNotIn('role_id', $standardRoles)->whereNotIn('model_id', $cubeUsers)->delete();
+ // Delete roles not associated to the right model
+ DB::connection('extranet_users')->table('model_has_roles')->where('model_type', '!=', $modelType)->delete();
+ // Delete roles no more granted to the company
+ foreach ($deletePermissions as $user => $toDelete) {
+ DB::connection('extranet_users')->table('model_has_roles')->where('model_id', $user)->whereIn('role_id', $toDelete)->delete();
+ }
+ // Add new roles
+ $rows = [];
+ foreach ($addPermissions as $id => $roles) {
+ foreach ($roles as $role) {
+ $rows[] = ['model_id' => $id, 'role_id' => $role, 'model_type' => $modelType];
+ }
}
+ DB::connection('extranet_users')->table('model_has_roles')->insert($rows);
}
}
namespace Cubedesigners\UserDatabase\Models;
use Cubedesigners\UserDatabase\Fields\Users;
+use Cubedesigners\UserDatabase\Jobs\ApplyPermissionsToUsers;
use Cubedesigners\UserDatabase\Permissions;
use Cubedesigners\UserDatabase\SubForms\Address;
use Cubist\Backpack\Magic\Fields\Integer;
return Permissions::getNames(Permissions::getUsersByCompany($this->id));
}
+ public function getEnabledUsers()
+ {
+ $users = $this->getUsers();
+ $res = [];
+ foreach ($users as $id => $user) {
+ if ($user['enabled']) {
+ $res[$id] = $user;
+ }
+ }
+ return $res;
+ }
+
+ public function getDisabledUsers(){
+ $users = $this->getUsers();
+ $res = [];
+ foreach ($users as $id => $user) {
+ if (!$user['enabled']) {
+ $res[$id] = $user;
+ }
+ }
+ return $res;
+ }
+
+ public function onSaved(): bool
+ {
+ ApplyPermissionsToUsers::dispatch();
+ return parent::onSaved();
+ }
+
}