321 lines
9.7 KiB
C#
321 lines
9.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using xCommons.Extensions;
|
|
using xExceptions.Constants;
|
|
using xModels.Base;
|
|
using xModels.Dtos;
|
|
using xModels.Providers;
|
|
using xPushService.Interfaces;
|
|
using xPushService.Models;
|
|
|
|
namespace xPushService.Store
|
|
{
|
|
public class XPushConnectionInMemoryStore : XBaseInMemoryStore<XPushConnectionDto, string>, IXPushConnectionStore
|
|
{
|
|
//
|
|
#region Constructor ...
|
|
public XPushConnectionInMemoryStore(
|
|
IXPushConnectionStoreEvents events = null
|
|
) : base(events) {}
|
|
#endregion
|
|
|
|
//
|
|
#region Custom ...
|
|
/// <summary>
|
|
/// retrieve specific connection by it's Id ...
|
|
/// </summary>
|
|
/// <param name="connectionId"></param>
|
|
/// <returns></returns>
|
|
public Task<XPushConnectionDto> GetByConnectionId(string connectionId)
|
|
{
|
|
return Get(connectionId);
|
|
}
|
|
|
|
/// <summary>
|
|
/// retrieve specific user's connections ...
|
|
/// </summary>
|
|
/// <param name="userName"></param>
|
|
/// <returns></returns>
|
|
public Task<IEnumerable<XPushConnectionDto>> GetByUserName(string userName)
|
|
{
|
|
return FindMany(c => c.User.ToNormalString() == userName.ToNormalString());
|
|
}
|
|
|
|
/// <summary>
|
|
/// retrieve specific user's connected device connection
|
|
/// </summary>
|
|
/// <param name="userName"></param>
|
|
/// <param name="device"></param>
|
|
/// <returns></returns>
|
|
public Task<XPushConnectionDto> GetByUserDevice(string userName, XDeviceDto device)
|
|
{
|
|
return FindOne(c =>
|
|
c.User.ToNormalString() == userName.ToNormalString() &&
|
|
c.Device.IsSameContent(
|
|
device, null, null, null, false
|
|
)
|
|
);
|
|
}
|
|
|
|
/// <summary>
|
|
/// check a connection exists or not by it's id ...
|
|
/// </summary>
|
|
/// <param name="connectionId"></param>
|
|
/// <returns></returns>
|
|
public Task<bool> IsExistsConnectionId(string connectionId)
|
|
{
|
|
return IsExistsByKey(connectionId);
|
|
}
|
|
|
|
/// <summary>
|
|
/// check specific user connected or not ...
|
|
/// </summary>
|
|
/// <param name="userName"></param>
|
|
/// <returns></returns>
|
|
public Task<bool> IsExistsUser(string userName)
|
|
{
|
|
return GetByUserName(userName)
|
|
.ContinueWith(findTask =>
|
|
{
|
|
//
|
|
var findResult = findTask
|
|
.RunTask();
|
|
|
|
//
|
|
var result = findResult.Any();
|
|
return result;
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// retrieve specific user's connected devices ...
|
|
/// </summary>
|
|
/// <param name="userName"></param>
|
|
/// <param name="device"></param>
|
|
/// <returns></returns>
|
|
public Task<IEnumerable<XDeviceDto>> GetUserDevices(string userName)
|
|
{
|
|
return GetByUserName(userName)
|
|
.ContinueWith(userConnectionsTask =>
|
|
{
|
|
//
|
|
var userConnections = userConnectionsTask
|
|
.RunTask();
|
|
|
|
//
|
|
var result = userConnections.Select(c => c.Device);
|
|
return result;
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// remove specific connection by it's id ...
|
|
/// </summary>
|
|
/// <param name="connectionId"></param>
|
|
/// <returns></returns>
|
|
public Task<bool> RemoveByConnectionId(string connectionId)
|
|
{
|
|
return RemoveByKey(connectionId);
|
|
}
|
|
|
|
/// <summary>
|
|
/// remove specified user's connected device connection ...
|
|
/// </summary>
|
|
/// <param name="userName"></param>
|
|
/// <param name="device"></param>
|
|
/// <returns></returns>
|
|
public Task<bool> RemoveByUserDevice(string userName, XDeviceDto device)
|
|
{
|
|
return GetByUserDevice(
|
|
device: device,
|
|
userName: userName
|
|
)
|
|
.ContinueWith(connectionTask =>
|
|
{
|
|
//
|
|
var connection = connectionTask
|
|
.RunTask();
|
|
|
|
//
|
|
if (connection.IsNull())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//
|
|
var result = Remove(connection)
|
|
.RunTask();
|
|
return result;
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// remove specific user's all connected devices ...
|
|
/// </summary>
|
|
/// <param name="userName"></param>
|
|
/// <returns></returns>
|
|
public Task<bool> RemoveUser(string userName)
|
|
{
|
|
return GetByUserName(userName)
|
|
.ContinueWith(connectionsTask =>
|
|
{
|
|
//
|
|
var connections = connectionsTask
|
|
.RunTask();
|
|
|
|
//
|
|
if (!connections.HasChild())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//
|
|
var result = RemoveMany(new XBaseRangeRequest<XPushConnectionDto>
|
|
{
|
|
Items = connections
|
|
})
|
|
.RunTask();
|
|
|
|
//
|
|
return result;
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get specific connections last seen ...
|
|
/// </summary>
|
|
/// <param name="connectionId"></param>
|
|
/// <returns></returns>
|
|
public Task<DateTime> GetLastSeenByConnectionId(string connectionId)
|
|
{
|
|
return GetByConnectionId(connectionId)
|
|
.ContinueWith(connectionTask =>
|
|
{
|
|
//
|
|
var connection = connectionTask
|
|
.RunTask();
|
|
|
|
//
|
|
if (connection.IsNull())
|
|
{
|
|
throw XException.NotFound.ToException();
|
|
}
|
|
|
|
//
|
|
var result = connection.LastSeen;
|
|
return result;
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// get specific user's last seen ...
|
|
/// </summary>
|
|
/// <param name="userName"></param>
|
|
/// <returns></returns>
|
|
public Task<DateTime> GetLastSeenByUserName(string userName)
|
|
{
|
|
return GetByUserName(userName)
|
|
.ContinueWith(connectionsTask =>
|
|
{
|
|
//
|
|
var connections = connectionsTask
|
|
.RunTask();
|
|
|
|
//
|
|
if (!connections.HasChild())
|
|
{
|
|
throw XException.NotFound.ToException();
|
|
}
|
|
|
|
//
|
|
var result = connections
|
|
.Select(c => c.LastSeen)
|
|
.Max();
|
|
|
|
//
|
|
return result;
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// get specific user's connected device last seen ...
|
|
/// </summary>
|
|
/// <param name="userName"></param>
|
|
/// <param name="device"></param>
|
|
/// <returns></returns>
|
|
public Task<DateTime> GetLastSeenByUserDevice(string userName, XDeviceDto device)
|
|
{
|
|
return GetByUserDevice(
|
|
device: device,
|
|
userName: userName
|
|
)
|
|
.ContinueWith(connectionTask =>
|
|
{
|
|
//
|
|
var connection = connectionTask
|
|
.RunTask();
|
|
|
|
//
|
|
if (connection.IsNull())
|
|
{
|
|
throw XException.NotFound.ToException();
|
|
}
|
|
|
|
//
|
|
var result = connection.LastSeen;
|
|
return result;
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// Update Connection last seen ...
|
|
/// </summary>
|
|
/// <param name="connectionId"></param>
|
|
/// <returns></returns>
|
|
public Task<bool> UpdateLastSeen(string connectionId)
|
|
{
|
|
return IsExistsConnectionId(connectionId)
|
|
.ContinueWith(isExistsTask =>
|
|
{
|
|
//
|
|
// define empty result ...
|
|
var result = false;
|
|
|
|
//
|
|
// run task and get result ...
|
|
result = isExistsTask
|
|
.RunTask();
|
|
|
|
//
|
|
// check result is false ...
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// retreive connection ...
|
|
var connection = GetByConnectionId(connectionId)
|
|
.RunTask();
|
|
result = !connection.IsNull();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Update Connection last seen ...
|
|
connection.LastSeen = DateTime.UtcNow;
|
|
var updatedConnection = Update(connection)
|
|
.RunTask();
|
|
result = !updatedConnection.IsNull();
|
|
|
|
//
|
|
return result;
|
|
});
|
|
}
|
|
#endregion
|
|
}
|
|
} |