private async Task ProcessFile(BlueprintFile blueprintFile)
        {
            _logger.LogInformation($"Call to {nameof(ProcessFile)} with Id: {blueprintFile.Id}");

            // Delay 100ms to avoid blocking at the method "ReadImage"
            await Task.Delay(100);

            try
            {
                _logger.LogInformation($"Reading image {blueprintFile.FilePath} ...");
                FileStream fileStream = _imageService.ReadImage(blueprintFile.FilePath);
                if (fileStream != null)
                {
                    using (fileStream)
                    {
                        string fileExtension = blueprintFile.Extension.Contains(".") ? blueprintFile.Extension.ToLower() : $".{blueprintFile.Extension.ToLower()}";
                        (int height, int width)dimentions = await _imageService.GetImageDimentions(fileStream, fileExtension, CancellationToken.None);

                        _logger.LogInformation($"Saving dimentions info for ImgId: {blueprintFile.Id} - {blueprintFile.OriginalFileName} with width/height: {dimentions.width}/{dimentions.height} ...");
                        var          connection  = _sqlConnectionFactory.GetNewConnection();
                        const string updateQuery = @"UPDATE [dbo].[BlueprintFile] SET Width = @Width, Height=@Height WHERE Id = @Id";
                        await connection.ExecuteAsync(updateQuery, new { Width = dimentions.width, Height = dimentions.height, blueprintFile.Id });

                        connection.Dispose();
                        _logger.LogInformation($"Update successfully for ImgId: {blueprintFile.Id}.");
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"Failed {nameof(ProcessFile)} with ImgId: {blueprintFile.Id}");
            }
        }
Exemple #2
0
        /// <summary>
        /// Processes for PreGenerator.
        /// </summary>
        /// <returns>Task.</returns>
        public async Task Process()
        {
            _logger.LogInformation($"Call to {nameof(Process)}");

            List <string> supportFiles = new List <string>()
            {
                "jpg", "jpeg", "tif", "gif", "jfif", "webp", "png"
            };
            List <string> supportFileTypes = new List <string>()
            {
                "Product", "Service", "Collection"
            };
            int minWidth  = GetMinWidth();
            int minHeight = GetMinHeight();

            // Clean up existing resized images data
            List <BlueprintFile> cleanUpFiles = await _fileRepository.FindByAsync(f => f.OriginalId != null);

            if (cleanUpFiles != null)
            {
                _logger.LogInformation($"Total items for cleaning up: {cleanUpFiles.Count}");

                for (int i = 0; i *PageSize <= cleanUpFiles.Count; i++)
                {
                    _logger.LogInformation($"Start ProcessCleanUpDataWithPageSize with PageIndex: {i}, PageSize: {PageSize}");
                    await ProcessCleanUpDataWithPageSize(cleanUpFiles.Skip(i * PageSize).Take(PageSize).ToList());
                }
            }

            // Start re-generating resized images data
            var          connection = _sqlConnectionFactory.GetNewConnection();
            const string query      = @"SELECT * FROM BlueprintFile f WHERE f.OriginalId IS NULL
                                    AND f.Width IS NOT NULL
                                    AND f.Height IS NOT NULL
                                    AND (f.Width >= @MinWidth
                                            OR f.Height >= @MinHeight)
                                    AND (f.Extension in (SELECT * FROM STRING_SPLIT(@SupportFiles, ',')))
                                    AND (f.FileType in (SELECT * FROM STRING_SPLIT(@SupportFileTypes, ',')))";

            var blueprintFiles = (await connection.QueryAsync <BlueprintFile>(query, new
            {
                MinWidth = minWidth,
                MinHeight = minHeight,
                SupportFiles = string.Join(',', supportFiles),
                SupportFileTypes = string.Join(',', supportFileTypes)
            })).ToList();

            connection.Dispose();

            if (blueprintFiles != null)
            {
                _logger.LogInformation($"Total items for re-generating: {blueprintFiles.Count}");

                for (int i = 0; i *PageSize <= blueprintFiles.Count; i++)
                {
                    _logger.LogInformation($"Start ProcessWithPageSize with PageIndex: {i}, PageSize: {PageSize}");
                    await ProcessWithPageSize(blueprintFiles.Skip(i *PageSize).Take(PageSize).ToList());
                }
            }

            _logger.LogInformation($"End the call {nameof(Process)}");
        }