public async Task <IActionResult> Editar([FromBody] UsuarioAddUpdateRequest req)
        {
            if (ModelState.IsValid)
            {
                await _usuarioService.EditarAsync(req);

                return(Ok());
            }
            return(BadRequest());
        }
        public async Task <IActionResult> Adicionar([FromBody] UsuarioAddUpdateRequest req)
        {
            if (ModelState.IsValid)
            {
                var id = await _usuarioService.AdicionarAsync(req);

                if (!string.IsNullOrEmpty(id))
                {
                    return(Created($"/api/user/{id}", req));
                }
            }
            return(BadRequest());
        }
        public async Task <string> AdicionarAsync(UsuarioAddUpdateRequest req)
        {
            // Valida se as permissoes informadas existem no sistema
            if (req.Permissoes != null)
            {
                foreach (var permissao in req.Permissoes)
                {
                    if (String.IsNullOrWhiteSpace(permissao))
                    {
                        throw new EntityModelInvalidException($"Permissão {permissao} inválida");
                    }

                    if (!Roles.RolesExistentes().Contains(permissao.ToUpper()))
                    {
                        throw new EntityNotFoundException($"Permissão {permissao} inexistente");
                    }
                }
            }

            var usuario = _mapper.Map <Usuario>(req);

            if (_userManager.FindByNameAsync(usuario.UserName).Result == null)
            {
                var resultado = _userManager
                                .CreateAsync(usuario, req.Password).Result;

                if (resultado.Succeeded)
                {
                    foreach (var permissao in req.Permissoes)
                    {
                        await _userManager.AddToRoleAsync(usuario, permissao.ToUpper());
                    }
                }
                else
                {
                    string sMsgErro = string.Empty;
                    foreach (var err in resultado.Errors)
                    {
                        sMsgErro += err.Description + "\r\n";
                    }

                    throw new EntityModelInvalidException($"Não foi possível criar o usuário.\r\nDetalhes: {sMsgErro}");
                }
            }
            else
            {
                throw new EntityUniqueViolatedException("Usuario existente");
            }

            return(usuario.Id);
        }
        public async Task EditarAsync(UsuarioAddUpdateRequest req)
        {
            // Valida se as permissoes informadas existem no sistema
            foreach (var permissao in req.Permissoes)
            {
                if (String.IsNullOrWhiteSpace(permissao))
                {
                    throw new EntityModelInvalidException($"Permissão {permissao} inválida");
                }

                if (!Roles.RolesExistentes().Contains(permissao.ToUpper()))
                {
                    throw new EntityNotFoundException($"Permissão {permissao} inexistente");
                }
            }

            Usuario usuario = await _userManager.FindByNameAsync(req.UserName);

            if (usuario == null)
            {
                throw new EntityNotFoundException("Usuario não encontrado");
            }

            usuario.Email = req.Email;
            usuario.Roles = null;
            await _userManager.UpdateAsync(usuario);

            // Remove todas as permissoes e adiciona as que vierem da requisicao
            if (req.Permissoes.Length > 0)
            {
                var resultRoles = await _userManager.GetRolesAsync(usuario);

                await _userManager.RemoveFromRolesAsync(usuario, resultRoles);

                foreach (var permissao in req.Permissoes)
                {
                    await _userManager.AddToRoleAsync(usuario, permissao.ToUpper());
                }
            }

            // Troca de senha
            if (!string.IsNullOrWhiteSpace(req.Password))
            {
                await _userManager.RemovePasswordAsync(usuario);

                await _userManager.AddPasswordAsync(usuario, req.Password);
            }
        }