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