2026-07-23 13:54:06 -07:00

158 lines
5.8 KiB
C#

using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;
namespace qtc_api.Services.BucketService
{
public class BucketService : IBucketService
{
public string ServiceUrl { get; private set; } = string.Empty;
public string AccessKey { get; private set; } = string.Empty;
public string SecretKey { get; private set; } = string.Empty;
public string ProfileImagesBucketName { get; private set; } = string.Empty;
public string CDNBucketName { get; private set; } = string.Empty;
public string ImagesBucketName { get; private set; } = string.Empty;
private static AmazonS3Client S3Client = new();
private IConfiguration _config;
private ILogger<BucketService> _logger;
private bool Enabled { get; set; }
public BucketService(IConfiguration config, ILogger<BucketService> logger)
{
_config = config;
_logger = logger;
var serviceUrl = _config["S3Config:S3ServiceUrl"];
var accessKey = _config["S3Config:S3AccessKey"];
var secretKey = _config["S3Config:S3SecretKey"];
var profileImagesBucket = _config["S3Config:S3ProfileImagesBucket"];
var cdnBucket = _config["S3Config:S3CDNBucket"];
var imagesBucket = _config["S3Config:S3ImagesBucket"];
var enabled = _config.GetValue<bool>("S3Config:S3Enabled");
if (serviceUrl != null) ServiceUrl = serviceUrl;
if (accessKey != null) AccessKey = accessKey;
if (secretKey != null) SecretKey = secretKey;
if (profileImagesBucket != null) ProfileImagesBucketName = profileImagesBucket;
if (cdnBucket != null) CDNBucketName = cdnBucket;
if (imagesBucket != null) ImagesBucketName = imagesBucket;
Enabled = enabled;
var credentials = new BasicAWSCredentials(AccessKey, SecretKey);
S3Client = new AmazonS3Client(credentials, new AmazonS3Config
{
ServiceURL = ServiceUrl,
});
_logger = logger;
}
public async Task<bool> PutProfileImage(string userId, string imageName, byte[] imageBytes)
{
if (!Enabled)
{
_logger.LogWarning("Not Using S3 Bucket. Performance May Be Degraded.");
return false;
}
try
{
using var stream = new MemoryStream(imageBytes);
var request = new PutObjectRequest()
{
Key = $@"{userId}/{imageName}",
BucketName = ProfileImagesBucketName,
InputStream = stream,
DisablePayloadSigning = true,
DisableDefaultChecksumValidation = true
};
var response = await S3Client.PutObjectAsync(request);
return response.HttpStatusCode == System.Net.HttpStatusCode.OK || response.HttpStatusCode == System.Net.HttpStatusCode.Accepted;
}
catch (AmazonS3Exception ex)
{
_logger.LogError($"S3 Bucket Threw An Exception\n{ex.Message}\n{ex.StackTrace}");
return false;
}
}
public async Task<byte[]?> GetProfileImageBytes(string userId, string imageName)
{
if (!Enabled)
{
_logger.LogWarning("Not Using S3 Bucket. Performance May Be Degraded.");
return default;
}
try
{
var response = await S3Client.GetObjectAsync(ProfileImagesBucketName, $@"{userId}/{imageName}");
if (response != null)
{
using var stream = response.ResponseStream;
using var ms = new MemoryStream();
stream.CopyTo(ms);
return ms.ToArray();
}
else return default;
}
catch (AmazonS3Exception ex)
{
_logger.LogError($"S3 Bucket Threw An Exception\n{ex.Message}\n{ex.StackTrace}");
return default;
}
}
public async Task<byte[]?> GetTagImageBytes(string tagName)
{
if (!Enabled)
{
_logger.LogWarning("Not Using S3 Bucket. Performance May Be Degraded.");
return default;
}
try
{
var response = await S3Client.GetObjectAsync(CDNBucketName, $@"tags/{tagName}.png");
if (response != null)
{
using var stream = response.ResponseStream;
using var ms = new MemoryStream();
stream.CopyTo(ms);
return ms.ToArray();
}
else return default;
}
catch (AmazonS3Exception ex)
{
_logger.LogError($"S3 Bucket Threw An Exception\n{ex.Message}\n{ex.StackTrace}");
return default;
}
}
public async Task<bool> DeleteProfileImage(string userId, string imageName)
{
if (!Enabled)
{
_logger.LogWarning("Not Using S3 Bucket. Performance May Be Degraded.");
return false;
}
try
{
var response = await S3Client.DeleteObjectAsync(ProfileImagesBucketName, $@"{userId}/{imageName}");
return response.HttpStatusCode == System.Net.HttpStatusCode.OK || response.HttpStatusCode == System.Net.HttpStatusCode.Accepted;
}
catch (AmazonS3Exception ex)
{
_logger.LogError($"S3 Bucket Threw An Exception\n{ex.Message}\n{ex.StackTrace}");
return false;
}
}
}
}