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