From 6a830e02b1c1873c77907e7a88c2143a351adea4 Mon Sep 17 00:00:00 2001 From: Rory& Date: Wed, 11 Jun 2025 10:47:15 +0200 Subject: Finish demo --- flake.nix | 4 +- testFrontend/SafeNSound.Demo/Layout/NavMenu.razor | 5 ++ testFrontend/SafeNSound.Demo/Pages/Admin.razor | 20 +++++++- testFrontend/SafeNSound.Demo/Pages/Devices.razor | 5 ++ testFrontend/SafeNSound.Demo/Pages/Monitor.razor | 59 +++++++++++++++++++++-- testFrontend/SafeNSound.Demo/Pages/Tools.razor | 18 +++++++ testFrontend/SafeNSound.Demo/Pages/User.razor | 46 +++++++++++++++++- testFrontend/SafeNSound.Sdk/SafeNSoundClient.cs | 23 ++++++--- 8 files changed, 163 insertions(+), 17 deletions(-) create mode 100644 testFrontend/SafeNSound.Demo/Pages/Tools.razor diff --git a/flake.nix b/flake.nix index 86ddc58..4245b6d 100644 --- a/flake.nix +++ b/flake.nix @@ -80,7 +80,9 @@ devShell = pkgs.mkShell { buildInputs = with pkgs; [ mongodb-compass -# jetbrains.webstorm + # jetbrains.webstorm + # jetbrains.rider + # dotnet-sdk_9 nodejs nodePackages.prettier ]; diff --git a/testFrontend/SafeNSound.Demo/Layout/NavMenu.razor b/testFrontend/SafeNSound.Demo/Layout/NavMenu.razor index 36501b1..a4d4522 100644 --- a/testFrontend/SafeNSound.Demo/Layout/NavMenu.razor +++ b/testFrontend/SafeNSound.Demo/Layout/NavMenu.razor @@ -24,6 +24,11 @@ Admin + diff --git a/testFrontend/SafeNSound.Demo/Pages/Admin.razor b/testFrontend/SafeNSound.Demo/Pages/Admin.razor index 0dcb1a3..952910d 100644 --- a/testFrontend/SafeNSound.Demo/Pages/Admin.razor +++ b/testFrontend/SafeNSound.Demo/Pages/Admin.razor @@ -5,8 +5,24 @@ return Task.CompletedTask; })">Manage devices +Get all users + +
+    @foreach (var user in Enumerable.Reverse(UserList)) {
+        @(user + "\n")
+    }
+
@code { - - + + List UserList { get; set; } = []; + + private async Task GetUserList() { + UserList.Clear(); + await foreach (var userId in App.AdminClient.GetAllUserIdsEnumerable()) { + UserList.Add(userId); + StateHasChanged(); + } + } + } \ No newline at end of file diff --git a/testFrontend/SafeNSound.Demo/Pages/Devices.razor b/testFrontend/SafeNSound.Demo/Pages/Devices.razor index 5f90132..695c138 100644 --- a/testFrontend/SafeNSound.Demo/Pages/Devices.razor +++ b/testFrontend/SafeNSound.Demo/Pages/Devices.razor @@ -5,6 +5,7 @@
Create new device Reload Devices + Log out Delete account @foreach (var device in CurrentDevices) {
@@ -77,5 +78,9 @@ private async Task DeleteAccount() { await Client.DeleteAccount(Auth); } + + private async Task Logout() { + await Client.LogOut(); + } } \ No newline at end of file diff --git a/testFrontend/SafeNSound.Demo/Pages/Monitor.razor b/testFrontend/SafeNSound.Demo/Pages/Monitor.razor index d78d60a..f948b69 100644 --- a/testFrontend/SafeNSound.Demo/Pages/Monitor.razor +++ b/testFrontend/SafeNSound.Demo/Pages/Monitor.razor @@ -6,16 +6,44 @@ return Task.CompletedTask; })">Manage devices - + @foreach (var user in AssignedUsers) { -

Assigned user @user +

+ Assigned user @user @if (Alarms.ContainsKey(user)) { -

@Alarms[user].ToJson(indent: false)
+ 🔔 +
+ @Alarms[user].Reason (@Alarms[user].CreatedAt) + } + else { + 🔕 } -

+

+ Manage } } +@if (!string.IsNullOrWhiteSpace(manageUserId)) { + + ID: @manageUserId
+ @if (Alarms.ContainsKey(manageUserId)) { + User has alarm! +
+ @Alarms[manageUserId].Reason at @Alarms[manageUserId].CreatedAt.ToLocalTime() + Clear +
+ } + Budget: @manageUserBudget?.Amount EUR
+ Add money: + + , reason: + + Add budget + +
+} + @code { bool _isInitialized = false; @@ -28,4 +56,27 @@ _isInitialized = true; } + string? manageUserId { get; set; } + BudgetWithHistory? manageUserBudget { get; set; } + BudgetHistoryEntry manageUserNewBudget { get; set; } + + private async Task ManageUser(string user) { + manageUserId = user; + manageUserBudget = await App.MonitorClient.GetBudget(manageUserId); + manageUserBudget ??= new BudgetWithHistory { + Amount = 0, + History = [] + }; + manageUserNewBudget = new() { + Venue = App.MonitorAuth.Username + }; + + StateHasChanged(); + } + + private async Task UpdateUserBudget() { + await App.MonitorClient.AddBudget(manageUserId, manageUserNewBudget); + await ManageUser(manageUserId); + } + } \ No newline at end of file diff --git a/testFrontend/SafeNSound.Demo/Pages/Tools.razor b/testFrontend/SafeNSound.Demo/Pages/Tools.razor new file mode 100644 index 0000000..f67f7ef --- /dev/null +++ b/testFrontend/SafeNSound.Demo/Pages/Tools.razor @@ -0,0 +1,18 @@ +@page "/Tools" +

Tools

+Assign more users to monitor + +@code { + + private async Task MakeSuperAdmin() { + await foreach (var user in App.AdminClient.GetAllUserIdsEnumerable()) { + try { + await App.MonitorClient.AddAssignedUser(user); + } + catch (Exception ex) { + Console.WriteLine($"Failed to assign user {user}: {ex.Message}"); + } + } + } + +} \ No newline at end of file diff --git a/testFrontend/SafeNSound.Demo/Pages/User.razor b/testFrontend/SafeNSound.Demo/Pages/User.razor index cdffbe3..cfbfa53 100644 --- a/testFrontend/SafeNSound.Demo/Pages/User.razor +++ b/testFrontend/SafeNSound.Demo/Pages/User.razor @@ -16,6 +16,30 @@ Clear
+ + Budget: @Math.Round(Budget.Amount, 2)
+ + + Spend + + EUR at + + for + + Spend +
+ + Spend history is comming soon! + @* oops, forgot to use the DTO for getting own budget... *@ + @* @foreach(var history in Budget.History) { *@ + @*
*@ + @* @history.CreatedAt!.Value.ToLocalTime() - *@ + @* @history.Amount EUR - *@ + @* @history.Reason - *@ + @* @history.Venue *@ + @*
*@ + @* } *@ + } @if (Alarm != null) { @@ -38,16 +62,22 @@ private WhoAmI WhoAmI { get; set; } = null!; private AlarmDto? Alarm { get; set; } = null!; + private BudgetHistoryEntry ToSpend { get; set; } = new() { + Amount = 0, + Reason = string.Empty, + Venue = string.Empty + }; protected override async Task OnInitializedAsync() { WhoAmI = await App.UserClient.WhoAmI(); - _isInitialized = true; _ = PollAlarm(); + Budget = await App.UserClient.GetBudget(); NavigationManager.LocationChanged += (sender, args) => { if (args.Location != NavigationManager.Uri) { - _running = false; // Stop polling when navigating away + _running = false; } }; + _isInitialized = true; } private async Task PollAlarm() { @@ -57,11 +87,19 @@ Alarm = newAlarm; StateHasChanged(); } + + var newBudget = await App.UserClient.GetBudget(); + if (Math.Abs(Budget.Amount - newBudget.Amount) > 0.01) { + Budget = newBudget; + StateHasChanged(); + } await Task.Delay(1000); } } + public CurrentBalance Budget { get; set; } + private async Task RaiseAlarm(string? reason) { if (string.IsNullOrWhiteSpace(reason)) await App.UserClient.DeleteAlarm(); @@ -80,4 +118,8 @@ ~User() => ReleaseUnmanagedResources(); + private async Task SpendBudget(BudgetHistoryEntry toSpend) { + await App.UserClient.SpendBudget(toSpend); + } + } \ No newline at end of file diff --git a/testFrontend/SafeNSound.Sdk/SafeNSoundClient.cs b/testFrontend/SafeNSound.Sdk/SafeNSoundClient.cs index 3cd5d5c..b5bca12 100644 --- a/testFrontend/SafeNSound.Sdk/SafeNSoundClient.cs +++ b/testFrontend/SafeNSound.Sdk/SafeNSoundClient.cs @@ -66,12 +66,14 @@ public class SafeNSoundClient(SafeNSoundConfiguration config, string accessToken res.EnsureSuccessStatusCode(); } - public async Task GetBudget(string userId = "@me") { - var res = await HttpClient.GetAsync( - userId == "@me" - ? $"/budget/@me" - : $"/user/{userId}/budget" - ); + public async Task GetBudget() { + var res = await HttpClient.GetAsync($"/budget/@me"); + res.EnsureSuccessStatusCode(); + return (await res.Content.ReadFromJsonAsync())!; + } + + public async Task GetBudget(string userId) { + var res = await HttpClient.GetAsync($"/user/{userId}/budget"); res.EnsureSuccessStatusCode(); return (await res.Content.ReadFromJsonAsync())!; } @@ -143,7 +145,7 @@ public class SafeNSoundClient(SafeNSoundConfiguration config, string accessToken public class AlarmDto { [JsonPropertyName("_id")] public string? Id { get; set; } - + [JsonPropertyName("reason")] public required string Reason { get; set; } @@ -165,8 +167,13 @@ public class DeviceDto { public DateTime LastSeen { get; set; } } +public class CurrentBalance { + [JsonPropertyName("currentBalance")] + public double Amount { get; set; } +} + public class BudgetWithHistory { - [JsonPropertyName("budget")] + [JsonPropertyName("balance")] public double Amount { get; set; } [JsonPropertyName("history")] -- cgit 1.5.1