Пример #1
0
            public async Task <ExamDTOEnvelope> Handle(Request request, CancellationToken cancellationToken)
            {
                var tags = await context.SaveTagsAsync(request.Exam.Tags ?? Enumerable.Empty <string>(), cancellationToken);

                var exam = mapper.Map <ExamData, Domain.Exam>(request.Exam);

                exam.UserId = this.currentUserAccessor.GetCurrentUserId();
                var utcNow = DateTime.UtcNow;

                exam.CreatedAt = utcNow;
                exam.UpdatedAt = utcNow;

                await this.context.Exams.AddAsync(exam, cancellationToken);

                await context.ExamTags.AddRangeAsync(tags.Select(tag => new Domain.ExamTag()
                {
                    Exam = exam,
                    Tag  = tag
                }), cancellationToken);

                await context.SaveChangesAsync(cancellationToken);

                var examDto = mapper.Map <Domain.Exam, ExamDTO>(exam);

                return(new ExamDTOEnvelope(examDto));
            }
Пример #2
0
            public async Task <ExamDTOEnvelope> Handle(Request request, CancellationToken cancellationToken)
            {
                var userId   = currentUserAccessor.GetCurrentUserId();
                var examData = request.Exam;
                var exam     = await context.Exams.NotPublishedByIdAndUserId(request.Id, userId)
                               .IncludeTags()
                               .FirstOrDefaultAsync(cancellationToken);

                if (exam == null)
                {
                    throw new Exceptions.ExamNotFoundException();
                }

                exam.Title          = examData.Title ?? exam.Title;
                exam.Description    = examData.Description ?? exam.Description;
                exam.TimeInMinutes  = examData.TimeInMinutes ?? exam.TimeInMinutes;
                exam.PassPercentage = examData.PassPercentage ?? exam.PassPercentage;
                exam.IsPrivate      = examData.IsPrivate ?? exam.IsPrivate;
                var examTagsToAdd    = Array.Empty <Domain.ExamTag>();
                var examTagsToDelete = Array.Empty <Domain.ExamTag>();

                if (request.Exam.Tags != null)
                {
                    var tags = await context.SaveTagsAsync(request.Exam.Tags ?? Enumerable.Empty <string>(), cancellationToken);

                    var examTags = exam.ExamTags;
                    examTagsToDelete = examTags.Where(et => !tags.Any(t => t.TagId == et.TagId)).ToArray();
                    examTagsToAdd    = tags.Where(t => !examTags.Any(et => et.TagId == t.TagId))
                                       .Select(t => new Domain.ExamTag()
                    {
                        Tag = t, TagId = t.TagId, Exam = exam, ExamId = exam.Id
                    }).ToArray();
                }

                if (context.IsModified(exam) || examTagsToAdd.Length > 0 || examTagsToDelete.Length > 0)
                {
                    exam.UpdatedAt = DateTime.UtcNow;
                }

                await context.ExamTags.AddRangeAsync(examTagsToAdd, cancellationToken);

                context.ExamTags.RemoveRange(examTagsToDelete);

                await context.SaveChangesAsync(cancellationToken);

                var examDto = mapper.Map <Domain.Exam, ExamDTO>(exam);

                return(new ExamDTOEnvelope(examDto));
            }