All checks were successful
Build & Deploy PLDpro.Web Test to 192.168.1.100 / build-and-deploy (push) Successful in 1m2s
126 lines
4.1 KiB
Plaintext
126 lines
4.1 KiB
Plaintext
|
|
@page "/storage"
|
|
@inject IHttpClientFactory HttpFactory
|
|
@inject NavigationManager Nav
|
|
@using System.Net.Http.Json
|
|
@using Pldpro.Web.Models
|
|
|
|
<PageTitle>Storage</PageTitle>
|
|
|
|
<MudText Typo="Typo.h4" GutterBottom="true">S3 Storage</MudText>
|
|
|
|
<MudPaper Class="pa-4 mb-4" Elevation="0">
|
|
<MudStack Row="true" Spacing="2">
|
|
<MudText Typo="Typo.h6">Buckets</MudText>
|
|
<MudSpacer />
|
|
<MudTextField @bind-Value="newBucketName" Placeholder="neuer Bucketname" Variant="Variant.Outlined" />
|
|
<MudButton Color="Color.Primary" Variant="Variant.Filled" OnClick="CreateBucket">Erstellen</MudButton>
|
|
</MudStack>
|
|
|
|
<MudList T="BucketVm" Dense="true" Class="mt-2">
|
|
@if (buckets is null)
|
|
{
|
|
<MudListItem>(lädt...)</MudListItem>
|
|
}
|
|
else if (!buckets.Any())
|
|
{
|
|
<MudListItem>(keine Buckets)</MudListItem>
|
|
}
|
|
else
|
|
{
|
|
@foreach (var b in buckets)
|
|
{
|
|
<MudListItem OnClick="@(() => SelectBucket(b.Name))" Class="cursor-pointer"
|
|
Style="@(selectedBucket == b.Name ? "font-weight:600" : "")">
|
|
<MudIcon Icon="@Icons.Material.Filled.Inventory2" Class="me-2" />
|
|
@b.Name
|
|
</MudListItem>
|
|
}
|
|
}
|
|
</MudList>
|
|
</MudPaper>
|
|
|
|
@if (!string.IsNullOrEmpty(selectedBucket))
|
|
{
|
|
<MudPaper Class="pa-4" Elevation="0">
|
|
<MudStack Row="true" Spacing="2">
|
|
<MudText Typo="Typo.h6">Objekte in '@selectedBucket'</MudText>
|
|
<MudSpacer />
|
|
<InputFile OnChange="OnFilesSelected" />
|
|
</MudStack>
|
|
|
|
<MudTable Items="objects" Hover="true" Dense="true" Class="mt-2">
|
|
<HeaderContent>
|
|
<MudTh>Key</MudTh>
|
|
<MudTh>Größe</MudTh>
|
|
<MudTh>Geändert</MudTh>
|
|
</HeaderContent>
|
|
<RowTemplate>
|
|
<MudTd DataLabel="Key">@context.Key</MudTd>
|
|
<MudTd DataLabel="Größe">@context.Size</MudTd>
|
|
<MudTd DataLabel="Geändert">@context.LastModified</MudTd>
|
|
</RowTemplate>
|
|
</MudTable>
|
|
</MudPaper>
|
|
}
|
|
|
|
@code {
|
|
private record BucketVm(string Name, DateTime? CreationDate);
|
|
private record ObjectVm(string Key, long? Size, DateTime? LastModified);
|
|
|
|
private List<BucketVm>? buckets;
|
|
private List<ObjectVm>? objects;
|
|
private string? selectedBucket;
|
|
private string newBucketName = "";
|
|
private const long StreamLimit = 512L * 1024 * 1024; // 512 MB (Program.cs erhöht Multipart-Limit)
|
|
|
|
private HttpClient? Http;
|
|
|
|
protected override Task OnInitializedAsync()
|
|
{
|
|
Http = HttpFactory.CreateClient();
|
|
Http.BaseAddress = new Uri(Nav.BaseUri); // für relative URLs wie "/api/storage/..."
|
|
return LoadBuckets();
|
|
}
|
|
|
|
|
|
|
|
private async Task LoadBuckets()
|
|
{
|
|
var data = await Http.GetFromJsonAsync<List<BucketVm>>("/api/storage/buckets");
|
|
buckets = data ?? new();
|
|
StateHasChanged();
|
|
}
|
|
|
|
private async Task SelectBucket(string name)
|
|
{
|
|
selectedBucket = name;
|
|
objects = await Http.GetFromJsonAsync<List<ObjectVm>>($"/api/storage/buckets/{name}/objects") ?? new();
|
|
}
|
|
|
|
private async Task CreateBucket()
|
|
{
|
|
if (string.IsNullOrWhiteSpace(newBucketName)) return;
|
|
await Http.PostAsJsonAsync("/api/storage/buckets", new S3CreateBucketDto { BucketName = newBucketName! });
|
|
newBucketName = "";
|
|
await LoadBuckets();
|
|
}
|
|
|
|
private async Task OnFilesSelected(InputFileChangeEventArgs e)
|
|
{
|
|
if (string.IsNullOrEmpty(selectedBucket)) return;
|
|
|
|
foreach (var file in e.GetMultipleFiles())
|
|
{
|
|
using var stream = file.OpenReadStream(StreamLimit);
|
|
using var content = new MultipartFormDataContent();
|
|
content.Add(new StreamContent(stream), "file", file.Name);
|
|
|
|
var resp = await Http.PostAsync($"/api/storage/buckets/{selectedBucket}/upload", content);
|
|
resp.EnsureSuccessStatusCode();
|
|
}
|
|
// Refresh list
|
|
objects = await Http.GetFromJsonAsync<List<ObjectVm>>($"/api/storage/buckets/{selectedBucket}/objects") ?? new();
|
|
}
|
|
}
|