using Core; using Core.Enumerations; 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 IBucketDataProvider _imageBucketDataProvider; /// /// /// /// /// /// public FileService( ILogger logger, IFileSecurityService fileSecurityService, IBucketDataProvider 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 (mediaType, signatureResult) = _fileSecurityService.CheckFileSignature(file.FileName, bytes, file.ContentType); if(!signatureResult.IsSuccess || mediaType == null) return IDomainResult.Failed(); var bucketFile = new BucketFile(file.FileName, bytes, file.ContentType); IDomainResult result; Guid? fileId; if (mediaType == MediaTypes.Image) (fileId, result) = _imageBucketDataProvider.Upload(siteId, userId, bucketFile); else 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); } } } }