reactredux/webapi/WeatherForecast/Services/ImageService.cs

88 lines
2.7 KiB
C#

using DomainResults.Common;
using DataProviders;
using DataProviders.Buckets;
using DataProviders.Collections;
using ImageProvider;
using ImageProvider.Fonts;
using Core.Abstractions;
namespace WeatherForecast.Services {
/// <summary>
///
/// </summary>
public interface IImageService {
/// <summary>
///
/// </summary>
/// <param name="siteId"></param>
/// <param name="width"></param>
/// <param name="height"></param>
/// <param name="imageId"></param>
/// <returns></returns>
(BucketFile?, IDomainResult) Get(Guid siteId, int width, int height, Guid imageId);
}
/// <summary>
///
/// </summary>
public class ImageService : ServiceBase<ImageService>, IImageService {
private readonly IImageBucketDataProvider _imageBucketDataProvider;
private readonly IImageProvider _imageProvider;
private readonly IContentDataProvider _contentDataProvider;
/// <summary>
///
/// </summary>
/// <param name="logger"></param>
/// <param name="imageBucketDataProvider"></param>
/// <param name="imageProvider"></param>
public ImageService(
ILogger<ImageService> logger,
IImageBucketDataProvider imageBucketDataProvider,
IImageProvider imageProvider,
IContentDataProvider contentDataProvider
) : base(logger) {
_imageBucketDataProvider = imageBucketDataProvider;
_imageProvider = imageProvider;
_contentDataProvider = contentDataProvider;
}
/// <summary>
///
/// </summary>
/// <param name="siteId"></param>
/// <param name="width"></param>
/// <param name="height"></param>
/// <param name="imageId"></param>
/// <returns></returns>
public (BucketFile?, IDomainResult) Get(Guid siteId, int width, int height, Guid imageId) {
try {
var (file, downloadResult) = _imageBucketDataProvider.Download(siteId, imageId);
if (!downloadResult.IsSuccess || file == null)
return IDomainResult.Failed<BucketFile?> ();
var (content, getContentResult) = _contentDataProvider.Get(siteId);
if (!getContentResult.IsSuccess || content == null)
return IDomainResult.Failed<BucketFile?>();
var (image, transformResult) = _imageProvider.ResizeAndWatermark(file.Bytes, width, height, FontsEnum.Montserrat, FontStylesEnum.Regular, content.First().SiteName);
if (!transformResult.IsSuccess || image == null)
return IDomainResult.Failed<BucketFile?>();
return IDomainResult.Success(new BucketFile(file.Name, image, "image/jpeg"));
}
catch (Exception ex) {
_logger.LogError(ex, "Unhandled exception");
return IDomainResult.Failed<BucketFile?> (ex.Message);
}
}
}
}