Route Object Generation Complete
This commit is contained in:
		| @@ -29,7 +29,7 @@ namespace EFB.Controllers | |||||||
|         { |         { | ||||||
|             //Check the user has a valid login |             //Check the user has a valid login | ||||||
|             UserModel user = HttpContext.Session.GetObject<UserModel>("User"); |             UserModel user = HttpContext.Session.GetObject<UserModel>("User"); | ||||||
|             if (user == null || user.Route != null || user.Token.IsExpired()) |             if (user == null || user.UserToken.IsExpired()) | ||||||
|             { |             { | ||||||
|                 return RedirectToAction("Index", "Home"); |                 return RedirectToAction("Index", "Home"); | ||||||
|             } |             } | ||||||
| @@ -46,7 +46,7 @@ namespace EFB.Controllers | |||||||
|         public async Task<IActionResult> New(string departure, string arrival, string cruise) |         public async Task<IActionResult> New(string departure, string arrival, string cruise) | ||||||
|         { |         { | ||||||
|             UserModel user = HttpContext.Session.GetObject<UserModel>("User"); |             UserModel user = HttpContext.Session.GetObject<UserModel>("User"); | ||||||
|             if (!(user == null || user.Token.IsExpired())) |             if (!(user == null || user.UserToken.IsExpired())) | ||||||
|             {//If the user is still authenticated |             {//If the user is still authenticated | ||||||
|                 if (FormAuthenticator.ValidateICAOCode(departure) && FormAuthenticator.ValidateICAOCode(arrival)) |                 if (FormAuthenticator.ValidateICAOCode(departure) && FormAuthenticator.ValidateICAOCode(arrival)) | ||||||
|                 {//If the user has entered valid ICAOs |                 {//If the user has entered valid ICAOs | ||||||
| @@ -61,7 +61,7 @@ namespace EFB.Controllers | |||||||
|  |  | ||||||
|                         //Prepare data to be send off with request (route) |                         //Prepare data to be send off with request (route) | ||||||
|                         Dictionary<string, string> headerData = new Dictionary<string, string>(); |                         Dictionary<string, string> headerData = new Dictionary<string, string>(); | ||||||
|                         headerData.Add("Authorization", $"Bearer {user.Token.TokenValue}"); |                         headerData.Add("Authorization", $"Bearer {user.UserToken.TokenValue}"); | ||||||
|  |  | ||||||
|                         RouteRequest routeRequest = new RouteRequest() |                         RouteRequest routeRequest = new RouteRequest() | ||||||
|                         { |                         { | ||||||
| @@ -79,15 +79,15 @@ namespace EFB.Controllers | |||||||
|  |  | ||||||
|                         if (responseRoute.Error == null) |                         if (responseRoute.Error == null) | ||||||
|                         {//Update User session and add route ID |                         {//Update User session and add route ID | ||||||
|                             RouteModel route = new RouteModel() |                             TokenModel routeToken = new TokenModel() | ||||||
|                             { |                             { | ||||||
|                                 RouteID = responseRoute.Result.ToString() |                                 TokenValue = responseRoute.Result.ToString() | ||||||
|                             }; |                             }; | ||||||
|  |  | ||||||
|                             user.Route = route; |                             user.RouteToken = routeToken; | ||||||
|                             HttpContext.Session.SetObject("User", user); |                             HttpContext.Session.SetObject("User", user); | ||||||
|  |  | ||||||
|                             return await Poll(); |                             return await Poll(departure, arrival, cruiseAlt); | ||||||
|  |  | ||||||
|                         } |                         } | ||||||
|  |  | ||||||
| @@ -108,29 +108,29 @@ namespace EFB.Controllers | |||||||
|         } |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|         public async Task<IActionResult> Poll() |         public async Task<IActionResult> Poll(string departure, string arrival, uint cruise) | ||||||
|         { |         { | ||||||
|             if (HttpContext.Session.GetString("User") != null) |             if (HttpContext.Session.GetString("User") != null) | ||||||
|             {//If the user is currently logged in |             {//If the user is currently logged in | ||||||
|                 UserModel user = HttpContext.Session.GetObject<UserModel>("User"); |                 UserModel user = HttpContext.Session.GetObject<UserModel>("User"); | ||||||
|  |  | ||||||
|                 if (user.Route != null) |                 if (user.RouteToken != null) | ||||||
|                 {//If the user has a route object (e.g, they have been to the route page) |                 {//If the user has a route object (e.g, they have been to the route page) | ||||||
|  |  | ||||||
|                     //Make calls to the server to fetch route |                     //Make calls to the server to fetch route | ||||||
|                     bool collected = false; |                     bool collected = false; | ||||||
|                     int count = 0; |                     int pollCount = 0; | ||||||
|                     string route = ""; |                     string routeString = ""; | ||||||
|  |  | ||||||
|                     APIInterface API = new APIInterface(); |                     APIInterface API = new APIInterface(); | ||||||
|  |  | ||||||
|                     Dictionary<string, string> headerData = new Dictionary<string, string>(); |                     Dictionary<string, string> headerData = new Dictionary<string, string>(); | ||||||
|                     headerData.Add("Authorization", $"Bearer {user.Token.TokenValue}"); |                     headerData.Add("Authorization", $"Bearer {user.UserToken.TokenValue}"); | ||||||
|  |  | ||||||
|                     while (collected == false && count <= 5) |                     while (collected == false && pollCount < 3) | ||||||
|                     { |                     { | ||||||
|                         //Make Polling Request |                         //Make Polling Request | ||||||
|                         var pollingRequest = API.Put<List<PollResponse>>($"https://api.autorouter.aero/v1.0/router/{user.Route.RouteID}/longpoll", headerData, null); |                         var pollingRequest = API.Put<List<PollResponse>>($"https://api.autorouter.aero/v1.0/router/{user.RouteToken.TokenValue}/longpoll", headerData, null); | ||||||
|  |  | ||||||
|                         ResponseModel<List<PollResponse>> responsePoll = await pollingRequest; |                         ResponseModel<List<PollResponse>> responsePoll = await pollingRequest; | ||||||
|  |  | ||||||
| @@ -139,25 +139,28 @@ namespace EFB.Controllers | |||||||
|                         if (responsePoll.Result[routePos].Command == "solution") |                         if (responsePoll.Result[routePos].Command == "solution") | ||||||
|                         { |                         { | ||||||
|                             collected = true; |                             collected = true; | ||||||
|                             route = responsePoll.Result[routePos].FlightPlan; |                             routeString = responsePoll.Result[routePos].FlightPlan; | ||||||
|                             break; |                             break; | ||||||
|                         } |                         } | ||||||
|  |  | ||||||
|                         Thread.Sleep(5000); |                         Thread.Sleep(3000); | ||||||
|                         count++; |                         pollCount++; | ||||||
|  |  | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|                     if (collected) |                     if (collected) | ||||||
|                     { |                     { | ||||||
|                         //fill in route |                         //fill in route | ||||||
|                         string finalRoute = ParseRoute(route); |                         string finalRoute = RouteModel.ParseRoute(routeString); | ||||||
|  |  | ||||||
|  |                         RouteModel route = RouteModel.StringToRoute(departure, arrival, cruise, finalRoute); | ||||||
|  |                         user.Route = route; | ||||||
|  |                         HttpContext.Session.SetObject("User", user); | ||||||
|                          |                          | ||||||
|                         TempData["Error"] = finalRoute; |  | ||||||
|                         return RedirectToAction("Index", "Route"); |                         return RedirectToAction("Index", "Route"); | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|                     TempData["Error"] = "Unable to get route!"; |                     TempData["Error"] = $"Unable to get route after {pollCount} Attempts!"; | ||||||
|                     return RedirectToAction("Index", "Route"); |                     return RedirectToAction("Index", "Route"); | ||||||
|  |  | ||||||
|                 } |                 } | ||||||
| @@ -173,29 +176,6 @@ namespace EFB.Controllers | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         private string ParseRoute(string route){ |  | ||||||
|             TempData["Error"] = route; |  | ||||||
|          |          | ||||||
|             route.Replace('/', ' '); |  | ||||||
|             var routeArr = route.Split(' '); |  | ||||||
|  |  | ||||||
|             string finalRoute = ""; |  | ||||||
|  |  | ||||||
|             foreach (var item in routeArr) |  | ||||||
|             { |  | ||||||
|                 var waypoint = item.Split('/')[0]; |  | ||||||
|                 if (waypoint.Length <= 7 && waypoint.Length >= 3 && !waypoint.Contains('-')) |  | ||||||
|                 { |  | ||||||
|                     finalRoute += $"{waypoint} "; |  | ||||||
|  |  | ||||||
|                     if (waypoint.Length == 7 && finalRoute.Length > 8) |  | ||||||
|                         break; |  | ||||||
|                      |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             return finalRoute; |  | ||||||
|  |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -17,10 +17,9 @@ namespace EFB.Models.Route | |||||||
|         public IWaypoint Previous { get; set; } = null; |         public IWaypoint Previous { get; set; } = null; | ||||||
|         public bool Visited { get; set; } = false; |         public bool Visited { get; set; } = false; | ||||||
|          |          | ||||||
|         public NavaidModel(string name, string airway, int frequency){ |         public NavaidModel(string name, string airway){ | ||||||
|             Name = name; |             Name = name; | ||||||
|             Airway = Airway; |             Airway = airway; | ||||||
|             Frequency = frequency; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -18,7 +18,7 @@ namespace EFB.Models.Route | |||||||
|  |  | ||||||
|         public WaypointModel(string name, string airway){ |         public WaypointModel(string name, string airway){ | ||||||
|             Name = name; |             Name = name; | ||||||
|             Airway = Airway; |             Airway = airway; | ||||||
|         } |         } | ||||||
|          |          | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -3,6 +3,8 @@ using System.Collections.Generic; | |||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| using EFB.Models.Route; | using EFB.Models.Route; | ||||||
|  | using EFB.Controllers.Form; | ||||||
|  | using System.Net.Http; | ||||||
|  |  | ||||||
| namespace EFB.Models | namespace EFB.Models | ||||||
| { | { | ||||||
| @@ -13,12 +15,93 @@ namespace EFB.Models | |||||||
|  |  | ||||||
|             Route only becomes populated after route is recieved from autorouter API |             Route only becomes populated after route is recieved from autorouter API | ||||||
|         */ |         */ | ||||||
|         public string RouteID { get; init; } |  | ||||||
|          |  | ||||||
|         public WaypointModel Departure { get; set; } = null; |         public WaypointModel Departure { get; set; } = null; | ||||||
|         public WaypointModel Arrival { get; set; } = null; |         public WaypointModel Arrival { get; set; } = null; | ||||||
|         public IWaypoint Current { get; set; } = null; |         public IWaypoint Current { get; set; } = null; | ||||||
|         public uint Cruise { get; set; } = 0; |         public uint Cruise { get; set; } = 0; | ||||||
|  |         public RouteModel(string departure, string departureRoute, string arrival, string arrivalRoute, uint cruise){ | ||||||
|  |             if (FormAuthenticator.ValidateICAOCode(departure)) | ||||||
|  |             { | ||||||
|  |                 Departure = new WaypointModel(departure, departureRoute); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (FormAuthenticator.ValidateICAOCode(arrival)) | ||||||
|  |             { | ||||||
|  |                 Arrival = new WaypointModel(arrival, arrivalRoute); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (FormAuthenticator.ValidateCruiseAlt(cruise)) | ||||||
|  |             { | ||||||
|  |                 Cruise = cruise; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //Generate a route Object | ||||||
|  |         public static RouteModel StringToRoute(string departure, string arrival, uint cruise, string routeString){ | ||||||
|  |             string[] routeTemp = routeString.Split(" "); | ||||||
|  |  | ||||||
|  |             //Set departure and arrival route | ||||||
|  |             string departureRoute = routeTemp[0]; | ||||||
|  |             string arrivalRoute = routeTemp[routeTemp.Length - 2]; | ||||||
|  |  | ||||||
|  |             RouteModel route = new RouteModel(departure, departureRoute, arrival, arrivalRoute, cruise); | ||||||
|  |             route.Departure.Airway = routeTemp[0]; | ||||||
|  |  | ||||||
|  |             route.Current = route.Departure; | ||||||
|  |  | ||||||
|  |             for (var i = 1; i < routeTemp.Length-1; i+=2) | ||||||
|  |             {//Already used first item, continue itterating over every other item | ||||||
|  |                 IWaypoint next; | ||||||
|  |  | ||||||
|  |                 //Populate 'next' waypoint | ||||||
|  |                 if (routeTemp[i].Length > 3) | ||||||
|  |                 {//waypoint Type | ||||||
|  |                     next = new WaypointModel(routeTemp[i], routeTemp[i+1]);  | ||||||
|  |                 }else | ||||||
|  |                 {//Navaid Type | ||||||
|  |                     next = new NavaidModel(routeTemp[i], routeTemp[i+1]);  | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 next.Previous = route.Current; | ||||||
|  |                 route.Current.Next = next; | ||||||
|  |                 route.Current = next; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             //Connect end of route (linked list) | ||||||
|  |             route.Current.Airway = null; | ||||||
|  |             route.Current.Next = route.Arrival; | ||||||
|  |             route.Arrival.Previous = route.Current; | ||||||
|  |  | ||||||
|  |             route.Current = null; | ||||||
|  |  | ||||||
|  |             return route; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         //Generate a route String | ||||||
|  |         public static string ParseRoute(string route){ | ||||||
|  |             route.Replace('/', ' '); | ||||||
|  |             var routeArr = route.Split(' '); | ||||||
|  |  | ||||||
|  |             string finalRoute = ""; | ||||||
|  |  | ||||||
|  |             foreach (var item in routeArr) | ||||||
|  |             { | ||||||
|  |                 var waypoint = item.Split('/')[0]; | ||||||
|  |                 if (waypoint.Length <= 7 && waypoint.Length >= 3 && !waypoint.Contains('-')) | ||||||
|  |                 { | ||||||
|  |                     finalRoute += $"{waypoint} "; | ||||||
|  |  | ||||||
|  |                     if (waypoint.Length == 7 && finalRoute.Length > 8) | ||||||
|  |                         break; | ||||||
|                      |                      | ||||||
|                 } |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return finalRoute; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
		Reference in New Issue
	
	Block a user