--- name: rbac_check kind: function lang: go domain: infra version: "1.0.0" purity: pure signature: "func RBACCheck(roles []Role, roleName string, perm Permission) bool" description: "Verifica si un rol tiene un permiso concreto. Busca el rol por Name e itera sus permisos buscando match exacto de Resource + Action. Funcion pura." tags: [rbac, role, permission, check, auth, infra] uses_functions: [] uses_types: [Role_go_infra, Permission_go_infra] returns: [] returns_optional: false error_type: "" imports: [] params: - name: roles desc: "slice de roles disponibles en el sistema, cada uno con su lista de permisos" - name: roleName desc: "nombre del rol a verificar (ej: admin, viewer). Comparacion exacta" - name: perm desc: "permiso requerido: par Resource + Action (ej: users/delete)" output: "true si el rol existe y tiene el permiso; false si el rol no existe o no tiene el permiso" tested: true tests: ["true cuando el rol tiene el permiso", "false cuando no tiene el permiso", "false cuando el rol no existe", "match exacto de Resource y Action"] test_file_path: "functions/infra/rbac_check_test.go" file_path: "functions/infra/rbac_check.go" --- ## Ejemplo ```go roles := []Role{ {Name: "admin", Permissions: []Permission{{Resource: "users", Action: "delete"}}}, {Name: "viewer", Permissions: []Permission{{Resource: "users", Action: "read"}}}, } can := RBACCheck(roles, "admin", Permission{Resource: "users", Action: "delete"}) // can == true ``` ## Notas Pura — solo recorre slices, sin I/O. No hay herencia ni wildcards: un rol "admin" sin el permiso explicito `users/delete` no lo tiene. Esto es deliberado para que la matriz rol→permisos sea auditable con un grep. Para wildcards o herencia, construir la lista de roles expandida antes de pasarla (ej: funcion helper que toma {admin: [viewer, ...]} y expande). Si hay dos Roles con el mismo Name solo se evalua el primero — considerar invariante de unicidad al construir la lista.