UDT-005: Gestión de Permisos (RBAC) — catálogo + asignación rol↔permisos #9
49
src/api/SIGCM2.Domain/Entities/Permiso.cs
Normal file
49
src/api/SIGCM2.Domain/Entities/Permiso.cs
Normal file
@@ -0,0 +1,49 @@
|
||||
namespace SIGCM2.Domain.Entities;
|
||||
|
||||
/// <summary>
|
||||
/// Entidad de dominio que representa un permiso atómico del catálogo RBAC.
|
||||
/// Inmutable — solo se puede leer desde BD (sin creación por API).
|
||||
/// </summary>
|
||||
public sealed class Permiso
|
||||
{
|
||||
public int Id { get; }
|
||||
public string Codigo { get; }
|
||||
public string Nombre { get; }
|
||||
public string? Descripcion { get; }
|
||||
public string Modulo { get; }
|
||||
public bool Activo { get; }
|
||||
public DateTime FechaCreacion { get; }
|
||||
|
||||
private Permiso(
|
||||
int id,
|
||||
string codigo,
|
||||
string nombre,
|
||||
string? descripcion,
|
||||
string modulo,
|
||||
bool activo,
|
||||
DateTime fechaCreacion)
|
||||
{
|
||||
Id = id;
|
||||
Codigo = codigo;
|
||||
Nombre = nombre;
|
||||
Descripcion = descripcion;
|
||||
Modulo = modulo;
|
||||
Activo = activo;
|
||||
FechaCreacion = fechaCreacion;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Factory para hidratación desde BD (read-only — el catálogo solo se modifica vía migraciones).
|
||||
/// </summary>
|
||||
public static Permiso ForRead(
|
||||
int id,
|
||||
string codigo,
|
||||
string nombre,
|
||||
string? descripcion,
|
||||
string modulo,
|
||||
bool activo,
|
||||
DateTime fechaCreacion)
|
||||
{
|
||||
return new Permiso(id, codigo, nombre, descripcion, modulo, activo, fechaCreacion);
|
||||
}
|
||||
}
|
||||
12
src/api/SIGCM2.Domain/Exceptions/PermisoNotFoundException.cs
Normal file
12
src/api/SIGCM2.Domain/Exceptions/PermisoNotFoundException.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
namespace SIGCM2.Domain.Exceptions;
|
||||
|
||||
public sealed class PermisoNotFoundException : Exception
|
||||
{
|
||||
public string Codigo { get; }
|
||||
|
||||
public PermisoNotFoundException(string codigo)
|
||||
: base($"El permiso '{codigo}' no existe.")
|
||||
{
|
||||
Codigo = codigo;
|
||||
}
|
||||
}
|
||||
53
src/api/SIGCM2.Domain/Permissions/Permiso.cs
Normal file
53
src/api/SIGCM2.Domain/Permissions/Permiso.cs
Normal file
@@ -0,0 +1,53 @@
|
||||
namespace SIGCM2.Domain.Permissions;
|
||||
|
||||
/// <summary>
|
||||
/// Catálogo canónico de permisos RBAC del sistema.
|
||||
/// Source of truth: cada código aquí debe tener su fila en dbo.Permiso vía migración.
|
||||
/// Convención: al agregar un permiso nuevo → también asignarlo al rol admin en la misma migración.
|
||||
/// </summary>
|
||||
public static class Permiso
|
||||
{
|
||||
// ── Ventas: contado ──────────────────────────────────────────────────────
|
||||
public const string VentasContadoCrear = "ventas:contado:crear";
|
||||
public const string VentasContadoModificar = "ventas:contado:modificar";
|
||||
public const string VentasContadoCobrar = "ventas:contado:cobrar";
|
||||
public const string VentasContadoFacturar = "ventas:contado:facturar";
|
||||
|
||||
// ── Ventas: cuenta corriente ─────────────────────────────────────────────
|
||||
public const string VentasCtacteCrear = "ventas:ctacte:crear";
|
||||
public const string VentasCtacteFacturar = "ventas:ctacte:facturar";
|
||||
|
||||
// ── Textos ───────────────────────────────────────────────────────────────
|
||||
public const string TextosEditar = "textos:editar";
|
||||
public const string TextosReclamosVer = "textos:reclamos:ver";
|
||||
|
||||
// ── Pauta ────────────────────────────────────────────────────────────────
|
||||
public const string PautaAzanuVer = "pauta:azanu:ver";
|
||||
public const string PautaLimpiar = "pauta:limpiar";
|
||||
public const string PautaRecursosFueraDeHora = "pauta:recursos:fueradehora";
|
||||
|
||||
// ── Productores ──────────────────────────────────────────────────────────
|
||||
public const string ProductoresDeudaVer = "productores:deuda:ver";
|
||||
public const string ProductoresPendientesCrear = "productores:pendientes:crear";
|
||||
public const string ProductoresDeudaBypass = "productores:deuda:bypass";
|
||||
|
||||
// ── Administración ───────────────────────────────────────────────────────
|
||||
public const string AdministracionUsuariosGestionar = "administracion:usuarios:gestionar";
|
||||
public const string AdministracionTarifariosGestionar = "administracion:tarifarios:gestionar";
|
||||
public const string AdministracionMediosGestionar = "administracion:medios:gestionar";
|
||||
public const string AdministracionAuditoriaVer = "administracion:auditoria:ver";
|
||||
|
||||
/// <summary>
|
||||
/// Set completo de todos los códigos canónicos (útil para validación y seeds).
|
||||
/// </summary>
|
||||
public static readonly IReadOnlySet<string> Todos = new HashSet<string>
|
||||
{
|
||||
VentasContadoCrear, VentasContadoModificar, VentasContadoCobrar, VentasContadoFacturar,
|
||||
VentasCtacteCrear, VentasCtacteFacturar,
|
||||
TextosEditar, TextosReclamosVer,
|
||||
PautaAzanuVer, PautaLimpiar, PautaRecursosFueraDeHora,
|
||||
ProductoresDeudaVer, ProductoresPendientesCrear, ProductoresDeudaBypass,
|
||||
AdministracionUsuariosGestionar, AdministracionTarifariosGestionar,
|
||||
AdministracionMediosGestionar, AdministracionAuditoriaVer,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user