add support for separating connection type in XPushConnectionDto by adding an abstract GetConnection method ...

This commit is contained in:
2025-07-14 08:03:09 +03:30
parent 6e1fb930a5
commit cfcb2d12b4
2 changed files with 134 additions and 89 deletions
+128 -87
View File
@@ -14,7 +14,8 @@ namespace xPushService.Base {
/// <summary> /// <summary>
/// a base class for implementing Hubs ... /// a base class for implementing Hubs ...
/// </summary> /// </summary>
public abstract class XBaseHub : Hub, IXBaseHub { public abstract class XBaseHub : Hub, IXBaseHub
{
// //
#region Props ... #region Props ...
protected readonly IXPushGroupStore groupStore; protected readonly IXPushGroupStore groupStore;
@@ -23,10 +24,11 @@ namespace xPushService.Base {
// //
#region Constructor ... #region Constructor ...
public XBaseHub ( public XBaseHub(
IXPushGroupStore groupStore, IXPushGroupStore groupStore,
IXPushConnectionStore connectionStore IXPushConnectionStore connectionStore
) : base () { ) : base()
{
// //
this.groupStore = groupStore; this.groupStore = groupStore;
this.connectionStore = connectionStore; this.connectionStore = connectionStore;
@@ -35,6 +37,7 @@ namespace xPushService.Base {
// //
#region Abstract ... #region Abstract ...
public abstract XPushConnectionDto GetConnection();
#endregion #endregion
// //
@@ -43,48 +46,52 @@ namespace xPushService.Base {
// //
#region Overrides ... #region Overrides ...
public override Task OnConnectedAsync () { public override Task OnConnectedAsync()
{
// //
var connection = GetConnection (); var connection = GetConnection();
if (!connection.IsNull ()) { if (!connection.IsNull())
{
// //
connectionStore connectionStore
.Add (connection) .Add(connection)
.RunTask (); .RunTask();
// //
var count = connectionStore var count = connectionStore
.Count () .Count()
.RunTask (); .RunTask();
// //
Console.WriteLine ($"Count After Coonected: {count}"); Console.WriteLine($"Count After Coonected: {count}");
} }
// //
return base.OnConnectedAsync (); return base.OnConnectedAsync();
} }
public override Task OnDisconnectedAsync (Exception exception) { public override Task OnDisconnectedAsync(Exception exception)
{
// //
var connection = GetConnection (); var connection = GetConnection();
if (!connection.IsNull ()) { if (!connection.IsNull())
{
// //
connectionStore connectionStore
.RemoveByConnectionId (connection.Id) .RemoveByConnectionId(connection.Id)
.RunTask (); .RunTask();
// //
var count = connectionStore var count = connectionStore
.Count () .Count()
.RunTask (); .RunTask();
// //
Console.WriteLine ($"Count After DisCoonected: {count}"); Console.WriteLine($"Count After DisCoonected: {count}");
} }
// //
return base.OnDisconnectedAsync (exception); return base.OnDisconnectedAsync(exception);
} }
#endregion #endregion
@@ -94,32 +101,34 @@ namespace xPushService.Base {
/// Notify to all Other Clients which a new Connection is established ... /// Notify to all Other Clients which a new Connection is established ...
/// </summary> /// </summary>
/// <param name="connectionId"></param> /// <param name="connectionId"></param>
public Task NotifyNewConnection (string connectionId) { public Task NotifyNewConnection(string connectionId)
{
// //
var actor = Context.User.Identity.Name; var actor = Context.User.Identity.Name;
var authType = Context.User.Identity.AuthenticationType; var authType = Context.User.Identity.AuthenticationType;
var actorRole = Context?.User?.FindFirst ("role")?.Value; var actorRole = Context?.User?.FindFirst("role")?.Value;
// //
var pushMessage = new XPushMessage { var pushMessage = new XPushMessage
{
// //
Actor = actor, Actor = actor,
Payload = connectionId, Payload = connectionId,
TimeStamp = DateTime.UtcNow, TimeStamp = DateTime.UtcNow,
Type = XPushType.System.GetStringValue(), Type = XPushType.System.GetStringValue(),
Topic = XPushType.System.GetStringValue(), Topic = XPushType.System.GetStringValue(),
Action = XBasePushAction.NotifyNewConnection.GetStringValue (), Action = XBasePushAction.NotifyNewConnection.GetStringValue(),
Message = $"a new connection stablished by {connectionId} ...", Message = $"a new connection stablished by {connectionId} ...",
}; };
// //
Console.WriteLine ($"XPushServiceLog => "); Console.WriteLine($"XPushServiceLog => ");
Console.WriteLine ($"XPushServiceLog => NotifyNewConnection: User: {actor}/Role: {actorRole}/AuthType: {authType}/ConnectionId: {connectionId}/ConnectedAt: {DateTime.UtcNow}"); Console.WriteLine($"XPushServiceLog => NotifyNewConnection: User: {actor}/Role: {actorRole}/AuthType: {authType}/ConnectionId: {connectionId}/ConnectedAt: {DateTime.UtcNow}");
Console.WriteLine ($"XPushServiceLog => "); Console.WriteLine($"XPushServiceLog => ");
// //
return Clients.Others.SendAsync ( return Clients.Others.SendAsync(
XBasePushAction.PushMessage.GetStringValue (), XBasePushAction.PushMessage.GetStringValue(),
pushMessage pushMessage
); );
} }
@@ -127,27 +136,30 @@ namespace xPushService.Base {
/// <summary> /// <summary>
/// Update Last Seen ... /// Update Last Seen ...
/// </summary> /// </summary>
public Task UpdateLastSeen () { public Task UpdateLastSeen()
{
var connectionId = Context.ConnectionId; var connectionId = Context.ConnectionId;
return connectionStore return connectionStore
.UpdateLastSeen (connectionId) .UpdateLastSeen(connectionId)
.ContinueWith (updateLastSeenTask => { .ContinueWith(updateLastSeenTask =>
{
// //
var updateLastSeen = updateLastSeenTask var updateLastSeen = updateLastSeenTask
.RunTask (); .RunTask();
if (updateLastSeen) { if (updateLastSeen)
{
// //
var updatedConnection = connectionStore var updatedConnection = connectionStore
.GetByConnectionId (connectionId) .GetByConnectionId(connectionId)
.RunTask (); .RunTask();
// //
var count = connectionStore var count = connectionStore
.Count () .Count()
.RunTask (); .RunTask();
// //
Console.WriteLine ($"Connection Last Seen Updated: {connectionId}: {updatedConnection.LastSeen}, Connection Count: {count} ..."); Console.WriteLine($"Connection Last Seen Updated: {connectionId}: {updatedConnection.LastSeen}, Connection Count: {count} ...");
} }
}); });
} }
@@ -157,16 +169,20 @@ namespace xPushService.Base {
/// </summary> /// </summary>
/// <param name="message"></param> /// <param name="message"></param>
/// <returns></returns> /// <returns></returns>
public Task PushMessageAsync (XPushMessage message) { public Task PushMessageAsync(XPushMessage message)
{
// //
if (message.IsNull ()) { if (message.IsNull())
message = GetPushMessage (); {
} else { message = GetPushMessage();
}
else
{
message.TimeStamp = DateTime.UtcNow; message.TimeStamp = DateTime.UtcNow;
} }
// //
return Clients.Others.SendAsync (XBasePushAction.PushMessage.GetStringValue (), message); return Clients.Others.SendAsync(XBasePushAction.PushMessage.GetStringValue(), message);
} }
/// <summary> /// <summary>
@@ -175,16 +191,20 @@ namespace xPushService.Base {
/// <param name="message"></param> /// <param name="message"></param>
/// <returns></returns> /// <returns></returns>
[Authorize] [Authorize]
public Task AuthorizedMessageAsync (XPushMessage message) { public Task AuthorizedMessageAsync(XPushMessage message)
{
// //
if (message.IsNull ()) { if (message.IsNull())
message = GetPushMessage (); {
} else { message = GetPushMessage();
}
else
{
message.TimeStamp = DateTime.UtcNow; message.TimeStamp = DateTime.UtcNow;
} }
// //
return Clients.Others.SendAsync (XBasePushAction.PushMessage.GetStringValue (), message); return Clients.Others.SendAsync(XBasePushAction.PushMessage.GetStringValue(), message);
} }
/// <summary> /// <summary>
@@ -192,20 +212,24 @@ namespace xPushService.Base {
/// </summary> /// </summary>
/// <param name="message"></param> /// <param name="message"></param>
/// <returns></returns> /// <returns></returns>
public Task PushMessageToAll (XPushMessage message) { public Task PushMessageToAll(XPushMessage message)
{
// //
// Normalize Message ... // Normalize Message ...
if (message.IsNull ()) { if (message.IsNull())
message = GetPushMessage (); {
} else { message = GetPushMessage();
}
else
{
message.TimeStamp = DateTime.UtcNow; message.TimeStamp = DateTime.UtcNow;
} }
// //
return Clients return Clients
.All .All
.SendAsync ( .SendAsync(
XBasePushAction.PushMessage.GetStringValue (), XBasePushAction.PushMessage.GetStringValue(),
message message
); );
} }
@@ -216,29 +240,34 @@ namespace xPushService.Base {
/// <param name="connectionId"></param> /// <param name="connectionId"></param>
/// <param name="message"></param> /// <param name="message"></param>
/// <returns></returns> /// <returns></returns>
public Task PushMessageToConnection ( public Task PushMessageToConnection(
string connectionId, string connectionId,
XPushMessage message XPushMessage message
) { )
{
// //
// Validate Args ... // Validate Args ...
if (connectionId.IsNullOrEmpty ()) { if (connectionId.IsNullOrEmpty())
{
return Task.CompletedTask; return Task.CompletedTask;
} }
// //
// Normalize Message ... // Normalize Message ...
if (message.IsNull ()) { if (message.IsNull())
message = GetPushMessage (); {
} else { message = GetPushMessage();
}
else
{
message.TimeStamp = DateTime.UtcNow; message.TimeStamp = DateTime.UtcNow;
} }
// //
return Clients return Clients
.Client (connectionId) .Client(connectionId)
.SendAsync ( .SendAsync(
XBasePushAction.PushMessage.GetStringValue (), XBasePushAction.PushMessage.GetStringValue(),
message message
); );
} }
@@ -249,33 +278,38 @@ namespace xPushService.Base {
/// <param name="connectionIds"></param> /// <param name="connectionIds"></param>
/// <param name="message"></param> /// <param name="message"></param>
/// <returns></returns> /// <returns></returns>
public Task PushMessageToConnections ( public Task PushMessageToConnections(
IEnumerable<string> connectionIds, IEnumerable<string> connectionIds,
XPushMessage message XPushMessage message
) { )
{
// //
// Validate Args ... // Validate Args ...
if (!connectionIds.HasChild ()) { if (!connectionIds.HasChild())
{
return Task.CompletedTask; return Task.CompletedTask;
} }
// //
// Normalize Message ... // Normalize Message ...
if (message.IsNull ()) { if (message.IsNull())
message = GetPushMessage (); {
} else { message = GetPushMessage();
}
else
{
message.TimeStamp = DateTime.UtcNow; message.TimeStamp = DateTime.UtcNow;
} }
// //
return Clients return Clients
.Clients ( .Clients(
connectionIds connectionIds
.ToList () .ToList()
.AsReadOnly () .AsReadOnly()
) )
.SendAsync ( .SendAsync(
XBasePushAction.PushMessage.GetStringValue (), XBasePushAction.PushMessage.GetStringValue(),
message message
); );
} }
@@ -287,7 +321,8 @@ namespace xPushService.Base {
/// retrieve connected user name ... /// retrieve connected user name ...
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
protected string GetUserName () { protected string GetUserName()
{
return Context?.User?.Identity?.Name; return Context?.User?.Identity?.Name;
} }
@@ -295,22 +330,25 @@ namespace xPushService.Base {
/// retrieve connected user role ... /// retrieve connected user role ...
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
protected string GetUserRole () { protected string GetUserRole()
return Context?.User?.FindFirst ("role")?.Value; {
return Context?.User?.FindFirst("role")?.Value;
} }
/// <summary> /// <summary>
/// Retrieve Empty Message ... /// Retrieve Empty Message ...
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
protected XPushMessage GetPushMessage () { protected XPushMessage GetPushMessage()
{
// //
var timeStamp = DateTime.UtcNow; var timeStamp = DateTime.UtcNow;
var actor = Context.User.Identity.Name; var actor = Context.User.Identity.Name;
var connectionId = Context.ConnectionId; var connectionId = Context.ConnectionId;
// //
var result = new XPushMessage { var result = new XPushMessage
{
Actor = actor, Actor = actor,
TimeStamp = timeStamp, TimeStamp = timeStamp,
Payload = connectionId, Payload = connectionId,
@@ -324,7 +362,8 @@ namespace xPushService.Base {
/// retrieve current connection id ... /// retrieve current connection id ...
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
protected string GetConnectionId () { protected string GetConnectionId()
{
return Context.ConnectionId; return Context.ConnectionId;
} }
@@ -332,19 +371,21 @@ namespace xPushService.Base {
/// Retrieve Connection Model from Context ... /// Retrieve Connection Model from Context ...
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
protected XPushConnectionDto GetConnection () { protected XPushConnectionDto GetBaseConnection()
{
// //
var connectionId = Context.ConnectionId; var connectionId = Context.ConnectionId;
var userName = Context.User.Identity.Name; var userName = Context.User.Identity.Name;
var authenticationType = Context.User.Identity.AuthenticationType; var authenticationType = Context.User.Identity.AuthenticationType;
// //
var httpContext = Context.GetHttpContext (); var httpContext = Context.GetHttpContext();
var deviceJson = httpContext.Request.Query["Option"].ToString (); var deviceJson = httpContext.Request.Query["Option"].ToString();
var device = deviceJson.FromJSON<XDeviceDto> (); var device = deviceJson.FromJSON<XDeviceDto>();
// //
var result = new XPushConnectionDto { var result = new XPushConnectionDto
{
User = userName, User = userName,
Device = device, Device = device,
Id = connectionId, Id = connectionId,
+4
View File
@@ -18,6 +18,10 @@ namespace xPushService.Models {
/// <value></value> /// <value></value>
public string User { get; set; } public string User { get; set; }
/// <summary> /// <summary>
/// Connected Hub Type Name ...
/// </summary>
public string Type { get; set; }
/// <summary>
/// Connected User Device ... /// Connected User Device ...
/// </summary> /// </summary>
/// <value></value> /// <value></value>