1 files changed, 97 insertions, 0 deletions
diff --git a/testFrontend/SafeNSound.FakeUser/UserStore.cs b/testFrontend/SafeNSound.FakeUser/UserStore.cs
new file mode 100644
index 0000000..9b04efb
--- /dev/null
+++ b/testFrontend/SafeNSound.FakeUser/UserStore.cs
@@ -0,0 +1,97 @@
+using SafeNSound.Sdk;
+
+namespace SafeNSound.FakeUser;
+
+public class UserStore(SafeNSoundAuthentication authService, SafeNSoundConfiguration config) : IHostedService {
+ public List<ClientContainer> Admins { get; } = Enumerable.Range(0, 1).Select(_ => new ClientContainer()).ToList();
+ public List<ClientContainer> Monitors { get; } = Enumerable.Range(0, 5).Select(_ => new ClientContainer()).ToList();
+ public List<ClientContainer> Users { get; } = Enumerable.Range(0, 150000).Select(_ => new ClientContainer()).ToList();
+ public List<ClientContainer> AllUsers => [.. Users, .. Monitors, .. Admins];
+
+ public ClientContainer GetRandomUser() {
+ ClientContainer user;
+ do {
+ user = Users[new Random().Next(Users.Count)];
+ } while (user.Client == null);
+
+ return user;
+ }
+
+ public ClientContainer GetRandomMonitor() {
+ ClientContainer user;
+ do {
+ user = Monitors[new Random().Next(Monitors.Count)];
+ } while (user.Client == null);
+
+ return user;
+ }
+
+ public ClientContainer GetRandomAdmin() {
+ ClientContainer user;
+ do {
+ user = Admins[new Random().Next(Admins.Count)];
+ } while (user.Client == null);
+
+ return user;
+ }
+
+ public ClientContainer GetRandomUserOfAnyType() {
+ ClientContainer user;
+ do {
+ user = AllUsers[new Random().Next(AllUsers.Count)];
+ } while (user.Client == null);
+
+ return user;
+ }
+
+ public async Task StartAsync(CancellationToken cancellationToken) {
+ Admins.ForEach(x => x.Auth.UserType = "admin");
+ Monitors.ForEach(x => x.Auth.UserType = "monitor");
+ var ss = new SemaphoreSlim(256, 256);
+ var tasks = ((ClientContainer[]) [..Users, ..Monitors, ..Admins]).Select(async container => {
+ await ss.WaitAsync();
+ await authService.Register(container.Auth);
+ // container.Client = new SafeNSoundClient(config, (await authService.Login(container.Auth)).AccessToken);
+ // container.WhoAmI = await container.Client.WhoAmI();
+ ss.Release();
+ }).ToList();
+ await Task.WhenAll(tasks);
+
+ var users = Users.ToArray();
+ tasks = Monitors.Select(async container => {
+ var items = Random.Shared.GetItems(users, Users.Count / Monitors.Count).DistinctBy(x=>x.WhoAmI!.UserId);
+ foreach (var user in items) {
+ await container.Client!.AddAssignedUser(user.WhoAmI!.UserId);
+ }
+ }).ToList();
+ await Task.WhenAll(tasks);
+ }
+
+ public async Task StopAsync(CancellationToken cancellationToken) {
+ await Task.WhenAll(Users.Select(Cleanup).ToList());
+ await Task.WhenAll(Monitors.Select(Cleanup).ToList());
+ await Task.WhenAll(Admins.Select(Cleanup).ToList());
+ }
+
+ private async Task Cleanup(ClientContainer container) {
+ if (container.Client == null) return;
+ try {
+ await container.Client.DeleteAccount(container.Auth);
+ }
+ catch {
+ Console.WriteLine("Failed to delete account for user: " + container.Auth.Username);
+ }
+ }
+
+ public class ClientContainer {
+ public RegisterDto Auth { get; set; } = new() {
+ Email = $"{Guid.NewGuid()}@example.com",
+ Username = $"user-{Guid.NewGuid()}",
+ Password = Guid.NewGuid().ToString(),
+ UserType = "user"
+ };
+
+ public SafeNSoundClient? Client { get; set; }
+ public WhoAmI? WhoAmI { get; set; }
+ }
+}
\ No newline at end of file
|