Exemplo n.º 1
0
        protected override async Task <ResultWithMetrologyProperties <Result> > DoRunAsync(Request request)
        {
            var current = await DbContext.Cards
                          .Include(c => c.CardLanguage)
                          .Include(c => c.TagsInCards)
                          .ThenInclude(t => t.Tag)
                          .Include(c => c.Images)
                          .ThenInclude(i => i.Image)
                          .SingleAsync(c => c.Id == request.CurrentCardId);

            var original = await DbContext.CardPreviousVersions
                           .Include(c => c.CardLanguage)
                           .Include(c => c.Tags)
                           .ThenInclude(t => t.Tag)
                           .Include(c => c.Images)
                           .ThenInclude(i => i.Image)
                           .SingleAsync(c => c.Id == request.OriginalVersionId);

            var result = new Result(current.VersionCreator.UserName, original.VersionCreator.UserName, current.VersionUtcDate, original.VersionUtcDate, current.VersionDescription, original.VersionDescription);

            if (current.FrontSide != original.FrontSide)
            {
                result = result with {
                    FrontSide = new(current.FrontSide, original.FrontSide)
                }
            }
            ;
            if (current.BackSide != original.BackSide)
            {
                result = result with {
                    BackSide = new(current.BackSide, original.BackSide)
                }
            }
            ;
            if (current.AdditionalInfo != original.AdditionalInfo)
            {
                result = result with {
                    AdditionalInfo = new(current.AdditionalInfo, original.AdditionalInfo)
                }
            }
            ;
            if (current.CardLanguage != original.CardLanguage)
            {
                result = result with {
                    Language = new(current.CardLanguage.Name, original.CardLanguage.Name)
                }
            }
            ;
            if (!Enumerable.SequenceEqual(current.TagsInCards.Select(t => t.Tag.Name).OrderBy(tagName => tagName), original.Tags.Select(t => t.Tag.Name).OrderBy(tagName => tagName)))
            {
                var currentTags  = string.Join(",", current.TagsInCards.Select(t => t.Tag.Name).OrderBy(tagName => tagName));
                var originalTags = string.Join(",", original.Tags.Select(t => t.Tag.Name).OrderBy(tagName => tagName));
                result = result with {
                    Tags = new(currentTags, originalTags)
                };
            }
            if (!CardVisibilityHelper.CardsHaveSameUsersWithView(current.UsersWithView, original.UsersWithView))
            {
                var currentUsers      = string.Join(",", current.UsersWithView.Select(u => u.User.UserName).OrderBy(userName => userName));
                var originalUserIds   = original.UsersWithView.Select(u => u.AllowedUserId).ToHashSet();
                var originalUserNames = DbContext.Users.Where(u => originalUserIds.Contains(u.Id)).Select(u => u.UserName);
                var originalUsers     = string.Join(",", originalUserNames.OrderBy(userName => userName));
                result = result with {
                    UsersWithView = new(currentUsers, originalUsers)
                };
            }
            if (!ComparisonHelper.SameSetOfGuid(current.Images.Where(i => i.CardSide == ImageInCard.FrontSide).Select(i => i.ImageId), original.Images.Where(i => i.CardSide == ImageInCard.FrontSide).Select(i => i.ImageId)))
            {
                var currentImages  = string.Join(",", current.Images.Where(i => i.CardSide == ImageInCard.FrontSide).Select(i => i.Image.Name).OrderBy(imageName => imageName));
                var originalImages = string.Join(",", original.Images.Where(i => i.CardSide == ImageInCard.FrontSide).Select(i => i.Image.Name).OrderBy(imageName => imageName));
                result = result with {
                    ImagesOnFrontSide = new(currentImages, originalImages)
                };
            }
            if (!ComparisonHelper.SameSetOfGuid(current.Images.Where(i => i.CardSide == ImageInCard.BackSide).Select(i => i.ImageId), original.Images.Where(i => i.CardSide == ImageInCard.BackSide).Select(i => i.ImageId)))
            {
                var currentImages  = string.Join(",", current.Images.Where(i => i.CardSide == ImageInCard.BackSide).Select(i => i.Image.Name).OrderBy(imageName => imageName));
                var originalImages = string.Join(",", original.Images.Where(i => i.CardSide == ImageInCard.BackSide).Select(i => i.Image.Name).OrderBy(imageName => imageName));
                result = result with {
                    ImagesOnBackSide = new(currentImages, originalImages)
                };
            }
            if (!ComparisonHelper.SameSetOfGuid(current.Images.Where(i => i.CardSide == ImageInCard.AdditionalInfo).Select(i => i.ImageId), original.Images.Where(i => i.CardSide == ImageInCard.AdditionalInfo).Select(i => i.ImageId)))
            {
                var currentImages  = string.Join(",", current.Images.Where(i => i.CardSide == ImageInCard.AdditionalInfo).Select(i => i.Image.Name).OrderBy(imageName => imageName));
                var originalImages = string.Join(",", original.Images.Where(i => i.CardSide == ImageInCard.AdditionalInfo).Select(i => i.Image.Name).OrderBy(imageName => imageName));
                result = result with {
                    ImagesOnAdditionalSide = new(currentImages, originalImages)
                };
            }
            return(new ResultWithMetrologyProperties <Result>(result, ("CurrentCardId", request.CurrentCardId.ToString()), ("OriginalVersionId", request.OriginalVersionId.ToString())));
        }