Löschen implementiert
All checks were successful
Build & Deploy PLDpro.Web Test to 192.168.1.100 / build-and-deploy (push) Successful in 1m16s

This commit is contained in:
2026-02-09 20:29:36 +01:00
parent 61ae8e2a3a
commit 3ca683d06f
7 changed files with 89 additions and 2 deletions

View File

@@ -9,5 +9,6 @@ public interface IStorageService
Task CreateBucketAsync(string bucketName, CancellationToken ct = default);
Task<IEnumerable<ObjectItem>> ListObjectsAsync(string bucket, CancellationToken ct = default);
Task UploadObjectAsync(string bucket, string key, Stream content, string contentType, CancellationToken ct = default);
Task DeleteObjectAsync(string bucket, string key);
Task<(Stream Stream, string ContentType, long? ContentLength)> GetObjectAsync(string bucket, string key, CancellationToken ct = default);
}

View File

@@ -74,4 +74,15 @@ public sealed class S3StorageService(IAmazonS3 s3) : IStorageService
return (resp.ResponseStream, contentType, len);
}
public async Task DeleteObjectAsync(string bucket, string key)
{
// S3-Delete ist idempotent: 204 auch wenn das Objekt nicht existiert.
await _s3.DeleteObjectAsync(new Amazon.S3.Model.DeleteObjectRequest
{
BucketName = bucket,
Key = key
});
}
}

View File

@@ -6,6 +6,7 @@ public interface IStorageMetadataRepository
Task EnsureSchemaAsync(CancellationToken ct = default);
Task UpsertAsync(string bucket, string fileName, string? path, string key, long? size, string? contentType, CancellationToken ct = default);
Task<StorageObject?> TryGetAsync(string bucket, string fileName, CancellationToken ct = default);
Task DeleteByKeyAsync(string bucket, string key, CancellationToken ct = default);
}
public sealed record StorageObject(

View File

@@ -90,4 +90,19 @@ public sealed class StorageMetadataRepository : IStorageMetadataRepository
}
return null;
}
public async Task DeleteByKeyAsync(string bucket, string key, CancellationToken ct = default)
{
const string sql = """
DELETE FROM storage_objects
WHERE bucket = @bucket AND s3_key = @key;
""";
await using var conn = new MySqlConnector.MySqlConnection(_connStr);
await conn.OpenAsync(ct);
await using var cmd = new MySqlConnector.MySqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@bucket", bucket);
cmd.Parameters.AddWithValue("@key", key);
await cmd.ExecuteNonQueryAsync(ct);
}
}