rama creada apartir de master en j
This commit is contained in:
@@ -8,6 +8,12 @@ using MongoDB.Bson;
|
||||
|
||||
namespace adas_core.Application.Subscriptions;
|
||||
|
||||
/// <summary>
|
||||
/// Provides an implementation of <see cref="ISubscriberGroupedService"/> that coordinates subscription handling for grouped observations, integrating caching, client messaging, and logging capabilities.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This service depends on an optional cache, a grouped observation service, a logger, and a lazily-initialized client message service to support its subscriber-related operations.
|
||||
/// </remarks>
|
||||
public class SubscriberGroupedService(
|
||||
ICacheService? cacheService,
|
||||
IGroupedObservationService groupedObservationService,
|
||||
@@ -38,6 +44,10 @@ public class SubscriberGroupedService(
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a thread-safe snapshot of the grouped subscribers as a new list. The internal collection is locked during the copy to ensure consistency and prevent concurrent modification.
|
||||
/// </summary>
|
||||
/// <returns>A new <see cref="List{WsSubscriberGrouped}"/> containing a copy of the grouped subscribers.</returns>
|
||||
public List<WsSubscriberGrouped> GetGrouped()
|
||||
{
|
||||
lock (_subscriberGrouped)
|
||||
@@ -46,6 +56,10 @@ public class SubscriberGroupedService(
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes all grouped observations associated with the specified patient identifier from the subscriber collection in a thread-safe manner.
|
||||
/// </summary>
|
||||
/// <param name="patientId">The string representation of the patient identifier used to locate and remove the matching grouped observations.</param>
|
||||
public void RemoveGroupedObsByPatientId(string patientId)
|
||||
{
|
||||
lock (_subscriberGrouped)
|
||||
@@ -81,6 +95,11 @@ public class SubscriberGroupedService(
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes the specified WebSocket subscriber ID from all subscriber groups associated with the given patient ID in a thread-safe manner, and checks whether any resulting group is now empty for further cleanup.
|
||||
/// </summary>
|
||||
/// <param name="patientId">The patient identifier used to locate the subscriber groups to update.</param>
|
||||
/// <param name="wsIdToRemove">The WebSocket subscriber ID to remove from the matching subscriber and group collections.</param>
|
||||
public void RemoveWsSubscriberPatientIdAndWsId(string patientId, string wsIdToRemove)
|
||||
{
|
||||
lock (_subscriberGrouped)
|
||||
@@ -155,6 +174,11 @@ public class SubscriberGroupedService(
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a grouped WebSocket subscriber to the internal collection in a thread-safe manner.
|
||||
/// Uses locking to ensure that concurrent calls do not corrupt the subscriber list.
|
||||
/// </summary>
|
||||
/// <param name="wsSubscriberGrouped">The grouped WebSocket subscriber instance to be added to the collection.</param>
|
||||
public void AddSubscriberGrouped(WsSubscriberGrouped wsSubscriberGrouped)
|
||||
{
|
||||
lock (_subscriberGrouped)
|
||||
@@ -163,8 +187,16 @@ public class SubscriberGroupedService(
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Registers a client connection for grouped-field observation updates for a given patient. If an existing grouped subscription matches the patient and field, the connection is added to it; otherwise, a new grouped subscription is created with a callback that processes empty observations.
|
||||
/// </summary>
|
||||
/// <param name="groupedField">The grouped field criteria used to locate or create the matching subscription.</param>
|
||||
/// <param name="patientId">The identifier of the patient whose grouped observation is being subscribed to.</param>
|
||||
/// <param name="timeZoneId">The optional time zone identifier applied to the new subscription when one is created.</param>
|
||||
/// <param name="connectionId">The unique identifier of the client connection being registered.</param>
|
||||
/// <param name="lastObsInGroup">The most recent observation in the group, used to initialize a new subscription.</param>
|
||||
public void CheckOnSubscriptionGroup(GroupedField groupedField, ObjectId patientId, string? timeZoneId,
|
||||
string connectionId, GroupedObservation lastObsInGroup)
|
||||
string connectionId, GroupedObservation lastObsInGroup)
|
||||
{
|
||||
var wsSubscriberGrouped = GetGrouped().FirstOrDefault(s => s.Compare(groupedField, patientId));
|
||||
if (wsSubscriberGrouped != null)
|
||||
@@ -182,7 +214,7 @@ public class SubscriberGroupedService(
|
||||
AddSubscriberGrouped(
|
||||
// ReSharper disable once AsyncVoidLambda
|
||||
new WsSubscriberGrouped(patientId, connectionId, timeZoneId, groupedField, lastObsInGroup,
|
||||
async delegate(object? sender, string _)
|
||||
async delegate (object? sender, string _)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -197,6 +229,12 @@ public class SubscriberGroupedService(
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the last grouped observation in the subscriber group identified by the specified hash code.
|
||||
/// Performs a thread-safe lookup; if no matching subscriber group is found, the operation is silently skipped.
|
||||
/// </summary>
|
||||
/// <param name="wsgHashCode">The hash code used to identify the target subscriber group whose last grouped observation should be updated.</param>
|
||||
/// <param name="newGroupedObservation">The new <see cref="GroupedObservation"/> to set as the last grouped observation in the matched group.</param>
|
||||
public void UpdateLastGroupedObsInGroup(string wsgHashCode, GroupedObservation newGroupedObservation)
|
||||
{
|
||||
lock (_subscriberGrouped)
|
||||
@@ -205,6 +243,10 @@ public class SubscriberGroupedService(
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates the next empty grouped observation for the supplied WebSocket subscriber group and distributes it asynchronously to every subscriber in the group, applying the subscriber-specific group value resolved from the group mapping.
|
||||
/// </summary>
|
||||
/// <param name="ws">The grouped WebSocket subscriber context whose next empty observation is generated and whose subscribers will receive the notification.</param>
|
||||
private async Task AddEmptyObs(WsSubscriberGrouped ws)
|
||||
{
|
||||
var gobs = await groupedObservationService.CreateNextEmptyObs(ws);
|
||||
|
||||
Reference in New Issue
Block a user