Example #1
0
        private async Task <string> ProcessImages(
            S3Event s3Event,
            IImageScaler imageScaler,
            ILogWriter <ImageResizeHandler> logger,
            IPhotosService photoService)
        {
            logger.LogInformation($"{nameof(ProcessImages)}");

            var s3Entity = s3Event.Records?[0].S3;

            if (s3Entity == null)
            {
                logger.LogCritical($"{nameof(s3Entity)} is null");
                return("NULL");
            }

            var     urlDecodedKey = System.Web.HttpUtility.UrlDecode(s3Entity.Object.Key);
            UserId  userId        = GetUserIdFromKey(urlDecodedKey);
            PhotoId photoId       = GetPhotoIdFromKey(urlDecodedKey);

            try
            {
                logger.LogInformation($"{nameof(urlDecodedKey)} is '{urlDecodedKey}'");



                await photoService.SetPhotoState(userId, photoId, PhotoState.ProcessingStarted);

                // generate filenames to use for the scaled images
                ImageKeys imageKeys = GetImageKeysWithoutExtension(urlDecodedKey);

                IEnumerable <Size> imageSizes;

                using (var s3InputObject = await S3Client.GetObjectAsync(s3Entity.Bucket.Name, urlDecodedKey))
                    using (var originalImageStream = new MemoryStream())
                    {
                        await ReadImageIntoStream(logger, originalImageStream, s3InputObject.ResponseStream);

                        imageSizes = await CreateScaledImages(imageScaler, logger, imageKeys, originalImageStream, GetTargetBucket());
                    }

                logger.LogInformation($"Updating photo data, making it available.");
                await UpdatePhotoData(photoService, photoId, imageSizes);

                // finish with deleting the upload file
                await DeleteOriginalSourceFile(logger, s3Entity, urlDecodedKey);

                logger.LogInformation($"Done with {urlDecodedKey}");
                return("OK");
            }
            catch (Exception ex)
            {
                logger.LogError(ex, $"Error when resizing {s3Entity.Object.Key} from bucket {s3Entity.Bucket.Name}:\n{ex.ToString()}");
                // set photo state to ProcessingFailed
                await photoService.SetPhotoState(userId, photoId, PhotoState.ProcessingFailed);

                throw;
            }
        }
Example #2
0
        private Task <IEnumerable <Size> > CreateScaledImages(
            IImageScaler imageScaler,
            ILogWriter <ImageResizeHandler> logger,
            ImageKeys imageKeys,
            MemoryStream originalImageStream,
            string targetBucket)
        {
            var imageSizes = new HashSet <Size>();

            originalImageStream.Position = 0;
            return(imageScaler.ScaleImageByWidths(
                       originalImageStream,
                       (scaledStream, size, extension) =>
            {
                imageSizes.Add(size);
                string s3key = $"{imageKeys.ObjectKeys[size.Width]}.{extension}";
                return StoreImageInTargetBucket(targetBucket, s3key, scaledStream, logger);
            },
                       imageKeys.ObjectKeys.Keys));
        }