Files
GSB-Construction/Modules/UserManagement/app/Livewire/UserManager.php

114 lines
3.8 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', 'Project Manager', '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');
}
}