Add option to run playground against separate API
This commit is contained in:
parent
192dd67f52
commit
d549f99c67
|
@ -19,7 +19,15 @@ builder.Host.UseSerilog((context, services, configuration) =>
|
||||||
// Add services to the container.
|
// Add services to the container.
|
||||||
builder.Services.AddRazorComponents()
|
builder.Services.AddRazorComponents()
|
||||||
.AddInteractiveServerComponents();
|
.AddInteractiveServerComponents();
|
||||||
builder.Services.AddSingleton<IAccessService, AccessService>();
|
if (string.IsNullOrEmpty(builder.Configuration["AccessQueuePlayground:ServiceUrl"]))
|
||||||
|
{
|
||||||
|
builder.Services.AddSingleton<IAccessService, AccessService>();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
builder.Services.AddHttpClient();
|
||||||
|
builder.Services.AddSingleton<IAccessService, AccessQueueApiService>();
|
||||||
|
}
|
||||||
builder.Services.AddSingleton<IAccessQueueRepo, TakeANumberAccessQueueRepo>();
|
builder.Services.AddSingleton<IAccessQueueRepo, TakeANumberAccessQueueRepo>();
|
||||||
builder.Services.AddSingleton<IAccessQueueManager, AccessQueueManager>();
|
builder.Services.AddSingleton<IAccessQueueManager, AccessQueueManager>();
|
||||||
builder.Services.AddHostedService<AccessQueueBackgroundService>();
|
builder.Services.AddHostedService<AccessQueueBackgroundService>();
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Net.Http.Json;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
using AccessQueueService.Models;
|
||||||
|
using AccessQueueService.Services;
|
||||||
|
|
||||||
|
namespace AccessQueuePlayground.Services
|
||||||
|
{
|
||||||
|
public class AccessQueueApiService : IAccessService
|
||||||
|
{
|
||||||
|
private readonly HttpClient _httpClient;
|
||||||
|
private readonly string _serviceUrl;
|
||||||
|
|
||||||
|
public AccessQueueStatus Status => throw new NotImplementedException();
|
||||||
|
|
||||||
|
public AccessQueueApiService(HttpClient httpClient, IConfiguration config)
|
||||||
|
{
|
||||||
|
_httpClient = httpClient;
|
||||||
|
_serviceUrl = config["AccessQueuePlayground:ServiceUrl"]?.TrimEnd('/') ?? "https://localhost:7291";
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<AccessResponse> RequestAccess(string userId)
|
||||||
|
{
|
||||||
|
return await _httpClient.GetFromJsonAsync<AccessResponse>($"{_serviceUrl}/access/{userId}");
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<bool> RevokeAccess(string userId)
|
||||||
|
{
|
||||||
|
var response = await _httpClient.DeleteAsync($"{_serviceUrl}/access/{userId}");
|
||||||
|
if (response.IsSuccessStatusCode)
|
||||||
|
{
|
||||||
|
var result = await response.Content.ReadFromJsonAsync<bool>();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<int> DeleteExpiredTickets()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccessQueueConfig GetConfiguration()
|
||||||
|
{
|
||||||
|
return _httpClient.GetFromJsonAsync<AccessQueueConfig>($"{_serviceUrl}/config").Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateConfiguration(AccessQueueConfig config)
|
||||||
|
{
|
||||||
|
_ = _httpClient.PostAsJsonAsync($"{_serviceUrl}/config", config).Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PatchConfiguration(AccessQueueConfig partialConfig)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,13 +6,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AccessQueue": {
|
"AccessQueue": {
|
||||||
"CapacityLimit": 3, // Maximum number of active users
|
"CapacityLimit": 3,
|
||||||
"ActivitySeconds": 2, // Time since last access before a user is considered inactive
|
"ActivitySeconds": 2,
|
||||||
"ExpirationSeconds": 10, // 12 hours - Time before a user access is revoked
|
"ExpirationSeconds": 10,
|
||||||
"RollingExpiration": true // Whether to extend expiration time on access
|
"RollingExpiration": true
|
||||||
},
|
},
|
||||||
"AccessQueuePlayground": {
|
"AccessQueuePlayground": {
|
||||||
"RefreshRateMilliseconds": 200 // How often to re-request access and update the UI
|
"RefreshRateMilliseconds": 200,
|
||||||
|
"ServiceUrl": "https://localhost:7291/"
|
||||||
},
|
},
|
||||||
"AllowedHosts": "*"
|
"AllowedHosts": "*"
|
||||||
}
|
}
|
||||||
|
|
31
README.md
31
README.md
|
@ -155,7 +155,7 @@ Test results will be displayed in the terminal. You can also use Visual Studio's
|
||||||
|
|
||||||
The `AccessQueuePlayground` project provides a simple web-based UI for interacting with the AccessQueueService API. This is useful for testing and demonstration purposes.
|
The `AccessQueuePlayground` project provides a simple web-based UI for interacting with the AccessQueueService API. This is useful for testing and demonstration purposes.
|
||||||
|
|
||||||
### Running the Playground
|
### Running
|
||||||
|
|
||||||
1. Build and run the playground project:
|
1. Build and run the playground project:
|
||||||
```powershell
|
```powershell
|
||||||
|
@ -166,7 +166,7 @@ The `AccessQueuePlayground` project provides a simple web-based UI for interacti
|
||||||
- HTTPS: https://localhost:7211
|
- HTTPS: https://localhost:7211
|
||||||
(See `AccessQueuePlayground/Properties/launchSettings.json` for details.)
|
(See `AccessQueuePlayground/Properties/launchSettings.json` for details.)
|
||||||
|
|
||||||
### Using the Playground
|
### Using
|
||||||
|
|
||||||
- Open the provided URL in your browser.
|
- Open the provided URL in your browser.
|
||||||
- Use the UI to request and revoke access for different user IDs.
|
- Use the UI to request and revoke access for different user IDs.
|
||||||
|
@ -174,5 +174,32 @@ The `AccessQueuePlayground` project provides a simple web-based UI for interacti
|
||||||
|
|
||||||
This playground is intended only for local development and demonstration.
|
This playground is intended only for local development and demonstration.
|
||||||
|
|
||||||
|
### Configuring
|
||||||
|
|
||||||
|
The `AccessQueuePlayground` project can be configured via its `appsettings.json` file. The main options are:
|
||||||
|
|
||||||
|
- **RefreshRateMilliseconds**: Determines how often (in milliseconds) the playground requests access for all active users and updates the UI. Lower values provide more real-time updates but may increase load on the service.
|
||||||
|
- **ServiceUrl**: The URL of the AccessQueueService API to use. If this is set, all API requests from the playground will be sent to the specified service URL (e.g., `https://localhost:7291/`).
|
||||||
|
- If `ServiceUrl` is **not provided**, the playground will use an internal instance of AccessQueueService, configured using the playground's own `appsettings.json` values under the `AccessQueue` section. This is useful for local development and testing without running the service separately.
|
||||||
|
|
||||||
|
Example configuration in `AccessQueuePlayground/appsettings.json`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"AccessQueuePlayground": {
|
||||||
|
"RefreshRateMilliseconds": 200,
|
||||||
|
"ServiceUrl": "https://localhost:7291/"
|
||||||
|
},
|
||||||
|
"AccessQueue": {
|
||||||
|
"CapacityLimit": 3,
|
||||||
|
"ActivitySeconds": 2,
|
||||||
|
"ExpirationSeconds": 10,
|
||||||
|
"RollingExpiration": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Tip:** Adjust `RefreshRateMilliseconds` for your use case. For most demos, 100–500ms works well. If you are connecting to a remote or production AccessQueueService, consider increasing the refresh interval (e.g., 1000ms or higher) to account for network latency and reduce unnecessary load.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
See [LICENSE.txt](./LICENSE.txt) for license information.
|
See [LICENSE.txt](./LICENSE.txt) for license information.
|
Loading…
Reference in New Issue