//TODO: Add a test that ensure that the right count is put in the right property //TODO: This should possibly be process once, since it should only happen the first time a text message is recieved public void Process(TextMessageReceived @event) { //TODO: Handle if parsing fails and send TextMessageParseFailed event var caseReportContent = TextMessageContentParser.Parse(@event.Message); var dataCollector = _dataCollectors.GetByPhoneNumber(@event.OriginNumber); if (caseReportContent.GetType() == typeof(SingleCaseReportContent)) { var singlecaseReport = caseReportContent as SingleCaseReportContent; _eventEmitter.Emit(Feature, new CaseReportReceived { Id = Guid.NewGuid(), DataCollectorId = dataCollector?.Id, HealthRiskId = _healthRisks.GetByReadableId(caseReportContent.HealthRiskId).Id, NumberOfFemalesUnder5 = singlecaseReport.Age <= 5 && singlecaseReport.Sex == Sex.Female ? 1 : 0, NumberOfFemalesOver5 = singlecaseReport.Age > 5 && singlecaseReport.Sex == Sex.Female ? 1 : 0, NumberOfMalesUnder5 = singlecaseReport.Age <= 5 && singlecaseReport.Sex == Sex.Male ? 1 : 0, NumberOfMalesOver5 = singlecaseReport.Age > 5 && singlecaseReport.Sex == Sex.Male ? 1 : 0, Latitude = @event.Latitude, Longitude = @event.Longitude, Timestamp = @event.Sent }); } else { var report = caseReportContent as MultipleCaseReportContent; _eventEmitter.Emit(Feature, new CaseReportReceived { Id = Guid.NewGuid(), DataCollectorId = dataCollector?.Id, HealthRiskId = _healthRisks.GetByReadableId(caseReportContent.HealthRiskId).Id, NumberOfFemalesUnder5 = report.FemalesUnder5, NumberOfFemalesOver5 = report.FemalesOver5, NumberOfMalesUnder5 = report.MalesUnder5, NumberOfMalesOver5 = report.MalesOver5, Latitude = @event.Latitude, Longitude = @event.Longitude, Timestamp = @event.Sent }); } //TODO: emit AnonymousCaseReportRecieved //Or should both events be emitted? //if (dataCollector == null) //{ // return; //} }
/// <inheritdoc/> public void Process(TextMessage message) { var parsingResult = _textMessageParser.Parse(message); var isTextMessageFormatValid = parsingResult.IsValid; var dataCollector = _dataCollectors.GetByPhoneNumber(message.OriginNumber); var unknownDataCollector = dataCollector == null; var caseReportId = Guid.NewGuid(); var caseReporting = _caseReportingRepository.Get(caseReportId); if (!isTextMessageFormatValid && unknownDataCollector) { caseReporting.ReportInvalidReportFromUnknownDataCollector( message.OriginNumber, message.Message, parsingResult.ErrorMessages, message.Sent); return; } if (!isTextMessageFormatValid && !unknownDataCollector) { caseReporting.ReportInvalidReport( dataCollector.Id, message.OriginNumber, message.Message, parsingResult.ErrorMessages, message.Sent); return; } var healthRiskReadableId = parsingResult.HealthRiskReadableId; var healthRiskId = _healthRisks.GetIdFromReadableId(healthRiskReadableId); if (healthRiskId == HealthRiskId.NotSet) { var errorMessages = new List <string> { $"Unable to find health risk, since there are no health risks with a readable id of {healthRiskReadableId}" }; if (unknownDataCollector) { caseReporting.ReportInvalidReportFromUnknownDataCollector( message.OriginNumber, message.Message, errorMessages, message.Sent); return; } caseReporting.ReportInvalidReport( dataCollector.Id, message.OriginNumber, message.Message, errorMessages, message.Sent); return; } if (unknownDataCollector) { caseReporting.ReportFromUnknownDataCollector( message.OriginNumber, healthRiskId, parsingResult.MalesUnder5, parsingResult.MalesAged5AndOlder, parsingResult.FemalesUnder5, parsingResult.FemalesAged5AndOlder, message.Sent, message.Message ); return; } caseReporting.Report( dataCollector.Id, healthRiskId, message.OriginNumber, parsingResult.MalesUnder5, parsingResult.MalesAged5AndOlder, parsingResult.FemalesUnder5, parsingResult.FemalesAged5AndOlder, dataCollector.Location.Longitude, dataCollector.Location.Latitude, message.Sent, message.Message ); }
/// <inheritdoc/> public void Process(TextMessage message) { var parsingResult = _textMessageParser.Parse(message); var dataCollector = _dataCollectors.GetByPhoneNumber(message.OriginNumber); var caseReportId = Guid.NewGuid(); var caseReporting = _caseReportingRepository.Get(caseReportId); if (!parsingResult.IsValid) { ReportInvalidMessage(message, parsingResult.ErrorMessages, dataCollector, caseReporting, message.Sent); return; } var healthRiskReadableId = parsingResult.Numbers[0]; var healthRiskId = _healthRisks.GetIdFromReadableId(healthRiskReadableId); if (healthRiskId == Guid.Empty) { ReportInvalidMessage( message, new List <string> { $"Unable to find health risk, since there are no health risks with a readable id of {healthRiskReadableId}" }, dataCollector, caseReporting, message.Sent); return; } if (!parsingResult.HasMultipleCases) { var malesAges0To4 = 0; var malesAgedOver4 = 0; var femalesAges0To4 = 0; var femalesAgedOver4 = 0; if (parsingResult.Numbers.Length == 3) { var sex = (Sex)parsingResult.Numbers[1]; var ageGroup = parsingResult.Numbers[2]; malesAges0To4 = ageGroup == 1 && sex == Sex.Male ? 1 : 0; malesAgedOver4 = ageGroup == 2 && sex == Sex.Male ? 1 : 0; femalesAges0To4 = ageGroup == 1 && sex == Sex.Female ? 1 : 0; femalesAgedOver4 = ageGroup == 2 && sex == Sex.Female ? 1 : 0; } Report( message, dataCollector, caseReporting, healthRiskId, malesAges0To4, malesAgedOver4, femalesAges0To4, femalesAgedOver4, message.Sent); } else { var malesAges0To4 = parsingResult.Numbers[1]; var malesAgedOver4 = parsingResult.Numbers[2]; var femalesAges0To4 = parsingResult.Numbers[3]; var femalesAgedOver4 = parsingResult.Numbers[4]; Report( message, dataCollector, caseReporting, healthRiskId, malesAges0To4, malesAgedOver4, femalesAges0To4, femalesAgedOver4, message.Sent); } }
//TODO: Add a test that ensure that the right count is put in the right property //TODO: This should possibly be process once, since it should only happen the first time a text message is recieved public void Process(TextMessageReceived @event) { var caseReportContent = TextMessageContentParser.Parse(@event.Message); var dataCollector = _dataCollectors.GetByPhoneNumber(@event.OriginNumber); if (caseReportContent.GetType() == typeof(InvalidCaseReportContent)) { //TODO: Handle if datacollector is unknown also. Different event? var invalidCaseReport = caseReportContent as InvalidCaseReportContent; _eventEmitter.Emit(Feature, new TextMessageParsingFailed { Id = Guid.NewGuid(), DataCollectorId = dataCollector.Id, Message = @event.Message, ParsingErrorMessage = invalidCaseReport.ErrorMessage }); } else if (caseReportContent.GetType() == typeof(SingleCaseReportContent)) { var singlecaseReport = caseReportContent as SingleCaseReportContent; var healthRisk = _healthRisks.GetByReadableId(singlecaseReport.HealthRiskId); if (dataCollector == null) { _eventEmitter.Emit(Feature, new AnonymousCaseReportRecieved { Id = Guid.NewGuid(), PhoneNumber = @event.OriginNumber, HealthRiskId = healthRisk.Id, NumberOfFemalesUnder5 = singlecaseReport.Age <= 5 && singlecaseReport.Sex == Sex.Female ? 1 : 0, NumberOfFemalesOver5 = singlecaseReport.Age > 5 && singlecaseReport.Sex == Sex.Female ? 1 : 0, NumberOfMalesUnder5 = singlecaseReport.Age <= 5 && singlecaseReport.Sex == Sex.Male ? 1 : 0, NumberOfMalesOver5 = singlecaseReport.Age > 5 && singlecaseReport.Sex == Sex.Male ? 1 : 0, Latitude = @event.Latitude, Longitude = @event.Longitude, Timestamp = @event.Sent }); return; } _eventEmitter.Emit(Feature, new CaseReportReceived { Id = Guid.NewGuid(), DataCollectorId = dataCollector.Id, HealthRiskId = healthRisk.Id, NumberOfFemalesUnder5 = singlecaseReport.Age <= 5 && singlecaseReport.Sex == Sex.Female ? 1 : 0, NumberOfFemalesOver5 = singlecaseReport.Age > 5 && singlecaseReport.Sex == Sex.Female ? 1 : 0, NumberOfMalesUnder5 = singlecaseReport.Age <= 5 && singlecaseReport.Sex == Sex.Male ? 1 : 0, NumberOfMalesOver5 = singlecaseReport.Age > 5 && singlecaseReport.Sex == Sex.Male ? 1 : 0, Latitude = @event.Latitude, Longitude = @event.Longitude, Timestamp = @event.Sent }); } else { var report = caseReportContent as MultipleCaseReportContent; var healthRisk = _healthRisks.GetByReadableId(report.HealthRiskId); if (dataCollector == null) { _eventEmitter.Emit(Feature, new AnonymousCaseReportRecieved { Id = Guid.NewGuid(), PhoneNumber = @event.OriginNumber, HealthRiskId = healthRisk.Id, NumberOfFemalesUnder5 = report.FemalesUnder5, NumberOfFemalesOver5 = report.FemalesOver5, NumberOfMalesUnder5 = report.MalesUnder5, NumberOfMalesOver5 = report.MalesOver5, Latitude = @event.Latitude, Longitude = @event.Longitude, Timestamp = @event.Sent }); return; } _eventEmitter.Emit(Feature, new CaseReportReceived { Id = Guid.NewGuid(), DataCollectorId = dataCollector.Id, HealthRiskId = healthRisk.Id, NumberOfFemalesUnder5 = report.FemalesUnder5, NumberOfFemalesOver5 = report.FemalesOver5, NumberOfMalesUnder5 = report.MalesUnder5, NumberOfMalesOver5 = report.MalesOver5, Latitude = @event.Latitude, Longitude = @event.Longitude, Timestamp = @event.Sent }); } }