public UsuarioModel Login(LoginRequest request)
        {
            request.Validar();

            var usuario            = _repositorioUsuario.Obter(request.Email);
            var senhaCriptografada = CriptografiaSha512.GerarHash(request.Senha);

            new ValidacaoLogin(senhaCriptografada).Validar(usuario);

            return(new UsuarioModel(usuario));
        }
        public void RecuperarSenha(string token, RecuperarSenhaRequest request)
        {
            request.Validar();

            var tokenRecuperacaoSenha = ValidarTokenRecuperacaoSenha(token);
            var novaSenha             = CriptografiaSha512.GerarHash(request.Senha);

            tokenRecuperacaoSenha.RecuperarSenha(novaSenha);

            _repositorioUsuario.AtualizarSenha(tokenRecuperacaoSenha.Usuario);
            _repositorioTokenRecuperacaoSenha.Utilizar(tokenRecuperacaoSenha);
            _servicoEnvioEmail.EnviarEmailAtualizacaoSenha(tokenRecuperacaoSenha.Usuario);
        }
        public async Task AtualizarSenha(AtualizarSenhaRequest request, long idUsuarioAutenticado)
        {
            request.Validar();

            var usuario   = _repositorioUsuario.Obter(idUsuarioAutenticado);
            var novaSenha = CriptografiaSha512.GerarHash(request.Senha);

            new ValidacaoAtualizacaoSenhaUsuario(novaSenha).Validar(usuario);
            usuario.AtualizarSenha(novaSenha);

            _repositorioUsuario.AtualizarSenha(usuario);
            await _servicoEmail.EnviarEmailAtualizacaoSenha(usuario);
        }
        public UsuarioModel Cadastrar(CadastrarUsuarioRequest request)
        {
            request.Validar();

            var senha         = CriptografiaSha512.GerarHash(request.Senha);
            var perfilUsuario = _repositorioUsuario.ObterPerfil(request.Tipo);
            var usuario       = request.ParaEntidade(senha, perfilUsuario);

            new ValidacaoCadastroUsuario(_repositorioUsuario, _repositorioArquivo).Validar(usuario);

            _unitOfWork.IniciarTransacao();

            _repositorioEndereco.Inserir(usuario.Endereco);
            _repositorioUsuario.Inserir(usuario);
            _repositorioUsuarioCausa.Inserir(usuario);

            _unitOfWork.ExecutarCommit();

            return(new UsuarioModel(usuario));
        }