2.1 Clases del Dominio: Modelos Core
Este diagrama representa la estructura de clases del dominio nuclear de Mañuti, reflejando las entidades Eloquent en MariaDB, sus atributos principales, métodos de verificación y relaciones de cardinalidad.
1. Explicación y Semántica del Diagrama
El modelo ilustra la separación de conceptos entre la identidad de acceso, la bitácora de actividad y la matriz de privilegios:
Usuario: Extiende deIlluminate\Foundation\Auth\User. Encapsula la lógica de autenticación, verificación de permisos mediantehasPermission(), soporte de SoftDeletes y enlace hacia perfiles y sesiones.Role: Representa perfiles organizacionales. Mantiene relaciones Muchos a Muchos (N:M) con usuarios y capacidades.Permission: Define las capacidades atómicas del sistema (slug,module,auditable).Login: Espejo transaccional en SQL que rastrea el puntero de la sesión activa en memoria Redis (session_id).LoginLog: Historial forense inmutable de intentos de autenticación exitosos y fallidos.LostPassword: Tokens de recuperación de acceso asociados al ID del usuario y a un estatus del catálogo.
2. Cómo se Lee este Diagrama
- Las cajas representan las clases PHP del directorio
app/Models/. - Los atributos marcados con
+representan propiedades públicas o columnas mapeadas. - Las relaciones:
1 --> *: Relación Uno a Muchos (hasMany/belongsTo). Un usuario genera múltiples registros de log y mantiene múltiples sesiones históricas.* -- *: Relación Muchos a Muchos (belongsToMany), resuelta a través de tablas intermedias pivote (role_userypermission_role).
3. Implementación en el Framework Mañuti
role_user: Pivote con llavesusuario_idyrole_idcon borrado en cascada.permission_role: Pivote con llavesrole_idypermission_idcon restricción de unicidad compuesta.- Resolución en Memoria: La evaluación de
hasPermission(slug)carga ávidamente las relaciones para evitar problemas de consultas $N+1$.
4. Diagrama Mermaid
classDiagram
class Usuario {
+id: BigInt
+usuario: String
+correo: String
+password: String
+hasPermission(slug): Bool
}
class Role {
+id: BigInt
+name: String
+description: String
}
class Permission {
+id: BigInt
+slug: String
+module: String
+auditable: Boolean
}
class Login {
+session_id: String
+ip_address: String
+open: Boolean
}
class LoginLog {
+usuario_input: String
+exitoso: Boolean
}
class LostPassword {
+usuario_id: BigInt
+token: String
+cat_status: BigInt
}
%% Relaciones
Usuario "1" --> "*" Login : tiene
Usuario "1" --> "*" LoginLog : genera
Usuario "1" --> "*" LostPassword : solicita
Usuario "*" -- "*" Role : role_user N-M
Role "*" -- "*" Permission : permission_role N-M