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 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 } }