예제 #1
0
        public virtual ThumbnailOptionEntity FromModel(ThumbnailOption option, PrimaryKeyResolvingMap pkMap)
        {
            if (option == null)
            {
                throw new ArgumentNullException(nameof(option));
            }

            pkMap.AddPair(option, this);

            Id              = option.Id;
            Name            = option.Name;
            FileSuffix      = option.FileSuffix;
            ResizeMethod    = option.ResizeMethod.ToString();
            Width           = option.Width;
            Height          = option.Height;
            BackgroundColor = option.BackgroundColor;
            AnchorPosition  = option.AnchorPosition.ToString();
            JpegQuality     = option.JpegQuality.ToString();
            CreatedBy       = option.CreatedBy;
            CreatedDate     = option.CreatedDate;
            ModifiedBy      = option.ModifiedBy;
            ModifiedDate    = option.ModifiedDate;

            return(this);
        }
        private ThumbnailOption Create(JObject jObject)
        {
            ResizeMethod resultResizeMethod = default(ResizeMethod);
            var          resizeMethod       = jObject["method"];

            if (resizeMethod != null)
            {
                Enum.TryParse(resizeMethod.Value <string>(), out resultResizeMethod);
            }

            AnchorPosition resultAnchorPosition = default(AnchorPosition);
            var            anchorPosition       = jObject["anchorposition"];

            if (anchorPosition != null)
            {
                Enum.TryParse(anchorPosition.Value <string>(), out resultAnchorPosition);
            }

            var result = new ThumbnailOption()
            {
                BackgroundColor = jObject["color"]?.Value <string>(),
                FileSuffix      = jObject["alias"]?.Value <string>(),
                Width           = jObject["width"]?.Value <int>(),
                Height          = jObject["height"]?.Value <int>(),
                AnchorPosition  = resultAnchorPosition,
                ResizeMethod    = resultResizeMethod
            };

            return(result);
        }
예제 #3
0
        /// <summary>
        ///Generates a Thumbnail
        /// </summary>
        /// <param name="image"></param>
        /// <param name="option"></param>
        /// <returns></returns>
        protected virtual Image GenerateThumbnail(Image image, ThumbnailOption option)
        {
            var height = option.Height ?? image.Height;
            var width  = option.Width ?? image.Width;
            var color  = ColorTranslator.FromHtml(option.BackgroundColor);

            Image thumbnail = null;

            switch (option.ResizeMethod)
            {
            case ResizeMethod.FixedSize:
                thumbnail = ImageResizer.FixedSize(image, width, height, color);
                break;

            case ResizeMethod.FixedWidth:
                thumbnail = ImageResizer.FixedWidth(image, width, color);
                break;

            case ResizeMethod.FixedHeight:
                thumbnail = ImageResizer.FixedHeight(image, height, color);
                break;

            case ResizeMethod.Crop:
                thumbnail = ImageResizer.Crop(image, width, height, option.AnchorPosition);
                break;
            }
            return(thumbnail);
        }
        public virtual ThumbnailTaskOptionEntity FromModel(ThumbnailOption option, ThumbnailTask task)
        {
            var result = new ThumbnailTaskOptionEntity();

            result.ThumbnailTaskId   = task.Id;
            result.ThumbnailOptionId = option.Id;
            return(result);
        }
예제 #5
0
        public async Task GetNextChangesBatch_TasksWithDifferentWorkPathAndOptions_UseDifferentValues()
        {
            // Arrange
            var blobContents = new List <BlobEntry>()
            {
                new BlobInfo()
                {
                    Name = "Blob1.png",
                    Url  = "testPath1/Blob1.png",
                },
                new BlobInfo()
                {
                    Name = "Blob2.png",
                    Url  = "testPath2/Blob2.png",
                },
            };
            var changesProvider = GetBlobImagesChangesProvider(blobContents);
            var thumbnailOption = new ThumbnailOption()
            {
                FileSuffix = OptionSuffix
            };
            var task1 = new ThumbnailTask()
            {
                Id               = Guid.NewGuid().ToString(),
                LastRun          = null,
                WorkPath         = "testPath1",
                ThumbnailOptions = new List <ThumbnailOption>()
                {
                    thumbnailOption
                },
            };
            var task2 = new ThumbnailTask()
            {
                Id               = Guid.NewGuid().ToString(),
                LastRun          = null,
                WorkPath         = "testPath2",
                ThumbnailOptions = new List <ThumbnailOption>()
                {
                    thumbnailOption
                },
            };
            var cancellationToken = new CancellationTokenWrapper(new CancellationToken());

            // Act
            var changes1 = await changesProvider.GetNextChangesBatch(task1, null, 0, 10, cancellationToken);

            var changes2 = await changesProvider.GetNextChangesBatch(task2, null, 0, 10, cancellationToken);

            //Assert
            StorageProviderMock.Verify(x => x.SearchAsync(It.IsAny <string>(), It.IsAny <string>()), Times.Exactly(2));

            Assert.Collection(changes1, x => Assert.Equal("Blob1.png", x.Name));
            Assert.Collection(changes2, x => Assert.Equal("Blob2.png", x.Name));
        }
예제 #6
0
        public async Task GetNextChangesBatch_TasksWithOneWorkPathAndOptions_CacheIsWorking()
        {
            // Arrange
            var blobContents = new List <BlobEntry>()
            {
                new BlobInfo()
                {
                    Name = "Blob1.png",
                    Url  = "testPath/Blob1.png",
                },
            };
            var changesProvider = GetBlobImagesChangesProvider(blobContents);
            var thumbnailOption = new ThumbnailOption()
            {
                FileSuffix = OptionSuffix
            };
            var workPath = "testPath";
            var task1    = new ThumbnailTask()
            {
                Id               = Guid.NewGuid().ToString(),
                LastRun          = null,
                WorkPath         = workPath,
                ThumbnailOptions = new List <ThumbnailOption>()
                {
                    thumbnailOption
                },
            };
            var task2 = new ThumbnailTask()
            {
                Id               = Guid.NewGuid().ToString(),
                LastRun          = null,
                WorkPath         = workPath,
                ThumbnailOptions = new List <ThumbnailOption>()
                {
                    thumbnailOption
                },
            };
            var cancellationToken = new CancellationTokenWrapper(new CancellationToken());

            // Act
            var changes1 = await changesProvider.GetNextChangesBatch(task1, null, 0, 10, cancellationToken);

            var changes2 = await changesProvider.GetNextChangesBatch(task2, null, 0, 10, cancellationToken);

            //Assert
            StorageProviderMock.Verify(x => x.SearchAsync(It.IsAny <string>(), It.IsAny <string>()), Times.Once);

            Assert.Single(changes1);
            Assert.Single(changes2);
            for (var i = 0; i < changes1.Length; i++)
            {
                Assert.Same(changes1[i], changes2[i]);
            }
        }
예제 #7
0
        public virtual async Task <GenericSearchResult <ThumbnailOption> > SearchAsync(ThumbnailOptionSearchCriteria criteria)
        {
            using (var repository = ThumbnailRepositoryFactory())
            {
                var sortInfos = criteria.SortInfos;
                if (sortInfos.IsNullOrEmpty())
                {
                    sortInfos = new[]
                    {
                        new SortInfo
                        {
                            SortColumn = ReflectionUtility.GetPropertyName <ThumbnailTask>(t => t.CreatedDate), SortDirection = SortDirection.Descending
                        }
                    }
                }
                ;

                var query      = repository.ThumbnailOptions.OrderBySortInfos(sortInfos);
                var totalCount = await query.CountAsync();

                var results = new ThumbnailOption[0];

                if (criteria.Take > 0)
                {
                    var ids = await query.Skip(criteria.Skip).Take(criteria.Take).Select(x => x.Id).ToArrayAsync();

                    var thumbnailOptions = await repository.GetThumbnailOptionsByIdsAsync(ids);

                    results = thumbnailOptions.Select(t => t.ToModel(AbstractTypeFactory <ThumbnailOption> .TryCreateInstance())).ToArray();
                }

                var retVal = new GenericSearchResult <ThumbnailOption>
                {
                    TotalCount = totalCount,
                    Results    = results.AsQueryable().OrderBySortInfos(sortInfos).ToList()
                };

                return(retVal);
            }
        }
    }
예제 #8
0
        public async Task GetNextChangesBatch_TasksWithOneWorkPathAndOptions_CacheIsWorkingWithGetTotalChangesCount()
        {
            // Arrange
            var blobContents = new List <BlobEntry>()
            {
                new BlobInfo()
                {
                    Name = "Blob1.png",
                    Url  = "testPath/Blob1.png",
                },
            };
            var changesProvider = GetBlobImagesChangesProvider(blobContents);
            var thumbnailOption = new ThumbnailOption()
            {
                FileSuffix = OptionSuffix
            };
            var workPath = "testPath";
            var task     = new ThumbnailTask()
            {
                Id               = Guid.NewGuid().ToString(),
                LastRun          = null,
                WorkPath         = workPath,
                ThumbnailOptions = new List <ThumbnailOption>()
                {
                    thumbnailOption
                },
            };
            var cancellationToken = new CancellationTokenWrapper(new CancellationToken());

            // Act
            var changes = await changesProvider.GetNextChangesBatch(task, null, 0, 10, cancellationToken);

            var count = await changesProvider.GetTotalChangesCount(task, null, cancellationToken);

            //Assert
            StorageProviderMock.Verify(x => x.SearchAsync(It.IsAny <string>(), It.IsAny <string>()), Times.Once);

            Assert.Collection(changes, x => Assert.Equal("Blob1.png", x.Name));
            Assert.Equal(1, count);
        }
예제 #9
0
        public async Task ProcessTasksAsync_BlobChangesProviderCache_ExpiredAfterExecution()
        {
            // Arrange
            var blobContents = new List <BlobEntry>()
            {
                new BlobInfo()
                {
                    Name = "Blob1.png",
                    Url  = "testPath/Blob1.png",
                },
            };
            var imageChangesProvider         = GetBlobImagesChangesProvider(blobContents);
            var thumbnailGenerationProcessor = new ThumbnailGenerationProcessor(_generator.Object, _settingsManager.Object, imageChangesProvider);

            var thumbnailOption = new ThumbnailOption()
            {
                FileSuffix = OptionSuffix
            };
            var workPath = "testPath";
            var task1    = new ThumbnailTask()
            {
                Id               = Guid.NewGuid().ToString(),
                LastRun          = null,
                WorkPath         = workPath,
                ThumbnailOptions = new List <ThumbnailOption>()
                {
                    thumbnailOption
                },
            };
            var cancellationToken = new CancellationTokenWrapper(new CancellationToken());

            // Act

            await thumbnailGenerationProcessor.ProcessTasksAsync(new[] { task1 }, false, x => { }, cancellationToken);

            await thumbnailGenerationProcessor.ProcessTasksAsync(new[] { task1 }, false, x => { }, cancellationToken);

            //Assert
            StorageProviderMock.Verify(x => x.SearchAsync(It.IsAny <string>(), It.IsAny <string>()), Times.Exactly(2));
        }
예제 #10
0
        public virtual ThumbnailOption ToModel(ThumbnailOption option)
        {
            if (option == null)
            {
                throw new ArgumentNullException(nameof(option));
            }

            option.Id              = Id;
            option.Name            = Name;
            option.FileSuffix      = FileSuffix;
            option.ResizeMethod    = EnumUtility.SafeParse(this.ResizeMethod, Core.Models.ResizeMethod.Crop);
            option.AnchorPosition  = EnumUtility.SafeParse(this.AnchorPosition, Core.Models.AnchorPosition.Center);
            option.Width           = Width;
            option.Height          = Height;
            option.BackgroundColor = BackgroundColor;
            option.CreatedBy       = CreatedBy;
            option.CreatedDate     = CreatedDate;
            option.ModifiedBy      = ModifiedBy;
            option.ModifiedDate    = ModifiedDate;

            return(option);
        }
예제 #11
0
        /// <summary>
        ///Generates a Thumbnail
        /// </summary>
        /// <param name="image"></param>
        /// <param name="option"></param>
        /// <returns></returns>
        protected virtual Image <Rgba32> GenerateThumbnail(Image <Rgba32> image, ThumbnailOption option)
        {
            var height = option.Height ?? image.Height;
            var width  = option.Width ?? image.Width;

            var color = Rgba32.Transparent;

            if (!string.IsNullOrWhiteSpace(option.BackgroundColor))
            {
                color = Rgba32.FromHex(option.BackgroundColor);
            }

            Image <Rgba32> result;

            switch (option.ResizeMethod)
            {
            case ResizeMethod.FixedSize:
                result = _imageResizer.FixedSize(image, width, height, color);
                break;

            case ResizeMethod.FixedWidth:
                result = _imageResizer.FixedWidth(image, width, color);
                break;

            case ResizeMethod.FixedHeight:
                result = _imageResizer.FixedHeight(image, height, color);
                break;

            case ResizeMethod.Crop:
                result = _imageResizer.Crop(image, width, height, option.AnchorPosition);
                break;

            default:
                throw new ArgumentOutOfRangeException($"ResizeMethod {option.ResizeMethod.ToString()} not supported.");
            }

            return(result);
        }
예제 #12
0
        public async Task <ActionResult> UpdateThumbnailOption([FromBody] ThumbnailOption option)
        {
            await _thumbnailOptionService.SaveOrUpdateAsync(new[] { option });

            return(Ok());
        }
예제 #13
0
 protected override void InitOption()
 {
     if (_opetion == null) _opetion = new ThumbnailOption();
 }
예제 #14
0
 public IHttpActionResult Create(ThumbnailOption option)
 {
     _thumbnailOptionService.SaveOrUpdate(new[] { option });
     return(Ok(option));
 }
예제 #15
0
 public IHttpActionResult Update(ThumbnailOption option)
 {
     _thumbnailOptionService.SaveOrUpdate(new[] { option });
     return(StatusCode(HttpStatusCode.NoContent));
 }