public async Task <IActionResult> GetCovidStatistics(string packageDate) { try { var applicationStatisticsDb = await _applicationStatisticsRepository.GetNewestEntryAsync(); if (applicationStatisticsDb == null) { throw new InvalidOperationException("No application statistics entries in the database"); } CovidStatistics covidStatisticsDb; if (packageDate != null) { var success = DateTime.TryParse(packageDate, out DateTime lastPackageDate); if (!success) { _logger.LogError("Could not parse package date"); return(BadRequest("Could not parse package date")); } covidStatisticsDb = await _covidStatisticsRepository.GetEntryByDateAsync(lastPackageDate); } else { covidStatisticsDb = await _covidStatisticsRepository.GetNewestEntryAsync(); } if (covidStatisticsDb == null) { return(NoContent()); } var resultsDbTuple = new Tuple <CovidStatistics, ApplicationStatistics>(covidStatisticsDb, applicationStatisticsDb); var covidStatisticsDto = _mapper.Map <Tuple <CovidStatistics, ApplicationStatistics>, StatisticsDto>(resultsDbTuple); return(Ok(covidStatisticsDto)); } catch (InvalidOperationException e) { _logger.LogError(e.ToString()); return(BadRequest()); } catch (Exception e) { _logger.LogError($"Unexpected behaviour. Exception message: {e}"); return(StatusCode(500)); } }
/// <summary> /// Checks access to log files and that they are written to every day /// </summary> /// <param name="context"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) { _logger.LogInformation($"Health check {Startup.NumbersTodayPattern}"); var status = HealthStatus.Healthy; var data = new Dictionary <string, object>(); var hour = _appSettingsConfig.HealthCheckSettings.NumbersTodayCallAfter24Hour; if (TooEarly(hour, _logger)) { var key = $"Too early to check numbers today {DateTime.Now}"; data.Add(key, $"Configured value is {hour}"); return(await Task.FromResult(new HealthCheckResult( status, Description, data : data))); } // Check directory exists var directoryPath = _appSettingsConfig.GitHubSettings.GitHubStatisticsZipFileFolder; if (!_fileSystem.DirectoryExists(directoryPath)) { status = HealthStatus.Unhealthy; data.Add("Directory for SSI statistics does not exist", directoryPath); return(await Task.FromResult(new HealthCheckResult( status, Description, data : data))); } // Check latest file is from today var directory = new DirectoryInfo(directoryPath); var latestFileInfo = directory.GetFiles().OrderByDescending(f => f.LastWriteTime).FirstOrDefault(); if (latestFileInfo == null) { status = HealthStatus.Unhealthy; data.Add($"SSI statistics file for today does not exist. Empty folder.", directoryPath); return(await Task.FromResult(new HealthCheckResult( status, Description, data : data))); } var today = DateTime.Today.ToString("yyyy-MM-dd"); if (!latestFileInfo.Name.Contains(today)) { status = HealthStatus.Unhealthy; data.Add($"SSI statistics file for today does not exist. Latest file is {latestFileInfo.Name}", directoryPath); } // Check numbers have been stored in database try { // check infection numbers var newestEntry = await _covidStatisticsRepository.GetNewestEntryAsync(); if (newestEntry == null) { status = HealthStatus.Unhealthy; data.Add("SSI statistics infection entry in database does not exists", "CovidStatistics"); return(await Task.FromResult(new HealthCheckResult( status, Description, data : data))); } var entryDate = newestEntry.EntryDate; var entryDateString = entryDate.ToString("yyyy-MM-dd"); if (!entryDateString.Contains(today)) { status = HealthStatus.Unhealthy; data.Add($"SSI statistics infection entry in database is not from today {DateTime.Now}", $"Latest entry is from {entryDate}"); } // check vaccine numbers var newestVaccineEntry = await _covidStatisticsRepository.GetNewestEntryAsync(); if (newestVaccineEntry == null) { status = HealthStatus.Unhealthy; data.Add("SSI statistics vaccine entry in database does not exists", "CovidStatistics"); return(await Task.FromResult(new HealthCheckResult( status, Description, data : data))); } var vaccineEntryDate = newestVaccineEntry.EntryDate; var vaccineEntryDateString = vaccineEntryDate.ToString("yyyy-MM-dd"); if (!vaccineEntryDateString.Contains(today)) { status = HealthStatus.Unhealthy; data.Add($"SSI statistics vaccine entry in database is not from today {DateTime.Now}", $"Latest entry is from {entryDate}"); } } catch (Exception e) { var errorMessage = $"{e.Message} - {e.StackTrace}"; _logger.LogError(errorMessage); status = HealthStatus.Unhealthy; data.Add($"Error in data retrieval {DateTime.Now}", errorMessage); return(await Task.FromResult(new HealthCheckResult( status, Description, e, data))); } return(await Task.FromResult(new HealthCheckResult( status, Description, data : data))); }