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));
            }
        }
コード例 #2
0
        /// <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)));
        }