using Serilog; using System; using System.Threading.Tasks; using TINK.Model.Repository; using TINK.Model.Repository.Request; using TINK.Model.Repository.Response; using TINK.Model.User.Account; namespace TINK.Model.Connector { public class Command : Base, ICommand { /// True if connector has access to copri server, false if cached values are used. public bool IsConnected => CopriServer.IsConnected; /// No user is logged in. public string SessionCookie => null; /// Is raised whenever login state has changed. public event LoginStateChangedEventHandler LoginStateChanged; /// Constructs a copri query object. /// Server which implements communication. public Command( ICopriServerBase p_oCopriServer) : base(p_oCopriServer) { } /// /// Logs user in. /// If log in succeeds either and session might be updated if it was no more valid (logged in by an different device). /// If log in fails (password modified) session cookie is set to empty. /// If communication fails an exception is thrown. /// public async Task DoLogin( string p_strMail, string p_strPassword, string p_strDeviceId) { if (string.IsNullOrEmpty(p_strMail)) { throw new ArgumentNullException("Can not loging user. Mail address must not be null or empty."); } if (string.IsNullOrEmpty(p_strPassword)) { throw new ArgumentNullException("Can not loging user. Password must not be null or empty."); } if (string.IsNullOrEmpty(p_strDeviceId)) { throw new ArgumentNullException("Can not loging user. Device not be null or empty."); } AuthorizationResponse l_oResponse; try { l_oResponse = (await CopriServer.DoAuthorizationAsync(p_strMail, p_strPassword, p_strDeviceId)).GetIsResponseOk(p_strMail); } catch (System.Exception) { throw; } var l_oAccount = l_oResponse.GetAccount(MerchantId, p_strMail, p_strPassword); // Log in state changes. Notify parent object to update. LoginStateChanged?.Invoke(this, new LoginStateChangedEventArgs(l_oAccount.SessionCookie, l_oAccount.Mail)); return l_oAccount; } /// Logs user out. public async Task DoLogout() { Log.ForContext().Error("Unexpected log out request detected. No user logged in."); await Task.CompletedTask; } /// /// Request to reserve a bike. /// /// Bike to book. public async Task DoReserve( Bikes.Bike.BC.IBikeInfoMutable p_oBike) { Log.ForContext().Error("Unexpected booking request detected. No user logged in."); await Task.CompletedTask; } /// Request to cancel a reservation. /// Bike to book. public async Task DoCancelReservation(Bikes.Bike.BC.IBikeInfoMutable bike) { Log.ForContext().Error("Unexpected cancel reservation request detected. No user logged in."); await Task.CompletedTask; } /// Get authentication keys. /// Bike to book. public async Task CalculateAuthKeys(Bikes.Bike.BluetoothLock.IBikeInfoMutable bike) { Log.ForContext().Error("Unexpected request to get authenticatin keys detected. No user logged in."); await Task.CompletedTask; } /// Updates COPRI lock state for a booked bike. /// Bike to update locking state for. /// Location where lock was opened/ changed. /// Response on updating locking state. public async Task UpdateLockingStateAsync(Bikes.Bike.BluetoothLock.IBikeInfoMutable bike, LocationDto location) { Log.ForContext().Error("Unexpected request to update locking state detected. No user logged in."); await Task.CompletedTask; } public async Task DoBook(Bikes.Bike.BluetoothLock.IBikeInfoMutable bike) { Log.ForContext().Error("Unexpected booking request detected. No user logged in."); await Task.CompletedTask; } public async Task DoReturn( Bikes.Bike.BluetoothLock.IBikeInfoMutable bike, LocationDto location) { Log.ForContext().Error("Unexpected returning request detected. No user logged in."); await Task.CompletedTask; } /// /// Submits feedback to copri server. /// /// Feedback to submit. public async Task DoSubmitFeedback(ICommand.IUserFeedback userFeedback, Uri opertorUri) { Log.ForContext().Error("Unexpected submit feedback request detected. No user logged in."); await Task.CompletedTask; } } }