Initial Commit ...
This commit is contained in:
@@ -0,0 +1,283 @@
|
||||
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 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user