private GetEnrolmentsByUserIdResponse SendDisciplina(InternalMoodleData moodleData)
        {
            Enrol(moodleData);
            GetEnrolmentsByUserIdResponse response = GetUserEnrolment(moodleData);

            return(response);
        }
        private void Enrol(InternalMoodleData data)
        {
            EnrolmentClient client = EnrolmentClient;

            BuildMoodleClient(client, MoodleTokenType.OfficialMoodleApiFunctions);

            EnrolmentRequest request = new EnrolmentRequest()
            {
                CourseId = data.MoodleCourseId,
                UserId   = data.MoodleUserId,
                RoleId   = Constantes.ROLEID_PROFESSOR
            };

            Task <EmptyResponse> task = client.Post(request);

            task.Wait();

            LastUrl = client.LastUrl;
        }
        private GetEnrolmentsByUserIdResponse GetUserEnrolment(InternalMoodleData moodleData)
        {
            GetEnrolementsrByUserIdClient client = GetEnrolementsrByUserIdClient;

            BuildMoodleClient(client, MoodleTokenType.LocalMoodleExternalApiGetInfoToken);

            GetEnrolmentsByUserIdRequest request = new GetEnrolmentsByUserIdRequest()
            {
                UserId     = moodleData.MoodleUserId,
                CategoryId = moodleData.MoodleCategoryId,
                CourseId   = moodleData.MoodleCourseId,
                RoleId     = Constantes.ROLEID_ALUNO
            };

            Task <GetEnrolmentsByUserIdResponse> task = client.Post(request);

            task.Wait();

            GetEnrolmentsByUserIdResponse response = task.Result;

            return(response);
        }
        protected void ProcessDisciplina(Professor professor, Disciplina disciplina, AbstractMoodleServiceClient createClient, AbstractMoodleServiceClient verifyClient)
        {
            disciplina.DisciplinaNome = disciplina.GetNomeDisciplina(Configuration, ModalidadeAtual);
            disciplina.ShortName      = disciplina.GetShortNameDisciplina(Configuration, ModalidadeAtual);

            try
            {
                InternalMoodleData            moodleData = VerifyIfExistsOnMoodleAndCreateIfDont(professor, disciplina);
                GetEnrolmentsByUserIdResponse response   = null;

                if (moodleData?.MoodleCategoryId > 0 && moodleData?.MoodleCourseId > 0 && moodleData?.MoodleUserId > 0)
                {
                    response = SendDisciplina(moodleData);
                }

                ProfessorDisciplinaImportedResult <ProfessorDisciplinaViewModel, GetEnrolmentsByUserIdResponse> importedResult =
                    new ProfessorDisciplinaImportedResult <ProfessorDisciplinaViewModel, GetEnrolmentsByUserIdResponse>()
                {
                    Date       = DateTime.Now,
                    Url        = LastUrl,
                    Professor  = professor,
                    Disciplina = disciplina,
                    Result     = response
                };

                Result.ImportedSuccessfully.Enqueue(importedResult);
                Log($"Disciplina [{disciplina.DisciplinaNome}] do professor [{professor.ProfessorCpf} | {professor.ProfessorNome}] adicionada.");
            }
            catch (MoodleDataNotExistsException mex)
            {
                var reason = new ProfessorDisciplinaNotImportedReason <ProfessorDisciplinaViewModel>()
                {
                    Url        = LastUrl,
                    Professor  = professor,
                    Disciplina = disciplina,
                    Reason     = mex.Message
                };

                Result.NotImported.Enqueue(reason);
                Log(reason.Reason);
            }
            catch (AggregateException agex)
            {
                var exception = agex.InnerExceptions[0];

                var reason = new ProfessorDisciplinaNotImportedReason <ProfessorDisciplinaViewModel>()
                {
                    Url        = LastUrl,
                    Professor  = professor,
                    Disciplina = disciplina,
                    Exception  = exception,
                    Reason     = exception.Message
                };

                Result.NotImported.Enqueue(reason);
                Log(reason.Reason);
            }
            catch (Exception ex)
            {
                var reason = new ProfessorDisciplinaNotImportedReason <ProfessorDisciplinaViewModel>()
                {
                    Url        = LastUrl,
                    Professor  = professor,
                    Disciplina = disciplina,
                    Exception  = ex,
                    Reason     = ex.Message
                };

                Result.NotImported.Enqueue(reason);
                Log(reason.Reason);
            }
        }
        protected void ProcessDisciplina(Aluno aluno, Disciplina disciplina, AbstractMoodleServiceClient createClient, AbstractMoodleServiceClient verifyClient)
        {
            if (disciplina?.IdDisciplina == 0 || string.IsNullOrEmpty(disciplina?.DisciplinaNome))
            {
                return;
            }

            disciplina.DisciplinaNome = disciplina.GetNomeDisciplina(Configuration, ModalidadeAtual);
            disciplina.ShortName      = disciplina.GetShortNameDisciplina(Configuration, ModalidadeAtual);

            try
            {
                InternalMoodleData            moodleData = VerifyIfExistsOnMoodleAndCreateIfDont(aluno, disciplina);
                GetEnrolmentsByUserIdResponse response   = null;

                if (moodleData?.MoodleCategoryId > 0 && moodleData?.MoodleCourseId > 0 && moodleData?.MoodleUserId > 0)
                {
                    response = SendDisciplina(moodleData);
                }

                AlunoDisciplinaImportedResult <AlunoDisciplinaViewModel, GetEnrolmentsByUserIdResponse> importedResult =
                    new AlunoDisciplinaImportedResult <AlunoDisciplinaViewModel, GetEnrolmentsByUserIdResponse>()
                {
                    Date       = DateTime.Now,
                    Aluno      = aluno,
                    Disciplina = disciplina,
                    Url        = LastUrl,
                    Result     = response
                };

                Result.ImportedSuccessfully.Enqueue(importedResult);
                Log($"Disciplina {disciplina.DisciplinaNome} do aluno {aluno.AlunoNomeSocial ?? aluno.AlunoNome} adicionada.");
            }
            catch (MoodleDataNotExistsException mex)
            {
                var reason = new AlunoDisciplinaNotImportedReason <AlunoDisciplinaViewModel>()
                {
                    Url        = LastUrl,
                    Aluno      = aluno,
                    Disciplina = disciplina,
                    Reason     = mex.Message
                };

                Result.NotImported.Enqueue(reason);
                Log($"Disciplina {disciplina.DisciplinaNome} não adicionada. {reason.Reason}");
            }
            catch (AggregateException agex)
            {
                var exception = agex.InnerExceptions[0];

                var reason = new AlunoDisciplinaNotImportedReason <AlunoDisciplinaViewModel>()
                {
                    Url        = LastUrl,
                    Aluno      = aluno,
                    Disciplina = disciplina,
                    Exception  = exception,
                    Reason     = exception.Message
                };

                Result.NotImported.Enqueue(reason);

                if (exception is MoodleResponseException moodleEx)
                {
                    Log($"Disciplina {disciplina.DisciplinaNome} não adicionada. {moodleEx.RawMoodleError}");
                }
                else
                {
                    Log($"Disciplina {disciplina.DisciplinaNome} não adicionada. {reason.Reason}");
                }
            }
            catch (Exception ex)
            {
                var reason = new AlunoDisciplinaNotImportedReason <AlunoDisciplinaViewModel>()
                {
                    Url        = LastUrl,
                    Aluno      = aluno,
                    Disciplina = disciplina,
                    Exception  = ex,
                    Reason     = ex.Message
                };

                Result.NotImported.Enqueue(reason);
                Log($"Disciplina {disciplina.DisciplinaNome} não adicionada. {reason.Reason}");
            }
        }