using Amazon.S3; using Amazon.S3.Model; using FictionArchive.Common.Enums; using FictionArchive.Service.FileService.Models; using FictionArchive.Service.FileService.Models.IntegrationEvents; using FictionArchive.Service.Shared.Services.EventBus; using Microsoft.Extensions.Options; namespace FictionArchive.Service.FileService.Services.EventHandlers; public class FileUploadRequestCreatedEventHandler : IIntegrationEventHandler { private readonly ILogger _logger; private readonly AmazonS3Client _amazonS3Client; private readonly IEventBus _eventBus; private readonly S3Configuration _s3Configuration; private readonly ProxyConfiguration _proxyConfiguration; public FileUploadRequestCreatedEventHandler(ILogger logger, AmazonS3Client amazonS3Client, IEventBus eventBus, IOptions s3Configuration, IOptions proxyConfiguration) { _logger = logger; _amazonS3Client = amazonS3Client; _eventBus = eventBus; _proxyConfiguration = proxyConfiguration.Value; _s3Configuration = s3Configuration.Value; } public async Task Handle(FileUploadRequestCreatedEvent @event) { var putObjectRequest = new PutObjectRequest(); putObjectRequest.BucketName = _s3Configuration.Bucket; putObjectRequest.Key = @event.FilePath; using MemoryStream memoryStream = new MemoryStream(@event.FileData); putObjectRequest.InputStream = memoryStream; var s3Response = await _amazonS3Client.PutObjectAsync(putObjectRequest); if (s3Response.HttpStatusCode != System.Net.HttpStatusCode.OK) { _logger.LogError("An error occurred while uploading file to S3. Response code: {responsecode}", s3Response.HttpStatusCode); await _eventBus.Publish(new FileUploadRequestStatusUpdateEvent() { RequestId = @event.RequestId, Status = RequestStatus.Failed, ErrorMessage = "An error occurred while uploading file to S3." }); return; } await _eventBus.Publish(new FileUploadRequestStatusUpdateEvent() { Status = RequestStatus.Success, RequestId = @event.RequestId, FileAccessUrl = _proxyConfiguration.BaseUrl + "/" + @event.FilePath }); } }