diff --git a/Data/FimRepository.cs b/Data/FimRepository.cs
new file mode 100644
index 0000000..17f562b
--- /dev/null
+++ b/Data/FimRepository.cs
@@ -0,0 +1,18 @@
+using Microsoft.EntityFrameworkCore;
+
+namespace fim_queueing_admin.Data;
+
+///
+/// Used for anything that can't be easily done with native EF
+///
+///
+public class FimRepository(FimDbContext dbContext)
+{
+ public async Task SetCartLastSeen(Guid id, DateTime? lastSeen)
+ {
+ // Note: EF will automatically parameterize this query, id and lastSeen are *not* just substituted in as strings
+ var result = await dbContext.Database.ExecuteSqlAsync(
+ $"UPDATE equipment SET configuration['LastSeen'] = to_jsonb({lastSeen}) WHERE id = {id}");
+ return result > 0;
+ }
+}
\ No newline at end of file
diff --git a/Hubs/AssistantHub.cs b/Hubs/AssistantHub.cs
index 5988657..83807d2 100644
--- a/Hubs/AssistantHub.cs
+++ b/Hubs/AssistantHub.cs
@@ -10,32 +10,20 @@
namespace fim_queueing_admin.Hubs;
[Authorize(AuthTokenScheme.AuthenticationScheme)]
-public class AssistantHub(FimDbContext dbContext, AssistantService assistantService, ILogger logger) : Hub
+public class AssistantHub(FimDbContext dbContext, FimRepository repository, AssistantService assistantService, ILogger logger) : Hub
{
private Guid CartId => Guid.Parse(Context.User?.FindFirst(ClaimTypes.CartId)?.Value ??
throw new ApplicationException("No cart id"));
public override async Task OnConnectedAsync()
{
- // await dbContext.Carts.Where(c => c.Id == CartId).ExecuteUpdateAsync(c => c
- // .SetProperty(p => p.Configuration!.LastSeen, DateTime.MaxValue));
- var cart = await dbContext.Carts.FirstOrDefaultAsync(c => c.Id == CartId);
- if (cart is not null)
- {
- cart.Configuration!.LastSeen = DateTime.MaxValue;
- await dbContext.SaveChangesAsync();
- }
+ await repository.SetCartLastSeen(CartId, DateTime.MaxValue);
await SendPendingAlertsToCaller();
}
public override async Task OnDisconnectedAsync(Exception? exception)
{
- var cart = await dbContext.Carts.FirstOrDefaultAsync(c => c.Id == CartId);
- if (cart is not null)
- {
- cart.Configuration!.LastSeen = DateTime.UtcNow;
- await dbContext.SaveChangesAsync();
- }
+ await repository.SetCartLastSeen(CartId, DateTime.UtcNow);
}
///
diff --git a/Program.cs b/Program.cs
index 76d29d6..70ef057 100644
--- a/Program.cs
+++ b/Program.cs
@@ -81,6 +81,7 @@ async Task GetAccessToken()
builder.Services.AddSingleton();
builder.Services.AddSingleton();
+builder.Services.AddScoped();
builder.Services.AddSignalR();
builder.Services.AddCors(opt => opt.AddDefaultPolicy(pol =>