public async Task <Unit> Handle(AssociarGrupoUsuarioCommand request, CancellationToken cancellationToken)
        {
            var grupos = await usuarioCoreSSORepositorio.SelecionarGrupos();

            if (grupos == null)
            {
                throw new NegocioException("Grupos de usuário não encontrados");
            }

            var gruposNaoIncluidos = grupos.Where(x => !request.UsuarioCoreSSO.Grupos.Any(z => z.Equals(x)));

            if (gruposNaoIncluidos.Any())
            {
                await usuarioCoreSSORepositorio.IncluirUsuarioNosGrupos(request.UsuarioCoreSSO.UsuId, gruposNaoIncluidos);
            }

            return(default);
        public async Task <RetornoUsuarioCoreSSO> Handle(CriarUsuarioCoreSSOCommand request, CancellationToken cancellationToken)
        {
            var usuarios = await repositoryCoreSSO.ObterPorCPF(request.Usuario.Cpf);

            if (usuarios != null)
            {
                throw new NegocioException($"Já existe usuário com o CPF {request.Usuario.Cpf} na base do CoreSSO");
            }

            var usuarioId = await repositoryCoreSSO.Criar(request.Usuario);

            var grupos = await repositoryCoreSSO.SelecionarGrupos();

            await repositoryCoreSSO.IncluirUsuarioNosGrupos(usuarioId, grupos);

            return(await repositoryCoreSSO.ObterPorId(usuarioId));
        }
Esempio n. 3
0
        public async Task <RespostaApi> Handle(AutenticarUsuarioCommand request, CancellationToken cancellationToken)
        {
            bool primeiroAcesso = false;

            var validator = new AutenticarUsuarioUseCaseValidatior();
            var validacao = validator.Validate(request);

            if (!validacao.IsValid)
            {
                return(RespostaApi.Falha(validacao.Errors));
            }

            //verificar se o usuário está cadastrado no CoreSSO
            var usuarioCoreSSO = await mediator.Send(new ObterUsuarioCoreSSOQuery(request.Cpf));

            string senhaCriptografada = string.Empty;

            //se for primeiro acesso
            if (usuarioCoreSSO == null)
            {
                primeiroAcesso = true;
                var senha = Regex.Replace(request.Senha, @"\-\/", "");

                try
                {
                    request.DataNascimento = DateTime.ParseExact(senha, "ddMMyyyy", CultureInfo.InvariantCulture);
                }
                catch
                {
                    validacao.Errors.Add(new ValidationFailure("Usuário", "Data de nascimento inválida."));
                    return(RespostaApi.Falha(validacao.Errors));
                }
            }

            //buscar o usuario
            var usuarioRetorno = await _repository.ObterPorCpf(request.Cpf);

            //verificar se as senhas são iguais
            if (usuarioRetorno != null)
            {
                primeiroAcesso = usuarioRetorno.PrimeiroAcesso;

                if (!usuarioRetorno.PrimeiroAcesso)
                {
                    if (usuarioCoreSSO != null && (!Criptografia.EqualsSenha(request.Senha, usuarioCoreSSO.Senha, usuarioCoreSSO.TipoCriptografia)))
                    {
                        validacao.Errors.Add(new ValidationFailure("Usuário", "Usuário ou senha incorretos."));
                        return(RespostaApi.Falha(validacao.Errors));
                    }
                }
                else
                {
                    var senha = Regex.Replace(request.Senha, @"\-\/", "");

                    try
                    {
                        request.DataNascimento = DateTime.ParseExact(senha, "ddMMyyyy", CultureInfo.InvariantCulture);
                    }
                    catch
                    {
                        validacao.Errors.Add(new ValidationFailure("Usuário", "Data de nascimento inválida."));
                        return(RespostaApi.Falha(validacao.Errors));
                    }
                }
            }
            else
            {
                primeiroAcesso = true;
                var senha = Regex.Replace(request.Senha, @"\-\/", "");

                try
                {
                    request.DataNascimento = DateTime.ParseExact(senha, "ddMMyyyy", CultureInfo.InvariantCulture);
                }
                catch
                {
                    validacao.Errors.Add(new ValidationFailure("Usuário", "Data de nascimento inválida."));
                    return(RespostaApi.Falha(validacao.Errors));
                }
            }

            //selecionar alunos do responsável buscando apenas pelo cpf
            var usuarioAlunos = await _autenticacaoService.SelecionarAlunosResponsavel(request.Cpf);

            //caso nao tenha nenhum filho matriculado, retornar falha e inativá-lo no coresso
            if (usuarioAlunos == null || !usuarioAlunos.Any())
            {
                validacao.Errors.Add(new ValidationFailure("Usuário", "Este CPF não está relacionado como responsável de um aluno ativo na rede municipal."));
                ExcluiUsuarioSeExistir(request, usuarioRetorno);

                if (usuarioCoreSSO != null)
                {
                    await _repositoryCoreSSO.AlterarStatusUsuario(usuarioCoreSSO.UsuId, StatusUsuarioCoreSSO.Inativo);
                }

                return(RespostaApi.Falha(validacao.Errors));
            }

            //se for primeiro acesso, a senha validar se a senha inputada é alguma data de nascimento de algum aluno do responsável
            if (primeiroAcesso && (!usuarioAlunos.Any(w => w.DataNascimento == request.DataNascimento)))
            {
                validacao.Errors.Add(new ValidationFailure("Usuário", "Data de Nascimento inválida."));
                //ExcluiUsuarioSeExistir(request, usuarioRetorno);
                return(RespostaApi.Falha(validacao.Errors));
            }

            if (primeiroAcesso && (usuarioAlunos.Any(w => w.DataNascimento == request.DataNascimento && w.TipoSigilo == (int)AlunoTipoSigilo.Restricao)))
            {
                validacao.Errors.Add(new ValidationFailure("Usuário", "Usuário não cadastrado, qualquer dúvida procure a unidade escolar."));
                return(RespostaApi.Falha(validacao.Errors));
            }

            //necessário implementar unit of work para transacionar essas operações
            var grupos = await _repositoryCoreSSO.SelecionarGrupos();

            var usuarioParaSeBasear = usuarioAlunos
                                      .OrderByDescending(a => a.DataAtualizacao)
                                      .FirstOrDefault();

            primeiroAcesso = primeiroAcesso || !grupos.Any(x => usuarioCoreSSO.Grupos.Any(z => z.Equals(x)));

            //verificar se o usuário está incluído em todos os grupos
            if (usuarioCoreSSO != null && usuarioCoreSSO.Status == (int)StatusUsuarioCoreSSO.Inativo)
            {
                await _repositoryCoreSSO.AlterarStatusUsuario(usuarioCoreSSO.UsuId, StatusUsuarioCoreSSO.Ativo);
            }

            if (usuarioCoreSSO != null && usuarioCoreSSO.TipoCriptografia != TipoCriptografia.TripleDES)
            {
                senhaCriptografada = Criptografia.CriptografarSenhaTripleDES(request.Senha);
                await _repositoryCoreSSO.AtualizarCriptografiaUsuario(usuarioCoreSSO.UsuId, senhaCriptografada);
            }

            usuarioRetorno = await CriaUsuarioEhSeJaExistirAtualizaUltimoLogin(request, usuarioRetorno, usuarioParaSeBasear, primeiroAcesso);

            usuarioRetorno.PrimeiroAcesso = usuarioRetorno.PrimeiroAcesso || primeiroAcesso;

            var atualizarDadosCadastrais = VerificarAtualizacaoCadastral(usuarioParaSeBasear);


            return(MapearResposta(usuarioParaSeBasear, usuarioRetorno, primeiroAcesso, atualizarDadosCadastrais || primeiroAcesso));
        }