@page "/Users/Delete/{Id}" @using System.Net.Http.Headers @using System.Text.Json @using System.Text.Json.Nodes @using ArcaneLibs.Extensions @using Spacebar.AdminApi.Models @using Spacebar.AdminAPI.TestClient.Services @inject Config Config

UsersDelete - @Id

Deleted @ChannelDeleteProgress.Sum(x=>x.Value.Deleted) messages so far! @foreach (var (channel, progress) in ChannelDeleteProgress.Where(x=>x.Value.Deleted != x.Value.Total).OrderByDescending(x=>x.Value.Progress)) {
@channel: @progress.Total total, @progress.Deleted deleted
} @if (Done) {

Done!

} @code { [Parameter] public required string Id { get; set; } private Dictionary ChannelDeleteProgress { get; set; } = new(); private bool Done { get; set; } protected override async Task OnInitializedAsync() { var hc = new StreamingHttpClient(); hc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Config.AccessToken); var response = await hc.GetAsync(Config.AdminUrl + $"/_spacebar/admin/Users/{Id}/delete?messageDeleteChunkSize=100"); if (!response.IsSuccessStatusCode) throw new Exception(await response.Content.ReadAsStringAsync()); var content = response.Content.ReadFromJsonAsAsyncEnumerable(); await foreach (var actionResult in content) { Console.WriteLine(actionResult.ToJson(indent: false)); switch (actionResult.MessageType) { case "STATS": { var data = JsonSerializer.Deserialize(actionResult.Data.ToJson()); ChannelDeleteProgress = data!["messages_per_channel"]! .Deserialize>()! .ToDictionary(x=>x.Key, x=>new DeleteProgress { Total = x.Value }); break; } case "BULK_DELETED": { var data = JsonSerializer.Deserialize(actionResult.Data.ToJson()); ChannelDeleteProgress[data!["channel_id"]!.ToString()].Deleted += data!["deleted"]!.GetValue(); break; } default: { Console.WriteLine($"Unknown message type: {actionResult.MessageType}"); break; } } StateHasChanged(); await Task.Delay(1); } Done = true; StateHasChanged(); } private class DeleteProgress { public int Total { get; set; } public int Deleted { get; set; } = 0; public float Progress => (float)Deleted / Total; } }