Exemplo n.º 1
0
        private void dgBtnEditar_Click(object sender, RoutedEventArgs e)
        {
            var selected = dgUsuarios.SelectedItem as UsuarioModel;
            var detalle  = new UsuarioDetalle(selected, true);

            detalle.ShowDialog();
        }
Exemplo n.º 2
0
        public async Task <IActionResult> Post([FromBody] UsuarioDetalle usuario)
        {
            if (!ModelState.IsValid)
            {
                return(HttpBadRequest(ModelState));
            }

            var usuarioId = await usuarios.CrearAsync(usuario);

            var result = await usuarios.ObtenerUnicoAsync(usuarioId);

            return(CreatedAtRoute("GetUsuario", new { id = usuarioId }, result));
        }
Exemplo n.º 3
0
        public async Task <IActionResult> Put(int id, [FromBody] UsuarioDetalle usuario)
        {
            if (!ModelState.IsValid)
            {
                return(HttpBadRequest(ModelState));
            }

            id = id == 0 ? User.Id() : id;

            var modificado = await usuarios.EditarAsync(id, usuario);

            if (modificado)
            {
                var result = await usuarios.ObtenerUnicoAsync(id);

                return(Ok(result));
            }
            else
            {
                return(new HttpStatusCodeResult((int)HttpStatusCode.NotModified));
            }
        }
Exemplo n.º 4
0
        public async Task <int> CrearAsync(UsuarioDetalle usuario)
        {
            var login  = usuario.Login.Trim().ToLowerInvariant();
            var correo = usuario.Correo.Trim().ToLowerInvariant();

            if (string.IsNullOrWhiteSpace(usuario.Clave))
            {
                throw new InvalidOperationException("La clave no puede estar en blanco");
            }

            if (await ExisteLoginInterno(login))
            {
                throw new InvalidOperationException($"El login '{login}' ya está asignado a otro usuario.");
            }

            if (await ExisteCorreoInterno(correo))
            {
                throw new InvalidOperationException($"El correo '{correo}' ya está asignado a otro usuario.");
            }

            var nuevoUsuario = new Usuario {
                Login            = login,
                Nombres          = usuario.Nombres.Trim(),
                Apellidos        = usuario.Apellidos.Trim(),
                NombreCompleto   = usuario.NombreCompleto.Trim(),
                Correo           = correo,
                SitioWeb         = usuario.SitioWeb?.Trim().ToLowerInvariant(),
                Activo           = true,
                CorreoVerificado = false,
                Clave            = usuario.Clave.Encriptar()
            };

            if (usuario.Roles != null && usuario.Roles.Count > 0)
            {
                var rolesIds = usuario.Roles.Keys;
                var roles    = db.Roles.Where(x => rolesIds.Contains(x.Id)).Distinct().ToList();
                if (rolesIds.Count != roles.Count)
                {
                    throw new InvalidOperationException("Al menos uno de los roles especificados no es válido.");
                }

                nuevoUsuario.Roles = roles.Select(x => new UsuarioRol
                {
                    Usuario = nuevoUsuario,
                    Rol     = x
                }).ToList();
            }

            if (usuario.Atributos != null && usuario.Atributos.Count > 0)
            {
                nuevoUsuario.Atributos = new List <UsuarioAtributo>();

                foreach (var atributo in usuario.Atributos)
                {
                    if (string.IsNullOrWhiteSpace(atributo.Key))
                    {
                        continue;
                    }

                    foreach (var valor in atributo.Value)
                    {
                        if (string.IsNullOrEmpty(valor))
                        {
                            continue;
                        }

                        nuevoUsuario.Atributos.Add(new UsuarioAtributo
                        {
                            Nombre  = atributo.Key.Trim().ToLowerInvariant(),
                            Valor   = valor.Trim(),
                            Usuario = nuevoUsuario
                        });
                    }
                }
            }

            db.Usuarios.Add(nuevoUsuario);
            var filasAfectadas = await db.SaveChangesAsync();

            if (filasAfectadas > 0)
            {
                return(nuevoUsuario.Id);
            }
            else
            {
                return(-1);
            }
        }
Exemplo n.º 5
0
        public async Task <bool> EditarAsync(int id, UsuarioDetalle usuario)
        {
            var usuarioAEditar = await db.Usuarios.Include(x => x.Atributos).Include(x => x.Roles).ThenInclude(x => x.Rol).SingleOrDefaultAsync(x => x.Id == id);

            if (usuarioAEditar == null)
            {
                throw new RegistroNoEncontradoException($"No existe el usuario {id}");
            }

            var correo = usuario.Correo.Trim().ToLowerInvariant();

            if (await ExisteCorreoEnOtroUsuario(id, correo))
            {
                throw new InvalidOperationException($"El correo {correo} ya está asginado a otro usuario.");
            }

            usuarioAEditar.Nombres        = usuario.Nombres.Trim();
            usuarioAEditar.Apellidos      = usuario.Apellidos.Trim();
            usuarioAEditar.NombreCompleto = usuario.NombreCompleto.Trim();
            usuarioAEditar.Correo         = correo;
            usuarioAEditar.SitioWeb       = usuario.SitioWeb?.Trim().ToLowerInvariant();

            var atributos = usuario.Atributos ?? new Dictionary <string, string[]>();
            var roles     = usuario.Roles ?? new Dictionary <int, string>();

            var rolesAEliminar = usuarioAEditar.Roles.Where(x => !roles.Keys.Contains(x.RolId)).ToArray();
            var rolesAInsertar = roles.Where(x => !usuarioAEditar.Roles.Select(y => y.RolId).Contains(x.Key)).ToArray();

            var atributosAEliminar = usuarioAEditar.Atributos.Where(x => !atributos.Keys.Contains(x.Nombre, StringComparer.OrdinalIgnoreCase)).ToArray();
            var atributosAEditar   = usuarioAEditar.Atributos.Where(x => atributos.Keys.Contains(x.Nombre, StringComparer.OrdinalIgnoreCase)).GroupBy(x => x.Nombre).ToDictionary(x => x.Key, x => x.ToArray());
            var atributosAInsertar = atributos.Where(x => !usuarioAEditar.Atributos.Select(y => y.Nombre).Contains(x.Key, StringComparer.OrdinalIgnoreCase)).ToArray();

            foreach (var rol in rolesAEliminar)
            {
                usuarioAEditar.Roles.Remove(rol);
            }

            foreach (var rol in rolesAInsertar)
            {
                usuarioAEditar.Roles.Add(new UsuarioRol {
                    RolId   = rol.Key,
                    Usuario = usuarioAEditar
                });
            }
            foreach (var atributo in atributosAEliminar)
            {
                usuarioAEditar.Atributos.Remove(atributo);
            }

            foreach (var atributo in atributosAInsertar)
            {
                if (string.IsNullOrWhiteSpace(atributo.Key))
                {
                    continue;
                }

                foreach (var valor in atributo.Value)
                {
                    if (string.IsNullOrEmpty(valor))
                    {
                        continue;
                    }

                    usuarioAEditar.Atributos.Add(new UsuarioAtributo
                    {
                        Nombre  = atributo.Key.Trim().ToLowerInvariant(),
                        Valor   = valor.Trim(),
                        Usuario = usuarioAEditar
                    });
                }
            }

            // En lugar de este algoritmo sería mas fácil eliminar todos los
            // atributos que tiene el usuario y agregar como nuevos los que
            // se envían en el modelo, pero a fin de ejercicio y de reutilizar
            // los ids con los que ya cuentan los atributos se realiza este
            // algoritmo.
            foreach (var atributo in atributosAEditar)
            {
                var esteAtributo     = atributo.Value;
                var otroAtributo     = atributos[atributo.Key];
                var longitudOriginal = esteAtributo.Length;
                int i;

                if (longitudOriginal == otroAtributo.Length)
                {
                    for (i = 0; i < longitudOriginal; i++)
                    {
                        var atributoOriginal = esteAtributo[i];
                        var nuevoValor       = otroAtributo[i];
                        if (atributoOriginal.Valor != nuevoValor)
                        {
                            atributoOriginal.Valor = nuevoValor;
                        }
                    }
                }
                else if (longitudOriginal < otroAtributo.Length)
                {
                    for (i = 0; i < longitudOriginal; i++)
                    {
                        var atributoOriginal = esteAtributo[i];
                        var nuevoValor       = otroAtributo[i];
                        if (atributoOriginal.Valor != nuevoValor)
                        {
                            atributoOriginal.Valor = nuevoValor;
                        }
                    }

                    for (; i < otroAtributo.Length; i++)
                    {
                        usuarioAEditar.Atributos.Add(new UsuarioAtributo
                        {
                            Nombre  = atributo.Key,
                            Valor   = otroAtributo[i].Trim(),
                            Usuario = usuarioAEditar
                        });
                    }
                }
                else if (longitudOriginal > otroAtributo.Length)
                {
                    for (i = 0; i < otroAtributo.Length; i++)
                    {
                        var atributoOriginal = esteAtributo[i];
                        var nuevoValor       = otroAtributo[i];
                        if (atributoOriginal.Valor != nuevoValor)
                        {
                            atributoOriginal.Valor = nuevoValor;
                        }
                    }

                    for (; i < longitudOriginal; i++)
                    {
                        usuarioAEditar.Atributos.Remove(esteAtributo[i]);
                    }
                }
            }

            var filasAfectadas = await db.SaveChangesAsync();

            return(filasAfectadas > 0);
        }
        public App()
        {
            InitializeComponent();

            MainPage = new UsuarioDetalle();
        }