Refactored service to internalise the CDN
continuous-integration/drone/pr Build is passing

This commit is contained in:
Khwezi Mngoma
2026-05-19 11:34:00 +02:00
parent f245bc94e1
commit 52d204e286
10 changed files with 188 additions and 46 deletions
@@ -0,0 +1,38 @@
using LiteCharms.Features.S3.Abstractions;
namespace LiteCharms.Features.S3;
public class BookstoreS3Service(IConfiguration configuration, [FromKeyedServices(Constants.BookshopBucketName)] IAmazonS3 amazonS3) :
S3ServiceBase(amazonS3), IS3Service
{
public override async Task<Result<string>> UploadFileAsync(string fileName, Stream fileStream, string contentType, CancellationToken cancellationToken = default)
{
try
{
var bucketName = configuration.GetSection($"{Constants.BookshopS3SettingsSection}:BucketName").Value!;
var cdnBaseUrl = configuration.GetSection($"{Constants.BookshopS3SettingsSection}:CdnBaseUrl").Value!;
if(string.IsNullOrWhiteSpace(bucketName))
return Result.Fail<string>("Bucket name is not configured.");
if (string.IsNullOrWhiteSpace(cdnBaseUrl))
return Result.Fail<string>("CDN base URL is not configured.");
var response = await client.PutObjectAsync(new PutObjectRequest
{
BucketName = bucketName,
Key = fileName,
InputStream = fileStream,
ContentType = contentType
}, cancellationToken);
return response.HttpStatusCode != System.Net.HttpStatusCode.OK
? Result.Fail<string>($"Failed to upload {fileName} to S3.")
: Result.Ok(string.Format(cdnBaseUrl, bucketName, fileName));
}
catch (Exception ex)
{
return Result.Fail<string>(new Error($"Error uploading {fileName} to S3: {ex.Message}").CausedBy(ex));
}
}
}