Example #1
0
        public async Task SendNotificationsForNewAlert(Alert alert, GatewaySetting gatewaySetting)
        {
            var phoneNumbersOfSupervisorsInAlert = await _nyssContext.AlertReports
                                                   .Where(ar => ar.Alert.Id == alert.Id)
                                                   .Select(ar => ar.Report.DataCollector.Supervisor.PhoneNumber)
                                                   .Distinct()
                                                   .ToListAsync();

            var message = await CreateNotificationMessageForNewAlert(alert);

            await _queuePublisherService.SendSMSesViaEagle(gatewaySetting.EmailAddress, gatewaySetting.Name, phoneNumbersOfSupervisorsInAlert, message);

            await _queuePublisherService.QueueAlertCheck(alert.Id);
        }
Example #2
0
        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);
            }
        }