fix(online): honor runtime disable in sync loop to stop OIDC discovery

OnlineSyncService is registered once at startup; toggling the feature off
in Settings persisted the flag but never stopped the running loop, so it
kept polling and failing OIDC discovery every cycle. Guard TickAsync on
the shared config's Enabled flag so disabling takes effect live.
This commit is contained in:
Mika Kuns
2026-06-23 16:02:29 +02:00
parent 19340fd9de
commit f86b78593e
2 changed files with 20 additions and 2 deletions

View File

@@ -66,6 +66,12 @@ public sealed class OnlineSyncService : BackgroundService
internal async Task TickAsync(CancellationToken ct)
{
// Respect a runtime disable. The hosted service stays registered for the process
// lifetime, so toggling the feature off in Settings must stop all sync + auth work
// (incl. OIDC discovery) here — otherwise the loop keeps polling until a restart.
if (!_config.Enabled)
return;
var token = await _auth.GetAccessTokenAsync(ct);
if (token is null)
{

View File

@@ -55,9 +55,9 @@ public sealed class OnlineSyncServiceTests : IDisposable
}
}
private OnlineSyncService BuildService(FakeApi api, string? token = "test-token")
private OnlineSyncService BuildService(FakeApi api, string? token = "test-token", bool enabled = true)
{
var config = new OnlineInboxConfig { Enabled = true, PollIntervalSeconds = 60 };
var config = new OnlineInboxConfig { Enabled = enabled, PollIntervalSeconds = 60 };
var auth = new StaticTokenAuthProvider(token);
return new OnlineSyncService(
_db.CreateFactory(),
@@ -209,6 +209,18 @@ public sealed class OnlineSyncServiceTests : IDisposable
Assert.Equal(0, api.CallCount);
}
[Fact]
public async Task Tick_Disabled_SkipsCycle_NoApiCalls()
{
_ = await SeedAsync();
var api = new FakeApi();
var svc = BuildService(api, enabled: false);
await svc.TickAsync(CancellationToken.None);
Assert.Equal(0, api.CallCount);
}
// ---- multi-user: owner stamping + guard ----
[Fact]