-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathManageCaasSubscription.cs
More file actions
154 lines (135 loc) · 6.85 KB
/
ManageCaasSubscription.cs
File metadata and controls
154 lines (135 loc) · 6.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
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;
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;
}
[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);
// 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.");
}
_logger.LogInformation("CAAS Subscribe forwarded to Mesh stub. MessageId: {Msg}", messageId);
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.");
}
}
[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.");
}
[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.");
}
}
[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.");
}
}
[Function("PollMeshMailbox")]
public async Task RunAsync([TimerTrigger("59 23 * * *")] TimerInfo myTimer)
{
await _meshPoller.ExecuteHandshake(_config.CaasFromMailbox!);
}
}