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 =>