feature: Ward Gateway Service (Local-First Clinical Path)
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
using Microsoft.Extensions.Options;
|
||||
using RabbitMQ.Client;
|
||||
|
||||
public sealed class LocalPagingPublisher
|
||||
{
|
||||
private readonly RabbitMqOptions _opts;
|
||||
private readonly ILogger<LocalPagingPublisher> _logger;
|
||||
|
||||
public LocalPagingPublisher(IOptions<RabbitMqOptions> opts, ILogger<LocalPagingPublisher> logger)
|
||||
{
|
||||
_opts = opts.Value;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public Task PublishCriticalAsync(LocalClinicalAlert alert, ReplicaEncounter encounter)
|
||||
{
|
||||
try
|
||||
{
|
||||
var factory = new ConnectionFactory
|
||||
{
|
||||
HostName = _opts.Host,
|
||||
Port = _opts.Port,
|
||||
UserName = _opts.Username,
|
||||
Password = _opts.Password
|
||||
};
|
||||
using var conn = factory.CreateConnection("gateway-publisher");
|
||||
using var channel = conn.CreateModel();
|
||||
|
||||
var payload = JsonSerializer.Serialize(new
|
||||
{
|
||||
alertId = alert.Id,
|
||||
encounterId = alert.EncounterId,
|
||||
details = alert.Details,
|
||||
attendingPhysician = encounter.AttendingPhysician
|
||||
});
|
||||
|
||||
var body = Encoding.UTF8.GetBytes(payload);
|
||||
channel.BasicPublish(
|
||||
RabbitMqTopologyProvisioner.Exchange,
|
||||
RabbitMqTopologyProvisioner.PagingKey,
|
||||
body: body);
|
||||
|
||||
_logger.LogInformation(
|
||||
"Published critical alert {AlertId} to paging queue for encounter {EncounterId}",
|
||||
alert.Id, alert.EncounterId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex,
|
||||
"Failed to publish critical alert {AlertId} to paging queue — alert persisted locally",
|
||||
alert.Id);
|
||||
}
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user