221 lines
7.8 KiB
C#
221 lines
7.8 KiB
C#
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Identity;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using System;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using vita_asistente.Models;
|
|
|
|
namespace vita_asistente.Controllers
|
|
{
|
|
[Authorize(Roles = "Admin")]
|
|
public class UsuariosController : Controller
|
|
{
|
|
private readonly UserManager<ApplicationUser> _userManager;
|
|
private readonly RoleManager<IdentityRole> _roleManager;
|
|
|
|
public UsuariosController(UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager)
|
|
{
|
|
_userManager = userManager;
|
|
_roleManager = roleManager;
|
|
}
|
|
|
|
// GET: Usuarios
|
|
public async Task<IActionResult> Index()
|
|
{
|
|
var usuarios = await _userManager.Users.ToListAsync();
|
|
return View(usuarios);
|
|
}
|
|
|
|
// GET: Usuarios/Details/5
|
|
public async Task<IActionResult> Details(string id)
|
|
{
|
|
if (id == null) return NotFound();
|
|
var usuario = await _userManager.FindByIdAsync(id);
|
|
if (usuario == null) return NotFound();
|
|
var roles = await _userManager.GetRolesAsync(usuario);
|
|
ViewBag.Roles = roles;
|
|
return View(usuario);
|
|
}
|
|
|
|
// GET: Usuarios/Create
|
|
public IActionResult Create()
|
|
{
|
|
return View();
|
|
}
|
|
|
|
// POST: Usuarios/Create
|
|
[HttpPost]
|
|
[ValidateAntiForgeryToken]
|
|
public async Task<IActionResult> Create(ApplicationUser usuario, string password)
|
|
{
|
|
if (ModelState.IsValid)
|
|
{
|
|
var user = new ApplicationUser
|
|
{
|
|
UserName = usuario.Email,
|
|
Email = usuario.Email,
|
|
Nombre = usuario.Nombre,
|
|
Apellido = usuario.Apellido,
|
|
Documento = usuario.Documento,
|
|
Direccion = usuario.Direccion,
|
|
// RolPrincipal se asigna después
|
|
};
|
|
var result = await _userManager.CreateAsync(user, password);
|
|
if (result.Succeeded)
|
|
{
|
|
// Asignar un rol por defecto (por ejemplo "Usuario" si existe)
|
|
if (await _roleManager.RoleExistsAsync("Usuario"))
|
|
{
|
|
await _userManager.AddToRoleAsync(user, "Usuario");
|
|
}
|
|
return RedirectToAction(nameof(Index));
|
|
}
|
|
foreach (var error in result.Errors)
|
|
{
|
|
ModelState.AddModelError(string.Empty, error.Description);
|
|
}
|
|
}
|
|
return View(usuario);
|
|
}
|
|
|
|
// GET: Usuarios/Edit/5
|
|
public async Task<IActionResult> Edit(string id)
|
|
{
|
|
if (id == null) return NotFound();
|
|
var usuario = await _userManager.FindByIdAsync(id);
|
|
if (usuario == null) return NotFound();
|
|
return View(usuario);
|
|
}
|
|
|
|
// POST: Usuarios/Edit/5
|
|
[HttpPost]
|
|
[ValidateAntiForgeryToken]
|
|
public async Task<IActionResult> Edit(string id, ApplicationUser usuarioActualizado)
|
|
{
|
|
if (id != usuarioActualizado.Id) return NotFound();
|
|
if (ModelState.IsValid)
|
|
{
|
|
var usuario = await _userManager.FindByIdAsync(id);
|
|
if (usuario == null) return NotFound();
|
|
|
|
// Actualizar solo los campos permitidos
|
|
usuario.Nombre = usuarioActualizado.Nombre;
|
|
usuario.Apellido = usuarioActualizado.Apellido;
|
|
usuario.Documento = usuarioActualizado.Documento;
|
|
usuario.Direccion = usuarioActualizado.Direccion;
|
|
usuario.Email = usuarioActualizado.Email;
|
|
usuario.UserName = usuarioActualizado.Email;
|
|
|
|
var result = await _userManager.UpdateAsync(usuario);
|
|
if (result.Succeeded)
|
|
{
|
|
return RedirectToAction(nameof(Index));
|
|
}
|
|
foreach (var error in result.Errors)
|
|
{
|
|
ModelState.AddModelError(string.Empty, error.Description);
|
|
}
|
|
}
|
|
return View(usuarioActualizado);
|
|
}
|
|
|
|
// GET: Usuarios/Delete/5
|
|
public async Task<IActionResult> Delete(string id)
|
|
{
|
|
if (id == null) return NotFound();
|
|
var usuario = await _userManager.FindByIdAsync(id);
|
|
if (usuario == null) return NotFound();
|
|
return View(usuario);
|
|
}
|
|
|
|
// POST: Usuarios/Delete/5
|
|
[HttpPost, ActionName("Delete")]
|
|
[ValidateAntiForgeryToken]
|
|
public async Task<IActionResult> DeleteConfirmed(string id)
|
|
{
|
|
var usuario = await _userManager.FindByIdAsync(id);
|
|
if (usuario != null)
|
|
{
|
|
var result = await _userManager.DeleteAsync(usuario);
|
|
if (!result.Succeeded)
|
|
{
|
|
foreach (var error in result.Errors)
|
|
{
|
|
ModelState.AddModelError(string.Empty, error.Description);
|
|
}
|
|
}
|
|
}
|
|
return RedirectToAction(nameof(Index));
|
|
}
|
|
|
|
// GET: Usuarios/ManageRoles/5
|
|
public async Task<IActionResult> ManageRoles(string id)
|
|
{
|
|
if (id == null) return NotFound();
|
|
var usuario = await _userManager.FindByIdAsync(id);
|
|
if (usuario == null) return NotFound();
|
|
|
|
var rolesDelUsuario = await _userManager.GetRolesAsync(usuario);
|
|
var todosLosRoles = await _roleManager.Roles.ToListAsync();
|
|
|
|
var model = new ManageRolesViewModel
|
|
{
|
|
UsuarioId = usuario.Id,
|
|
UsuarioNombre = $"{usuario.Nombre} {usuario.Apellido}",
|
|
RolesDisponibles = todosLosRoles.Select(r => new RoleCheckbox
|
|
{
|
|
RoleId = r.Id,
|
|
RoleName = r.Name,
|
|
IsSelected = rolesDelUsuario.Contains(r.Name)
|
|
}).ToList()
|
|
};
|
|
return View(model);
|
|
}
|
|
|
|
// POST: Usuarios/ManageRoles
|
|
[HttpPost]
|
|
[ValidateAntiForgeryToken]
|
|
public async Task<IActionResult> ManageRoles(ManageRolesViewModel model)
|
|
{
|
|
var usuario = await _userManager.FindByIdAsync(model.UsuarioId);
|
|
if (usuario == null) return NotFound();
|
|
|
|
var rolesDelUsuario = await _userManager.GetRolesAsync(usuario);
|
|
var rolesSeleccionados = model.RolesDisponibles.Where(r => r.IsSelected).Select(r => r.RoleName).ToList();
|
|
|
|
// Remover roles que ya no están seleccionados
|
|
var rolesAEliminar = rolesDelUsuario.Except(rolesSeleccionados).ToList();
|
|
foreach (var rol in rolesAEliminar)
|
|
{
|
|
await _userManager.RemoveFromRoleAsync(usuario, rol);
|
|
}
|
|
|
|
// Agregar roles nuevos
|
|
var rolesAAgregar = rolesSeleccionados.Except(rolesDelUsuario).ToList();
|
|
foreach (var rol in rolesAAgregar)
|
|
{
|
|
await _userManager.AddToRoleAsync(usuario, rol);
|
|
}
|
|
|
|
return RedirectToAction(nameof(Index));
|
|
}
|
|
}
|
|
|
|
// ViewModels para la gestión de roles (dentro del mismo archivo por simplicidad)
|
|
public class ManageRolesViewModel
|
|
{
|
|
public string UsuarioId { get; set; }
|
|
public string UsuarioNombre { get; set; }
|
|
public List<RoleCheckbox> RolesDisponibles { get; set; }
|
|
}
|
|
|
|
public class RoleCheckbox
|
|
{
|
|
public string RoleId { get; set; }
|
|
public string RoleName { get; set; }
|
|
public bool IsSelected { get; set; }
|
|
}
|
|
}
|