public async Task ReportDismissed(int reportId) { using var transactionScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled); var inspectedAlert = await _nyssContext.AlertReports .Where(ar => ar.ReportId == reportId) .Where(ar => ar.Alert.Status == AlertStatus.Pending) .Select(ar => ar.Alert) .SingleOrDefaultAsync(); if (inspectedAlert == null) { _loggerAdapter.Warn($"The alert for report with id {reportId} does not exist or has status different than pending."); return; } var report = await _nyssContext.Reports .Include(r => r.ProjectHealthRisk) .ThenInclude(phr => phr.AlertRule) .Where(r => r.Id == reportId) .SingleAsync(); if (report == null) { _loggerAdapter.Warn($"The report with id {reportId} does not exist."); return; } if (report.Status == ReportStatus.Pending) { report.Status = ReportStatus.Rejected; } var alertRule = report.ProjectHealthRisk.AlertRule; await RecalculateAlert(report, alertRule); await RejectAlertWhenRequirementsAreNotMet(reportId, alertRule, inspectedAlert); await _nyssContext.SaveChangesAsync(); transactionScope.Complete(); }
public async Task Handle(string queryString) { var parsedQueryString = HttpUtility.ParseQueryString(queryString); var sender = parsedQueryString[SenderParameterName]; var timestamp = parsedQueryString[TimestampParameterName]; var text = parsedQueryString[TextParameterName]; var incomingMessageId = parsedQueryString[IncomingMessageIdParameterName].ParseToNullableInt(); var outgoingMessageId = parsedQueryString[OutgoingMessageIdParameterName].ParseToNullableInt(); var modemNumber = parsedQueryString[ModemNumberParameterName].ParseToNullableInt(); var apiKey = parsedQueryString[ApiKeyParameterName]; ErrorReportData reportErrorData = null; try { Alert triggeredAlert = null; ProjectHealthRisk projectHealthRisk = null; GatewaySetting gatewaySetting = null; using (var transactionScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { var rawReport = new RawReport { Sender = sender, Timestamp = timestamp, ReceivedAt = _dateTimeProvider.UtcNow, Text = text, IncomingMessageId = incomingMessageId, OutgoingMessageId = outgoingMessageId, ModemNumber = modemNumber, ApiKey = apiKey }; await _nyssContext.AddAsync(rawReport); var reportValidationResult = await ParseAndValidateReport(rawReport, parsedQueryString); if (reportValidationResult.IsSuccess) { gatewaySetting = reportValidationResult.GatewaySetting; projectHealthRisk = reportValidationResult.ReportData.ProjectHealthRisk; var epiDate = _dateTimeProvider.GetEpiDate(reportValidationResult.ReportData.ReceivedAt); var report = new Report { IsTraining = reportValidationResult.ReportData.DataCollector.IsInTrainingMode, ReportType = reportValidationResult.ReportData.ParsedReport.ReportType, Status = ReportStatus.New, ReceivedAt = reportValidationResult.ReportData.ReceivedAt, CreatedAt = _dateTimeProvider.UtcNow, DataCollector = reportValidationResult.ReportData.DataCollector, EpiWeek = epiDate.EpiWeek, EpiYear = epiDate.EpiYear, PhoneNumber = sender, Location = reportValidationResult.ReportData.DataCollector.Location, ReportedCase = reportValidationResult.ReportData.ParsedReport.ReportedCase, KeptCase = new ReportCase { CountMalesBelowFive = null, CountMalesAtLeastFive = null, CountFemalesBelowFive = null, CountFemalesAtLeastFive = null }, DataCollectionPointCase = reportValidationResult.ReportData.ParsedReport.DataCollectionPointCase, ProjectHealthRisk = projectHealthRisk, ReportedCaseCount = projectHealthRisk.HealthRisk.HealthRiskType == HealthRiskType.Human ? (reportValidationResult.ReportData.ParsedReport.ReportedCase.CountFemalesAtLeastFive ?? 0) + (reportValidationResult.ReportData.ParsedReport.ReportedCase.CountFemalesBelowFive ?? 0) + (reportValidationResult.ReportData.ParsedReport.ReportedCase.CountMalesAtLeastFive ?? 0) + (reportValidationResult.ReportData.ParsedReport.ReportedCase.CountMalesBelowFive ?? 0) : 1 }; rawReport.Report = report; await _nyssContext.Reports.AddAsync(report); triggeredAlert = await _alertService.ReportAdded(report); } else { reportErrorData = reportValidationResult.ErrorReportData; gatewaySetting = reportValidationResult.GatewaySetting; } await _nyssContext.SaveChangesAsync(); transactionScope.Complete(); } if (reportErrorData == null) { if (!string.IsNullOrEmpty(gatewaySetting?.EmailAddress) && projectHealthRisk != null) { var recipients = new List <string> { sender }; await _queuePublisherService.SendSMSesViaEagle(gatewaySetting.EmailAddress, gatewaySetting.Name, recipients, projectHealthRisk.FeedbackMessage); } if (triggeredAlert != null) { await _alertService.SendNotificationsForNewAlert(triggeredAlert, gatewaySetting); } } else { await SendFeedbackOnError(reportErrorData, gatewaySetting); } } catch (ReportValidationException e) { _loggerAdapter.Warn(e.Message); } }