Esempio n. 1
0
            private ModuleDraft DeleteNonExisting(ModuleDraft module, List <ContractContent> contents)
            {
                foreach (var subject in module.Subjects)
                {
                    var requestIds = from content in contents
                                     where !string.IsNullOrEmpty(content.Id)
                                     select ObjectId.Parse(content.Id);

                    subject.Contents = subject.Contents.Where(
                        x => requestIds.Contains(x.Id)
                        ).ToList();
                }

                return(module);
            }
Esempio n. 2
0
            private async Task <ModuleDraft> CreateModuleDraft(
                Contract request, Module originalModule, CancellationToken token
                )
            {
                var moduleId = ObjectId.Parse(request.ModuleId);

                var module = ModuleDraft.Create(
                    moduleId, originalModule.Title, originalModule.Excerpt, originalModule.ImageUrl, originalModule.Published,
                    originalModule.InstructorId, originalModule.Instructor, originalModule.InstructorMiniBio, originalModule.InstructorImageUrl,
                    originalModule.Duration, originalModule.VideoDuration, originalModule.VideoUrl,
                    originalModule.CertificateUrl, originalModule.StoreUrl, originalModule.EcommerceUrl, false,
                    originalModule.Tags, originalModule.TutorsIds
                    ).Data;

                module.Subjects         = originalModule.Subjects;
                module.Requirements     = originalModule.Requirements;
                module.SupportMaterials = originalModule.SupportMaterials;

                await _db.ModuleDraftCollection.InsertOneAsync(
                    module, cancellationToken : token
                    );

                var dbModulesQuestionsQuery = _db.QuestionCollection
                                              .AsQueryable()
                                              .Where(q => q.ModuleId == moduleId);

                var dbModuleQuestions = await(
                    (IAsyncCursorSource <Question>)dbModulesQuestionsQuery
                    ).ToListAsync();

                if (dbModuleQuestions.Count > 0)
                {
                    var draftQuestions = dbModuleQuestions.Select(q =>
                                                                  QuestionDraft.Create(
                                                                      q.Id, module.Id,
                                                                      q.Text, q.Level, q.Duration,
                                                                      q.Concepts, q.Answers,
                                                                      q.ModuleId, q.SubjectId
                                                                      ).Data
                                                                  );

                    await _db.QuestionDraftCollection.InsertManyAsync(
                        draftQuestions, cancellationToken : token
                        );
                }

                return(module);
            }
Esempio n. 3
0
            private async Task <bool> UpdateCurrentModule(ObjectId userId, ModuleDraft draft, CancellationToken token)
            {
                var module = await _db.ModuleCollection.AsQueryable()
                             .Where(mod => mod.Id == draft.ModuleId)
                             .FirstOrDefaultAsync();

                if (module == null)
                {
                    return(false);
                }

                string config = _configuration[$"EcommerceIntegration:Active"];

                if (!draft.EcommerceId.HasValue && draft.CreateInEcommerce && config == "True")
                {
                    var response = await CreateEcommerceProduct(module);

                    string content = await response.Content.ReadAsStringAsync();

                    if (response.StatusCode == HttpStatusCode.Created)
                    {
                        var parsed = JObject.Parse(content);
                        module.EcommerceId = (long)parsed["product"]["id"];
                    }
                    else
                    {
                        var error = ErrorLog.Create(
                            ErrorLogTypeEnum.EcommerceIntegration,
                            "create-module", content
                            ).Data;

                        await _db.ErrorLogCollection.InsertOneAsync(
                            error, cancellationToken : token
                            );
                    }
                }

                var serializedModuleOldValues = JsonConvert.SerializeObject(new List <Module>
                {
                    module
                });

                module.Title              = draft.Title;
                module.Excerpt            = draft.Excerpt;
                module.ImageUrl           = draft.ImageUrl;
                module.Published          = draft.Published;
                module.InstructorId       = draft.InstructorId;
                module.ExtraInstructorIds = draft.ExtraInstructorIds;
                module.Instructor         = draft.Instructor;
                module.InstructorMiniBio  = draft.InstructorMiniBio;
                module.InstructorImageUrl = draft.InstructorImageUrl;
                module.Duration           = draft.Duration;
                module.VideoUrl           = draft.VideoUrl;
                module.VideoDuration      = draft.VideoDuration;
                module.CertificateUrl     = draft.CertificateUrl;
                module.StoreUrl           = draft.StoreUrl;
                module.EcommerceUrl       = draft.EcommerceUrl;
                module.Tags             = draft.Tags;
                module.TutorsIds        = draft.TutorsIds;
                module.Subjects         = draft.Subjects;
                module.Requirements     = draft.Requirements;
                module.SupportMaterials = draft.SupportMaterials;
                module.EcommerceId      = draft.EcommerceId;
                module.ModuleGradeType  = draft.ModuleGradeType;
                var listEcomerce = new List <EcommerceModule>();

                if (draft.EcommerceProducts != null && draft.EcommerceProducts.Count > 0)
                {
                    for (int i = 0; i < draft.EcommerceProducts.Count; i++)
                    {
                        var currentDraftProduct = draft.EcommerceProducts[i];
                        listEcomerce.Add(new EcommerceModule()
                        {
                            EcommerceId      = currentDraftProduct.EcommerceId,
                            UsersAmount      = currentDraftProduct.UsersAmount,
                            DisableEcommerce = currentDraftProduct.DisableEcommerce,
                            Price            = currentDraftProduct.Price,
                            DisableFreeTrial = currentDraftProduct.DisableFreeTrial,
                            LinkEcommerce    = currentDraftProduct.LinkEcommerce,
                            LinkProduct      = currentDraftProduct.LinkProduct,
                            Subject          = currentDraftProduct.Subject,
                            Hours            = currentDraftProduct.Hours
                        });
                    }
                }
                module.EcommerceProducts = listEcomerce;

                await _db.ModuleCollection.ReplaceOneAsync(t =>
                                                           t.Id == module.Id, module,
                                                           cancellationToken : token
                                                           );

                var newDraftList = new List <Module>
                {
                    module
                };

                var auditLog = AuditLog.Create(userId, module.Id, module.GetType().ToString(),
                                               JsonConvert.SerializeObject(newDraftList), EntityAction.Update, serializedModuleOldValues);
                await _db.AuditLogCollection.InsertOneAsync(auditLog);

                return(true);
            }
Esempio n. 4
0
            private async Task<ModuleDraft> CreateModuleDraft(ObjectId userId, Contract request, Module originalModule,
                Duration duration, Duration videoDuration, CancellationToken token
            ) {
                var tags = new List<Tag>();
                foreach (var tagStr in request.Tags)
                {
                    var tag = Tag.Create(tagStr);
                    tags.Add(tag.Data);
                }

                var tutorsIds = request.TutorsIds != null ?
                    request.TutorsIds.Select(x => ObjectId.Parse(x)).ToList() :
                    new List<ObjectId>();

                var instructorId = String.IsNullOrEmpty(request.InstructorId) ?
                    ObjectId.Empty : ObjectId.Parse(request.InstructorId);

                var extraInstructorIds = request.ExtraInstructorIds != null ?
                    request.ExtraInstructorIds.Select(x => ObjectId.Parse(x)).ToList() :
                    new List<ObjectId>();

                var moduleId = ObjectId.Parse(request.Id);

                var module = ModuleDraft.Create(
                    moduleId, request.Title, request.Excerpt, request.ImageUrl, request.Published,
                    instructorId, request.Instructor, request.InstructorMiniBio, request.InstructorImageUrl,
                    duration, videoDuration, request.VideoUrl, request.CertificateUrl, request.StoreUrl, request.EcommerceUrl,
                    request.CreateInEcommerce.HasValue ? request.CreateInEcommerce.Value : false,
                    tags, tutorsIds, extraInstructorIds, request.ModuleGradeType
                ).Data;

                module.Subjects = originalModule.Subjects;
                module.Requirements = originalModule.Requirements;
                module.SupportMaterials = originalModule.SupportMaterials;

                await _db.ModuleDraftCollection.InsertOneAsync(
                    module, cancellationToken: token
                );

                var creationLog = AuditLog.Create(userId, moduleId, module.GetType().ToString(),
                    JsonConvert.SerializeObject(module), EntityAction.Add);

                await _db.AuditLogCollection.InsertOneAsync(creationLog);

                var dbModuleQuestions = await _db.QuestionCollection.AsQueryable()
                    .Where(q => q.ModuleId == moduleId)
                    .ToListAsync();

                if (dbModuleQuestions.Count > 0)
                {
                    var draftQuestions = dbModuleQuestions.Select(q =>
                        QuestionDraft.Create(
                            q.Id, module.Id,
                            q.Text, q.Level, q.Duration,
                            q.Concepts, q.Answers,
                            q.ModuleId, q.SubjectId
                        ).Data
                    );

                    await _db.QuestionDraftCollection.InsertManyAsync(
                        draftQuestions, cancellationToken: token
                    );
                }

                return module;
            }
Esempio n. 5
0
            public async Task <Result <Contract> > Handle(Contract request, CancellationToken cancellationToken)
            {
                if (request.UserRole == "Secretary" || request.UserRole == "Recruiter")
                {
                    return(Result.Fail <Contract>("Acesso Negado"));
                }

                var mId    = ObjectId.Parse(request.ModuleId);
                var userId = ObjectId.Parse(request.UserId);

                var module = await _db.ModuleDraftCollection.AsQueryable()
                             .Where(x => (
                                        x.DeletedAt == null || x.DeletedAt == DateTimeOffset.MinValue
                                        ) && !x.DraftPublished && (
                                        x.Id == mId || x.ModuleId == mId
                                        )
                                    )
                             .FirstOrDefaultAsync(cancellationToken: cancellationToken);

                if (module == null)
                {
                    return(Result.Fail <Contract>("Módulo não Encontrado"));
                }

                if (request.UserRole == "Student")
                {
                    if (!ModuleDraft.IsInstructor(module, userId).Data)
                    {
                        return(Result.Fail <Contract>("Acesso Negado"));
                    }
                }

                var subject = module.Subjects.FirstOrDefault(x =>
                                                             x.Id == ObjectId.Parse(request.SubjectId)
                                                             );

                if (subject == null)
                {
                    return(Result.Fail <Contract>("Assunto não Encontrado"));
                }

                var answers = request.Answers.Select(x =>
                                                     new Answer(
                                                         x.Description, x.Points,
                                                         x.Concepts.Select(y => new AnswerConcept(y.Concept, y.IsRight)).ToList()
                                                         )
                                                     ).ToList();

                Result <QuestionDraft> newObject;

                if (!String.IsNullOrEmpty(request.QuestionId))
                {
                    var questionId = ObjectId.Parse(request.QuestionId);

                    newObject = QuestionDraft.Create(
                        questionId, module.Id, request.Text, request.Level, request.Duration,
                        request.Concepts, answers, module.ModuleId, ObjectId.Parse(request.SubjectId)
                        );
                }
                else
                {
                    newObject = QuestionDraft.Create(
                        module.Id, request.Text, request.Level, request.Duration,
                        request.Concepts, answers, module.ModuleId, ObjectId.Parse(request.SubjectId)
                        );
                }

                if (newObject.IsFailure)
                {
                    return(Result.Fail <Contract>(newObject.Error));
                }

                var newQuestion     = newObject.Data;
                var newQuestionList = new List <QuestionDraft>
                {
                    newQuestion
                };


                if (string.IsNullOrEmpty(request.Id))
                {
                    await _db.QuestionDraftCollection.InsertOneAsync(
                        newQuestion,
                        cancellationToken : cancellationToken
                        );

                    request.Id = newQuestion.Id.ToString();

                    var creationLog = AuditLog.Create(userId, mId, newQuestionList[0].GetType().ToString(),
                                                      JsonConvert.SerializeObject(newQuestionList), EntityAction.Add);

                    await _db.AuditLogCollection.InsertOneAsync(creationLog);
                }
                else
                {
                    var question = await _db.QuestionDraftCollection
                                   .AsQueryable()
                                   .Where(x => x.Id == ObjectId.Parse(request.Id))
                                   .FirstOrDefaultAsync(cancellationToken: cancellationToken);

                    if (question == null)
                    {
                        return(Result.Fail <Contract>("Questão não Encontrada"));
                    }

                    var oldQuestionList = new List <QuestionDraft>
                    {
                        question
                    };
                    var oldValues = JsonConvert.SerializeObject(oldQuestionList);

                    question.ModuleId  = newQuestion.ModuleId;
                    question.SubjectId = newQuestion.SubjectId;
                    question.Concepts  = newQuestion.Concepts;
                    question.Answers   = newQuestion.Answers;
                    question.Duration  = newQuestion.Duration;
                    question.Level     = newQuestion.Level;
                    question.Text      = newQuestion.Text;
                    question.UpdatedAt = DateTimeOffset.UtcNow;

                    await _db.QuestionDraftCollection.ReplaceOneAsync(t =>
                                                                      t.Id == question.Id, question,
                                                                      cancellationToken : cancellationToken
                                                                      );

                    var changeLog = AuditLog.Create(userId, mId, newQuestionList[0].GetType().ToString(),
                                                    JsonConvert.SerializeObject(newQuestionList), EntityAction.Update, oldValues);

                    await _db.AuditLogCollection.InsertOneAsync(changeLog);
                }

                return(Result.Ok(request));
            }
Esempio n. 6
0
            public async Task <Result> Handle(Contract request, CancellationToken cancellationToken)
            {
                if (request.UserRole != "Admin" && request.UserRole != "Author")
                {
                    return(Result.Fail("Acesso Negado"));
                }

                var userId  = ObjectId.Parse(request.UserId);
                var draftId = ObjectId.Parse(request.ModuleId);

                var module = await _db.ModuleDraftCollection.AsQueryable()
                             .Where(x => (
                                        x.DeletedAt == null || x.DeletedAt == DateTimeOffset.MinValue
                                        ) && !x.DraftPublished && (
                                        x.Id == draftId || x.ModuleId == draftId
                                        )
                                    )
                             .FirstOrDefaultAsync();

                if (module == null)
                {
                    return(Result.Fail("Rascunho de Módulo não encontrado"));
                }


                if (module.CreatedBy != userId)
                {
                    return(Result.Fail("Você não tem permissão de excluir o módulo selecionado."));
                }

                if (request.UserRole == "Student")
                {
                    if (!ModuleDraft.IsInstructor(module, userId).Data)
                    {
                        return(Result.Fail("Acesso Negado"));
                    }
                }

                module.DeletedBy = ObjectId.Parse(request.UserId);
                module.DeletedAt = DateTimeOffset.Now;

                await _db.ModuleDraftCollection.ReplaceOneAsync(t =>
                                                                t.Id == module.Id, module,
                                                                cancellationToken : cancellationToken
                                                                );

                var oldDraftList = new List <ModuleDraft>
                {
                    module
                };

                var changeLog = AuditLog.Create(userId, draftId, module.GetType().ToString(),
                                                "", EntityAction.Delete, JsonConvert.SerializeObject(oldDraftList));

                await _db.AuditLogCollection.InsertOneAsync(changeLog);

                var questionDrafts = await _db.QuestionDraftCollection.AsQueryable()
                                     .Where(d => d.ModuleId == module.ModuleId && !d.DraftPublished)
                                     .ToListAsync();

                if (questionDrafts.Count > 0)
                {
                    var update = Builders <QuestionDraft> .Update
                                 .Set(d => d.DeletedAt, DateTimeOffset.Now)
                                 .Set(d => d.DeletedBy, ObjectId.Parse(request.UserId));

                    var ids = questionDrafts.Select(x => x.Id).ToArray();

                    await _db.QuestionDraftCollection.UpdateManyAsync(x =>
                                                                      ids.Contains(x.Id), update,
                                                                      cancellationToken : cancellationToken
                                                                      );
                }

                return(Result.Ok());
            }