public async Task <IActionResult> GetDepartures(Crossing crossing, DateTime?date, int?days = 1) { date = date ?? LaesoeTime.Now.Date; if (Request.GetTypedHeaders().CacheControl?.NoCache != true) { var departures = await _cache.GetDeparturesAsync(crossing, date.Value, days.Value, false, HttpContext.RequestAborted); if (departures != null) { return(Ok(departures)); } } await _crawlDeparturesProcessor.SyncDeparturesAsync(crossing, date.Value, days.Value, HttpContext.RequestAborted); var result = await _cache.GetDeparturesAsync(crossing, date.Value, days.Value, true, HttpContext.RequestAborted); return(Ok(result)); }
protected override async Task RunAsync(CancellationToken cancellationToken) { var crossings = (Crossing[])Enum.GetValues(typeof(Crossing)); var isFirstRun = true; while (!cancellationToken.IsCancellationRequested) { var now = LaesoeTime.Now; var nowDate = now.Date; int days = GetDays(now, isFirstRun); isFirstRun = false; try { foreach (var crossing in crossings) { await _processor.SyncDeparturesAsync(crossing, nowDate, days, cancellationToken); _logger.LogInformation("Successfully synchronized departures for {Crossing} from {Date} for {Days} days", crossing, nowDate, days); } } catch (TaskCanceledException) { } catch (Exception e) { _logger.LogError(e, "Departure synchronization failed from {Date} for {Days} days", nowDate, days); } try { await Task.Delay(TimeSpan.FromHours(1), cancellationToken); } catch (TaskCanceledException) { } } }