summary refs log tree commit diff
path: root/extra/admin-api/Utilities/Spacebar.AdminAPI.TestClient/Pages/Media
diff options
context:
space:
mode:
authorEmma [it/its]@Rory& <root@rory.gay>2025-04-10 17:12:53 +0200
committerEmma [it/its]@Rory& <root@rory.gay>2025-10-05 21:34:42 +0200
commite1483e9f90ef506444a75499768ec0d7c27bfdc8 (patch)
tree9f2db36f9a4ffd169f89e3d4d3a66cb72015370e /extra/admin-api/Utilities/Spacebar.AdminAPI.TestClient/Pages/Media
parentLocal changes (diff)
downloadserver-ts-e1483e9f90ef506444a75499768ec0d7c27bfdc8.tar.xz
Further admin api work
Diffstat (limited to 'extra/admin-api/Utilities/Spacebar.AdminAPI.TestClient/Pages/Media')
-rw-r--r--extra/admin-api/Utilities/Spacebar.AdminAPI.TestClient/Pages/Media/Index.razor7
-rw-r--r--extra/admin-api/Utilities/Spacebar.AdminAPI.TestClient/Pages/Media/Users.razor106
2 files changed, 113 insertions, 0 deletions
diff --git a/extra/admin-api/Utilities/Spacebar.AdminAPI.TestClient/Pages/Media/Index.razor b/extra/admin-api/Utilities/Spacebar.AdminAPI.TestClient/Pages/Media/Index.razor
new file mode 100644

index 000000000..76621e74c --- /dev/null +++ b/extra/admin-api/Utilities/Spacebar.AdminAPI.TestClient/Pages/Media/Index.razor
@@ -0,0 +1,7 @@ +@page "/Media" +<h3>Index of /Media</h3> +<hr/> + +@code { + +} \ No newline at end of file diff --git a/extra/admin-api/Utilities/Spacebar.AdminAPI.TestClient/Pages/Media/Users.razor b/extra/admin-api/Utilities/Spacebar.AdminAPI.TestClient/Pages/Media/Users.razor new file mode 100644
index 000000000..81008a258 --- /dev/null +++ b/extra/admin-api/Utilities/Spacebar.AdminAPI.TestClient/Pages/Media/Users.razor
@@ -0,0 +1,106 @@ +@page "/Media/ByUser" +@using System.Net.Http.Headers +@using System.Reflection +@using Spacebar.AdminApi.Models +@using Spacebar.AdminAPI.TestClient.Services +@using ArcaneLibs.Blazor.Components +@inject Config Config +@inject ILocalStorageService LocalStorage + +<PageTitle>Uploaded media by user</PageTitle> + +<details> + <summary>Displayed columns</summary> + @foreach (var column in DisplayedColumns) { + var value = column.Value; + <span> + <InputCheckbox @bind-Value:get="@(value)" @bind-Value:set="@(b => { + DisplayedColumns[column.Key] = b; + StateHasChanged(); + })"/> + @column.Key.Name + </span> + <br/> + } +</details> + +<InputSelect @bind-Value="@SelectedUserId"> + <option value="">All users</option> + @if (UserList is { Count: > 0 }) { + @foreach (var user in UserList.OrderByDescending(u => u.Id).Where(x => !x.Deleted)) { + <option value="@user.Id">@user.Username</option> + } + } +</InputSelect> + + +<table class="table table-bordered"> + @{ + var columns = DisplayedColumns.Where(kvp => kvp.Value).Select(kvp => kvp.Key).ToList(); + } + <thead> + <tr> + @foreach (var column in columns) { + <th>@column.Name</th> + } + <th>Actions</th> + </tr> + </thead> + <tbody> + @foreach (var user in UserMedia) { + <tr> + @foreach (var column in columns) { + <td>@column.GetValue(user)</td> + } + <td> + <LinkButton href="@($"/Users/Delete/{user.Id}")" Color="#ff0000">Delete</LinkButton> + </td> + </tr> + } + </tbody> +</table> + +@code { + + private Dictionary<PropertyInfo, bool> DisplayedColumns { get; set; } = typeof(FileMetadataModel).GetProperties() + .ToDictionary(p => p, p => p.Name == "Username" || p.Name == "Id" || p.Name == "MessageCount"); + + private List<UserModel> UserList { get; set; } = new(); + private List<FileMetadataModel> UserMedia { get; set; } = new(); + + [SupplyParameterFromQuery(Name = "UserId")] + public string? SelectedUserId { + get; + set { + field = value; + if (string.IsNullOrWhiteSpace(field)) + UserMedia.Clear(); + else _ = GetMediaForUser(value!); + } + } + + protected override async Task OnInitializedAsync() { + using var hc = new HttpClient(); + hc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Config.AccessToken); + var response = await hc.GetAsync(Config.AdminUrl + "/_spacebar/admin/users/"); + if (!response.IsSuccessStatusCode) throw new Exception(await response.Content.ReadAsStringAsync()); + var content = response.Content.ReadFromJsonAsAsyncEnumerable<UserModel>(); + await foreach (var user in content) { + UserList.Add(user!); + StateHasChanged(); + } + } + + private async Task GetMediaForUser(string userId) { + using var hc = new HttpClient(); + hc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Config.AccessToken); + var response = await hc.GetAsync(Config.AdminUrl + $"/_spacebar/admin/media/user/{userId}/attachments"); + if (!response.IsSuccessStatusCode) throw new Exception(await response.Content.ReadAsStringAsync()); + var content = response.Content.ReadFromJsonAsAsyncEnumerable<FileMetadataModel>(); + await foreach (var media in content) { + UserMedia.Add(media!); + StateHasChanged(); + } + } + +} \ No newline at end of file