Compare commits

...

15 Commits

Author SHA1 Message Date
8ac4a3d693 Chart Viewer now complete 2022-02-15 16:03:46 +00:00
39cc7caef7 Tried sending model back to controller but now unsure of how to do so 2022-02-11 20:55:53 +00:00
a4e7a30a9f Force user to be logged in before accessing routes 2022-02-11 20:14:57 +00:00
d8a40e64ef Adapted ChartModel to accept an ICAO Code 2022-02-11 19:54:11 +00:00
0c68d05af1 Added Current Chart to user model 2022-02-11 19:41:46 +00:00
dd2a367a58 Added and Started on views for Chart Viewer 2022-02-11 19:40:31 +00:00
76878e7745 Updated Chart Fetch functions in order to create a more generic template 2022-02-11 17:00:08 +00:00
35a6686cd5 Updated layout to use EMail when logged in instead of API Token 2022-02-09 20:48:10 +00:00
39c18ee9bf Updated NavdataModel and RouteController to user environment Variables 2022-02-09 20:41:39 +00:00
30ac25c8fb Added addition constructor for JSON Serialisation 2022-02-09 20:40:24 +00:00
c3a414285a Update Route Controller to ensure that response is valid before parsin 2022-02-09 20:22:46 +00:00
b6e5f09c11 Add Update route controller to fetch charts and adapt model to allow for response parsing 2022-02-09 20:19:32 +00:00
21aff4096f Altered user model and updated controller to make Chart requests on load 2022-02-09 19:08:56 +00:00
94393e232c Altered API Interface import 2022-02-09 18:11:00 +00:00
b2d4b52d6e Added Provisional Chart Models 2022-02-09 17:59:02 +00:00
12 changed files with 444 additions and 6 deletions

View File

@ -0,0 +1,76 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using EFB.Models;
using EFB.Models.JSON;
using EFB.Controllers.Form;
using EFB.Sessions;
namespace EFB.Controllers
{
//[Route("[controller]")]
public class ChartsController : Controller
{
private readonly ILogger<ChartsController> _logger;
public ChartsController(ILogger<ChartsController> logger)
{
_logger = logger;
}
public async Task<IActionResult> Index(string ICAO)
{
UserModel user = HttpContext.Session.GetObject<UserModel>("User");
if (user == null)
{
TempData["Error"] = "Must be logged in to view charts";
return RedirectToAction("Index", "Home");
}
if(ICAO == null)
return View();
if (FormAuthenticator.ValidateICAOCode(ICAO))
{
var charts = await ChartModel.FetchAsync(ICAO);
if (charts != null)
{
ChartModel chartModel = new ChartModel(ICAO, charts);
//Save the current chart into user model for later access
user.CurrentCharts = chartModel;
HttpContext.Session.SetObject("User", user);
return RedirectToAction("ViewCharts");
}
}else
{
TempData["Error"] = "Invalid ICAO";
}
return View();
}
public IActionResult ViewCharts(string chart){
UserModel user = HttpContext.Session.GetObject<UserModel>("User");
if (user != null)
{
ViewChartModel charts = new ViewChartModel(user.CurrentCharts, chart);
if (charts != null)
{
return View("ViewCharts", charts);
}
return RedirectToAction("Index");
}
return RedirectToAction("Index", "Home");
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View("Error!");
}
}
}

View File

@ -71,7 +71,7 @@ namespace EFB.Controllers
preferredmaxlevel = cruiseAlt / 1000, preferredmaxlevel = cruiseAlt / 1000,
}; };
StringContent content = new StringContent(JsonConvert.SerializeObject(routeRequest), Encoding.UTF8, "application/json"); StringContent content = new StringContent(JsonConvert.SerializeObject(routeRequest), Encoding.UTF8, "application/json");
//Make initial Route Request //Make initial Route Request
var requestRoute = API.Post<string>("https://api.autorouter.aero/v1.0/router", headerData, content); var requestRoute = API.Post<string>("https://api.autorouter.aero/v1.0/router", headerData, content);
@ -123,8 +123,16 @@ namespace EFB.Controllers
string routeString = ""; 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>();
/*-----Chart Fetching Operations--------*/
var requestDepartureCharts = ChartModel.FetchAsync(departure);
var requestArrivalCharts = ChartModel.FetchAsync(arrival);
/*----------------------------------*/
//Run route Polling
headerData.Add("Authorization", $"Bearer {user.UserToken.TokenValue}"); headerData.Add("Authorization", $"Bearer {user.UserToken.TokenValue}");
while (collected == false && pollCount < 15) while (collected == false && pollCount < 15)
@ -151,6 +159,19 @@ namespace EFB.Controllers
if (collected) if (collected)
{ {
//Get Response from Charts
ChartList departureCharts = await requestDepartureCharts;
if (departureCharts != null)
{
user.DepartureCharts = new ChartModel(departure, departureCharts);
}
ChartList arrivalCharts = await requestArrivalCharts;
if (arrivalCharts != null)
{
user.ArrivalCharts = new ChartModel(arrival, arrivalCharts);
}
//fill in route //fill in route
string finalRoute = RouteModel.ParseRoute(routeString); string finalRoute = RouteModel.ParseRoute(routeString);
user.Route = finalRoute; user.Route = finalRoute;

View File

@ -9,6 +9,7 @@ using EFB.Models.JSON;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using EFB.Models; using EFB.Models;
using EFB.Sessions; using EFB.Sessions;
using EFB.Controllers.API;
namespace EFB.Controllers namespace EFB.Controllers
{ {
@ -33,7 +34,7 @@ namespace EFB.Controllers
if (Form.FormAuthenticator.ValidateEMail(email)) if (Form.FormAuthenticator.ValidateEMail(email))
{ {
//API Helper //API Helper
API.APIInterface API = new API.APIInterface(); APIInterface API = new APIInterface();
//Dictionary of Formdata to be encoded //Dictionary of Formdata to be encoded
Dictionary<string, string> formData = new Dictionary<string, string>(); Dictionary<string, string> formData = new Dictionary<string, string>();

97
Models/ChartModel.cs Normal file
View File

@ -0,0 +1,97 @@
using System;
using System.Threading.Tasks;
using System.Threading;
using System.Collections.Generic;
using System.Text;
using System.Net.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using EFB.Models;
using EFB.Models.JSON;
using EFB.Sessions;
using EFB.Controllers.Form;
using EFB.Controllers.API;
namespace EFB.Models
{
public class ChartModel
{
public string ICAO { get; set; }
public Chart[] General { get; set; }
public Chart[] TextualData { get; set; }
public Chart[] GroundLayout { get; set; }
public Chart[] SID { get; set; }
public Chart[] STAR { get; set; }
public Chart[] Approach { get; set; }
public Chart[] Transition { get; set; }
public Chart[] PilotBriefing { get; set; }
[JsonConstructor]
public ChartModel(){
//Empty constructor for JSON Serialisation Purposes
}
public ChartModel(string ICAO, ChartList response)
{
this.ICAO = ICAO;
General = FillChart(response.General);
TextualData = FillChart(response.TextualData);
GroundLayout = FillChart(response.GroundLayout);
SID = FillChart(response.SID);
STAR = FillChart(response.STAR);
Approach = FillChart(response.Approach);
Transition = FillChart(response.Transition);
PilotBriefing = FillChart(response.PilotBriefing);
}
private Chart[] FillChart(ChartsCollection collection){
if (collection != null)
{
return collection.Charts;
}
return new Chart[]{};
}
public static async Task<ChartList> FetchAsync(string ICAO){
Console.WriteLine("Start");
if (FormAuthenticator.ValidateICAOCode(ICAO))
{
APIInterface API = new APIInterface();
Dictionary <string, string> headerData = new Dictionary<string, string>();
headerData.Add("referer", "luke-else.co.uk");
Dictionary<string, string> formData = new Dictionary<string, string>();
formData.Add("token", Environment.GetEnvironmentVariable("ChartFoxAPIKey", EnvironmentVariableTarget.User));
FormUrlEncodedContent body = new FormUrlEncodedContent(formData);
//make Charts request
var requestCharts = await API.Post<ChartResponse>($"https://chartfox.org/api/charts/grouped/{ICAO}", headerData, body);
Console.WriteLine("End");
if (requestCharts.Result.Status == "success")
{
return requestCharts.Result.Response;
}
}
return null;
}
}
public class Pinned
{
public Chart[] Charts { get; set; }
}
// public class Chart *Found in Models/JSON*
// {
// public string Name { get; set; }
// public string Identifier { get; set; }
// public int TypeCode { get; set; }
// public string Type { get; set; }
// public string Runway { get; set; }
// public string PseudoURL { get; set; }
// public string URL { get; set; }
// }
}

View File

@ -0,0 +1,64 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace EFB.Models.JSON
{
public class ChartResponse
{
[JsonProperty("status")]
public string Status { get; set; }
[JsonProperty("charts")]
public ChartList Response { get; set; }
}
public class ChartList
{
[JsonProperty("0")]
public ChartsCollection General { get; set; }
[JsonProperty("1")]
public ChartsCollection TextualData { get; set; }
[JsonProperty("2")]
public ChartsCollection GroundLayout { get; set; }
[JsonProperty("6")]
public ChartsCollection SID { get; set; }
[JsonProperty("7")]
public ChartsCollection STAR { get; set; }
[JsonProperty("8")]
public ChartsCollection Approach { get; set; }
[JsonProperty("9")]
public ChartsCollection Transition { get; set; }
[JsonProperty("99")]
public ChartsCollection PilotBriefing { get; set; }
}
public class ChartsCollection
{
[JsonProperty("group_name")]
public string Category { get; set; }
[JsonProperty("charts")]
public Chart[] Charts { get; set; }
}
public class Chart
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("identifier")]
public string Identifier { get; set; }
[JsonProperty("type_code")]
public int TypeCode { get; set; }
[JsonProperty("type")]
public string Type { get; set; }
[JsonProperty("runway")]
public string Runway { get; set; }
[JsonProperty("pseudo_url")]
public string PseudoURL { get; set; }
[JsonProperty("url")]
public string URL { get; set; }
}
}

View File

@ -39,7 +39,8 @@ namespace EFB.Models
} }
public static async Task<NavdataModel[]> Populate(){ public static async Task<NavdataModel[]> Populate(){
MySqlConnection con = new MySqlConnection("server=server.luke-else.co.uk;userid=root;password=;database=EFB"); string password = Environment.GetEnvironmentVariable("MySQLPassword", EnvironmentVariableTarget.User);
MySqlConnection con = new MySqlConnection($"server=server.luke-else.co.uk;userid=root;password={password};database=EFB");
con.Open(); con.Open();
// Console.WriteLine($"MySQL version : {con.ServerVersion}"); // Console.WriteLine($"MySQL version : {con.ServerVersion}");

View File

@ -24,6 +24,11 @@ namespace EFB.Models
public string Route { get; set; } public string Route { get; set; }
public TokenModel RouteToken { get; set; } = null; public TokenModel RouteToken { get; set; } = null;
//Contains the Departure and Arrival Charts for the user's route
public ChartModel DepartureCharts { get; set; }
public ChartModel ArrivalCharts { get; set; }
public ChartModel CurrentCharts { get; set; }
//Contains the most recently stored position of the user in the simulator //Contains the most recently stored position of the user in the simulator
public object SimPosition { get; set; } = null; public object SimPosition { get; set; } = null;

28
Models/ViewChartModel.cs Normal file
View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Razor;
using Newtonsoft.Json;
using EFB.Models.JSON;
using Microsoft.AspNetCore;
using EFB.Sessions;
namespace EFB.Models
{
public class ViewChartModel
{
public ChartModel Charts { get; set; }
public Chart Selected { get; set; }
public ViewChartModel(ChartModel current, string selected){
Charts = current;
if (selected != null)
{
Selected = JsonConvert.DeserializeObject<Chart>(selected);
}
}
}
}

View File

@ -54,6 +54,12 @@ namespace EFB
endpoints.MapControllerRoute( endpoints.MapControllerRoute(
name: "default", name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}"); pattern: "{controller=Home}/{action=Index}/{id?}");
// endpoints.MapControllerRoute(
// name: "Navdata",
// pattern: "{controller=Navdata}/{action=Index}/{identifier?}");
// endpoints.MapControllerRoute(
// name: "Charts",
// pattern: "{controller=Charts}/{action=Index}/{ICAO?}");
}); });
} }
} }

37
Views/Charts/Index.cshtml Normal file
View File

@ -0,0 +1,37 @@
@{
ViewData["Title"] = "Welcome";
}
<div class="row d-flex justify-content-center">
<div class="card-body col-md-6">
<div class="container jumbotron">
<h3>Chart Lookup</h3>
<br />
<br />
<form asp-controller="Charts" asp-action="Index">
<div class="form-group">
<input type="text" class="form-control" placeholder="ICAO Code" name="ICAO" value="@TempData["ICAO"]">
</div>
<button type="submit" class="btn btn-secondary">Search</button>
@{
if (TempData["Error"] != null)
{//If an error has been flagged, information will be displayed to the user
<br />
<br />
<div class="alert alert-danger">
<strong>Warning!</strong> @TempData["Error"] <button type='button' class='close' data-dismiss='alert' aria-hidden='true' />&times;
</div>
}
}
</form>
</div>
</div>
</div>

View File

@ -0,0 +1,102 @@
@using Newtonsoft.Json;
@model EFB.Models.ViewChartModel;
@{
ViewData["Title"] = "Welcome";
}
<div class="row d-flex justify-content-center">
<div class="card-body col-md-4">
<div class="container jumbotron">
<form asp-controller="Charts" asp-action="Index">
<div class="form-group">
<input type="text" class="form-control" placeholder="ICAO Code" name="ICAO" value="@TempData["ICAO"]">
</div>
<button type="submit" class="btn btn-secondary">Search</button>
@{
if (TempData["Error"] != null)
{//If an error has been flagged, information will be displayed to the user
<br />
<br />
<div class="alert alert-danger">
<strong>Warning!</strong> @TempData["Error"] <button type='button' class='close' data-dismiss='alert' aria-hidden='true' />&times;
</div>
}
}
</form>
@{
<br />
<h4>Charts for: @Model.Charts.ICAO</h4>
<form asp-action="ViewCharts" method="post">
<div class="form-group">
<label>Select Charts</label><br />
<select name="chart" class="form-control">
@if (Model.Charts != null) {
<option value=""></option>
foreach(var item in Model.Charts.GroundLayout) {
var itemString = JsonConvert.SerializeObject(item);
<option value="@itemString">@item.Name</option>
}
<option value=""></option>
foreach(var item in Model.Charts.SID) {
var itemString = JsonConvert.SerializeObject(item);
<option value="@itemString">@item.Name</option>
}
<option value=""></option>
foreach(var item in Model.Charts.STAR) {
var itemString = JsonConvert.SerializeObject(item);
<option value="@itemString">@item.Name</option>
}
<option value=""></option>
foreach(var item in Model.Charts.Approach) {
var itemString = JsonConvert.SerializeObject(item);
<option value="@itemString">@item.Name</option>
}
<option value=""></option>
foreach(var item in Model.Charts.TextualData) {
var itemString = JsonConvert.SerializeObject(item);
<option value="@itemString">@item.Name</option>
}
}
</select>
<button type="submit" class="btn btn-primary">View</button>
</div>
</form>
}
</div>
</div>
<div class="card-body col-md-8 vh-80">
<div class="container jumbotron vh-100">
@{
if (Model.Selected != null)
{
<h3>@Model.Selected.Name</h3>
<br />
<br />
<iframe src="@Model.Selected.URL" width="100%" height="90%"></iframe>
}
}
</div>
</div>
</div>

View File

@ -32,7 +32,7 @@
<a class="nav-link text-light" asp-area="" asp-controller="Navdata" asp-action="Index">Navdata</a> <a class="nav-link text-light" asp-area="" asp-controller="Navdata" asp-action="Index">Navdata</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-light" asp-area="" asp-controller="" asp-action="Index">Charts</a> <a class="nav-link text-light" asp-area="" asp-controller="Charts" asp-action="Index">Charts</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-light" asp-area="" asp-controller="" asp-action="Index">FlightSim</a> <a class="nav-link text-light" asp-area="" asp-controller="" asp-action="Index">FlightSim</a>
@ -44,7 +44,7 @@
{ {
<div class="ml-auto"> <div class="ml-auto">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-light" asp-area="" asp-controller="User" asp-action="Logout">Logout (@user.UserToken.TokenValue)</a> <a class="nav-link text-light" asp-area="" asp-controller="User" asp-action="Logout">Logout (@user.EMail)</a>
</li> </li>
</div> </div>
} }