diff --git a/src/NetworkOptimizer.Storage/Repositories/CmRepository.cs b/src/NetworkOptimizer.Storage/Repositories/CmRepository.cs index 2fb4100cd1..e3188d1d28 100644 --- a/src/NetworkOptimizer.Storage/Repositories/CmRepository.cs +++ b/src/NetworkOptimizer.Storage/Repositories/CmRepository.cs @@ -84,7 +84,6 @@ public async Task SaveCmConfigurationAsync(CmConfiguration config, CancellationT existing.Username = config.Username; existing.Password = config.Password; existing.StatusPagePath = config.StatusPagePath; - existing.Enabled = config.Enabled; existing.PollingIntervalSeconds = config.PollingIntervalSeconds; existing.LastPolled = config.LastPolled; existing.LastError = config.LastError; @@ -154,19 +153,20 @@ public async Task UpdateCmPollResultAsync(int id, DateTime? lastPolled, st { try { - var config = await _context.CmConfigurations.FirstOrDefaultAsync(c => c.Id == id, cancellationToken); - // Never resurrect or overwrite a config that was disabled while the poll was - // in flight - its frozen state (and cleared LastError) must stand. - if (config == null || !config.Enabled) - return false; - + var now = DateTime.UtcNow; + int rows; if (lastPolled.HasValue) - config.LastPolled = lastPolled.Value; - config.LastError = lastError; - config.UpdatedAt = DateTime.UtcNow; - - await _context.SaveChangesAsync(cancellationToken); - return true; + rows = await _context.CmConfigurations.Where(c => c.Id == id && c.Enabled) + .ExecuteUpdateAsync(s => s + .SetProperty(c => c.LastPolled, lastPolled.Value) + .SetProperty(c => c.LastError, lastError) + .SetProperty(c => c.UpdatedAt, now), cancellationToken); + else + rows = await _context.CmConfigurations.Where(c => c.Id == id && c.Enabled) + .ExecuteUpdateAsync(s => s + .SetProperty(c => c.LastError, lastError) + .SetProperty(c => c.UpdatedAt, now), cancellationToken); + return rows > 0; } catch (Exception ex) { diff --git a/src/NetworkOptimizer.Storage/Repositories/ModemRepository.cs b/src/NetworkOptimizer.Storage/Repositories/ModemRepository.cs index b5a60fd2bf..65379a8e4f 100644 --- a/src/NetworkOptimizer.Storage/Repositories/ModemRepository.cs +++ b/src/NetworkOptimizer.Storage/Repositories/ModemRepository.cs @@ -107,7 +107,6 @@ public async Task SaveModemConfigurationAsync(ModemConfiguration config, Cancell existing.ModemType = config.ModemType; existing.QmiDevice = config.QmiDevice; existing.Provider = config.Provider; - existing.Enabled = config.Enabled; existing.PollingIntervalSeconds = config.PollingIntervalSeconds; existing.LastPolled = config.LastPolled; existing.LastError = config.LastError; @@ -182,19 +181,20 @@ public async Task UpdateModemPollResultAsync(int id, DateTime? lastPolled, { try { - var config = await _context.ModemConfigurations.FirstOrDefaultAsync(m => m.Id == id, cancellationToken); - // Never resurrect or overwrite a config that was disabled while the poll was - // in flight - its frozen state (and cleared LastError) must stand. - if (config == null || !config.Enabled) - return false; - + var now = DateTime.UtcNow; + int rows; if (lastPolled.HasValue) - config.LastPolled = lastPolled.Value; - config.LastError = lastError; - config.UpdatedAt = DateTime.UtcNow; - - await _context.SaveChangesAsync(cancellationToken); - return true; + rows = await _context.ModemConfigurations.Where(m => m.Id == id && m.Enabled) + .ExecuteUpdateAsync(s => s + .SetProperty(m => m.LastPolled, lastPolled.Value) + .SetProperty(m => m.LastError, lastError) + .SetProperty(m => m.UpdatedAt, now), cancellationToken); + else + rows = await _context.ModemConfigurations.Where(m => m.Id == id && m.Enabled) + .ExecuteUpdateAsync(s => s + .SetProperty(m => m.LastError, lastError) + .SetProperty(m => m.UpdatedAt, now), cancellationToken); + return rows > 0; } catch (Exception ex) { diff --git a/src/NetworkOptimizer.Storage/Repositories/OntRepository.cs b/src/NetworkOptimizer.Storage/Repositories/OntRepository.cs index 3531f21453..24ccccd7b6 100644 --- a/src/NetworkOptimizer.Storage/Repositories/OntRepository.cs +++ b/src/NetworkOptimizer.Storage/Repositories/OntRepository.cs @@ -85,7 +85,6 @@ public async Task SaveOntConfigurationAsync(OntConfiguration config, Cancellatio existing.Password = config.Password; existing.PrivateKeyPath = config.PrivateKeyPath; existing.AttachedSfpId = config.AttachedSfpId; - existing.Enabled = config.Enabled; existing.PollingIntervalSeconds = config.PollingIntervalSeconds; existing.LastPolled = config.LastPolled; existing.LastError = config.LastError; @@ -155,19 +154,20 @@ public async Task UpdateOntPollResultAsync(int id, DateTime? lastPolled, s { try { - var config = await _context.OntConfigurations.FirstOrDefaultAsync(o => o.Id == id, cancellationToken); - // Never resurrect or overwrite a config that was disabled while the poll was - // in flight - its frozen state (and cleared LastError) must stand. - if (config == null || !config.Enabled) - return false; - + var now = DateTime.UtcNow; + int rows; if (lastPolled.HasValue) - config.LastPolled = lastPolled.Value; - config.LastError = lastError; - config.UpdatedAt = DateTime.UtcNow; - - await _context.SaveChangesAsync(cancellationToken); - return true; + rows = await _context.OntConfigurations.Where(o => o.Id == id && o.Enabled) + .ExecuteUpdateAsync(s => s + .SetProperty(o => o.LastPolled, lastPolled.Value) + .SetProperty(o => o.LastError, lastError) + .SetProperty(o => o.UpdatedAt, now), cancellationToken); + else + rows = await _context.OntConfigurations.Where(o => o.Id == id && o.Enabled) + .ExecuteUpdateAsync(s => s + .SetProperty(o => o.LastError, lastError) + .SetProperty(o => o.UpdatedAt, now), cancellationToken); + return rows > 0; } catch (Exception ex) { diff --git a/src/NetworkOptimizer.Storage/Repositories/StarlinkRepository.cs b/src/NetworkOptimizer.Storage/Repositories/StarlinkRepository.cs index a5ba3af414..385630c0f2 100644 --- a/src/NetworkOptimizer.Storage/Repositories/StarlinkRepository.cs +++ b/src/NetworkOptimizer.Storage/Repositories/StarlinkRepository.cs @@ -81,7 +81,6 @@ public async Task SaveStarlinkConfigurationAsync(StarlinkConfiguration config, C existing.Provider = config.Provider; existing.Host = config.Host; existing.Port = config.Port; - existing.Enabled = config.Enabled; existing.PollingIntervalSeconds = config.PollingIntervalSeconds; existing.LastPolled = config.LastPolled; existing.LastError = config.LastError; @@ -132,19 +131,24 @@ public async Task UpdateStarlinkPollResultAsync(int id, DateTime? lastPoll { try { - var config = await _context.StarlinkConfigurations.FirstOrDefaultAsync(c => c.Id == id, cancellationToken); // Never resurrect or overwrite a config that was disabled while the poll was - // in flight - its frozen state (and cleared LastError) must stand. - if (config == null || !config.Enabled) - return false; - + // in flight - its frozen state (and cleared LastError) must stand. Check and + // write in one conditional statement so a Disable committing in between + // cannot slip through. + var now = DateTime.UtcNow; + int rows; if (lastPolled.HasValue) - config.LastPolled = lastPolled.Value; - config.LastError = lastError; - config.UpdatedAt = DateTime.UtcNow; - - await _context.SaveChangesAsync(cancellationToken); - return true; + rows = await _context.StarlinkConfigurations.Where(c => c.Id == id && c.Enabled) + .ExecuteUpdateAsync(s => s + .SetProperty(c => c.LastPolled, lastPolled.Value) + .SetProperty(c => c.LastError, lastError) + .SetProperty(c => c.UpdatedAt, now), cancellationToken); + else + rows = await _context.StarlinkConfigurations.Where(c => c.Id == id && c.Enabled) + .ExecuteUpdateAsync(s => s + .SetProperty(c => c.LastError, lastError) + .SetProperty(c => c.UpdatedAt, now), cancellationToken); + return rows > 0; } catch (Exception ex) { diff --git a/src/NetworkOptimizer.Web/Components/Pages/Settings.razor b/src/NetworkOptimizer.Web/Components/Pages/Settings.razor index 19777ac6a5..6d218533f2 100644 --- a/src/NetworkOptimizer.Web/Components/Pages/Settings.razor +++ b/src/NetworkOptimizer.Web/Components/Pages/Settings.razor @@ -1236,12 +1236,6 @@ } } -
- -
}
@@ -1438,13 +1432,6 @@
-
- -
-
-
- -
-
-
- -
-