Adding playground blazor app for manually experimenting with access queue #5

Merged
henry merged 4 commits from add-playground into main 2025-05-12 23:48:19 +00:00
4 changed files with 77 additions and 18 deletions
Showing only changes of commit d6aa832f61 - Show all commits

View File

@ -10,14 +10,53 @@
<Button Color="ButtonColor.Success" @onclick="AddUser">Add User</Button>
<Button Color="ButtonColor.Primary" @onclick="Refresh">Refresh</Button>
@if(Status != null)
@if (Status != null)
{
@foreach(var user in Status.Users)
{
<div>
<p>@user.Id @user.LatestResponse?.HasAccess @user.LatestResponse?.ExpiresOn</p>
</div>
}
<h2>Users with access</h2>
<Grid TItem="User" Data="Status.AccessUsers" Class="table table-bordered mt-3" AllowSorting>
<GridColumns>
<GridColumn TItem="User" HeaderText="Id" PropertyName="Id" SortKeySelector="item => item.Id">
@context.Id
</GridColumn>
<GridColumn TItem="User" HeaderText="Expiration" PropertyName="LatestResponse?.ExpiresOn" SortKeySelector="item => item.LatestResponse.ExpiresOn">
@context.LatestResponse?.ExpiresOn
</GridColumn>
<GridColumn TItem="User" HeaderText="Active">
<ChildContent>
<Switch Value="context.Active" ValueExpression="() => context.Active" ValueChanged="(_) => ToggleUserActive(context.Id)" />
</ChildContent>
</GridColumn>
</GridColumns>
</Grid>
<h2>Users in queue</h2>
<Grid TItem="User" Data="Status.QueuedUsers" Class="table table-bordered mt-3" AllowSorting>
<GridColumns>
<GridColumn TItem="User" HeaderText="Id" PropertyName="Id" SortKeySelector="item => item.Id">
@context.Id
</GridColumn>
<GridColumn TItem="User" HeaderText="Queue Postition" PropertyName="LatestResponse?.RequestsAhead">
@(context.LatestResponse?.RequestsAhead ?? 0 + 1)
</GridColumn>
<GridColumn TItem="User" HeaderText="Active">
<ChildContent>
<Switch Value="context.Active" ValueExpression="() => context.Active" ValueChanged="(_) => ToggleUserActive(context.Id)" />
</ChildContent>
</GridColumn>
</GridColumns>
</Grid>
<h2>Inactive users</h2>
<Grid TItem="User" Data="Status.InactiveUsers" Class="table table-bordered mt-3" AllowSorting>
<GridColumns>
<GridColumn TItem="User" HeaderText="Id" PropertyName="Id" SortKeySelector="item => item.Id">
@context.Id
</GridColumn>
<GridColumn TItem="User" HeaderText="Active">
<ChildContent>
<Switch Value="context.Active" ValueExpression="() => context.Active" ValueChanged="(_) => ToggleUserActive(context.Id)" />
</ChildContent>
</GridColumn>
</GridColumns>
</Grid>
}
@code {
@ -48,4 +87,9 @@
Manager.AddUser();
Status = Manager.GetStatus();
}
public void ToggleUserActive(Guid userId)
{
Manager.ToggleUserActivity(userId);
}
}

View File

@ -4,9 +4,8 @@ namespace AccessQueuePlayground.Models
{
public class AccessQueueStatus
{
public List<User> Users { get; set; } = [];
public int QueueSize { get; set; }
public int ActiveTickets { get; set; }
public int UnexpiredTickets { get; set; }
public List<User> AccessUsers { get; set; } = [];
public List<User> QueuedUsers { get; set; } = [];
public List<User> InactiveUsers { get; set; } = [];
}
}

View File

@ -52,13 +52,29 @@ namespace AccessQueuePlayground.Services
var newStatus = new AccessQueueStatus();
foreach (var user in userList)
{
AccessResponse? response = user.LatestResponse;
if (user.Active)
{
response = await _accessService.RequestAccess(user.Id);
user.LatestResponse = response;
user.LatestResponse = await _accessService.RequestAccess(user.Id);
if (user.LatestResponse?.HasAccess ?? false)
{
newStatus.AccessUsers.Add(user);
}
else
{
newStatus.QueuedUsers.Add(user);
}
}
else
{
if(user.LatestResponse?.ExpiresOn != null && user.LatestResponse.ExpiresOn > DateTime.UtcNow)
{
newStatus.AccessUsers.Add(user);
}
else
{
newStatus.InactiveUsers.Add(user);
}
}
newStatus.Users.Add(user);
}
_status = newStatus;
NotifyStatusUpdated();

View File

@ -6,9 +6,9 @@
}
},
"AccessQueue": {
"CapacityLimit": 10, // Maximum number of active users
"ActivitySeconds": 5, // Time since last access before a user is considered inactive
"ExpirationSeconds": 30, // 12 hours - Time before a user access is revoked
"CapacityLimit": 3, // Maximum number of active users
"ActivitySeconds": 2, // Time since last access before a user is considered inactive
"ExpirationSeconds": 10, // 12 hours - Time before a user access is revoked
"RollingExpiration": true // Whether to extend expiration time on access
},
"AllowedHosts": "*"