Skip to content

Commit 5c70525

Browse files
Merge branch 'main' into feat/DTOSS-7351-adding-new-ReceiveServiceNowMessage-function
2 parents f39f1db + 501e027 commit 5c70525

8 files changed

Lines changed: 66 additions & 49 deletions

File tree

application/CohortManager/compose.cohort-distribution.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ services:
7878
- AddCohortDistributionURL=http://localhost:7077/api/AddCohortDistributionData
7979
- ValidateCohortDistributionRecordURL=http://localhost:7084/api/ValidateCohortDistributionRecord
8080
- DtOsDatabaseConnectionString=Server=localhost,1433;Database=${DB_NAME};User Id=SA;Password=${PASSWORD};TrustServerCertificate=True
81+
- ParticipantManagementUrl=http://localhost:7994/api/ParticipantManagementDataService
8182
- CohortQueueName=cohort-distribution-queue
8283
- CohortQueueNamePoison=cohort-distribution-queue-poison
8384
- IgnoreParticipantExceptions=false

application/CohortManager/src/Functions/CohortDistributionServices/CreateCohortDistribution/CreateCohortDistribution.cs

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,23 @@ public class CreateCohortDistribution
2020
private readonly ICohortDistributionHelper _CohortDistributionHelper;
2121
private readonly IExceptionHandler _exceptionHandler;
2222
private readonly IAzureQueueStorageHelper _azureQueueStorageHelper;
23+
private readonly IDataServiceClient<ParticipantManagement> _participantManagementClient;
2324
private readonly CreateCohortDistributionConfig _config;
2425

2526
public CreateCohortDistribution(ILogger<CreateCohortDistribution> logger,
26-
ICallFunction callFunction,
27-
ICohortDistributionHelper CohortDistributionHelper,
28-
IExceptionHandler exceptionHandler,
29-
IAzureQueueStorageHelper azureQueueStorageHelper,
30-
IOptions<CreateCohortDistributionConfig> createCohortDistributionConfig)
27+
ICallFunction callFunction,
28+
ICohortDistributionHelper CohortDistributionHelper,
29+
IExceptionHandler exceptionHandler,
30+
IAzureQueueStorageHelper azureQueueStorageHelper,
31+
IDataServiceClient<ParticipantManagement> participantManagementClient,
32+
IOptions<CreateCohortDistributionConfig> createCohortDistributionConfig)
3133
{
3234
_logger = logger;
3335
_callFunction = callFunction;
3436
_CohortDistributionHelper = CohortDistributionHelper;
3537
_exceptionHandler = exceptionHandler;
3638
_azureQueueStorageHelper = azureQueueStorageHelper;
39+
_participantManagementClient = participantManagementClient;
3740
_config = createCohortDistributionConfig.Value;
3841
}
3942

@@ -67,12 +70,12 @@ public async Task RunAsync([QueueTrigger("%CohortQueueName%", Connection = "Azur
6770
return;
6871
}
6972
}
70-
73+
7174
// Check if participant has exceptions
7275
bool ignoreParticipantExceptions = _config.IgnoreParticipantExceptions;
7376
_logger.LogInformation("Environment variable IgnoreParticipantExceptions is set to {IgnoreParticipantExceptions}", ignoreParticipantExceptions);
74-
bool participantHasException = participantData.ExceptionFlag == 1;
7577

78+
bool participantHasException = participantData.ExceptionFlag == 1;
7679
if (participantHasException && !ignoreParticipantExceptions) // Will only run if IgnoreParticipantExceptions is false.
7780
{
7881
await HandleErrorResponseAsync($"Unable to add to cohort distribution. As participant with ParticipantId: {participantData.ParticipantId}. Has an Exception against it",
@@ -82,13 +85,21 @@ await HandleErrorResponseAsync($"Unable to add to cohort distribution. As partic
8285

8386
// Validation
8487
participantData.RecordType = basicParticipantCsvRecord.RecordType;
85-
var validationRecordCreated = await _CohortDistributionHelper.ValidateCohortDistributionRecordAsync(basicParticipantCsvRecord.NhsNumber, basicParticipantCsvRecord.FileName, participantData);
88+
var validationResponse = await _CohortDistributionHelper.ValidateCohortDistributionRecordAsync(basicParticipantCsvRecord.NhsNumber, basicParticipantCsvRecord.FileName, participantData);
8689

87-
if (validationRecordCreated && !ignoreParticipantExceptions)
90+
// Update participant exception flag
91+
if (validationResponse.CreatedException)
8892
{
89-
var errorMessage = $"Validation error: A rule triggered a fatal error, preventing the cohort distribution record with participant Id {participantData.ParticipantId} from being added to the database";
93+
var errorMessage = $"Participant {participantData.ParticipantId} triggered a validation rule, so will not be added to cohort distribution";
9094
_logger.LogInformation(errorMessage);
9195
await _exceptionHandler.CreateRecordValidationExceptionLog(participantData.NhsNumber, basicParticipantCsvRecord.FileName, errorMessage, serviceProvider, JsonSerializer.Serialize(participantData));
96+
97+
var participantMangement = await _participantManagementClient.GetSingle(participantData.ParticipantId);
98+
participantMangement.ExceptionFlag = 1;
99+
100+
bool excpetionFlagUpdated = await _participantManagementClient.Update(participantMangement);
101+
if (!excpetionFlagUpdated) throw new IOException("Failed to update exception flag");
102+
92103
return;
93104
}
94105
_logger.LogInformation("Validation has passed or exceptions are ignored, the record with participant id: {ParticipantId} will be added to the database", participantData.ParticipantId);
@@ -109,7 +120,7 @@ await HandleErrorResponseAsync($"Unable to add to cohort distribution. As partic
109120
}
110121
catch (Exception ex)
111122
{
112-
var errorMessage = $"Failed during TransformParticipant or AddCohortDistribution Function.\nMessage: {ex.Message}\nStack Trace: {ex.StackTrace}";
123+
var errorMessage = $"Create Cohort Distribution failed .\nMessage: {ex.Message}\nStack Trace: {ex.StackTrace}";
113124
_logger.LogError(ex, errorMessage);
114125
await _exceptionHandler.CreateSystemExceptionLogFromNhsNumber(ex, basicParticipantCsvRecord.NhsNumber, basicParticipantCsvRecord.FileName, "", JsonSerializer.Serialize(basicParticipantCsvRecord.ErrorRecord) ?? "N/A");
115126
throw;

application/CohortManager/src/Functions/CohortDistributionServices/CreateCohortDistribution/Program.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
var host = new HostBuilder()
1212
.AddConfiguration<CreateCohortDistributionConfig>(out CreateCohortDistributionConfig config)
1313
.ConfigureFunctionsWorkerDefaults()
14+
.AddDataServicesHandler()
15+
.AddDataService<ParticipantManagement>(Environment.GetEnvironmentVariable("ParticipantManagementUrl"))
16+
.Build()
1417
.ConfigureServices(services =>
1518
{
1619
services.AddSingleton<ICallFunction, CallFunction>();

application/CohortManager/src/Functions/CohortDistributionServices/ValidateCohortDistributionRecord/ValidateCohortDistributionRecord.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,7 @@ public async Task<HttpResponseData> RunAsync([HttpTrigger(AuthorizationLevel.Ano
7373
var newParticipant = requestBody.CohortDistributionParticipant;
7474

7575
var validationResult = await ValidateDataAsync(existingParticipant, newParticipant, requestBody.FileName);
76-
if (validationResult.CreatedException)
77-
{
78-
return _createResponse.CreateHttpResponse(HttpStatusCode.Created, req, JsonSerializer.Serialize(validationResult));
79-
}
80-
return _createResponse.CreateHttpResponse(HttpStatusCode.OK, req);
76+
return _createResponse.CreateHttpResponse(HttpStatusCode.OK, req, JsonSerializer.Serialize(validationResult));
8177

8278
}
8379
catch (Exception ex)

application/CohortManager/src/Functions/Shared/Common/CohortDistributionHelper.cs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public async Task<CohortDistributionParticipant> TransformParticipantAsync(strin
7676
return null;
7777
}
7878

79-
public async Task<bool> ValidateCohortDistributionRecordAsync(string nhsNumber, string FileName, CohortDistributionParticipant cohortDistributionParticipant)
79+
public async Task<ValidationExceptionLog> ValidateCohortDistributionRecordAsync(string nhsNumber, string FileName, CohortDistributionParticipant cohortDistributionParticipant)
8080
{
8181
var lookupValidationRequestBody = new ValidateCohortDistributionRecordBody()
8282
{
@@ -88,13 +88,7 @@ public async Task<bool> ValidateCohortDistributionRecordAsync(string nhsNumber,
8888

8989
_logger.LogInformation("Called cohort validation service");
9090
var response = await GetResponseAsync(json, Environment.GetEnvironmentVariable("ValidateCohortDistributionRecordURL"));
91-
if (!string.IsNullOrEmpty(response))
92-
{
93-
var responseObj = JsonSerializer.Deserialize<ValidationExceptionLog>(response);
94-
return responseObj.IsFatal;
95-
}
96-
_logger.LogInformation("The response from the validation for cohort distribution returned null or empty");
97-
return false;
91+
return JsonSerializer.Deserialize<ValidationExceptionLog>(response);
9892
}
9993

10094
private async Task<string> GetResponseAsync(string requestBodyJson, string functionURL)
@@ -104,7 +98,8 @@ private async Task<string> GetResponseAsync(string requestBodyJson, string funct
10498
{
10599
return "";
106100
}
107-
if (response.StatusCode == HttpStatusCode.OK)
101+
102+
if (response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Created)
108103
{
109104
var responseText = await _callFunction.GetResponseText(response);
110105
if (!string.IsNullOrEmpty(responseText))
@@ -113,7 +108,6 @@ private async Task<string> GetResponseAsync(string requestBodyJson, string funct
113108
}
114109

115110
}
116-
117111

118112
return "";
119113
}

application/CohortManager/src/Functions/Shared/Common/Interfaces/ICohortDistributionHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ public interface ICohortDistributionHelper
88
Task<CohortDistributionParticipant?> RetrieveParticipantDataAsync(CreateCohortDistributionRequestBody cohortDistributionRequestBody);
99
Task<string> AllocateServiceProviderAsync(string nhsNumber, string screeningAcronym, string postCode, string errorRecord);
1010
Task<CohortDistributionParticipant> TransformParticipantAsync(string serviceProvider, CohortDistributionParticipant participantData);
11-
Task<bool> ValidateCohortDistributionRecordAsync(string nhsNumber, string FileName, CohortDistributionParticipant cohortDistributionParticipant);
11+
Task<ValidationExceptionLog> ValidateCohortDistributionRecordAsync(string nhsNumber, string FileName, CohortDistributionParticipant cohortDistributionParticipant);
1212
}

tests/UnitTests/CohortDistributionTests/CreateCohortDistributionTests/CreateCohortDistributionTests.cs

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,21 @@ public CreateCohortDistributionTests()
6868
.Setup(x => x.RetrieveParticipantDataAsync(It.IsAny<CreateCohortDistributionRequestBody>()))
6969
.ReturnsAsync(_cohortDistributionParticipant);
7070

71+
_cohortDistributionHelper
72+
.Setup(x => x.ValidateCohortDistributionRecordAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CohortDistributionParticipant>()))
73+
.ReturnsAsync(new ValidationExceptionLog {CreatedException = false, IsFatal = false});
74+
75+
_participantManagementClientMock
76+
.Setup(x => x.GetSingle(It.IsAny<string>()))
77+
.ReturnsAsync(new ParticipantManagement {ExceptionFlag = 0});
78+
79+
_participantManagementClientMock
80+
.Setup(x => x.Update(It.IsAny<ParticipantManagement>()))
81+
.ReturnsAsync(true);
82+
7183
_sut = new CreateCohortDistribution(_logger.Object, _callFunction.Object, _cohortDistributionHelper.Object,
7284
_exceptionHandler.Object, _azureQueueStorageHelper.Object,
85+
_participantManagementClientMock.Object);
7386
_config.Object);
7487

7588
}
@@ -120,7 +133,7 @@ public async Task RunAsync_RetrieveParticipantDataRequestFails_ReturnBadRequest(
120133
// Assert
121134
_logger.Verify(x => x.Log(It.Is<LogLevel>(l => l == LogLevel.Error),
122135
It.IsAny<EventId>(),
123-
It.Is<It.IsAnyType>((v, t) => v.ToString().Contains("Failed during TransformParticipant or AddCohortDistribution Function.")),
136+
It.Is<It.IsAnyType>((v, t) => v.ToString().Contains("Create Cohort Distribution failed")),
124137
It.IsAny<Exception>(),
125138
It.IsAny<Func<It.IsAnyType, Exception, string>>()),
126139
Times.Once);
@@ -168,7 +181,7 @@ public async Task RunAsync_AllocateServiceProviderToParticipantRequestFails_Retu
168181
// Assert
169182
_logger.Verify(x => x.Log(It.Is<LogLevel>(l => l == LogLevel.Error),
170183
It.IsAny<EventId>(),
171-
It.Is<It.IsAnyType>((v, t) => v.ToString().Contains("Failed during TransformParticipant or AddCohortDistribution Function.")),
184+
It.Is<It.IsAnyType>((v, t) => v.ToString().Contains("Create Cohort Distribution failed")),
172185
It.IsAny<Exception>(),
173186
It.IsAny<Func<It.IsAnyType, Exception, string>>()),
174187
Times.Once);
@@ -181,9 +194,6 @@ public async Task RunAsync_AllocateServiceProviderToParticipantRequestFails_Retu
181194
public async Task RunAsync_TransformDataServiceRequestFails_ReturnEarly()
182195
{
183196
// Arrange
184-
_cohortDistributionHelper
185-
.Setup(x => x.ValidateCohortDistributionRecordAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CohortDistributionParticipant>()))
186-
.ReturnsAsync(false);
187197
_cohortDistributionHelper
188198
.Setup(x => x.AllocateServiceProviderAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
189199
.ReturnsAsync("");
@@ -209,9 +219,6 @@ public async Task RunAsync_AddCohortDistributionRequestFails_LogError()
209219
Exception caughtException = null;
210220
_request = _setupRequest.Setup(JsonSerializer.Serialize(_requestBody));
211221

212-
_cohortDistributionHelper
213-
.Setup(x => x.ValidateCohortDistributionRecordAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CohortDistributionParticipant>()))
214-
.ReturnsAsync(false);
215222
_cohortDistributionHelper
216223
.Setup(x => x.AllocateServiceProviderAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
217224
.ReturnsAsync("");
@@ -239,7 +246,7 @@ public async Task RunAsync_AddCohortDistributionRequestFails_LogError()
239246
// Assert
240247
_logger.Verify(x => x.Log(It.Is<LogLevel>(l => l == LogLevel.Error),
241248
It.IsAny<EventId>(),
242-
It.Is<It.IsAnyType>((v, t) => v.ToString().Contains("Failed during TransformParticipant or AddCohortDistribution Function.")),
249+
It.Is<It.IsAnyType>((v, t) => v.ToString().Contains("Create Cohort Distribution failed")),
243250
It.IsAny<Exception>(),
244251
It.IsAny<Func<It.IsAnyType, Exception, string>>()),
245252
Times.Once);
@@ -252,20 +259,13 @@ public async Task RunAsync_AddCohortDistributionRequestFails_LogError()
252259
public async Task RunAsync_AllSuccessfulRequests_AddsToCOhort()
253260
{
254261
// Arrange
255-
_cohortDistributionHelper
256-
.Setup(x => x.ValidateCohortDistributionRecordAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CohortDistributionParticipant>()))
257-
.ReturnsAsync(false);
258262
_cohortDistributionHelper
259263
.Setup(x => x.AllocateServiceProviderAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
260264
.ReturnsAsync("");
261265
_cohortDistributionHelper
262266
.Setup(x => x.TransformParticipantAsync(It.IsAny<string>(), It.IsAny<CohortDistributionParticipant>()))
263267
.ReturnsAsync(new CohortDistributionParticipant());
264268

265-
_participantManagementClientMock
266-
.Setup(c => c.GetSingleByFilter(It.IsAny<Expression<Func<ParticipantManagement, bool>>>()))
267-
.ReturnsAsync(new ParticipantManagement { ExceptionFlag = 0 });
268-
269269
_sendToCohortDistributionResponse
270270
.Setup(x => x.StatusCode)
271271
.Returns(HttpStatusCode.OK);
@@ -278,7 +278,9 @@ public async Task RunAsync_AllSuccessfulRequests_AddsToCOhort()
278278
.ReturnsAsync(new ParticipantManagement() { ExceptionFlag = 0 });
279279

280280
var response = MockHelpers.CreateMockHttpResponseData(HttpStatusCode.OK);
281-
_callFunction.Setup(call => call.SendPost(It.IsAny<string>(), It.IsAny<string>())).Returns(Task.FromResult(response));
281+
_callFunction
282+
.Setup(call => call.SendPost(It.IsAny<string>(), It.IsAny<string>()))
283+
.ReturnsAsync(response);
282284

283285
// Act
284286
await _sut.RunAsync(_requestBody);
@@ -321,12 +323,12 @@ public async Task RunAsync_ParticipantHasException_CreatesSystemExceptionLog()
321323
}
322324

323325
[TestMethod]
324-
public async Task RunAsync_ValidationRequestFailed_CreateValidationExceptionLog()
326+
public async Task RunAsync_ValidationRuleTriggered_UpdateExceptionFlagAndLog()
325327
{
326328
// Arrange
327329
_cohortDistributionHelper
328330
.Setup(x => x.ValidateCohortDistributionRecordAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CohortDistributionParticipant>()))
329-
.ReturnsAsync(true);
331+
.ReturnsAsync(new ValidationExceptionLog { CreatedException = true, IsFatal = false });
330332
_cohortDistributionHelper
331333
.Setup(x => x.AllocateServiceProviderAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
332334
.ReturnsAsync("");
@@ -351,10 +353,13 @@ public async Task RunAsync_ValidationRequestFailed_CreateValidationExceptionLog(
351353
It.IsAny<string>(),
352354
It.IsAny<string>()
353355
), Times.Once);
356+
357+
_participantManagementClientMock
358+
.Verify(x => x.Update(It.IsAny<ParticipantManagement>()), Times.Once);
354359
}
355360

356361
[TestMethod]
357-
public async Task RunAsync_ParticipantHasExceptionAndEnvironmentVariableFalse_CreateSystemExceptionLog()
362+
public async Task RunAsync_ParticipantHasExceptionAndEnvironmentVariableFalse_CreateExceptionAndReturn()
358363
{
359364
// Arrange
360365
Environment.SetEnvironmentVariable("IgnoreParticipantExceptions", "false");
@@ -376,5 +381,12 @@ public async Task RunAsync_ParticipantHasExceptionAndEnvironmentVariableFalse_Cr
376381
It.Is<It.IsAnyType>((v, t) => v.ToString().Contains($"Unable to add to cohort distribution")),
377382
It.IsAny<Exception>(),
378383
It.IsAny<Func<It.IsAnyType, Exception, string>>()));
384+
385+
_cohortDistributionHelper
386+
.Verify(x => x.ValidateCohortDistributionRecordAsync(
387+
It.IsAny<string>(),
388+
It.IsAny<string>(),
389+
It.IsAny<CohortDistributionParticipant>()),
390+
Times.Never);
379391
}
380392
}

tests/UnitTests/CohortDistributionTests/ValidateCohortDistributionRecordTests/ValidateCohortDistributionRecordTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ public async Task Run_RequestBodyInvalid_BadRequest()
142142
}
143143

144144
[TestMethod]
145-
public async Task Run_LookupValidationCreatesValidationError_Created()
145+
public async Task Run_LookupValidationCreatesValidationError_ReturnOk()
146146
{
147147
// Arrange
148148
SetUpRequestBody(JsonSerializer.Serialize(_requestBody));
@@ -162,7 +162,7 @@ public async Task Run_LookupValidationCreatesValidationError_Created()
162162
var result = await _function.RunAsync(_request.Object);
163163

164164
// Assert
165-
Assert.AreEqual(HttpStatusCode.Created, result.StatusCode);
165+
Assert.AreEqual(HttpStatusCode.OK, result.StatusCode);
166166
}
167167

168168
[TestMethod]

0 commit comments

Comments
 (0)