using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models; using Azure.Storage.Sas; using Core.Blueprint.DAL.Infrastructure.Contracts; using Core.Blueprint.Domain.Dtos; using Microsoft.Extensions.Azure; using System.Reflection.Metadata; namespace Core.Blueprint.DAL.Infrastructure.Proxies; public class ProxyBlobStorage : IProxyBlobStorage { private readonly BlobServiceClient _blobServiceClient; private readonly BlobContainerClient _blobContainerClient; private const string TIMESTAMP_TAG_NAME = "Timestamp"; private UserDelegationKey _blobDelegationKey; public ProxyBlobStorage(BlobServiceClient blobServiceClient) { _blobServiceClient = blobServiceClient; _blobContainerClient = blobServiceClient.GetBlobContainerClient("blueprint"); _blobDelegationKey = _blobServiceClient.GetUserDelegationKey(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddHours(2)); } public async IAsyncEnumerable ListAllItemsAsync() { await using (var blobs = _blobContainerClient.GetBlobsAsync().GetAsyncEnumerator()) { while (await blobs.MoveNextAsync()) { yield return new ImageUrlDto { Url = _blobContainerClient.GenerateSasUri(BlobContainerSasPermissions.Read, DateTimeOffset.UtcNow.AddMinutes(5)) }; } } } public async Task GetFirstImageUrlAsync() { await using (var blob = _blobContainerClient.GetBlobsAsync().GetAsyncEnumerator()) { System.Console.WriteLine(_blobContainerClient.Uri.ToString()); await blob.MoveNextAsync(); var blobClient = _blobContainerClient.GetBlobClient(blob.Current.Name); var sasBuilder = new BlobSasBuilder() { BlobContainerName = blobClient.BlobContainerName, BlobName = blobClient.Name, Resource = "b", StartsOn = DateTimeOffset.UtcNow, ExpiresOn = DateTimeOffset.UtcNow.AddMinutes(5), }; sasBuilder.SetPermissions(BlobAccountSasPermissions.Read); var blobUriBuilder = new BlobUriBuilder(blobClient.Uri){ Sas = sasBuilder.ToSasQueryParameters(_blobDelegationKey, _blobServiceClient.AccountName) }; var uri = blobUriBuilder.ToUri(); System.Console.WriteLine(uri); return new ImageUrlDto { Url = uri }; } } public async Task GetUploadUrl() { await using (var blobs = _blobContainerClient.GetBlobsAsync().GetAsyncEnumerator()) { await blobs.MoveNextAsync(); var blobClient = _blobContainerClient.GetBlobClient(blobs.Current.Name); var sasBuilder = new BlobSasBuilder(){ BlobContainerName = blobClient.BlobContainerName, BlobName = blobClient.Name, Resource = "b", StartsOn = DateTimeOffset.UtcNow, ExpiresOn = DateTimeOffset.UtcNow.AddMinutes(5), }; sasBuilder.SetPermissions(BlobAccountSasPermissions.Read); var blobUriBuilder = new BlobUriBuilder(blobClient.Uri){ Sas = sasBuilder.ToSasQueryParameters(_blobDelegationKey, _blobServiceClient.AccountName) }; var uri = blobUriBuilder.ToUri(); return new ImageUrlDto { Url = uri }; } } }