Skip to content
Merged
Show file tree
Hide file tree
Changes from 45 commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
749e8f7
temp commit
MWClayson-NHS Aug 27, 2025
19a54b9
adding mesh client code
MWClayson-NHS Aug 28, 2025
471e624
mesh integration tests
MWClayson-NHS Aug 28, 2025
fba7ce8
feat: added stubbed version of ManageCaasSubscription function, same …
SamAinsworth-NHS Aug 28, 2025
85aa980
fix: corrected placeholder config in compose.core.yml
SamAinsworth-NHS Aug 28, 2025
f757433
fix: unit test project references were missing
SamAinsworth-NHS Aug 28, 2025
60fc83f
testing parquet file
MWClayson-NHS Aug 28, 2025
a3b8292
fix: cleared up forwarder code - reimplemented NemsSubscriptionDataSe…
SamAinsworth-NHS Aug 28, 2025
fb44429
fix: added db configuration to core.yml for managecaassubscription fu…
SamAinsworth-NHS Aug 28, 2025
7be2593
feat: additional unit tests, catch around mesh logic
SamAinsworth-NHS Aug 28, 2025
207e5e5
Merge branch 'feat/new-caas-subscription-function' into feat/nems-rep…
MWClayson-NHS Aug 29, 2025
ce16899
integation tests
MWClayson-NHS Aug 29, 2025
bb63bab
Mesh Polling
MWClayson-NHS Aug 29, 2025
2c9febc
fix: addressed comments from previous PR
SamAinsworth-NHS Aug 29, 2025
a098fb7
mesh mailbox extension
MWClayson-NHS Aug 29, 2025
9e6958f
mesh integrated
MWClayson-NHS Aug 29, 2025
64ada3a
Merge branch 'feat/nems-replacement-mesh-branch' into Fix/manage-caas…
SamAinsworth-NHS Aug 29, 2025
94f4078
feat: Subscription source addition to nems subscription data table
SamAinsworth-NHS Aug 29, 2025
d03fbd1
Merge branch 'feat/nems-replacement-mesh-branch' into feat/add-mesh-e…
SamAinsworth-NHS Aug 29, 2025
9ab4a27
feat: insert record into nems sub table when new sub created
SamAinsworth-NHS Aug 29, 2025
d1b8ee4
fix: complete proper ef migration for new subscription source data ta…
SamAinsworth-NHS Aug 29, 2025
b1eb776
fix: removed CaasNemsSubscriptionAccessor
SamAinsworth-NHS Sep 1, 2025
5c4b631
fix: renamed parquet column to nhs_number
SamAinsworth-NHS Sep 1, 2025
7855354
fix: added further config for local docker testing
SamAinsworth-NHS Sep 1, 2025
c0d293b
fix: removed pointless comments
SamAinsworth-NHS Sep 1, 2025
1178ad3
fix: undone changes to other functions in compose yml
SamAinsworth-NHS Sep 1, 2025
c637d84
fix: reverted change to nems-mesh-retrieval compose
SamAinsworth-NHS Sep 1, 2025
d7f7dfb
fix: clean up ambiguity for certificate helper and fix unit test
SamAinsworth-NHS Sep 1, 2025
d1311b7
feat: add mesh enum to nems data service and table (#1564)
SamAinsworth-NHS Sep 2, 2025
a2971cd
Merge branch 'main' into feat/nems-replacement-mesh-branch
SamAinsworth-NHS Sep 2, 2025
7e9aa12
Merge branch 'main' into feat/nems-replacement-mesh-branch
SamAinsworth-NHS Sep 2, 2025
105424d
fix: resolved PR comments - required attribute, removal of comments, …
SamAinsworth-NHS Sep 2, 2025
4f8bd7f
fix: removed ManageNemsSubscriptionDataServiceURL from ManageCaasSubs…
SamAinsworth-NHS Sep 2, 2025
6ae4fdd
Merge branch 'main' into feat/nems-replacement-mesh-branch
SamAinsworth-NHS Sep 2, 2025
736a1d6
test: added further basic unit tests around the MeshPoller and shared…
SamAinsworth-NHS Sep 2, 2025
eb26290
fix: removed test that could not complete in pipeline
SamAinsworth-NHS Sep 2, 2025
fa3deba
fix: attempt to fix trx upload upon test failure to diagnose which te…
SamAinsworth-NHS Sep 2, 2025
6e18c53
fix: readded test, corrected pem mock
SamAinsworth-NHS Sep 2, 2025
c575751
fix: missing using statement, correcting test setup
SamAinsworth-NHS Sep 2, 2025
682668f
fix: added AAA comments
SamAinsworth-NHS Sep 2, 2025
5ec557e
fix: added XML docs for methods re Contributing.md
SamAinsworth-NHS Sep 2, 2025
8d66e12
fix: sonar issues including nullable warnings, glob syntax, unused vars
SamAinsworth-NHS Sep 2, 2025
a6c13b0
fix: method signatures in unit tests
SamAinsworth-NHS Sep 2, 2025
b32413e
Merge branch 'main' into feat/nems-replacement-mesh-branch
SamAinsworth-NHS Sep 2, 2025
a7d2272
Merge branch 'main' into feat/nems-replacement-mesh-branch
SamAinsworth-NHS Sep 2, 2025
b2a2e04
fix: removed nullable values from ManageCaasSubscriptionConfig to ali…
SamAinsworth-NHS Sep 4, 2025
e963312
fix: added string? nullable flag to SendSubscriptionRequest method re…
SamAinsworth-NHS Sep 4, 2025
3300269
fix: added null check to message id, implemented exception handler in…
SamAinsworth-NHS Sep 4, 2025
0d45c9b
fix: switched from DefaultAzureCredential to ManagedIdentityCredentia…
SamAinsworth-NHS Sep 4, 2025
59cdd67
fix: dev tfvars for ManageCaasSubscription; added db and kv connectio…
SamAinsworth-NHS Sep 4, 2025
c891d7a
fix: updated unit tests to include exception handler
SamAinsworth-NHS Sep 4, 2025
a87cd99
fix: extended stub in ManageCaasSubscription to cover polling, and co…
SamAinsworth-NHS Sep 4, 2025
6a17972
Merge branch 'main' into feat/nems-replacement-mesh-branch
SamAinsworth-NHS Sep 4, 2025
8c09edd
fix: added required keyword to required values in ManageCaasSubscript…
SamAinsworth-NHS Sep 4, 2025
e481d6b
fix: log to exception handler in main catch block in Subscribe endpoi…
SamAinsworth-NHS Sep 4, 2025
2f311f4
fix: covered all catch blocks with exception logs to handler within M…
SamAinsworth-NHS Sep 4, 2025
18d2e66
feat: added explicit stubbed log on startup to make it clear upon dia…
SamAinsworth-NHS Sep 4, 2025
fca17cc
test: Added unit tests around all code flows, removed validation test…
SamAinsworth-NHS Sep 4, 2025
25d81b3
fix: removed remaining 'CAAS' filenames from logs as they're not corr…
SamAinsworth-NHS Sep 4, 2025
b46a965
Merge branch 'main' into feat/nems-replacement-mesh-branch
SamAinsworth-NHS Sep 4, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .github/workflows/stage-2-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -137,12 +137,14 @@ jobs:
--collect:"XPlat Code Coverage;Format=opencover;Include=**/*.cs;ExcludeByFile=**/*Tests.cs,**/Tests/**/*.cs,**/Program.cs,**/Model/**/*.cs,**/Set-up/**/*.cs,**/scripts/**/*.cs,**/HealthCheckFunction.cs,**/*Config.cs,**/bin/**/*.cs,**/obj/**/*.cs,**/Properties/**/*.cs,**/*.generated.cs,**/*.Designer.cs,**/*.g.cs,**/*.GlobalUsings.g.cs,**/*.AssemblyInfo.cs" \
--verbosity quiet
- name: Upload test results as artifact
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results-consolidated
path: |
TestResults/**/*.${{ inputs.unit_test_logger_format }}
TestResults/**/coverage.opencover.xml
if-no-files-found: ignore

test-unit:
name: Unit tests
Expand Down Expand Up @@ -189,12 +191,14 @@ jobs:
--verbosity quiet
done
- name: Upload test results as artifact
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results-${{ matrix.scope }}
path: |
TestResults/**/*.${{ inputs.unit_test_logger_format }}
TestResults/**/coverage.opencover.xml
if-no-files-found: ignore

aggregate-test-results:
name: Aggregate results and report
Expand Down Expand Up @@ -261,4 +265,4 @@ jobs:
make test-lint
- name: Save the linting result
run: |
echo "Nothing to save"
echo "Nothing to save"
5 changes: 5 additions & 0 deletions application/CohortManager/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,8 @@ ENDPOINT_BS_SELECT_UPDATE_BLOCK_FLAG="" # "http://localhost:7026/"
SERVICENOW_CLIENT_ID=
SERVICENOW_CLIENT_SECRET=
SERVICENOW_REFRESH_TOKEN=

# CAAS Manage Subscription (local/dev overrides)
# Optional overrides for CAAS mailbox IDs used by ManageCaasSubscription Subscribe stub
CAAS_SUBSCRIBE_TO_MAILBOX=
CAAS_SUBSCRIBE_FROM_MAILBOX=
30 changes: 30 additions & 0 deletions application/CohortManager/compose.core.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ services:
- ExceptionFunctionURL=http://create-exception:7070/api/CreateException
- RetrievePdsDemographicURL=http://retrieve-pds-demographic:8082/api/RetrievePDSDemographic
- UnsubscribeNemsSubscriptionUrl=http://manage-nems-subscription:9081/api/Unsubscribe
# CAAS manage subscription stub available at manage-caas-subscription when needed
# - UnsubscribeCaasSubscriptionUrl=http://manage-caas-subscription:9084/api/Unsubscribe
- DemographicDataServiceURL=http://participant-demographic-data-service:7993/api/ParticipantDemographicDataService
- ServiceBusConnectionString_client_internal=Endpoint=sb://service-bus;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;
- ParticipantManagementTopic=participant-management-topic
Expand Down Expand Up @@ -124,6 +126,7 @@ services:
- SendServiceNowMessageURL=http://servicenow-message-handler:9092/api/servicenow/send
- ParticipantManagementURL=http://participant-management-data-service:7994/api/ParticipantManagementDataService
- ManageNemsSubscriptionSubscribeURL=http://manage-nems-subscription:9081/api/Subscribe
# - ManageNemsSubscriptionSubscribeURL=http://manage-caas-subscription:9084/api/Subscribe
- CohortDistributionTopic=cohort-distribution-topic

update-blocked-flag:
Expand All @@ -144,6 +147,8 @@ services:
- ExceptionFunctionURL=http://create-exception:7070/api/CreateException
- ManageNemsSubscriptionUnsubscribeURL=http://manage-nems-subscription:9081/api/Unsubscribe
- ManageNemsSubscriptionSubscribeURL=http://manage-nems-subscription:9081/api/Subscribe
# - ManageNemsSubscriptionUnsubscribeURL=http://manage-caas-subscription:9084/api/Unsubscribe
# - ManageNemsSubscriptionSubscribeURL=http://manage-caas-subscription:9084/api/Subscribe
- RetrievePdsDemographicURL=http://etrieve-pds-demographic:8082/api/RetrievePdsDemographic

delete-participant:
Expand Down Expand Up @@ -293,6 +298,31 @@ services:
ports:
- "9081:9081"

manage-caas-subscription:
container_name: manage-caas-subscription
image: cohort-manager-manage-caas-subscription
networks: [cohman-network]
profiles: [nems]
build:
context: ./src/Functions/
dockerfile: DemographicServices/ManageCaasSubscription/Dockerfile
environment:
- ASPNETCORE_URLS=http://*:9084
- FUNCTIONS_WORKER_RUNTIME=dotnet-isolated
- AzureWebJobsStorage=${AZURITE_CONNECTION_STRING}
- ExceptionFunctionURL=http://create-exception:7070/api/CreateException
- MeshApiBaseUrl=https://localhost:8700/messageexchange
- MeshCaasPassword=password
- MeshCaasSharedKey=TestKey
- MeshCaasKeyName=
- MeshCaasKeyPassword=
- IsStubbed=false
- CaasToMailbox=${CAAS_SUBSCRIBE_TO_MAILBOX:-CAAS_TO}
- CaasFromMailbox=${CAAS_SUBSCRIBE_FROM_MAILBOX:-CAAS_FROM}
- DtOsDatabaseConnectionString=Server=db,1433;Database=${DB_NAME};User Id=SA;Password=${PASSWORD};TrustServerCertificate=True
ports:
- "9084:9084"

durable-demographic-function:
container_name: durable-demographic-function
image: cohort-manager-durable-demographic-function
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
using NHS.Screening.RetrieveMeshFile;
using HealthChecks.Extensions;
using Azure.Security.KeyVault.Secrets;
using NHS.CohortManager.CaasIntegrationService;


var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS base

COPY ./Shared /Shared
WORKDIR /Shared

RUN mkdir -p /home/site/wwwroot && \
dotnet publish ./Common/Common.csproj --output /home/site/wwwroot && \
dotnet publish ./Model/Model.csproj --output /home/site/wwwroot && \
dotnet publish ./Data/Data.csproj --output /home/site/wwwroot && \
dotnet publish ./Utilities/Utilities.csproj --output /home/site/wwwroot && \
dotnet publish ./DataServices.Client/DataServices.Client.csproj --output /home/site/wwwroot && \
dotnet publish ./DataServices.Core/DataServices.Core.csproj --output /home/site/wwwroot && \
dotnet publish ./DataServices.Database/DataServices.Database.csproj --output /home/site/wwwroot

FROM base AS function

COPY ./DemographicServices/ManageCaasSubscription /src/dotnet-function-app
WORKDIR /src/dotnet-function-app

RUN --mount=type=cache,target=/root/.nuget/packages \
dotnet publish ./*.csproj --output /home/site/wwwroot

# To enable ssh & remote debugging on app service change the base image to the one below
# FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0-appservice
FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true

COPY --from=function ["/home/site/wwwroot", "/home/site/wwwroot"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
namespace NHS.CohortManager.DemographicServices;

using System.Threading.Tasks;
using HealthChecks.Extensions;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Diagnostics.HealthChecks;

public class HealthCheckFunction
{
private readonly HealthCheckService _healthCheckService;

public HealthCheckFunction(HealthCheckService healthCheckService)
{
_healthCheckService = healthCheckService;
}

[Function("health")]
public async Task<HttpResponseData> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequestData req)
{
return await HealthCheckServiceExtensions.CreateHealthCheckResponseAsync(req, _healthCheckService);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
namespace NHS.CohortManager.DemographicServices;

using System.Net;
using System.Threading.Tasks;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Common;
using System.Collections.Specialized;
using System.Text;
using DataServices.Core;
using Model;
using NHS.CohortManager.DemographicServices;

/// <summary>
/// Azure Functions endpoints for managing CaaS subscriptions via MESH and data services.
/// </summary>
public class ManageCaasSubscription
{
private readonly ILogger<ManageCaasSubscription> _logger;
private readonly ICreateResponse _createResponse;
private readonly ManageCaasSubscriptionConfig _config;
private readonly IMeshSendCaasSubscribe _meshSendCaasSubscribe;
private readonly IRequestHandler<NemsSubscription> _requestHandler;
private readonly IDataServiceAccessor<NemsSubscription> _nemsSubscriptionAccessor;
private readonly IMeshPoller _meshPoller;

public ManageCaasSubscription(
ILogger<ManageCaasSubscription> logger,
ICreateResponse createResponse,
IOptions<ManageCaasSubscriptionConfig> config,
IMeshSendCaasSubscribe meshSendCaasSubscribe,
IRequestHandler<NemsSubscription> requestHandler,
IDataServiceAccessor<NemsSubscription> nemsSubscriptionAccessor,
IMeshPoller meshPoller)
{
_logger = logger;
_createResponse = createResponse;
_config = config.Value;
_meshSendCaasSubscribe = meshSendCaasSubscribe;
_requestHandler = requestHandler;
_nemsSubscriptionAccessor = nemsSubscriptionAccessor;
_meshPoller = meshPoller;
}

/// <summary>
/// Creates a new CaaS subscription for the given NHS number and persists a record.
/// </summary>
/// <param name="req">HTTP request containing an <c>nhsNumber</c> query parameter.</param>
/// <returns>HTTP 200 on success, 400 for invalid input, or 500 on error.</returns>
[Function("Subscribe")]
public async Task<HttpResponseData> Subscribe([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
{
try
{
var nhsNumber = req.Query["nhsNumber"];
if (!ValidationHelper.ValidateNHSNumber(nhsNumber!))
{
return await _createResponse.CreateHttpResponseWithBodyAsync(HttpStatusCode.BadRequest, req, "NHS number is required and must be valid format.");
}

// Forward to MeshSendCaasSubscribeStub (Shared)
var nhsNo = long.Parse(nhsNumber!);
var toMailbox = _config.CaasToMailbox!;
var fromMailbox = _config.CaasFromMailbox!;
var messageId = await _meshSendCaasSubscribe.SendSubscriptionRequest(nhsNo, toMailbox, fromMailbox);
Comment thread
alex-clayton-1 marked this conversation as resolved.

// Save a record to NEMS_SUBSCRIPTION table with source = MESH
var record = new NemsSubscription
{
SubscriptionId = messageId,
NhsNumber = nhsNo,
RecordInsertDateTime = DateTime.UtcNow,
SubscriptionSource = SubscriptionSource.MESH
};
var saved = await _nemsSubscriptionAccessor.InsertSingle(record);
if (!saved)
{
_logger.LogError("Failed to write CAAS subscription record to database");
return await _createResponse.CreateHttpResponseWithBodyAsync(HttpStatusCode.InternalServerError, req, "Failed to save subscription record.");
Comment thread
alex-clayton-1 marked this conversation as resolved.
}

_logger.LogInformation("CAAS Subscribe forwarded to Mesh stub. MessageId: {Msg}", messageId);
Comment thread
alex-clayton-1 marked this conversation as resolved.
Outdated
return await _createResponse.CreateHttpResponseWithBodyAsync(HttpStatusCode.OK, req, $"Subscription request accepted. MessageId: {messageId}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Error sending CAAS subscribe request");
return await _createResponse.CreateHttpResponseWithBodyAsync(HttpStatusCode.InternalServerError, req, "An error occurred while sending the CAAS subscription request.");
}
}

/// <summary>
/// Stub endpoint to remove a CaaS subscription for the given NHS number.
/// </summary>
/// <param name="req">HTTP request containing an <c>nhsNumber</c> query parameter.</param>
/// <returns>HTTP 200 for the stub, or 400 for invalid input.</returns>
[Function("Unsubscribe")]
public async Task<HttpResponseData> Unsubscribe([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
{
var nhsNumber = req.Query["nhsNumber"];
if (!ValidationHelper.ValidateNHSNumber(nhsNumber!))
{
return await _createResponse.CreateHttpResponseWithBodyAsync(HttpStatusCode.BadRequest, req, "NHS number is required and must be valid format.");
}

_logger.LogInformation("[CAAS-Stub] Unsubscribe called");
return await _createResponse.CreateHttpResponseWithBodyAsync(HttpStatusCode.OK, req, "Stub: CAAS subscription would be removed.");
}

/// <summary>
/// Checks subscription status for a given NHS number.
/// </summary>
/// <param name="req">HTTP request containing an <c>nhsNumber</c> query parameter.</param>
/// <returns>HTTP 200 when an active subscription is found, 404 if not, or 400/500 on error.</returns>
[Function("CheckSubscriptionStatus")]
public async Task<HttpResponseData> CheckSubscriptionStatus([HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequestData req)
{
try
{
_logger.LogInformation("Received check subscription request");

string? nhsNumber = req.Query["nhsNumber"];

if (!ValidationHelper.ValidateNHSNumber(nhsNumber!))
{
_logger.LogError("NHS number is required and must be valid format");
return await _createResponse.CreateHttpResponseWithBodyAsync(HttpStatusCode.BadRequest, req, "NHS number is required and must be valid format.");
}

var record = await _nemsSubscriptionAccessor.GetSingle(i => i.NhsNumber == long.Parse(nhsNumber!));
string? subscriptionId = record?.SubscriptionId;

if (string.IsNullOrEmpty(subscriptionId))
{
return await _createResponse.CreateHttpResponseWithBodyAsync(HttpStatusCode.NotFound, req, "No subscription found for this NHS number.");
}

return await _createResponse.CreateHttpResponseWithBodyAsync(HttpStatusCode.OK, req, $"Active subscription found. Subscription ID: {subscriptionId}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Error checking subscription status");
return await _createResponse.CreateHttpResponseWithBodyAsync(HttpStatusCode.InternalServerError, req, "An error occurred while checking subscription status.");
}
}

/// <summary>
/// Pass-through data service endpoint for CRUD operations on the NEMS subscription data object.
/// </summary>
/// <param name="req">HTTP request containing payload and route parameters.</param>
/// <param name="key">Optional key or route tail for the data service.</param>
/// <returns>HTTP response from the underlying data service handler.</returns>
[Function("NemsSubscriptionDataService")]
public async Task<HttpResponseData> NemsSubscriptionDataService([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", "put", "delete", Route = "NemsSubscriptionDataService/{*key}")] HttpRequestData req, string? key)
{
try
{
_logger.LogInformation("DataService Request Received Method: {Method}, DataObject {DataType} ", req.Method, typeof(NemsSubscription));
var result = await _requestHandler.HandleRequest(req, key);
return result;
}
catch (Exception ex)
{
_logger.LogError(ex, "An error has occurred in data service");
return await _createResponse.CreateHttpResponseWithBodyAsync(HttpStatusCode.InternalServerError, req, "An error occurred while processing the data service request.");
}
}

/// <summary>
/// Nightly timer trigger to validate the configured MESH mailbox via handshake.
/// </summary>
/// <param name="myTimer">Timer trigger context.</param>
[Function("PollMeshMailbox")]
public async Task RunAsync([TimerTrigger("59 23 * * *")] TimerInfo myTimer)
{
await _meshPoller.ExecuteHandshake(_config.CaasFromMailbox!);
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ProjectGuid>{B0B2C4F4-AB0E-4C4D-9E1B-1F2C4E7F8A10}</ProjectGuid>
<TargetFramework>net8.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<OutputType>Exe</OutputType>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="2.0.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.3.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version="2.0.2" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Timer" Version="4.3.1" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="2.0.4" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="9.0.3" />
</ItemGroup>
<ItemGroup>
<None Update="host.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="local.settings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Shared\Common\Common.csproj" />
<ProjectReference Include="..\..\Shared\HealthChecks\HealthChecks.csproj" />
<ProjectReference Include="..\..\Shared\Model\Model.csproj" />
<ProjectReference Include="..\..\Shared\DataServices.Core\DataServices.Core.csproj" />
<ProjectReference Include="..\..\Shared\DataServices.Database\DataServices.Database.csproj" />
</ItemGroup>
</Project>
Loading
Loading