using Core;
using DataProviders;
using DataProviders.Buckets;
using DomainResults.Common;
using FileSecurityService;
namespace WeatherForecast.Services {
///
///
///
public interface IFileService {
///
///
///
///
///
///
///
(Guid?, IDomainResult) Post(Guid siteId, Guid userId, IFormFile file);
///
///
///
///
///
///
///
(BucketFile?, IDomainResult) Get(Guid siteId, Guid userId, Guid fileId);
///
///
///
///
///
///
///
IDomainResult Delete(Guid siteId, Guid userId, Guid fileId);
}
///
///
///
public class FileService : IFileService {
private readonly ILogger _logger;
private readonly IFileSecurityService _fileSecurityService;
private readonly IImagesBucketDataProvider _imageBucketDataProvider;
///
///
///
///
///
///
public FileService(
ILogger logger,
IFileSecurityService fileSecurityService,
IImagesBucketDataProvider imageBucketDataProvider
) {
_logger = logger;
_fileSecurityService = fileSecurityService;
_imageBucketDataProvider = imageBucketDataProvider;
}
///
///
///
///
///
///
///
public (Guid?, IDomainResult) Post(Guid siteId, Guid userId, IFormFile file) {
try {
if (!(file.Length > 0))
return IDomainResult.Failed();
using var ms = new MemoryStream();
file.CopyTo(ms);
var bytes = ms.ToArray();
var (fileCategory, signatureResult) = _fileSecurityService.CheckFileSignature(file.FileName, bytes, file.ContentType);
if(!signatureResult.IsSuccess || fileCategory == null)
return IDomainResult.Failed();
var bucketFile = new BucketFile(file.FileName, bytes, file.ContentType);
IDomainResult result;
Guid? fileId;
switch (fileCategory) {
case FileCategory.Image:
(fileId, result) = _imageBucketDataProvider.Upload(siteId, userId, bucketFile);
break;
default:
return IDomainResult.Failed();
}
if (!result.IsSuccess || fileId == null)
return IDomainResult.Failed();
return IDomainResult.Success(fileId);
}
catch (Exception ex) {
_logger.LogError(ex, "Unhandled exception");
return IDomainResult.Failed(ex.Message);
}
}
///
///
///
///
///
///
///
public (BucketFile?, IDomainResult) Get(Guid siteId, Guid userId, Guid fileId) {
try {
var (file, result) = _imageBucketDataProvider.Download(siteId, userId, fileId);
if (!result.IsSuccess || file == null)
return (null, result);
return IDomainResult.Success(file);
}
catch (Exception ex) {
_logger.LogError(ex, "Unhandled exception");
return IDomainResult.Failed(ex.Message);
}
}
///
///
///
///
///
///
///
public IDomainResult Delete(Guid siteId, Guid userId, Guid fileId) {
try {
return _imageBucketDataProvider.DeleteOne(siteId, userId, fileId);
}
catch (Exception ex) {
_logger.LogError(ex, "Unhandled exception");
return IDomainResult.Failed(ex.Message);
}
}
}
}