114 lines
3.7 KiB
PHP
114 lines
3.7 KiB
PHP
<?php
|
|
|
|
namespace Modules\UserManagement\Livewire;
|
|
|
|
use Livewire\Component;
|
|
use App\Models\User;
|
|
use Modules\ContractorManagement\Models\Contractor;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Validation\ValidationException;
|
|
use Spatie\Permission\Models\Role;
|
|
|
|
class UserManager extends Component
|
|
{
|
|
public $users;
|
|
public $name;
|
|
public $email;
|
|
public $password;
|
|
public $role;
|
|
public $contractor_id;
|
|
|
|
public $availableRoles = [];
|
|
public $availableContractors = [];
|
|
public $availablePermissions = [];
|
|
public $selectedPermissions = [];
|
|
|
|
protected function rules()
|
|
{
|
|
return [
|
|
'name' => 'required|string|max:255',
|
|
'email' => 'required|email|unique:users,email',
|
|
'password' => 'required|min:8',
|
|
'role' => 'required|string|exists:roles,name',
|
|
'contractor_id' => 'required|exists:contractors,id',
|
|
];
|
|
}
|
|
|
|
public function mount()
|
|
{
|
|
$this->loadData();
|
|
}
|
|
|
|
public function loadData()
|
|
{
|
|
$user = Auth::user();
|
|
|
|
// Populate available permissions strictly based on what the current user possesses
|
|
// (to prevent privilege escalation).
|
|
$this->availablePermissions = $user->getAllPermissions()->pluck('name', 'name')->toArray();
|
|
|
|
// 1. Determine which users this person can see
|
|
if ($user->hasRole('admin')) {
|
|
$this->users = User::all();
|
|
$this->availableRoles = Role::pluck('name', 'name')->toArray();
|
|
$this->availableContractors = Contractor::all();
|
|
} elseif ($user->hasRole('Main Contractor Admin') && $user->contractor) {
|
|
$contractorIds = array_merge(
|
|
[$user->contractor_id],
|
|
$user->contractor->children()->pluck('id')->toArray()
|
|
);
|
|
$this->users = User::whereIn('contractor_id', $contractorIds)->get();
|
|
$this->availableRoles = ['Main Contractor Admin', 'Construction Supervisor', 'Site Technical'];
|
|
$this->availableContractors = Contractor::whereIn('id', $contractorIds)->get();
|
|
} else {
|
|
$this->users = collect();
|
|
$this->availableRoles = [];
|
|
$this->availableContractors = collect();
|
|
$this->availablePermissions = [];
|
|
}
|
|
}
|
|
|
|
public function createUser()
|
|
{
|
|
$this->validate();
|
|
|
|
$contractor = Contractor::find($this->contractor_id);
|
|
|
|
// Enforce user limits in the UI layer as well before saving
|
|
if ($contractor && $contractor->user_limit > 0) {
|
|
$currentUsers = $contractor->users()->count();
|
|
if ($currentUsers >= $contractor->user_limit) {
|
|
session()->flash('error', 'Cannot create user: The contractor has reached its limit of ' . $contractor->user_limit . ' users.');
|
|
return;
|
|
}
|
|
}
|
|
|
|
try {
|
|
$newUser = User::create([
|
|
'name' => $this->name,
|
|
'email' => $this->email,
|
|
'password' => bcrypt($this->password),
|
|
'contractor_id' => $this->contractor_id,
|
|
]);
|
|
|
|
$newUser->assignRole($this->role);
|
|
|
|
// Assign direct permissions explicitly chosen
|
|
if (!empty($this->selectedPermissions)) {
|
|
$newUser->syncPermissions($this->selectedPermissions);
|
|
}
|
|
|
|
$this->reset(['name', 'email', 'password', 'role', 'contractor_id', 'selectedPermissions']);
|
|
$this->loadData();
|
|
session()->flash('message', 'User created successfully.');
|
|
} catch (\Exception $e) {
|
|
session()->flash('error', $e->getMessage());
|
|
}
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
return view('usermanagement::livewire.user-manager');
|
|
}
|
|
}
|