public async Task <IActionResult> CriarValidacaoUsuarioCandidato(CriarValidacaoUsuarioCandidatoInput input)
        {
            // Busca aluno por RMA ou Email
            var alunoDb = _alunoRepository.BuscarPorEmailouRMA(input.RmaouEmail);

            // Caso for nulo, não existe aluno
            if (alunoDb == null)
            {
                return(StatusCode(404, $"Não existe um aluno com estes dados."));
            }

            // Busca usuario por email para verificar se já existe algum candidato com este email
            var usuarioDb = _usuarioRepository.GetUsuarioByEmail(alunoDb.Email);

            if (usuarioDb != null)
            {
                return(StatusCode(400, "Já existe um usuário com este e-mail."));
            }

            // Busca referencia de aluno em algum usuarioCandidato
            var usuarioCandidatoDb = _usuarioCandidatoAlunoRepository.GetByAlunoId(alunoDb.Id);

            // Caso existir referencia, já existe usuário vinculado à este aluno
            if (usuarioCandidatoDb != null)
            {
                return(StatusCode(400, $"O aluno [{alunoDb.NomeCompleto}] já é vinculado à um usuário."));
            }

            // Caso aluno não tiver email, não será possível criar o cadastro
            if (string.IsNullOrEmpty(alunoDb.Email))
            {
                return(StatusCode(404, $"O aluno [{alunoDb.NomeCompleto}] não tem um e-mail cadastrado. Contate a administração do SENAI para atualizar seu cadastro, para assim ser possível o prosseguimento da criação de sua conta no SENAI Vagas."));
            }

            string token = "";

            ValidacaoUsuarioCandidato validacaoUsuario = null;

            try
            {
                // Verifica se já existe no BD uma validacao com o mesmo aluno existente
                var validacaoAntiga = _validacaoUsuarioCandidatoRepository.GetValidacaoUsuarioCandidatoAtualByAlunoId(alunoDb.Id);

                // Caso existir, altera para antiga
                if (validacaoAntiga != null)
                {
                    validacaoAntiga.AlterarParaInativo();
                    _validacaoUsuarioCandidatoRepository.UpdateValidacaoUsuarioCandidato(validacaoAntiga);
                }

                // Cria a nova validação
                token            = GenerationTokenUtil.TokenDefault();
                validacaoUsuario = new ValidacaoUsuarioCandidato(token, alunoDb.Id);
            }
            catch (Exception)
            {
                return(StatusCode(500, "Houve um erro interno ao criar a validação de usuário."));
            }

            // Cria validação de usuário no BD
            _validacaoUsuarioCandidatoRepository.Create(validacaoUsuario);

            // Envia email de verificação de usuário/aluno e valida se houver algum erro
            if (!sendEmailService.EmailVerificacaoCandidato(alunoDb.Email.ToLower(), alunoDb.NomeCompleto, token))
            {
                return(StatusCode(500, "Houve um erro interno ao enviar o email para validação de usuário."));
            }

            // Salva alterações no BD
            await _validacaoUsuarioCandidatoRepository.UnitOfWork.SaveDbChanges();

            return(StatusCode(200, $"Foi enviado ao email {alunoDb.Email} um link de validação de usuário / Aluno. O link é válido por 30 minutos."));
        }
        public async Task <IActionResult> SolicitacaoAlterarCredenciais(SolicitacaoAlterarCredenciaisInput input)
        {
            var usuarioDb = _usuarioRepository.GetUsuarioByEmail(input.EmailAtual);

            if (usuarioDb == null)
            {
                return(StatusCode(404, $"Não foi encontrado um usuário com o email [{input.EmailAtual}]."));
            }

            var alterarCredenciaisDb = _alterarCredenciaisRepository.GetAtualByUsuarioId(usuarioDb.Id);

            if (alterarCredenciaisDb != null)
            {
                alterarCredenciaisDb.AlterarParaInativo();
                _alterarCredenciaisRepository.UpdateAlterarCredenciais(alterarCredenciaisDb);
            }

            var token = GenerationTokenUtil.TokenDefault();

            AlterarCredenciais alterarCredenciais = null;

            try
            {
                if (string.IsNullOrEmpty(input.NovoEmail))
                {
                    alterarCredenciais = new AlterarCredenciais(token, usuarioDb.Id);
                }
                else
                {
                    alterarCredenciais = new AlterarCredenciais(token, input.NovoEmail, usuarioDb.Id);
                }
            }
            catch (Exception)
            {
                return(StatusCode(500, "Houve um erro interno ao criar o objeto AlterarCredenciais."));
            }

            _alterarCredenciaisRepository.Create(alterarCredenciais);

            string propAtualizada = string.IsNullOrEmpty(input.NovoEmail) == true ? "Senha" : "Email";

            string emailEnviado = string.IsNullOrEmpty(input.NovoEmail) == true ? usuarioDb.Email : input.NovoEmail;

            // Caso novo email não estiver vazio ou nulo, significa que o usuário deseja alterar seu email, caso contrário, deseja alterar sua senha
            if (!string.IsNullOrEmpty(input.NovoEmail))
            {
                // Envia email com link para alterar o email do usuário
                if (!sendEmailService.AlterarCredenciaisEmail(input.NovoEmail, usuarioDb.Nome, propAtualizada, token))
                {
                    return(StatusCode(500, "Houve um erro interno ao enviar o email para o usuário."));
                }
            }
            else
            {
                // Envia email com link para alterar a senha do usuário
                if (!sendEmailService.AlterarCredenciaisSenha(usuarioDb.Email, usuarioDb.Nome, propAtualizada, token))
                {
                    return(StatusCode(500, "Houve um erro interno ao enviar o email para o usuário."));
                }
            }

            await _alterarCredenciaisRepository.UnitOfWork.SaveDbChanges();

            return(StatusCode(200, $"Foi enviado ao email {emailEnviado} um link para alterar suas credenciais ({propAtualizada.ToLower()}). O link é válido por 30 minutos."));
        }