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)); }
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)); }