Avances con varias cosas~
This commit is contained in:
10
app/Enums/RoleName.php
Normal file
10
app/Enums/RoleName.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
|
||||
enum RoleName: string
|
||||
{
|
||||
case SuperAdmin = 'superadmin';
|
||||
case Admin = 'admin';
|
||||
case User = 'user';
|
||||
}
|
||||
118
app/Livewire/Usuarios/Edit.php
Normal file
118
app/Livewire/Usuarios/Edit.php
Normal file
@@ -0,0 +1,118 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire\Usuarios;
|
||||
|
||||
use App\Enums\RoleName;
|
||||
use App\Models\Role;
|
||||
use App\Models\User;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Livewire\Attributes\Computed;
|
||||
use Livewire\Attributes\Locked;
|
||||
use Livewire\Attributes\Validate;
|
||||
use Livewire\Component;
|
||||
use TallStackUi\Traits\Interactions;
|
||||
|
||||
class Edit extends Component
|
||||
{
|
||||
use Interactions;
|
||||
|
||||
#[Locked]
|
||||
public ?User $user = null;
|
||||
|
||||
public $name = null;
|
||||
|
||||
public $email = null;
|
||||
|
||||
public $password = null;
|
||||
|
||||
public $password_confirmation = null;
|
||||
|
||||
public $roles = [];
|
||||
|
||||
public $change_password = false;
|
||||
|
||||
public function mount(): void
|
||||
{
|
||||
if ($this->user) {
|
||||
$this->name = $this->user->name;
|
||||
$this->email = $this->user->email;
|
||||
$this->roles = $this->user->roles()->pluck('id')->toArray();
|
||||
}
|
||||
}
|
||||
|
||||
public function render(): View
|
||||
{
|
||||
return view('livewire.usuarios.edit');
|
||||
}
|
||||
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'name' => 'required|string',
|
||||
'email' => ['required', 'email', Rule::unique('users', 'email')->ignore($this->user->id)],
|
||||
'password' => $this->change_password ? 'required|string|min:8|confirmed' : 'nullable|string|min:8|confirmed',
|
||||
'password_confirmation' => $this->change_password ? 'required' : 'nullable',
|
||||
'roles' => 'nullable',
|
||||
];
|
||||
}
|
||||
|
||||
public function save(): void
|
||||
{
|
||||
$this->validate();
|
||||
|
||||
if ($this->user) {
|
||||
$this->update();
|
||||
} else {
|
||||
$this->store();
|
||||
}
|
||||
|
||||
$this->redirectRoute('usuarios.index', navigate: true);
|
||||
}
|
||||
|
||||
public function update(): void
|
||||
{
|
||||
$this->authorize('update', $this->user);
|
||||
|
||||
$this->user->name = $this->name;
|
||||
$this->user->email = $this->email;
|
||||
|
||||
if ($this->change_password) {
|
||||
$this->user->password = Hash::make($this->password);
|
||||
}
|
||||
|
||||
$this->user->save();
|
||||
|
||||
$isSuperAdmin = $this->user->roles()->where('name', RoleName::SuperAdmin)->exists();
|
||||
$this->user->roles()->sync($this->roles);
|
||||
if ($isSuperAdmin) {
|
||||
$this->user->roles()->attach(Role::where('name', RoleName::SuperAdmin)->first()->id);
|
||||
}
|
||||
|
||||
Session::flash('toast', ['type' => 'success', 'message' => 'Usuario modificado correctamente']);
|
||||
}
|
||||
|
||||
public function store(): void
|
||||
{
|
||||
$this->authorize('create', User::class);
|
||||
|
||||
$user = User::create([
|
||||
'name' => $this->name,
|
||||
'email' => $this->email,
|
||||
'password' => Hash::make($this->password),
|
||||
]);
|
||||
|
||||
$user->roles()->sync($this->roles);
|
||||
|
||||
Session::flash('toast', ['type' => 'success', 'message' => 'Usuario registrado correctamente']);
|
||||
}
|
||||
|
||||
#[Computed]
|
||||
public function availableRoles(): Collection
|
||||
{
|
||||
return Role::whereNot('name', RoleName::SuperAdmin)->get();
|
||||
}
|
||||
}
|
||||
66
app/Livewire/Usuarios/Index.php
Normal file
66
app/Livewire/Usuarios/Index.php
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire\Usuarios;
|
||||
|
||||
use App\Enums\RoleName;
|
||||
use App\Models\Turno;
|
||||
use App\Models\User;
|
||||
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use Livewire\Attributes\Computed;
|
||||
use Livewire\Component;
|
||||
use TallStackUi\Traits\Interactions;
|
||||
|
||||
class Index extends Component
|
||||
{
|
||||
use Interactions;
|
||||
|
||||
public function render(): View
|
||||
{
|
||||
return view('livewire.usuarios.index');
|
||||
}
|
||||
|
||||
public function confirmDelete($id): void
|
||||
{
|
||||
$user = User::find($id);
|
||||
$this->authorize('delete', $user);
|
||||
|
||||
if ($user->roles()->where('name', RoleName::SuperAdmin)->exists()) {
|
||||
$this->toast()->error('Error', 'No se puede eliminar un super administrador')->send();
|
||||
return;
|
||||
}
|
||||
|
||||
$this->dialog()->question('¿Esta seguro de eliminar este usuario?',
|
||||
'No podra ser recuperado')
|
||||
->confirm('Eliminar Usuario', method: 'doDelete', params: $id)
|
||||
->cancel()
|
||||
->send();
|
||||
}
|
||||
|
||||
public function doDelete($id): void
|
||||
{
|
||||
$user = User::find($id);
|
||||
$this->authorize('delete', $user);
|
||||
|
||||
$user->delete();
|
||||
|
||||
$this->toast()->success('Usuario eliminado correctamente')->send();
|
||||
}
|
||||
|
||||
#[Computed]
|
||||
public function headers(): array
|
||||
{
|
||||
return [
|
||||
['index' => 'name', 'label' => 'Nombre'],
|
||||
['index' => 'email', 'label' => 'Email'],
|
||||
['index' => 'action', 'label' => 'Acciones'],
|
||||
];
|
||||
}
|
||||
|
||||
#[Computed]
|
||||
public function rows(): LengthAwarePaginator
|
||||
{
|
||||
return User::paginate();
|
||||
}
|
||||
}
|
||||
22
app/Models/Role.php
Normal file
22
app/Models/Role.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Enums\RoleName;
|
||||
use Illuminate\Database\Eloquent\Concerns\HasUlids;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||
|
||||
class Role extends Model
|
||||
{
|
||||
use HasUlids;
|
||||
|
||||
protected $table = 'roles';
|
||||
protected $fillable = ['name', 'title'];
|
||||
protected $casts = ['name' => RoleName::class];
|
||||
|
||||
public function users(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(User::class, 'user_roles', 'role_id', 'user_id');
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Concerns\HasUlids;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
|
||||
@@ -24,6 +25,11 @@ class User extends Authenticatable
|
||||
'remember_token',
|
||||
];
|
||||
|
||||
public function roles(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(Role::class, 'user_roles', 'user_id', 'role_id');
|
||||
}
|
||||
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
|
||||
77
app/Policies/UserPolicy.php
Normal file
77
app/Policies/UserPolicy.php
Normal file
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
namespace App\Policies;
|
||||
|
||||
use App\Enums\RoleName;
|
||||
use App\Models\User;
|
||||
use Log;
|
||||
|
||||
class UserPolicy
|
||||
{
|
||||
public function before(User $user, string $ability): bool|null
|
||||
{
|
||||
$isAdmin = $user->roles()->whereIn('name', [RoleName::SuperAdmin, RoleName::Admin])->exists();
|
||||
|
||||
if (!$isAdmin) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can view any models.
|
||||
*/
|
||||
public function viewAny(User $user): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can view the model.
|
||||
*/
|
||||
public function view(User $user, User $model): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can create models.
|
||||
*/
|
||||
public function create(User $user): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can update the model.
|
||||
*/
|
||||
public function update(User $user, User $model): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can delete the model.
|
||||
*/
|
||||
public function delete(User $user, User $model): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can restore the model.
|
||||
*/
|
||||
public function restore(User $user, User $model): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can permanently delete the model.
|
||||
*/
|
||||
public function forceDelete(User $user, User $model): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Providers;
|
||||
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Livewire\Volt\Volt;
|
||||
|
||||
class VoltServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Register services.
|
||||
*/
|
||||
public function register(): void
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Bootstrap services.
|
||||
*/
|
||||
public function boot(): void
|
||||
{
|
||||
Volt::mount([
|
||||
config('livewire.view_path', resource_path('views/livewire')),
|
||||
resource_path('views/pages'),
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\View\Components;
|
||||
|
||||
use Illuminate\View\Component;
|
||||
use Illuminate\View\View;
|
||||
|
||||
class AppLayout extends Component
|
||||
{
|
||||
/**
|
||||
* Get the view / contents that represents the component.
|
||||
*/
|
||||
public function render(): View
|
||||
{
|
||||
return view('layouts.app');
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\View\Components;
|
||||
|
||||
use Illuminate\View\Component;
|
||||
use Illuminate\View\View;
|
||||
|
||||
class GuestLayout extends Component
|
||||
{
|
||||
/**
|
||||
* Get the view / contents that represents the component.
|
||||
*/
|
||||
public function render(): View
|
||||
{
|
||||
return view('layouts.guest');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user