using System; using System.Globalization; using System.Net; using TINK.Model.Repository.Exception; namespace TINK.Model.Repository.Request { /// Creates requests if a user is logged in. public class RequestBuilderLoggedIn : IRequestBuilder { /// Constructs a object for building requests. /// public RequestBuilderLoggedIn( string merchantId, string sessionCookie) { MerchantId = !string.IsNullOrEmpty(merchantId) ? merchantId : throw new ArgumentException("Merchant id must not be null.", nameof(merchantId)); SessionCookie = !string.IsNullOrEmpty(sessionCookie) ? sessionCookie : throw new ArgumentException("Session cookie must not be null.", nameof(sessionCookie)); } /// Holds the id denoting the merchant (TINK app). public string MerchantId { get; } /// Holds the session cookie if a user is logged in. public string SessionCookie { get; } /// Gets request to log user in. /// Mailaddress of user to log in. /// Password to log in. /// Id specifying user and hardware. /// Response which holds auth cookie public string DoAuthorization( string mailAddress, string password, string deviceId) { throw new CallNotRequiredException(); } /// Logs user out. public string DoAuthout() { return $"request=authout&authcookie={SessionCookie}{MerchantId}"; } /// Gets bikes available. /// Request to query list of bikes available. public string GetBikesAvailable() { return RequestBuilder.GetBikesAvailable(MerchantId, SessionCookie); } /// Gets a list of bikes reserved/ booked by acctive user from Copri. /// Request to query list of bikes occupied. public string GetBikesOccupied() { return !string.IsNullOrEmpty(SessionCookie) ? $"request=user_bikes_occupied&system=all&genkey=1&authcookie={SessionCookie}{MerchantId}" : "request=bikes_available"; } /// Get list of stations from file. /// Request to query list of station. public string GetStations() { return $"request=stations_available&authcookie={SessionCookie ?? string.Empty}{MerchantId}"; } /// Gets reservation request (synonym: reservation == request == reservieren). /// Operator specific call. /// Id of the bike to reserve. /// Requst to reserve bike. public string DoReserve(int bikeId) => $"request=booking_request&bike={bikeId}&authcookie={SessionCookie}{MerchantId}"; /// Gets request to cancel reservation. /// Operator specific call. /// Id of the bike to cancel reservation for. /// Requst on cancel booking request. public string DoCancelReservation(int p_iBikeId) => $"request=booking_cancel&bike={p_iBikeId}&authcookie={SessionCookie}{MerchantId}"; /// Request to get keys. /// Operator specific call. /// Id of the bike to get keys for. /// Request to get keys. public string CalculateAuthKeys(int bikeId) => $"request=booking_update&bike={bikeId}&authcookie={SessionCookie}{MerchantId}&genkey=1"; /// Gets the request for updating lock state for a booked bike. /// Operator specific call. /// Id of the bike to update locking state for. /// New locking state. /// Request to update locking state. public string UpateLockingState(int bikeId, LocationDto geolocation, lock_state state, double batteryPercentage) { return $"request=booking_update&bike={bikeId}{GetLocationKey(geolocation)}&lock_state={state}{GetBatteryPercentageKey(batteryPercentage)}&authcookie={SessionCookie}{MerchantId}"; } /// Gets booking request request (synonym: booking == renting == mieten). /// Operator specific call. /// Id of the bike to book. /// Used to publish GUID from app to copri. Used for initial setup of bike in copri. /// Holds the filling level percentage of the battery. /// Request to booking bike. public string DoBook(int bikeId, Guid guid, double batteryPercentage) => $"request=booking_update&bike={bikeId}&authcookie={SessionCookie}{MerchantId}&Ilockit_GUID={guid}&state=occupied&lock_state=unlocked{GetBatteryPercentageKey(batteryPercentage)}"; /// Gets request for returning the bike. /// Operator specific call. /// Id of bike to return. /// Geolocation of lock when returning bike. /// Requst on returning request. public string DoReturn(int bikeId, LocationDto geolocation) { return $"request=booking_update&bike={bikeId}&authcookie={SessionCookie}{MerchantId}&state=available{GetLocationKey(geolocation)}&lock_state=locked"; } /// Gets submit feedback request. /// General purpose message or error description. /// True if bike is broken. /// Submit feedback request. public string DoSubmitFeedback( string message = null, bool isBikeBroken = false) { if (string.IsNullOrEmpty(message) && !isBikeBroken) { // User just acknoledged biked returned message. return "request=user_feedback"; } if (isBikeBroken == false) { // Bike is ok and user entered a feedback message. return $"request=user_feedback&message={WebUtility.UrlEncode(message)}"; } if (string.IsNullOrEmpty(message)) { // User just marked bike as broken without comment. return $"request=user_feedback&bike_broken=1"; } // Bike is marked as broken and user added a comment. return $"request=user_feedback&bike_broken=1&message={WebUtility.UrlEncode(message)}"; } private string GetBatteryPercentageKey(double batteryPercentage) => !double.IsNaN(batteryPercentage) ? $"&voltage={batteryPercentage.ToString(CultureInfo.InvariantCulture)}" : string.Empty; private string GetLocationKey(LocationDto geolocation) { if (geolocation == null) return string.Empty; if (geolocation.Accuracy == null) return $"&gps={geolocation.Latitude.ToString(CultureInfo.InvariantCulture)},{ geolocation.Longitude.ToString(CultureInfo.InvariantCulture)}&gps_age={geolocation.Age.TotalSeconds}"; return $"&gps={geolocation.Latitude.ToString(CultureInfo.InvariantCulture)},{geolocation.Longitude.ToString(CultureInfo.InvariantCulture)}&gps_accuracy={geolocation.Accuracy.Value.ToString(CultureInfo.InvariantCulture)}&gps_age={geolocation.Age.TotalSeconds}"; } } }