Skip to content

Commit f69a4cc

Browse files
committed
Refactor data fetching and error handling for better reliability
Updated data fetching to use asynchronous methods (`FetchBetriebspunkt`) for improved scalability and consistency across event handlers. Enhanced error handling in background information updates to log exceptions, preventing silent failures. Minor adjustments include extending `Flags` enum, refining delay handling logic, and increasing periodic timer intervals for better performance.
1 parent 6fa2166 commit f69a4cc

File tree

9 files changed

+54
-29
lines changed

9 files changed

+54
-29
lines changed

Streckenbuch.Client/Events/ApproachingStop/ApproachingStopEventHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public ApproachingStopEventHandler(AudioState audioState, DataState dataState)
1616

1717
public async Task<Unit> Handle(ApproachingStopEvent request, CancellationToken cancellationToken)
1818
{
19-
var betriebspunkt = _dataState.Betriebspunkte.SingleOrDefault(x => x.Id == request.BetriebspunktId);
19+
var betriebspunkt = await _dataState.FetchBetriebspunkt(request.BetriebspunktId);
2020

2121
if (betriebspunkt is null)
2222
{

Streckenbuch.Client/Events/StopAdded/StopAddedHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public StopAddedHandler(AudioState audioState, DataState dataState, FahrenPositi
1919

2020
public async Task<Unit> Handle(Shared.Contracts.StopAdded request, CancellationToken cancellationToken)
2121
{
22-
var betriebspunkt = _dataState.Betriebspunkte.SingleOrDefault(x => x.Id == request.BetriebspunktId);
22+
var betriebspunkt = await _dataState.FetchBetriebspunkt(request.BetriebspunktId);
2323

2424
if (betriebspunkt is null)
2525
{

Streckenbuch.Client/Events/StopCanceled/StopCaneledHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public StopCaneledHandler(AudioState audioState, DataState dataState)
1616

1717
public async Task<Unit> Handle(Shared.Contracts.StopCanceled request, CancellationToken cancellationToken)
1818
{
19-
var betriebspunkt = _dataState.Betriebspunkte.SingleOrDefault(x => x.Id == request.BetriebspunktId);
19+
var betriebspunkt = await _dataState.FetchBetriebspunkt(request.BetriebspunktId);
2020

2121
if (betriebspunkt is null)
2222
{

Streckenbuch.Client/Events/StopDelayIntroduced/StopDelayIntroducedHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public StopDelayIntroducedHandler(AudioState audioState, DataState dataState)
1616

1717
public async Task<Unit> Handle(Shared.Contracts.StopDelayIntroduced request, CancellationToken cancellationToken)
1818
{
19-
var betriebspunkt = _dataState.Betriebspunkte.SingleOrDefault(x => x.Id == request.BetriebspunktId);
19+
var betriebspunkt = await _dataState.FetchBetriebspunkt(request.BetriebspunktId);
2020

2121
if (betriebspunkt is null)
2222
{

Streckenbuch.Client/States/DataState.cs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,28 @@ namespace Streckenbuch.Client.States;
88

99
public class DataState
1010
{
11-
public IReadOnlyList<BetriebspunktProto> Betriebspunkte => _betriebspunkte.AsReadOnly();
12-
11+
private readonly BetriebspunkteService.BetriebspunkteServiceClient _betriebspunkteService;
1312

1413
private readonly List<BetriebspunktProto> _betriebspunkte = new();
1514

1615
public DataState(BetriebspunkteService.BetriebspunkteServiceClient betriebspunkteService)
1716
{
18-
FetchBetriebspunkte(betriebspunkteService);
17+
_betriebspunkteService = betriebspunkteService;
1918
}
2019

21-
private void FetchBetriebspunkte(BetriebspunkteService.BetriebspunkteServiceClient betriebspunkteService)
20+
public async Task<List<BetriebspunktProto>> FetchBetriebspunkte()
2221
{
23-
var responseTask = betriebspunkteService.ListAllBetriebspunkteAsync(new Empty()).ResponseAsync;
22+
if (_betriebspunkte.Count == 0)
23+
{
24+
_betriebspunkte.AddRange((await _betriebspunkteService.ListAllBetriebspunkteAsync(new Empty())).Betriebspunkte);
25+
}
2426

25-
responseTask.ConfigureAwait(false);
26-
responseTask.ContinueWith(x => _betriebspunkte.AddRange(x.Result.Betriebspunkte));
27+
return _betriebspunkte;
28+
}
29+
30+
public async Task<BetriebspunktProto?> FetchBetriebspunkt(Guid id)
31+
{
32+
var list = await FetchBetriebspunkte();
33+
return list.FirstOrDefault(x => x.Id == id);
2734
}
28-
29-
3035
}

Streckenbuch.Miku/Models/Fahrten/FahrtenRoot.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ public class Haltestellen : IEquatable<Haltestellen>
146146
public string Bezeichnung { get; set; }
147147

148148
[JsonPropertyName("flags")]
149-
public List<Flags>? Flags { get; set; }
149+
public List<string>? Flags { get; set; }
150150

151151
[JsonPropertyName("abfahrtszeiten")]
152152
public Zeiten? Abfahrtszeiten { get; set; }

Streckenbuch.Miku/Models/Fahrten/Flags.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22

33
public enum Flags
44
{
5-
AUSFALL
5+
AUSFALL,
6+
AO_HALT
67
}

Streckenbuch.Server/Background/UpdateBackgroundInformation.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public UpdateBackgroundInformation(ILogger<UpdateBackgroundInformation> logger,
2020

2121
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
2222
{
23-
using PeriodicTimer timer = new PeriodicTimer(TimeSpan.FromSeconds(5));
23+
using PeriodicTimer timer = new PeriodicTimer(TimeSpan.FromSeconds(30));
2424

2525
while (!stoppingToken.IsCancellationRequested)
2626
{
@@ -43,9 +43,15 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
4343

4444
private async Task UpdateInformationForTrain(Guid clientId, int trainNumber)
4545
{
46-
var fahrtInformation = await _mikuApi.Fahrt.ListByTrainNumber(trainNumber);
47-
48-
await _continuousConnectionState.ProcessMikuInformation(clientId, fahrtInformation.Haltestellen);
46+
try
47+
{
48+
var fahrtInformation = await _mikuApi.Fahrt.ListByTrainNumber(trainNumber);
49+
50+
await _continuousConnectionState.ProcessMikuInformation(clientId, fahrtInformation.Haltestellen);
51+
} catch (Exception e)
52+
{
53+
_logger.LogError(e, "Error while updating background information for train {0}", trainNumber);
54+
}
4955
}
5056

5157
}

Streckenbuch.Server/States/ContinuousConnectionState.cs

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,14 @@ public async Task ProcessMikuInformation(Guid clientId, List<Haltestellen> halte
135135

136136
foreach (Haltestellen changedHaltestellen in changed)
137137
{
138-
await HandleChangedMessageAsync(clientId, changedHaltestellen, oldStops[changedHaltestellen.BetriebspunktId], haltestellen[haltestellen.IndexOf(changedHaltestellen) - 1], betriebspunkteRepository);
138+
Haltestellen? previousHaltestelle = null;
139+
var index = haltestellen.IndexOf(changedHaltestellen);
140+
if (index != 0)
141+
{
142+
previousHaltestelle = haltestellen[haltestellen.IndexOf(changedHaltestellen) - 1];
143+
}
144+
145+
await HandleChangedMessageAsync(clientId, changedHaltestellen, oldStops[changedHaltestellen.BetriebspunktId], previousHaltestelle, betriebspunkteRepository);
139146
}
140147

141148
_processedHaltestellen[clientId] = haltestellen;
@@ -161,7 +168,7 @@ private async Task HandleStopRemovedMessageAsync(Guid clientId, Haltestellen rem
161168
});
162169
}
163170

164-
private async Task HandleChangedMessageAsync(Guid clientId, Haltestellen changedHaltestelle, Haltestellen oldHaltestelle, Haltestellen previousHaltestelle, BetriebspunkteRepository betriebspunkteRepository)
171+
private async Task HandleChangedMessageAsync(Guid clientId, Haltestellen changedHaltestelle, Haltestellen oldHaltestelle, Haltestellen? previousHaltestelle, BetriebspunkteRepository betriebspunkteRepository)
165172
{
166173
var betriebspunktId = await betriebspunkteRepository.GetIdByMikuId(changedHaltestelle.BetriebspunktId);
167174

@@ -185,14 +192,14 @@ private void HandleStopCancellation(Guid clientId, Haltestellen changedHaltestel
185192
});
186193
}
187194

188-
private void HandleStopDelay(Guid clientId, Haltestellen changedHaltestelle, Haltestellen oldHaltestelle, Guid betriebspunktId, Haltestellen previousHaltestelle)
195+
private void HandleStopDelay(Guid clientId, Haltestellen changedHaltestelle, Haltestellen oldHaltestelle, Guid betriebspunktId, Haltestellen? previousHaltestelle)
189196
{
190197
if (changedHaltestelle.Verspaetungsgrund is null)
191198
{
192199
return;
193200
}
194201

195-
if (previousHaltestelle.Verspaetungsgrund is not null)
202+
if (previousHaltestelle?.Verspaetungsgrund is not null)
196203
{
197204
return;
198205
}
@@ -220,16 +227,22 @@ private void HandleStopDelay(Guid clientId, Haltestellen changedHaltestelle, Hal
220227
static bool HasSignificantIncrease(int? newDelay, int? oldDelay) =>
221228
newDelay.HasValue && ((!oldDelay.HasValue && newDelay.Value > 3) || (oldDelay.HasValue && newDelay.Value > oldDelay.Value + 2));
222229

223-
if (HasSignificantIncrease(changed.Ankunftszeiten.Verspaetung, old.Ankunftszeiten.Verspaetung)
224-
|| (isNewDelayReason && changed.Ankunftszeiten.Verspaetung.HasValue))
230+
if (changed.Ankunftszeiten is not null && old.Ankunftszeiten is not null)
225231
{
226-
return changed.Ankunftszeiten.Verspaetung;
232+
if (HasSignificantIncrease(changed.Ankunftszeiten.Verspaetung, old.Ankunftszeiten.Verspaetung)
233+
|| (isNewDelayReason && changed.Ankunftszeiten.Verspaetung.HasValue))
234+
{
235+
return changed.Ankunftszeiten.Verspaetung;
236+
}
227237
}
228238

229-
if (HasSignificantIncrease(changed.Abfahrtszeiten.Verspaetung, old.Abfahrtszeiten.Verspaetung)
230-
|| (isNewDelayReason && changed.Abfahrtszeiten.Verspaetung.HasValue))
239+
if (changed.Abfahrtszeiten is not null && old.Abfahrtszeiten is not null)
231240
{
232-
return changed.Abfahrtszeiten.Verspaetung;
241+
if (HasSignificantIncrease(changed.Abfahrtszeiten.Verspaetung, old.Abfahrtszeiten.Verspaetung)
242+
|| (isNewDelayReason && changed.Abfahrtszeiten.Verspaetung.HasValue))
243+
{
244+
return changed.Abfahrtszeiten.Verspaetung;
245+
}
233246
}
234247

235248
return null;

0 commit comments

Comments
 (0)