Webapp/SDAF/Services/AppFileService.cs (83 lines of code) (raw):
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using SDAFWebApp.Models;
using Azure.Data.Tables;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
namespace SDAFWebApp.Services
{
public class AppFileService : ITableStorageService<AppFile>
{
private readonly TableClient client;
private readonly BlobContainerClient blobContainerClient;
public AppFileService(TableStorageService tableStorageService, IDatabaseSettings settings)
{
client = tableStorageService.GetTableClient(settings.AppFileCollectionName).Result;
blobContainerClient = tableStorageService.GetBlobClient(settings.AppFileBlobCollectionName).Result;
}
public async Task<List<AppFile>> GetNAsync(int n)
{
List<AppFile> files = [];
await foreach (BlobItem blobItem in blobContainerClient.GetBlobsAsync())
{
files.Add(new AppFile() { Id = blobItem.Name, Content = blobItem.Properties.ContentHash });
}
return files;
}
public async Task<List<AppFile>> GetAllAsync()
{
List<AppFile> files = [];
await foreach (BlobItem blobItem in blobContainerClient.GetBlobsAsync())
{
files.Add(new AppFile() { Id = blobItem.Name, Content = blobItem.Properties.ContentHash });
}
return files;
}
public async Task<List<AppFile>> GetAllAsync(string partitionKey)
{
List<AppFile> files = [];
await foreach (BlobItem blobItem in blobContainerClient.GetBlobsAsync())
{
files.Add(new AppFile() { Id = blobItem.Name, Content = blobItem.Properties.ContentHash });
}
return files;
}
public async Task<AppFile> GetByIdAsync(string rowKey, string partitionKey)
{
BlobClient blobClient = blobContainerClient.GetBlobClient(rowKey);
using var memoryStream = new MemoryStream();
await blobClient.DownloadToAsync(memoryStream);
return new AppFile() { Id = rowKey, Content = memoryStream.ToArray() };
}
public Task<AppFile> GetDefault()
{
return null;
}
public async Task CreateAsync(AppFile file)
{
BlobClient blobClient = blobContainerClient.GetBlobClient(file.Id);
await blobClient.UploadAsync(new BinaryData(file.Content));
AppFileEntity fileEntity = new(file.Id, blobClient.Uri.ToString());
await client.AddEntityAsync(fileEntity);
}
public async Task UpdateAsync(AppFile file)
{
BlobClient blobClient = blobContainerClient.GetBlobClient(file.Id);
await blobClient.UploadAsync(new BinaryData(file.Content), overwrite: blobClient.Exists());
AppFileEntity fileEntity = new(file.Id, blobClient.Uri.ToString());
await client.UpsertEntityAsync(fileEntity, TableUpdateMode.Merge);
}
public async Task DeleteAsync(string rowKey, string partitionKey)
{
BlobClient blobClient = blobContainerClient.GetBlobClient(rowKey);
await blobClient.DeleteAsync();
await client.DeleteEntityAsync(partitionKey, rowKey);
}
public Task CreateTFVarsAsync(AppFile file)
{
throw new NotImplementedException();
}
}
}