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, IXPushConnectionStore { // #region Constructor ... public XPushConnectionInMemoryStore( IXPushConnectionStoreEvents events = null ) : base(events) {} #endregion // #region Custom ... /// /// retrieve specific connection by it's Id ... /// /// /// public Task GetByConnectionId(string connectionId) { return Get(connectionId); } /// /// retrieve specific user's connections ... /// /// /// public Task> GetByUserName(string userName) { return FindMany(c => c.User.ToNormalString() == userName.ToNormalString()); } /// /// retrieve specific user's connected device connection /// /// /// /// public Task GetByUserDevice(string userName, XDeviceDto device) { return FindOne(c => c.User.ToNormalString() == userName.ToNormalString() && c.Device.IsSameContent( device, null, null, null, false ) ); } /// /// check a connection exists or not by it's id ... /// /// /// public Task IsExistsConnectionId(string connectionId) { return IsExistsByKey(connectionId); } /// /// check specific user connected or not ... /// /// /// public Task IsExistsUser(string userName) { return GetByUserName(userName) .ContinueWith(findTask => { // var findResult = findTask .RunTask(); // var result = findResult.Any(); return result; }); } /// /// retrieve specific user's connected devices ... /// /// /// /// public Task> GetUserDevices(string userName) { return GetByUserName(userName) .ContinueWith(userConnectionsTask => { // var userConnections = userConnectionsTask .RunTask(); // var result = userConnections.Select(c => c.Device); return result; }); } /// /// remove specific connection by it's id ... /// /// /// public Task RemoveByConnectionId(string connectionId) { return RemoveByKey(connectionId); } /// /// remove specified user's connected device connection ... /// /// /// /// public Task 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; }); } /// /// remove specific user's all connected devices ... /// /// /// public Task RemoveUser(string userName) { return GetByUserName(userName) .ContinueWith(connectionsTask => { // var connections = connectionsTask .RunTask(); // if (!connections.HasChild()) { return false; } // var result = RemoveMany(new XBaseRangeRequest { Items = connections }) .RunTask(); // return result; }); } /// /// Get specific connections last seen ... /// /// /// public Task 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; }); } /// /// get specific user's last seen ... /// /// /// public Task 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; }); } /// /// get specific user's connected device last seen ... /// /// /// /// public Task 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; }); } /// /// Update Connection last seen ... /// /// /// public Task 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 } }