sharee.bike-App/SharedBusinessLogic.Tests.Framework/Repository/CopriCallsMemory.cs
2024-04-09 12:53:23 +02:00

1791 lines
79 KiB
C#
Raw Permalink Blame History

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using SharedBusinessLogic.Tests.Framework.Repository;
using ShareeBike.Model.Bikes.BikeInfoNS.BluetoothLock;
using ShareeBike.Model.Connector;
using ShareeBike.Repository.Request;
using ShareeBike.Repository.Response;
using ShareeBike.Repository.Response.Stations;
namespace ShareeBike.Repository
{
public class CopriCallsMemory : ICopriServer
{
/// <summary> Part in file specifying api server.</summary>
private static string CopriDevelHostUri = @"https://tinkwwp.copri-bike.de/APIjsonserver";
public const string DO_AUTH_Unknown_User_FILE = @"
{
""shareejson"" : {
""response"" : ""authorization"",
""authcookie"" : 0,
""response_state"" : ""Failure: cannot generate authcookie"",
""apiserver"" : ""https://tinkwwp.copri-bike.de""
}
}";
public const string DO_AUTH_SET02_001_FILE = @"
{
""shareejson"" : {
""response"" : ""authorization"",
""authcookie"" : ""4da3044c8657a04ba60e2eaa753bc51a"",
""user_group"" : [""ShareeBike""],
""response_state"" : ""OK"",
""apiserver"" : ""https://tinkwwp.copri-bike.de""
}
}";
public const string DO_AUTHOUT_SET02_001_FILE = @"{
""shareejson"" : {
""apiserver"" : ""https://app.tink-konstanz.de"",
""user_id"" : ""ohauff@posteo.de"",
""response_state"" : ""OK"",
""authcookie"" : ""1"",
""response"" : ""authout"",
""user_group"" : [ """" ],
""debuglevel"" : ""1"",
""copri_version"" : ""4.1.0.0""
}
}";
/// <summary>
/// Station ShareeBike: 4, 5, 7, 8, 10, 11, 12, 31
/// Station Citybike: 14, 31
/// Stations:
/// 4. Available: 26 Trike, 14, Cargo, 5 Cargo
/// 5. Available: 45 Cargo, 11 Cargo T, 2 Cargo, 52 Sr
/// 7. Available: 20 Cargo,
/// 8. Available: 19 Cargo
/// 10. Available: 18 Cargo
/// 11. Available: 17 Cargo
/// 12. Available: 13 Cargo
///
///
/// </summary>
public const string STATIONS_SET02_001_FILE = @"
{
""shareejson"": {
""authcookie"": 0,
""apiserver"": ""https://tinkwwp.copri-bike.de"",
""response"": ""stations_all"",
""stations"": {
""5786"": {
""station"" : ""4"",
""station_group"" : [ ""ShareeBike"" ],
""gps"" : { ""latitude"": ""47.6586936667"", ""longitude"": ""9.16863116667"" }
},
""2456"": {
""station"" : ""5"",
""station_group"" : [ ""ShareeBike"" ],
""gps"" : { ""latitude"": ""47.6675153333"", ""longitude"": ""9.16473216667"" }
},
""2798"": {
""station"" : ""12"",
""station_group"" : [ ""ShareeBike"" ],
""gps"" : { ""latitude"": ""47.6748671667"", ""longitude"": ""9.17326583333"" }
},
""3214"": {
""station"" : ""8"",
""station_group"" : [ ""ShareeBike"" ],
""gps"" : { ""latitude"": ""47.666401"", ""longitude"": ""9.175902"" }
},
""5462"": {
""station"" : ""11"",
""station_group"" : [ ""ShareeBike"" ],
""gps"" : { ""latitude"": ""47.672231"", ""longitude"": ""9.175862"" }
},
""3965"": {
""station"" : ""10"",
""station_group"" : [ ""ShareeBike"" ],
""gps"" : { ""latitude"": ""47.665556"", ""longitude"": ""9.17095133333"" }
},
""5423"": {
""station"" : ""7"",
""station_group"" : [ ""ShareeBike"" ],
""gps"" : { ""latitude"": ""47.6612413333"", ""longitude"": ""9.16641016667"" }
},
""14"": {
""station_group"" : [ ""Citybike"" ],
""description"": """",
""station"" : ""14"",
""gps"" : { ""latitude"": ""47.66698054007847"", ""longitude"": ""9.169303178787231"" }
},
""31"": {
""station_group"": [ ""ShareeBike"" , ""Citybike""],
""description"": ""Südstadt Station"",
""station"" : ""31"",
""gps"" : { ""latitude"": ""47.69489"", ""longitude"": ""9.19"" }
}
},
""response_state"": ""OK"",
""copri_version"" : ""4.1.0.0""
}
}";
/// <summary></summary>
public const string STATIONS_AVAILABLE_LOGGEDIN_20210720 = @"
{
""shareejson"": {
""lang"": ""DE"",
""impress_html"": ""site/impress.html"",
""tariff_info_html"": ""site/tariff_info_1.html"",
""debuglevel"": ""1"",
""user_tour"": [
null,
""""
],
""response"": ""stations_available"",
""user_id"": ""ohauff@posteo.de"",
""stations"": {
""LV_3"": {
""service_tour"": ""LV_1"",
""uri_operator"": ""https://shareeapp-lv.copri.eu"",
""authed"": ""1"",
""station"": ""LV_3"",
""gps"": {
""latitude"": ""47.9973"",
""longitude"": ""7.8585""
},
""gps_radius"": ""100"",
""description"": ""Katholische Akademie"",
""state"": ""available"",
""operator_data"": {
""operator_color"": ""#006269"",
""operator_hours"": """",
""operator_name"": ""LastenVelo Freiburg"",
""operator_email"": ""info@lastenvelofreiburg.de"",
""operator_phone"": """"
},
""station_group"": [
""LV_300005""
]
},
""LV_1"": {
""uri_operator"": ""https://shareeapp-lv.copri.eu"",
""station"": ""LV_1"",
""gps"": {
""latitude"": ""47.9848"",
""longitude"": ""7.848666""
},
""authed"": ""1"",
""service_tour"": ""LV_1"",
""operator_data"": {
""operator_hours"": """",
""operator_email"": ""info@lastenvelofreiburg.de"",
""operator_name"": ""LastenVelo Freiburg"",
""operator_color"": ""#006269"",
""operator_phone"": """"
},
""state"": ""available"",
""description"": ""Parkplatz Feuerwehr Wiehre"",
""station_group"": [
""LV_300005""
],
""gps_radius"": ""100""
},
""FR_105"": {
""gps_radius"": ""50"",
""station_group"": [
""FR_300029""
],
""state"": ""available"",
""description"": ""Contributor-Station Rainer"",
""operator_data"": {
""operator_phone"": ""+49 761 45370097"",
""operator_hours"": ""B<>rozeiten: Montag, Mittwoch, Freitag 9-12 Uhr"",
""operator_name"": ""sharee.bike | TeilRad GmbH"",
""operator_email"": ""hotline@sharee.bike"",
""operator_color"": ""#009699""
},
""service_tour"": ""FR_1"",
""authed"": ""1"",
""station"": ""FR_105"",
""gps"": {
""longitude"": "" 7.973855"",
""latitude"": ""47.927738""
},
""uri_operator"": ""https://shareeapp-fr01.copri.eu""
},
""FR_104"": {
""gps_radius"": ""50"",
""operator_data"": {
""operator_phone"": ""+49 761 45370097"",
""operator_color"": ""#009699"",
""operator_email"": ""hotline@sharee.bike"",
""operator_name"": ""sharee.bike | TeilRad GmbH"",
""operator_hours"": ""B<>rozeiten: Montag, Mittwoch, Freitag 9-12 Uhr""
},
""description"": ""Contributor-Station fahrradspezialitäten"",
""state"": ""available"",
""station_group"": [
""FR_300029""
],
""service_tour"": ""FR_1"",
""uri_operator"": ""https://shareeapp-fr01.copri.eu"",
""gps"": {
""latitude"": ""47.989807"",
""longitude"": "" 7.837621""
},
""station"": ""FR_104"",
""authed"": ""1""
},
""FR_103"": {
""uri_operator"": ""https://shareeapp-fr01.copri.eu"",
""authed"": ""1"",
""gps"": {
""longitude"": "" 7.785428"",
""latitude"": ""47.997930""
},
""station"": ""FR_103"",
""service_tour"": ""FR_1"",
""description"": ""Contributor-Station Oliver"",
""state"": ""available"",
""operator_data"": {
""operator_phone"": ""+49 761 45370097"",
""operator_hours"": ""B<>rozeiten: Montag, Mittwoch, Freitag 9-12 Uhr"",
""operator_name"": ""sharee.bike | TeilRad GmbH"",
""operator_email"": ""hotline@sharee.bike"",
""operator_color"": ""#009699""
},
""station_group"": [
""FR_300029""
],
""gps_radius"": ""50""
},
""LV_88"": {
""station_group"": [
""LV_300005""
],
""state"": ""available"",
""description"": ""ShareeBike Test KN"",
""operator_data"": {
""operator_name"": ""LastenVelo Freiburg"",
""operator_email"": ""info@lastenvelofreiburg.de"",
""operator_hours"": """",
""operator_color"": ""#006269"",
""operator_phone"": """"
},
""gps_radius"": ""50"",
""authed"": ""1"",
""gps"": {
""latitude"": ""47.65934079179006"",
""longitude"": "" 9.166126178863573""
},
""station"": ""LV_88"",
""uri_operator"": ""https://shareeapp-lv.copri.eu"",
""service_tour"": ""LV_2""
},
""LV_4"": {
""uri_operator"": ""https://shareeapp-lv.copri.eu"",
""authed"": ""1"",
""station"": ""LV_4"",
""gps"": {
""latitude"": ""48.01095"",
""longitude"": ""7.8553""
},
""service_tour"": ""LV_1"",
""state"": ""available"",
""description"": ""Fabrik Habsburger Straße"",
""operator_data"": {
""operator_phone"": """",
""operator_hours"": """",
""operator_email"": ""info@lastenvelofreiburg.de"",
""operator_name"": ""LastenVelo Freiburg"",
""operator_color"": ""#006269""
},
""station_group"": [
""LV_300005""
],
""gps_radius"": ""100""
},
""LV_2"": {
""uri_operator"": ""https://shareeapp-lv.copri.eu"",
""authed"": ""1"",
""gps"": {
""longitude"": ""7.84795"",
""latitude"": ""47.99762""
},
""station"": ""LV_2"",
""service_tour"": ""LV_1"",
""description"": ""Predigertor ADAC"",
""state"": ""available"",
""operator_data"": {
""operator_phone"": """",
""operator_name"": ""LastenVelo Freiburg"",
""operator_email"": ""info@lastenvelofreiburg.de"",
""operator_hours"": """",
""operator_color"": ""#006269""
},
""station_group"": [
""LV_300005""
],
""gps_radius"": ""100""
},
""FR_102"": {
""description"": ""Contributor-Station Dieter"",
""state"": ""available"",
""operator_data"": {
""operator_phone"": ""+49 761 45370097"",
""operator_hours"": ""B<>rozeiten: Montag, Mittwoch, Freitag 9-12 Uhr"",
""operator_email"": ""hotline@sharee.bike"",
""operator_name"": ""sharee.bike | TeilRad GmbH"",
""operator_color"": ""#009699""
},
""station_group"": [
""FR_300029""
],
""gps_radius"": ""50"",
""uri_operator"": ""https://shareeapp-fr01.copri.eu"",
""authed"": ""1"",
""station"": ""FR_102"",
""gps"": {
""longitude"": "" 7.835669"",
""latitude"": ""47.994371""
},
""service_tour"": ""FR_1""
},
""FR_101"": {
""station_group"": [
""FR_300001""
],
""state"": ""available"",
""description"": ""Villaban sharee Station"",
""operator_data"": {
""operator_color"": ""#009699"",
""operator_email"": ""hotline@sharee.bike"",
""operator_name"": ""sharee.bike | TeilRad GmbH"",
""operator_hours"": ""B<>rozeiten: Montag, Mittwoch, Freitag 9-12 Uhr"",
""operator_phone"": ""+49 761 45370097""
},
""gps_radius"": ""50"",
""authed"": ""1"",
""gps"": {
""longitude"": "" 7.825490"",
""latitude"": ""47.976634""
},
""station"": ""FR_101"",
""uri_operator"": ""https://shareeapp-fr01.copri.eu"",
""service_tour"": ""FR_1""
}
},
""response_state"": ""OK, nothing todo"",
""agb_checked"": ""1"",
""agb_html"": ""site/agb.html"",
""authcookie"": ""5781_f172cf59108fe53e7524c841847fee69_oiF2kahH"",
""Ilockit_admin"": ""1"",
""copri_version"": ""4.1.0.0"",
""bike_info_html"": ""site/bike_info.html"",
""uri_operator_array"": [
""https://shareeapp-lv.copri.eu"",
""https://shareeapp-fr01.copri.eu""
],
""uri_primary"": ""https://shareeapp-primary.copri.eu"",
""apiserver"": ""https://shareeapp-primary.copri.eu"",
""last_used_operator"": {
""operator_phone"": ""+49 761 45370097"",
""operator_color"": ""#009699"",
""operator_email"": ""hotline@sharee.bike"",
""operator_name"": ""sharee.bike | TeilRad GmbH"",
""operator_hours"": ""Bürozeiten: Montag, Mittwoch, Freitag 9-12 Uhr""
},
""clearing_cache"": ""0"",
""user_group"": [
""LV_300005"",
""FR_300029"",
""FR_300001""
],
""privacy_html"": ""site/privacy.html"",
""new_authcoo"": ""0""
}
}
";
const string BOOKING_REQUEST_SET02_001_FILE = @"
{
""shareejson"" : {
""response_state"" : ""OK: requested bike 8"",
""bikes_occupied"" : {
""87781"" : {
""timeCode"" : ""3630"",
""state"" : ""occupied"",
""station"" : ""5"",
""description"" : ""Cargo Long"",
""start_time"" : ""2017-11-28 11:01:51.637747+01"",
""bike"" : ""8""
},
""87780"" : {
""timeCode"" : ""1056"",
""state"" : ""occupied"",
""station"" : ""4"",
""description"" : ""Cargo Long"",
""start_time"" : ""2017-11-28 10:43:24.886288+01"",
""bike"" : ""7""
}
},
""timeCode"" : ""3630"",
""response"" : ""booking_request"",
""authcookie"" : ""4da3044c8657a04ba60e2eaa753bc51aoiF2kahH"",
""apiserver"" : ""https://tinkwwp.copri-bike.de""
}
} ";
/// <summary>
/// Holds three rented bc- bikes.
/// </summary>
const string BIKES_OCCUPIED_REQUEST_SET01_001_FILE = @"
{
""shareejson"" : {
""apiserver"" : ""https://tinkwwp.copri-bike.de"",
""bikes_occupied"" : {
""87785"" : {
""station"" : ""2"",
""state"" : ""occupied"",
""bike"" : ""20"",
""description"" : ""Cargo Long"",
""start_time"" : ""2017-12-01 22:21:57.740069+01"",
""timeCode"" : ""6603""
},
""87782"" : {
""station"" : ""4"",
""state"" : ""occupied"",
""bike"" : ""7"",
""description"" : ""Cargo Long"",
""start_time"" : ""2017-11-28 13:06:55.147368+01"",
""timeCode"" : ""2931""
},
""87781"" : {
""station"" : ""5"",
""state"" : ""occupied"",
""bike"" : ""8"",
""description"" : ""Cargo Long"",
""start_time"" : ""2017-11-28 11:01:51.637747+01"",
""timeCode"" : ""3630""
},
},
""response_state"" : ""OK"",
""authcookie"" : ""4da3044c8657a04ba60e2eaa753bc51a"",
""response"" : ""user_bikes_occupied"",
""copri_version"" : ""4.1.0.0""
}
}";
/// <summary>
/// Two rented bc bikes.
/// </summary>
const string BIKES_OCCUPIED_REQUEST_SET02_001_FILE = @"
{
""shareejson"": {
""response_state"": ""OK"",
""bikes_occupied"": {
""87781"": {
""timeCode"": ""3630"",
""state"": ""occupied"",
""station"" : ""5"",
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""start_time"": ""2017-11-28 11:01:51.637747+01"",
""bike"": ""8""
},
""87782"": {
""timeCode"": ""2931"",
""state"": ""occupied"",
""station"" : ""4"",
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""start_time"": ""2017-11-28 13:06:55.147368+01"",
""bike"": ""7""
}
},
""authcookie"": ""4da3044c8657a04ba60e2eaa753bc51a"",
""response"": ""user_bikes_occupied"",
""apiserver"": ""https://tinkwwp.copri-bike.de"",
""copri_version"" : ""4.1.0.0""
}
}";
/// <summary>
/// One reserved and two rented bikes.
/// </summary>
const string BIKES_OCCUPIED_REQUEST_SET02_002_FILE = @"
{
""shareejson"": {
""response_state"": ""OK"",
""bikes_occupied"": {
""87781"": {
""timeCode"": ""3630"",
""state"": ""occupied"",
""station"" : ""5"",
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""start_time"": ""2017-11-28 11:01:51.637747+01"",
""bike"": ""8""
},
""87782"": {
""timeCode"": ""2931"",
""state"": ""occupied"",
""station"" : ""4"",
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""start_time"": ""2017-11-28 13:06:55.147368+01"",
""bike"": ""7""
},
""2360"": {
""timeCode"": ""2360"",
""state"": ""reserved"",
""station"" : ""4"",
""description"": ""Cargo Long"",
""bike_type"": {
""category"": ""cargo"",
""wheels"": ""2""
},
""bike_group"" : [ ""ShareeBike"" ],
""start_time"": ""2017-11-28 14:07:13.745568+01"",
""bike"": ""5""
}
},
""authcookie"": ""4da3044c8657a04ba60e2eaa753bc51a"",
""response"": ""user_bikes_occupied"",
""apiserver"": ""https://tinkwwp.copri-bike.de"",
""copri_version"" : ""4.1.0.0""
}
}";
/// <summary>
/// Three rented bikes.
/// </summary>
const string BIKES_OCCUPIED_REQUEST_SET02_003_FILE = @"
{
""shareejson"": {
""response_state"": ""OK"",
""bikes_occupied"": {
""87781"": {
""timeCode"": ""3630"",
""state"": ""occupied"",
""station"" : ""5"",
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""start_time"": ""2017-11-28 11:01:51.637747+01"",
""bike"": ""8""
},
""87782"": {
""timeCode"": ""2931"",
""state"": ""occupied"",
""station"" : ""4"",
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""start_time"": ""2017-11-28 13:06:55.147368+01"",
""bike"": ""7""
},
""2360"": {
""timeCode"": ""2360"",
""state"": ""occupied"",
""station"" : ""4"",
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""start_time"": ""2017-11-28 14:08:32.756368+01"",
""bike"": ""5"",
""bike_type"": {
""category"": ""cargo"",
""wheels"": ""2""
},
}
},
""authcookie"": ""4da3044c8657a04ba60e2eaa753bc51a"",
""response"": ""user_bikes_occupied"",
""apiserver"": ""https://tinkwwp.copri-bike.de"",
""copri_version"" : ""4.1.0.0""
}
}";
/// <summary>
/// Two rented bikes.
/// </summary>
const string BIKES_OCCUPIED_REQUEST_SHAREEFR01_SET1_FILE = @"
{
""shareejson"": {
""privacy_html"": ""site/privacy.html"",
""response"": ""user_bikes_occupied"",
""apiserver"": ""https://shareeapp-fr01.copri.eu"",
""authcookie"": ""5781_d47fc786e740ef77d85a24bcb6f0ff97_oiF2kahH"",
""impress_html"": ""site/impress.html"",
""tariff_info_html"": ""site/tariff_info.html"",
""bikes_occupied"": {
""155776"": {
""K_a"": ""[-83, 104, 55, -74, 16, -105, 124, -103, -68, -17, -127, -113, 56, 43, -61, -86, 124, -54, 63, 57, 0, 0, 0, 0]"",
""real_hours"": ""49.3"",
""bike"": ""1545"",
""tariff_description"": {
""eur_per_hour"" : ""2.50"",
""number"" : ""5494"",
""name"" : ""Tester Basic"",
""max_eur_per_day"" : ""10.00""
},
""lock_state"": ""unlocked"",
""total_price"": ""23.75"",
""station"" : ""103"",
""gps"" : { ""latitude"": ""47.9980383301154"", ""longitude"": ""7.78496129438281"" },
""system"": ""Ilockit"",
""end_time"": ""2020-11-08 19:11:27"",
""bike_group"" : [ ""300029"" ],
""Ilockit_ID"": ""ISHAREIT-2200545"",
""start_time"": ""2020-11-06 17:53:22.784681+01"",
""unit_price"": ""2.50"",
""request_time"": ""2020-11-06 17:52:56.832138+01"",
""state"": ""occupied"",
""Ilockit_GUID"": ""00000000-0000-0000-0000-e38bf9d32234"",
""computed_hours"": ""9.50"",
""K_u"": ""[53, 92, -55, -109, 112, 38, -35, 43, -18, 122, 115, 50, -85, -57, 62, -57, -112, 2, 117, -47, 0, 0, 0, 0]"",
""description"": ""Tester-bike (Ilockit)"",
""K_seed"": ""[119, -47, -91, -36, -29, -17, 35, 47, -80, -112, -55, 2, 70, -45, 60, -62]""
},
""155744"": {
""Ilockit_GUID"": ""00000000-0000-0000-0000-d589a8023487"",
""unit_price"": ""2.50"",
""start_time"": ""2020-10-12 08:38:30.401679+02"",
""request_time"": ""2020-10-12 08:38:12.374231+02"",
""state"": ""occupied"",
""K_u"": ""[93, -45, -89, -38, 50, 107, 21, -119, -26, -90, -15, 99, 17, 44, -20, 24, 34, -111, 125, -31, 0, 0, 0, 0]"",
""computed_hours"": ""112"",
""K_seed"": ""[24, 69, -21, 52, 55, 3, -71, 30, -71, 43, 108, -100, 15, 126, -117, 40]"",
""description"": ""Oliver (Ilockit)"",
""tariff_description"": {
""eur_per_hour"" : ""2.50"",
""number"" : ""5494"",
""name"" : ""Tester Basic"",
""max_eur_per_day"" : ""10.00""
},
""bike"": ""1537"",
""real_hours"": ""659.55"",
""lock_state"": ""locked"",
""K_a"": ""[109, 35, -55, 78, -65, 87, -43, -4, -90, -104, -16, -45, -80, -80, 106, -25, -77, 111, -79, 58, 0, 0, 0, 0]"",
""system"": ""Ilockit"",
""gps"" : { ""latitude"": ""47.9977741744369"", ""longitude"": ""7.78484562411904"" },
""station"" : ""103"",
""total_price"": ""280.00"",
""Ilockit_ID"": ""ISHAREIT-2200537"",
""bike_group"" : [ ""300029"" ],
""end_time"": ""2020-11-08 19:11:25""
}
},
""bike_info_html"": ""site/bike_info.html"",
""agb_html"": ""site/agb.html"",
""agb_checked"": ""1"",
""user_id"": ""ohauff@posteo.de"",
""response_state"": ""OK: nothing todo "",
""lang"": ""DE"",
""user_group"": [ ""300029"", ""300001"" ],
""debuglevel"": ""1"",
""copri_version"" : ""4.1.0.0""
}
}";
/// <summary>
/// One reserved and two rented bikes.
/// </summary>
/// <remarks>
/// Response from BIKES_OCCUPIED_REQUEST_SHAREEFR01_SET2_FILE taken (does not yet contain uri_operator) and reserved bike added.
/// </remarks>
const string BIKES_OCCUPIED_REQUEST_SHAREEFR01_SET2_FILE = @"
{
""shareejson"": {
""privacy_html"": ""site/privacy.html"",
""response"": ""user_bikes_occupied"",
""apiserver"": ""https://shareeapp-fr01.copri.eu"",
""authcookie"": ""5781_d47fc786e740ef77d85a24bcb6f0ff97_oiF2kahH"",
""impress_html"": ""site/impress.html"",
""tariff_info_html"": ""site/tariff_info.html"",
""bikes_occupied"": {
""155776"": {
""K_a"": ""[-83, 104, 55, -74, 16, -105, 124, -103, -68, -17, -127, -113, 56, 43, -61, -86, 124, -54, 63, 57, 0, 0, 0, 0]"",
""real_hours"": ""49.3"",
""bike"": ""1545"",
""tariff_description"": {
""eur_per_hour"" : ""2.50"",
""number"" : ""5494"",
""name"" : ""Tester Basic"",
""max_eur_per_day"" : ""10.00""
},
""lock_state"": ""unlocked"",
""total_price"": ""23.75"",
""station"" : ""103"",
""gps"" : { ""latitude"": ""47.9980383301154"", ""longitude"": ""7.78496129438281"" },
""system"": ""Ilockit"",
""end_time"": ""2020-11-08 19:11:27"",
""bike_group"" : [ ""300029"" ],
""Ilockit_ID"": ""ISHAREIT-2200545"",
""start_time"": ""2020-11-06 17:53:22.784681+01"",
""unit_price"": ""2.50"",
""request_time"": ""2020-11-06 17:52:56.832138+01"",
""state"": ""occupied"",
""Ilockit_GUID"": ""00000000-0000-0000-0000-e38bf9d32234"",
""computed_hours"": ""9.50"",
""K_u"": ""[53, 92, -55, -109, 112, 38, -35, 43, -18, 122, 115, 50, -85, -57, 62, -57, -112, 2, 117, -47, 0, 0, 0, 0]"",
""description"": ""Tester-bike (Ilockit)"",
""K_seed"": ""[119, -47, -91, -36, -29, -17, 35, 47, -80, -112, -55, 2, 70, -45, 60, -62]""
},
""155744"": {
""Ilockit_GUID"": ""00000000-0000-0000-0000-d589a8023487"",
""unit_price"": ""2.50"",
""start_time"": ""2020-10-12 08:38:30.401679+02"",
""request_time"": ""2020-10-12 08:38:12.374231+02"",
""state"": ""occupied"",
""K_u"": ""[93, -45, -89, -38, 50, 107, 21, -119, -26, -90, -15, 99, 17, 44, -20, 24, 34, -111, 125, -31, 0, 0, 0, 0]"",
""computed_hours"": ""112"",
""K_seed"": ""[24, 69, -21, 52, 55, 3, -71, 30, -71, 43, 108, -100, 15, 126, -117, 40]"",
""description"": ""Oliver (Ilockit)"",
""tariff_description"": {
""eur_per_hour"" : ""2.50"",
""number"" : ""5494"",
""name"" : ""Tester Basic"",
""max_eur_per_day"" : ""10.00""
},
""bike"": ""1537"",
""uri_operator"" : ""https://shareeapp-fr01.copri.eu"",
""real_hours"": ""659.55"",
""lock_state"": ""locked"",
""K_a"": ""[109, 35, -55, 78, -65, 87, -43, -4, -90, -104, -16, -45, -80, -80, 106, -25, -77, 111, -79, 58, 0, 0, 0, 0]"",
""system"": ""Ilockit"",
""gps"" : { ""latitude"": ""47.9977741744369"", ""longitude"": ""7.78484562411904"" },
""station"" : ""103"",
""total_price"": ""280.00"",
""Ilockit_ID"": ""ISHAREIT-2200537"",
""bike_group"" : [ ""300029"" ],
""end_time"": ""2020-11-08 19:11:25""
},
""156350"" : {
""total_price"" : ""0.00"",
""description"" : ""Tester-bike Oliver 2"",
""K_u"" : ""[-72, 88, 96, -80, -2, 82, 36, -67, 48, 101, -55, 127, -85, 95, -83, -77, 14, -103, -14, -47, 0, 0, 0, 0]"",
""real_hours"" : ""0"",
""state"" : ""requested"",
""tariff_description"" : {
""eur_per_hour"" : ""3.00"",
""max_eur_per_day"" : ""10.00"",
""number"" : ""5494"",
""name"" : ""Tester Basic""
},
""station"" : ""FR_103"",
""Ilockit_ID"" : ""ISHAREIT-2302373"",
""K_seed"" : ""[-93, -36, 49, -84, 65, 107, 74, 125, -91, -59, 43, 45, 85, -126, 91, -27]"",
""K_a"" : ""[-76, 86, 39, -62, 89, 76, 23, -37, 108, -4, 4, -36, -48, 26, -110, -75, 96, -101, -26, -51, 0, 0, 0, 0]"",
""end_time"" : ""2021-07-04 17:46:00+02"",
""system"" : ""Ilockit"",
""computed_hours"" : ""0"",
""bike"" : ""FR_1004"",
""uri_operator"" : ""https://shareeapp-fr01.copri.eu"",
""start_time"" : ""2021-07-04 17:46:36.237404+02"",
""bike_group"" : [
""FR_300029""
],
""gps"" : {
""latitude"" : ""47.9978876"",
""longitude"" : ""7.7849563""
},
""unit_price"" : ""3.00"",
""lock_state"" : ""locked"",
""Ilockit_GUID"" : ""00000000-0000-0000-0000-fe3962c08bcc"",
""request_time"" : ""2021-07-04 17:46:36.237404+02""
}
},
""bike_info_html"": ""site/bike_info.html"",
""agb_html"": ""site/agb.html"",
""agb_checked"": ""1"",
""user_id"": ""ohauff@posteo.de"",
""response_state"": ""OK: nothing todo "",
""lang"": ""DE"",
""user_group"": [ ""300029"", ""300001"" ],
""debuglevel"": ""1"",
""copri_version"" : ""4.1.0.0""
}
}";
const string BIKES_AVAILABLE_SET01_001_FILE = @"
{
""shareejson"" : {
""bikes"" : {
""2352"" : {
""description"" : ""Cargo Long"",
""state"" : ""available"",
""bike"" : ""1"",
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
""station"" : ""9""
},
""2379"" : {
""description"" : ""Cargo Long"",
""state"" : ""available"",
""bike"" : ""19"",
""gps"" : { ""latitude"": ""47.6597846667"", ""longitude"": ""9.177439"" },
""station"" : ""3""
},
""2354"" : {
""description"" : ""Cargo Long"",
""state"" : ""available"",
""bike"" : ""2"",
""gps"" : { ""latitude"": ""47.6721741667"", ""longitude"": ""9.176165"" },
""station"" : ""11""
}
},
""response_state"" : ""OK"",
""authcookie"" : ""4da3044c8657a04ba60e2eaa753bc51a"",
""apiserver"" : ""https://tinkwwp.copri-bike.de"",
""response"" : ""bikes_available"",
""copri_version"" : ""4.1.0.0""
}
}
";
const string BIKES_AVAILABLE_SET02_001_FILE = @"
{
""shareejson"" : {
""authcookie"" : 0,
""apiserver"" : ""https://tinkwwp.copri-bike.de"",
""response"" : ""bikes_available"",
""bikes"" : {
""3399"" : {
""description"" : ""Cargo Trike"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"" : ""26"",
""state"" : ""available"",
""gps"" : { ""latitude"": ""47.6586936667"", ""longitude"": ""9.16863116667"" },
""system"" : ""BC"",
""station"" : ""4""
},
""3398"" : {
""description"" : ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"" : ""25"",
""state"" : ""available"",
""gps"" : { ""latitude"": ""47.669895"", ""longitude"": ""9.168173"" },
""system"" : ""BC"",
""station"" : ""5""
},
""2374"" : {
""description"" : ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"" : ""14"",
""state"" : ""available"",
""gps"" : { ""latitude"": ""0.0"", ""longitude"": ""0.0"" },
""system"" : ""BC"",
""station"" : ""4""
},
""2373"" : {
""description"" : ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"" : ""13"",
""state"" : ""available"",
""gps"" : { ""latitude"": ""47.6748671667"", ""longitude"": ""9.17326583333"" },
""system"" : ""BC"",
""station"" : ""12""
},
""2366"" : {
""description"" : ""Cargo Trike"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"" : ""11"",
""state"" : ""available"",
""gps"" : { ""latitude"": ""47.667938"", ""longitude"": ""9.164895"" },
""system"" : ""BC"",
""station"" : ""5""
},
""2379"" : {
""description"" : ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"" : ""19"",
""state"" : ""available"",
""gps"" : { ""latitude"": ""47.666401"", ""longitude"": ""9.175902"" },
""system"" : ""BC"",
""station"" : ""8""
},
""2377"" : {
""description"" : ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"" : ""17"",
""state"" : ""available"",
""gps"" : { ""latitude"": ""47.672231"", ""longitude"": ""9.175862"" },
""system"" : ""BC"",
""station"" : ""11""
},
""2378"" : {
""description"" : ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"" : ""18"",
""state"" : ""available"",
""gps"" : { ""latitude"": ""47.665556"", ""longitude"": ""9.17095133333"" },
""system"" : ""BC"",
""station"" : ""10""
},
""2354"" : {
""description"" : ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"" : ""2"",
""state"" : ""available"",
""gps"" : { ""latitude"": ""47.669895"", ""longitude"": ""9.168159"" },
""system"" : ""BC"",
""station"" : ""5""
},
""2360"" : {
""description"" : ""Cargo long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"" : ""5"",
""bike_type"": {
""category"": ""cargo"",
""wheels"": ""2""
},
""state"" : ""available"",
""gps"" : { ""latitude"": ""47.672082"", ""longitude"": ""9.17655283333"" },
""system"" : ""BC"",
""station"" : ""4""
},
""2380"" : {
""description"" : ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"" : ""20"",
""state"" : ""available"",
""gps"" : { ""latitude"": ""47.6612413333"", ""longitude"": ""9.16641016667"" },
""system"" : ""BC"",
""station"" : ""7""
},
""52"" : {
""state"" : ""available"",
""bike"" : ""52"",
""description"" : ""Stadtflitzer"",
""bike_group"" : [ ""Citybike"" ],
""station"" : ""31"",
""system"" : ""BC"",
""gps"" : { ""latitude"": ""47.67484"", ""longitude"": ""9.17254"" }
}
},
""response_state"" : ""OK"",
""copri_version"" : ""4.1.0.0""
}
}";
const string BIKES_AVAILABLE_SET02_002_FILE = @"
{
""shareejson"": {
""authcookie"": 0,
""apiserver"": ""https://tinkwwp.copri-bike.de"",
""response"": ""bikes_available"",
""bikes"": {
""3399"": {
""description"": ""Cargo Trike"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 26,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.6586936667"", ""longitude"": ""9.16863116667"" },
""station"" : ""4""
},
""3398"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 25,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.669895"", ""longitude"": ""9.168173"" },
""station"" : ""5""
},
""2374"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 14,
""state"": ""available"",
""gps"" : { ""latitude"": ""0.0"", ""longitude"": ""0.0"" },
""station"" : ""4""
},
""2373"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 13,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.6748671667"", ""longitude"": ""9.17326583333"" },
""station"" : ""12""
},
""2366"": {
""description"": ""Cargo Trike"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 11,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.667938"", ""longitude"": ""9.164895"" },
""station"" : ""5""
},
""2379"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 19,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.666401"", ""longitude"": ""9.175902"" },
""station"" : ""8""
},
""2377"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 17,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.672231"", ""longitude"": ""9.175862"" },
""station"" : ""11""
},
""2378"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 18,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.665556"", ""longitude"": ""9.17095133333"" },
""station"" : ""10""
},
""2354"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 2,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.669895"", ""longitude"": ""9.168159"" },
""station"" : ""5""
},
""2380"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 20,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.6612413333"", ""longitude"": ""9.16641016667"" },
""station"" : ""7""
},
""52"" : {
""state"" : ""available"",
""bike"" : ""52"",
""description"" : ""Stadtflitzer"",
""bike_group"" : [ ""Citybike"" ],
""station"" : ""5"",
""gps"" : { ""latitude"": ""47.67484"", ""longitude"": ""9.17254"" }
}
},
""response_state"": ""OK"",
""copri_version"" : ""4.1.0.0""
}
}";
const string BIKES_AVAILABLE_SET02_003_FILE = @"
{
""shareejson"": {
""authcookie"": 0,
""apiserver"": ""https://tinkwwp.copri-bike.de"",
""response"": ""bikes_available"",
""bikes"": {
""3399"": {
""description"": ""Cargo Trike"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 26,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.6586936667"", ""longitude"": ""9.16863116667"" },
""station"" : ""4""
},
""3398"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 25,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.669895"", ""longitude"": ""9.168173"" },
""station"" : ""5""
},
""2374"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 14,
""state"": ""available"",
""gps"" : { ""latitude"": ""0.0"", ""longitude"": ""0.0"" },
""station"" : ""4""
},
""2373"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 13,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.6748671667"", ""longitude"": ""9.17326583333"" },
""station"" : ""12""
},
""2366"": {
""description"": ""Cargo Trike"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 11,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.667938"", ""longitude"": ""9.164895"" },
""station"" : ""5""
},
""2379"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 19,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.666401"", ""longitude"": ""9.175902"" },
""station"" : ""8""
},
""2377"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 17,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.672231"", ""longitude"": ""9.175862"" },
""station"" : ""11""
},
""2378"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 18,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.665556"", ""longitude"": ""9.17095133333"" },
""station"" : ""10""
},
""2354"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 2,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.669895"", ""longitude"": ""9.168159"" },
""station"" : ""5""
},
""2380"": {
""description"": ""Cargo Long"",
""bike_group"" : [ ""ShareeBike"" ],
""bike"": 20,
""state"": ""available"",
""gps"" : { ""latitude"": ""47.6612413333"", ""longitude"": ""9.16641016667"" },
""station"" : ""7""
},
""52"" : {
""state"" : ""available"",
""bike"" : ""52"",
""description"" : ""Stadtflitzer"",
""bike_group"" : [ ""Citybike"" ],
""station"" : ""5"",
""gps"" : { ""latitude"": ""47.67484"", ""longitude"": ""9.17254"" }
}
},
""response_state"": ""OK"",
""copri_version"" : ""4.1.0.0""
}
}";
/// <summary>
/// Five available bikes.
/// </summary>
const string BIKES_AVAILABLE_REQUEST_SHAREEFR01_SET1_FILE = @"
{
""shareejson"": {
""user_id"": ""ohauff@posteo.de"",
""privacy_html"": ""site/privacy.html"",
""agb_checked"": ""1"",
""debuglevel"": ""1"",
""agb_html"": ""site/agb.html"",
""bike_info_html"": ""site/bike_info.html"",
""copri_version"": ""4.1.0.0"",
""apiserver"": ""https://shareeapp-fr01.copri.eu"",
""lang"": ""DE"",
""impress_html"": ""site/impress.html"",
""response"": ""bikes_available"",
""tariff_info_html"": ""site/tariff_info.html"",
""user_group"": [ ""300029"", ""300001"" ],
""authcookie"": ""5781_d47fc786e740ef77d85a24bcb6f0ff97_oiF2kahH"",
""response_state"": ""OK: nothing todo "",
""bikes"": {
""1536"": {
""bike"": ""1536"",
""tariff_description"": {
""eur_per_hour"" : ""3.00"",
""number"" : ""5491"",
""name"" : ""Vauban Basic"",
""max_eur_per_day"" : ""15.00""
},
""description"": ""Vauban-bike (Ilockit)"",
""state"": ""available"",
""station"" : ""101"",
""gps"" : { ""latitude"": ""47.976741"", ""longitude"": ""7.8257615"" },
""lock_state"": ""locked"",
""Ilockit_ID"": ""ISHAREIT-2200536"",
""Ilockit_GUID"": ""00000000-0000-0000-0000-caa87760e53e"",
""system"": ""Ilockit"",
""bike_group"" : [ ""300001"" ]
},
""1539"": {
""gps"" : { ""latitude"": ""47.992718"", ""longitude"": ""7.833071"" },
""station"" : ""104"",
""tariff_description"": {
""eur_per_hour"" : ""3.00"",
""number"" : ""5494"",
""name"" : ""Tester Basic"",
""max_eur_per_day"" : ""10.00""
},
""description"": ""Tester-bike (Ilockit)"",
""bike"": ""1539"",
""state"": ""available"",
""bike_group"" : [ ""300029"" ],
""system"": ""Ilockit"",
""lock_state"": ""unlocked"",
""Ilockit_ID"": ""ISHAREIT-2200539"",
""Ilockit_GUID"": ""00000000-0000-0000-0000-f0b4a692e169""
},
""1315"": {
""system"": ""Ilockit"",
""bike_group"" : [ ""300029"" ],
""Ilockit_GUID"": ""00000000-0000-0000-e57e6b9aee16"",
""Ilockit_ID"": ""ISHAREIT-2200315"",
""lock_state"": ""locked"",
""gps"" : { ""latitude"": ""47.997930"", ""longitude"": ""7.785428"" },
""station"" : ""103"",
""state"": ""available"",
""bike"": ""1315"",
""description"": ""Tester-bike (Ilockit)"",
""tariff_description"": {
""eur_per_hour"" : ""3.00"",
""number"" : ""5494"",
""name"" : ""Tester Basic"",
""max_eur_per_day"" : ""10.00""
},
},
""1544"": {
""station"" : ""101"",
""gps"" : { ""latitude"": ""47.976634"", ""longitude"": ""7.825490"" },
""state"": ""available"",
""tariff_description"": {
""eur_per_hour"" : ""3.00"",
""number"" : ""5491"",
""name"" : ""Vauban Basic"",
""max_eur_per_day"" : ""15.00""
},
""description"": ""Vauban-bike (Ilockit)"",
""bike"": ""1544"",
""bike_group"" : [ ""300001"" ],
""system"": ""Ilockit"",
""Ilockit_GUID"": ""00000000-0000-0000-0000-dc969f648732"",
""Ilockit_ID"": ""ISHAREIT-2200544"",
""lock_state"": ""locked""
},
""1543"": {
""gps"" : { ""latitude"": ""47.9979824"", ""longitude"": ""7.7848131"" },
""station"" : ""103"",
""bike"": ""1543"",
""description"": ""Tester-bike (Ilockit)"",
""tariff_description"": {
""eur_per_hour"" : ""3.00"",
""number"" : ""5494"",
""name"" : ""Tester Basic"",
""max_eur_per_day"" : ""10.00""
},
""state"": ""available"",
""system"": ""Ilockit"",
""bike_group"" : [ ""300029"" ],
""Ilockit_ID"": ""ISHAREIT-2200543"",
""lock_state"": ""locked"",
""Ilockit_GUID"": ""00000000-0000-0000-0000-cc141a6f68bb""
}
}
}
}";
private const SampleSets DEFAULT_SAMPLE_SET = SampleSets.Set2;
private const int DEFAULT_STAGE_INDEX = 1;
private IRequestBuilder requestBuilder;
public CopriCallsMemory(
string merchantId,
SampleSets? sampleSet = null,
int? index = null,
string sessionCookie = null)
{
MerchantId = merchantId ?? throw new ArgumentNullException(nameof(merchantId));
ActiveSampleSet = sampleSet ?? DEFAULT_SAMPLE_SET;
ActiveStageIndex = index ?? DEFAULT_STAGE_INDEX;
SessionCookie = sessionCookie;
requestBuilder = string.IsNullOrEmpty(sessionCookie)
? new RequestBuilder(MerchantId, null /*UI language */, null /* smart device */) as IRequestBuilder
: new RequestBuilderLoggedIn(MerchantId, null /*UI language */, sessionCookie, null /* smart device */);
}
/// <summary> Holds the session id of the logged in user, null otherwise. </summary>
public string SessionCookie { get; private set; }
/// <summary> Logs user in. </summary>
/// <param name="p_oUser">User to log in.</param>
/// <param name="p_strDeviceId">Id specifying user and hardware.</param>
/// <param name="p_strMailAddress">Mailaddress of user to log in.</param>
/// <param name="p_strPassword">Password to log in.</param>
/// <remarks>Response which holds auth cookie <see cref="ResponseBase.authcookie"/></remarks>
public async Task<AuthorizationResponse> DoAuthorizationAsync(
string p_strMailAddress,
string p_strPassword,
string p_strDeviceId)
{
return await Task.Run(() => DoAuthorize(p_strMailAddress, p_strPassword, p_strDeviceId));
}
/// <summary> Logs user out. </summary>
/// <param name="p_strSessionCookie">User to log in.</param>
/// <remarks>Response which holds auth cookie <see cref="ResponseBase.authcookie"/></remarks>
public async Task<AuthorizationoutResponse> DoAuthoutAsync()
{
return await Task.Run(() => DoAuthout(SessionCookie));
}
/// <summary>
/// Gets list of bikes from memory.
/// </summary>
/// <param name="operatorUri">Uri of the operator host to get bikes from or null if bikes have to be gotten form primary host.</param>
/// <param name="stationId"> Id of station which is used for filtering bikes. Null if no filtering should be applied.</param>
/// <param name="bikeId"> Id of bike which is used for filtering bikes. Null if no filtering should be applied.</param>
/// <returns></returns>
public async Task<BikesAvailableResponse> GetBikesAvailableAsync(Uri operatorUri = null, string stationId = null, string bikeId = null)
=> await Task.Run(() => GetBikesAvailable(null, SessionCookie, operatorUri, ActiveSampleSet, ActiveStageIndex, stationId, bikeId));
/// <summary>
/// Gets a list of bikes reserved/ booked by active user from Copri.
/// </summary>
/// <param name="p_strSessionCookie">Cookie to authenticate user.</param>
/// <returns>Response holding list of bikes.</returns>
public async Task<BikesReservedOccupiedResponse> GetBikesOccupiedAsync()
{
try
{
requestBuilder.GetBikesOccupied(); // Non mock implementation if ICopriServer call this member as well. To ensure comparable behavior this member is called here as well.
}
catch (NotSupportedException)
{
// No user logged in.
await Task.CompletedTask;
return ResponseHelper.GetBikesOccupiedNone();
}
return await Task.Run(() => GetBikesOccupied(SessionCookie, ActiveSampleSet, ActiveStageIndex));
}
/// <summary>
/// Get list of stations from file.
/// </summary>
/// <param name="cookie">Auto cookie of user if user is logged in.</param>
/// <returns>List of files.</returns>
public async Task<StationsAvailableResponse> GetStationsAsync()
{
return await Task.Run(() => GetStationsAll(null, SessionCookie, ActiveSampleSet, ActiveStageIndex));
}
/// <summary>
/// Gets booking request response.
/// </summary>
/// <param name="bikeId">Id of the bike to book.</param>
/// <returns>Booking response.</returns>
public async Task<ReservationBookingResponse> DoReserveAsync(string bikeId, Uri operatorUri)
{
return await Task.Run(() => DoReserve(bikeId, SessionCookie, ActiveSampleSet, ActiveStageIndex));
}
/// <summary>
/// Gets cancel booking request response.
/// </summary>
/// <param name="bikeId">Id of the bike to book.</param>
/// <param name="cookie">Cookie of the logged in user.</param>
/// <returns>Response on cancel booking request.</returns>
public async Task<BookingActionResponse> DoCancelReservationAsync(string bikeId, Uri operatorUri)
{
return await Task.Run(() => DoCancelReservation(bikeId, SessionCookie, ActiveSampleSet, ActiveStageIndex));
}
/// <summary>
/// Gets the count of stages that exist for a given sample set.
/// </summary>
/// <param name="p_eSampleSet"></param>
/// <returns></returns>
public int StagesCount
{
get
{
var l_iCount = 1;
while (GetBikesAvailable(CopriDevelHostUri, MerchantId, sampleSet: ActiveSampleSet, stageIndex: l_iCount) != null)
{
l_iCount++;
}
return l_iCount - 1;
}
}
/// <summary> Gets the merchant id.</summary>
public string MerchantId { get; private set; }
/// <summary>
/// Gets the active sample set.
/// </summary>
public SampleSets ActiveSampleSet { get; }
/// <summary>
/// Gets the active stage index.
/// </summary>
public int ActiveStageIndex { get; }
/// <summary> Returns false because cached values are returned. </summary>
public bool IsConnected => false;
/// <summary> Logs user in. </summary>
/// <param name="p_oUser">User to log in.</param>
/// <param name="p_strDeviceId">Id specifying user and hardware.</param>
/// <param name="p_strMailAddress">Mailaddress of user to log in.</param>
/// <param name="p_strPassword">Password to log in.</param>
/// <remarks>Response which holds auth cookie <see cref="ResponseBase.authcookie"/></remarks>
public static AuthorizationResponse DoAuthorize(
string p_strMailAddress,
string p_strPassword,
string p_strDeviceId,
SampleSets p_eSampleSet = DEFAULT_SAMPLE_SET,
long p_lStageIndex = DEFAULT_STAGE_INDEX)
{
switch (p_eSampleSet)
{
case SampleSets.Set2:
switch (p_lStageIndex)
{
case 1:
// Response contains auth cookie of user "JavaministerHardwareNr1"
// For this reason do not return answer if mail and pwd do not match.
return p_strMailAddress == "javaminister@gmail.com"
&& p_strPassword == "javaminister" &&
p_strDeviceId == "HwId1000000000000"
? JsonConvertRethrow.DeserializeObject<ResponseContainer<AuthorizationResponse>>(DO_AUTH_SET02_001_FILE).shareejson
: JsonConvertRethrow.DeserializeObject<ResponseContainer<AuthorizationResponse>>(DO_AUTH_Unknown_User_FILE).shareejson;
default:
return null;
}
default:
return null;
}
}
/// <summary> Logs user in. </summary>
/// <remarks>Response which holds auth cookie <see cref="ResponseBase.authcookie"/></remarks>
public static AuthorizationoutResponse DoAuthout(
string sessionCookie,
SampleSets p_eSampleSet = DEFAULT_SAMPLE_SET,
long p_lStageIndex = DEFAULT_STAGE_INDEX)
{
switch (p_eSampleSet)
{
case SampleSets.Set2:
switch (p_lStageIndex)
{
case 1:
// Response contains auth cookie of user "JavaministerHardwareNr1"
// For this reason do not return answer if mail and pwd do not match.
return !string.IsNullOrEmpty(sessionCookie)
? JsonConvertRethrow.DeserializeObject<ResponseContainer<AuthorizationoutResponse>>(DO_AUTHOUT_SET02_001_FILE).shareejson
: throw new NotSupportedException();
default:
return null;
}
default:
return null;
}
}
/// <summary>
/// Gets list of bikes from memory.
/// </summary>
/// <param name="merchantId">Id of the merchant.</param>
/// <param name="sessionCookie">Auto cookie of user if user is logged in.</param>
/// <param name="operatorUri">Uri of the operator host to get bikes from or null if bikes have to be gotten form primary host.</param>
/// <param name="sampleSet">Set of samples.</param>
/// <param name="stageIndex">Index of the stage.</param>
/// <param name="stationId"> Id of station which is used for filtering bikes. Null if no filtering should be applied.</param>
/// <param name="bikeId"> Id of bike to get.</param>
/// <returns></returns>
public static BikesAvailableResponse GetBikesAvailable(
string merchantId,
string sessionCookie = null,
Uri operatorUri = null,
SampleSets sampleSet = DEFAULT_SAMPLE_SET,
long stageIndex = DEFAULT_STAGE_INDEX,
string stationId = null,
string bikeId = null)
{
switch (sampleSet)
{
case SampleSets.Set1:
switch (stageIndex)
{
case 1:
return CopriCallsStatic.DeserializeResponse<BikesAvailableResponse>(BIKES_AVAILABLE_SET01_001_FILE)
.FilterByStation(stationId)
.FilterByBike(bikeId);
default:
return null;
}
case SampleSets.Set2:
switch (stageIndex)
{
case 1:
return CopriCallsStatic.DeserializeResponse<BikesAvailableResponse>(BIKES_AVAILABLE_SET02_001_FILE)
.FilterByStation(stationId)
.FilterByBike(bikeId);
case 2:
return CopriCallsStatic.DeserializeResponse<BikesAvailableResponse>(BIKES_AVAILABLE_SET02_002_FILE)
.FilterByStation(stationId);
case 3:
return CopriCallsStatic.DeserializeResponse<BikesAvailableResponse>(BIKES_AVAILABLE_SET02_003_FILE)
.FilterByStation(stationId)
.FilterByBike(bikeId);
default:
return null;
}
case SampleSets.ShareeFr01_Set1:
switch (stageIndex)
{
case 1:
return CopriCallsStatic.DeserializeResponse<BikesAvailableResponse>(BIKES_AVAILABLE_REQUEST_SHAREEFR01_SET1_FILE)
.FilterByStation(stationId)
.FilterByBike(bikeId);
default:
return null;
}
default:
return null;
}
}
/// <summary>
/// Gets stations response.
/// </summary>
/// <param name="merchantId">Id of the merchant.</param>
/// <param name="cookie">Auto cookie of user if user is logged in.</param>
/// <param name="p_eSampleSet"></param>
/// <param name="p_lStageIndex"></param>
/// <returns></returns>
public static StationsAvailableResponse GetStationsAll(
string merchantId,
string cookie = null,
SampleSets p_eSampleSet = DEFAULT_SAMPLE_SET,
long p_lStageIndex = DEFAULT_STAGE_INDEX)
{
switch (p_eSampleSet)
{
case SampleSets.Set2:
switch (p_lStageIndex)
{
case 1:
return JsonConvertRethrow.DeserializeObject<ResponseContainer<StationsAvailableResponse>>(STATIONS_SET02_001_FILE).shareejson;
default:
return null;
}
default:
return null;
}
}
/// <summary>
/// Gets booking request response.
/// </summary>
/// <param name="bikeId">Id of the bike.</param>
/// <param name="sessionCookie">Identifies the logged in user.</param>
/// <param name="sampleSet">Sample set to use.</param>
/// <param name="stageIndex">Index of the stage.</param>
/// <returns></returns>
public static ReservationBookingResponse DoReserve(
string bikeId,
string sessionCookie,
SampleSets sampleSet = DEFAULT_SAMPLE_SET,
long stageIndex = DEFAULT_STAGE_INDEX)
{
ReservationBookingResponse l_oResponse;
switch (sampleSet)
{
case SampleSets.Set2:
switch (stageIndex)
{
case 1:
l_oResponse = JsonConvertRethrow.DeserializeObject<ResponseContainer<ReservationBookingResponse>>(BOOKING_REQUEST_SET02_001_FILE).shareejson;
break;
default:
return null;
}
break;
default:
return null;
}
return l_oResponse;
}
/// <summary>
/// Gets cancel booking request response.
/// </summary>
/// <param name="bikeId">Id of the bike to book.</param>
/// <param name="cookie">Cookie of the logged in user.</param>
/// <returns>Response on cancel booking request.</returns>
public static BookingActionResponse DoCancelReservation(
string bikeId,
string cookie,
SampleSets sampleSet = DEFAULT_SAMPLE_SET,
long stageIndex = DEFAULT_STAGE_INDEX)
{
return null;
}
public Task<ReservationBookingResponse> CalculateAuthKeysAsync(string bikeId, Uri operatorUri) => null;
public Task<ResponseBase> StartReturningBike(
string bikeId,
Uri operatorUri) => null;
public Task<ReservationBookingResponse> UpdateLockingStateAsync(
string bikeId,
lock_state state,
Uri operatorUri,
LocationDto geolocation,
double batteryLevel,
IVersionInfo versionInfo) => null;
public Task<ReservationBookingResponse> DoBookAsync(Uri operatorUri, string bikeId, Guid guid, double batteryPercentage, LockingAction? nextAction = null)
=> null;
public Task<ReservationBookingResponse> BookAvailableAndStartOpeningAsync(
string bikeId,
Uri operatorUri)
=> null;
public Task<ReservationBookingResponse> BookReservedAndStartOpeningAsync(
string bikeId,
Uri operatorUri)
=> null;
public Task<DoReturnResponse> DoReturn(
string bikeId,
LocationDto geolocation,
Uri operatorUri)
=> null;
public Task<DoReturnResponse> ReturnAndStartClosingAsync(
string bikeId,
Uri operatorUri)
=> throw new NotImplementedException();
public Task<SubmitFeedbackResponse> DoSubmitFeedback(string bikeId, int? currentChargeBars, string message, bool isBikeBroken, Uri operatorUri)
=> null;
/// <summary> Submits mini survey to copri server. </summary>
/// <param name="answers">Collection of answers.</param>
public Task<ResponseBase> DoSubmitMiniSurvey(IDictionary<string, string> answers)
=> null;
/// <summary>
/// Gets a list of bikes reserved/ booked by active user from Copri.
/// </summary>
/// <param name="sessionCookie">Cookie to authenticate user.</param>
/// <param name="SampleSet">Sample set to use.</param>
/// <param name="p_lStageIndex">Index of the stage.</param>
/// <returns>Response holding list of bikes.</returns>
public static BikesReservedOccupiedResponse GetBikesOccupied(
string sessionCookie = null,
SampleSets sampleSet = DEFAULT_SAMPLE_SET,
long stageIndex = DEFAULT_STAGE_INDEX)
{
BikesReservedOccupiedResponse response;
switch (sampleSet)
{
case SampleSets.Set1:
switch (stageIndex)
{
case 1:
response = CopriCallsStatic.DeserializeResponse<BikesReservedOccupiedResponse>(BIKES_OCCUPIED_REQUEST_SET01_001_FILE);
break;
default:
return null;
}
break;
case SampleSets.Set2:
switch (stageIndex)
{
case 1:
response = CopriCallsStatic.DeserializeResponse<BikesReservedOccupiedResponse>(BIKES_OCCUPIED_REQUEST_SET02_001_FILE);
break;
case 2:
response = CopriCallsStatic.DeserializeResponse<BikesReservedOccupiedResponse>(BIKES_OCCUPIED_REQUEST_SET02_002_FILE);
break;
case 3:
response = CopriCallsStatic.DeserializeResponse<BikesReservedOccupiedResponse>(BIKES_OCCUPIED_REQUEST_SET02_003_FILE);
break;
default:
return null;
}
break;
case SampleSets.ShareeFr01_Set1:
switch (stageIndex)
{
case 1:
response = CopriCallsStatic.DeserializeResponse<BikesReservedOccupiedResponse>(BIKES_OCCUPIED_REQUEST_SHAREEFR01_SET1_FILE);
break;
case 2:
response = CopriCallsStatic.DeserializeResponse<BikesReservedOccupiedResponse>(BIKES_OCCUPIED_REQUEST_SHAREEFR01_SET2_FILE);
break;
default:
return null;
}
break;
default:
return null;
}
return sessionCookie == null || response?.authcookie == sessionCookie
? response
: ResponseHelper.GetBikesOccupiedNone(sessionCookie);
}
public enum SampleSets
{
/// <summary> Used for tests and demo GUI. </summary>
Set1,
/// <summary>
/// Sample set nr. 2.
/// Bikes values from first Copri- JSON returns these values.
/// </summary>
Set2,
/// <summary>
/// Sharee server
/// </summary>
ShareeFr01_Set1,
}
}
}