diff --git a/bahnplan.web/Pages/Ticket.cshtml.cs b/bahnplan.web/Pages/Ticket.cshtml.cs index 58c9690..20e5b9b 100644 --- a/bahnplan.web/Pages/Ticket.cshtml.cs +++ b/bahnplan.web/Pages/Ticket.cshtml.cs @@ -12,27 +12,64 @@ using Microsoft.AspNetCore.Mvc.RazorPages; using Newtonsoft.Json; using Leg = bahnplan.web.database.Tables.Leg; -namespace bahnplan.web.Pages { - public class TicketModel : PageModel { - public int TripId; +namespace bahnplan.web.Pages; - public void OnGet() { - if (HttpContext.Session.GetString("authorized") != "true") +public class TicketModel : PageModel { + public int TripId; + + public void OnGet() { + if (HttpContext.Session.GetString("authorized") != "true") + return; + + using var db = new Database.DbConn(); + if (!string.IsNullOrWhiteSpace(Request.Query["tripid"].ToString())) + if (db.Trips.First(p => p.TripId == int.Parse(Request.Query["tripid"].ToString())).UserId != int.Parse(HttpContext.Session.GetString("uid"))) return; - using var db = new Database.DbConn(); - if (!string.IsNullOrWhiteSpace(Request.Query["tripid"].ToString())) - if (db.Trips.First(p => p.TripId == int.Parse(Request.Query["tripid"].ToString())).UserId != int.Parse(HttpContext.Session.GetString("uid"))) - return; + if (db.Tickets.Any(p => p.OrderId == Request.Query["order"].ToString())) { + var tripId = Request.Query["action"] == "addleg" + ? int.Parse(Request.Query["tripid"]) + : db.InsertWithInt32Identity(new Trip { UserId = int.Parse(HttpContext.Session.GetString("uid")) }); + var ticketId = db.Tickets.First(p => p.OrderId == Request.Query["order"].ToString()).TicketId; + var ticketId2 = db.Tickets.FirstOrDefault(p => p.OrderId == Request.Query["order"] + "_2")?.TicketId; - if (db.Tickets.Any(p => p.OrderId == Request.Query["order"].ToString())) { - var tripId = Request.Query["action"] == "addleg" - ? int.Parse(Request.Query["tripid"]) - : db.InsertWithInt32Identity(new Trip { UserId = int.Parse(HttpContext.Session.GetString("uid")) }); - var ticketId = db.Tickets.First(p => p.OrderId == Request.Query["order"].ToString()).TicketId; - var ticketId2 = db.Tickets.FirstOrDefault(p => p.OrderId == Request.Query["order"] + "_2")?.TicketId; + var lastleg_ticket = 0; + foreach (var leg in db.TicketLegs.Where(p => p.TicketId == ticketId).ToList()) { + if (leg.TrainType == "placeholder") { + db.Insert(new Leg { + TripId = tripId, + UserId = int.Parse(HttpContext.Session.GetString("uid")), + TrainType = "placeholder", + TrainNr = lastleg_ticket, + ArrStation = "_", + ArrStationId = 0, + ArrTime = "_", + DepStation = "_", + DepStationId = 0, + DepTime = db.Legs.First(p => p.LegId == lastleg_ticket).DepTime + "_placeholder" + }); + continue; + } - foreach (var leg in db.TicketLegs.Where(p => p.TicketId == ticketId).ToList()) + lastleg_ticket = db.InsertWithInt32Identity(new Leg { + TripId = tripId, + UserId = int.Parse(HttpContext.Session.GetString("uid")), + TrainType = leg.TrainType, + TrainNr = leg.TrainNr, + ArrStation = leg.ArrStation, + ArrStationId = leg.ArrStationId, + ArrTime = leg.ArrTime, + DepStation = leg.DepStation, + DepStationId = leg.DepStationId, + DepTime = leg.DepTime, + TicketId = leg.TicketId + }); + } + + if (ticketId2 != null) { + var lastleg = 0; + + foreach (var leg in db.TicketLegs.Where(p => p.TicketId == ticketId2).ToList()) db.InsertWithInt32Identity(new Leg { TripId = tripId, UserId = int.Parse(HttpContext.Session.GetString("uid")), @@ -46,102 +83,144 @@ namespace bahnplan.web.Pages { DepTime = leg.DepTime, TicketId = leg.TicketId }); - - if (ticketId2 != null) - foreach (var leg in db.TicketLegs.Where(p => p.TicketId == ticketId2).ToList()) - db.InsertWithInt32Identity(new Leg { - TripId = tripId, - UserId = int.Parse(HttpContext.Session.GetString("uid")), - TrainType = leg.TrainType, - TrainNr = leg.TrainNr, - ArrStation = leg.ArrStation, - ArrStationId = leg.ArrStationId, - ArrTime = leg.ArrTime, - DepStation = leg.DepStation, - DepStationId = leg.DepStationId, - DepTime = leg.DepTime, - TicketId = leg.TicketId - }); - - TripId = tripId; } - else { - var request = new XDocument(new XElement("rqorderdetails", new XAttribute("version", "1.0"), - new XElement("rqheader", new XAttribute("ts", "2019-10-31T23:20:48"), new XAttribute("l", "de"), - new XAttribute("v", "19100000"), new XAttribute("d", "iPad7,5"), new XAttribute("os", "iOS_13.1.3"), - new XAttribute("app", "NAVIGATOR")), new XElement("rqorder", new XAttribute("on", Request.Query["order"])), - new XElement("authname", new XAttribute("tln", Request.Query["name"])))).ToString(); - var response = new WebClient().UploadString("https://fahrkarten.bahn.de/mobile/dbc/xs.go", "POST", request); - var xmlobj = new XmlDocument(); - xmlobj.LoadXml(response); - var json = JsonConvert.SerializeXmlNode(xmlobj); - var parsed = TicketResponse.FromJson(json); + TripId = tripId; + } - var tripId = Request.Query["action"] == "addleg" - ? int.Parse(Request.Query["tripid"]) - : db.InsertWithInt32Identity(new Trip { UserId = int.Parse(HttpContext.Session.GetString("uid")) }); + else { + var request = new XDocument(new XElement("rqorderdetails", new XAttribute("version", "1.0"), + new XElement("rqheader", new XAttribute("ts", "2019-10-31T23:20:48"), new XAttribute("l", "de"), + new XAttribute("v", "19100000"), new XAttribute("d", "iPad7,5"), new XAttribute("os", "iOS_13.1.3"), + new XAttribute("app", "NAVIGATOR")), new XElement("rqorder", new XAttribute("on", Request.Query["order"])), + new XElement("authname", new XAttribute("tln", Request.Query["name"])))).ToString(); + var response = new WebClient().UploadString("https://fahrkarten.bahn.de/mobile/dbc/xs.go", "POST", request); + var xmlobj = new XmlDocument(); + xmlobj.LoadXml(response); + var json = JsonConvert.SerializeXmlNode(xmlobj); + var parsed = TicketResponse.FromJson(json); - int ticketId; - int? ticketId2 = null; + var tripId = Request.Query["action"] == "addleg" + ? int.Parse(Request.Query["tripid"]) + : db.InsertWithInt32Identity(new Trip { UserId = int.Parse(HttpContext.Session.GetString("uid")) }); - switch (parsed.Rporderdetails.Order.Tcklist.Tck.Count) { - case 1: { - ticketId = db.InsertWithInt32Identity(new Ticket { - OrderId = Request.Query["order"], - TicketInfo = parsed.Rporderdetails.Order.Tcklist.Tck[0].Mtk.Txt, - TicketQr = parsed.Rporderdetails.Order.Tcklist.Tck[0].Htdata.Ht.First(p => p.Name == "barcode").Text, - TicketSecCode = parsed.Rporderdetails.Order.Tcklist.Tck[0].Htdata.Ht.First(p => p.Name == "sichtmerkmal").Text, - UserId = int.Parse(HttpContext.Session.GetString("uid")), - TicketPkPass = - parsed.Rporderdetails.Order.Tcklist.Tck[0] - .Htdata.Ht.FirstOrDefault(p => p.Name == "pass") - ?.Text, // application/vnd.apple.pkpass;base64 - Traveller = parsed.Rporderdetails.Order.Tcklist.Tck[0].Mtk.ReisenderVorname - + " " - + parsed.Rporderdetails.Order.Tcklist.Tck[0].Mtk.ReisenderNachname - }); - break; - } - case 2: { - ticketId = db.InsertWithInt32Identity(new Ticket { - OrderId = Request.Query["order"], - TicketInfo = parsed.Rporderdetails.Order.Tcklist.Tck[0].Mtk.Txt, - TicketQr = parsed.Rporderdetails.Order.Tcklist.Tck[0].Htdata.Ht.First(p => p.Name == "barcode").Text, - TicketSecCode = parsed.Rporderdetails.Order.Tcklist.Tck[0].Htdata.Ht.First(p => p.Name == "sichtmerkmal").Text, - UserId = int.Parse(HttpContext.Session.GetString("uid")), - TicketPkPass = - parsed.Rporderdetails.Order.Tcklist.Tck[0] - .Htdata.Ht.First(p => p.Name == "pass") - .Text, // application/vnd.apple.pkpass;base64 - Traveller = parsed.Rporderdetails.Order.Tcklist.Tck[0].Mtk.ReisenderVorname - + " " - + parsed.Rporderdetails.Order.Tcklist.Tck[0].Mtk.ReisenderNachname - }); + int ticketId; + int? ticketId2 = null; - ticketId2 = db.InsertWithInt32Identity(new Ticket { - OrderId = Request.Query["order"] + "_2", - TicketInfo = parsed.Rporderdetails.Order.Tcklist.Tck[1].Mtk.Txt, - TicketQr = parsed.Rporderdetails.Order.Tcklist.Tck[1].Htdata.Ht.First(p => p.Name == "barcode").Text, - TicketSecCode = parsed.Rporderdetails.Order.Tcklist.Tck[1].Htdata.Ht.First(p => p.Name == "sichtmerkmal").Text, - UserId = int.Parse(HttpContext.Session.GetString("uid")), - TicketPkPass = - parsed.Rporderdetails.Order.Tcklist.Tck[1] - .Htdata.Ht.First(p => p.Name == "pass") - .Text, // application/vnd.apple.pkpass;base64 - Traveller = parsed.Rporderdetails.Order.Tcklist.Tck[1].Mtk.ReisenderVorname - + " " - + parsed.Rporderdetails.Order.Tcklist.Tck[1].Mtk.ReisenderNachname - }); - - break; - } - default: { - throw new Exception("Order contains zero or more than two tickets"); - } + switch (parsed.Rporderdetails.Order.Tcklist.Tck.Count) { + case 1: { + ticketId = db.InsertWithInt32Identity(new Ticket { + OrderId = Request.Query["order"], + TicketInfo = parsed.Rporderdetails.Order.Tcklist.Tck[0].Mtk.Txt, + TicketQr = parsed.Rporderdetails.Order.Tcklist.Tck[0].Htdata.Ht.First(p => p.Name == "barcode").Text, + TicketSecCode = parsed.Rporderdetails.Order.Tcklist.Tck[0].Htdata.Ht.First(p => p.Name == "sichtmerkmal").Text, + UserId = int.Parse(HttpContext.Session.GetString("uid")), + TicketPkPass = + parsed.Rporderdetails.Order.Tcklist.Tck[0] + .Htdata.Ht.FirstOrDefault(p => p.Name == "pass") + ?.Text, // application/vnd.apple.pkpass;base64 + Traveller = parsed.Rporderdetails.Order.Tcklist.Tck[0].Mtk.ReisenderVorname + + " " + + parsed.Rporderdetails.Order.Tcklist.Tck[0].Mtk.ReisenderNachname + }); + break; } + case 2: { + ticketId = db.InsertWithInt32Identity(new Ticket { + OrderId = Request.Query["order"], + TicketInfo = parsed.Rporderdetails.Order.Tcklist.Tck[0].Mtk.Txt, + TicketQr = parsed.Rporderdetails.Order.Tcklist.Tck[0].Htdata.Ht.First(p => p.Name == "barcode").Text, + TicketSecCode = parsed.Rporderdetails.Order.Tcklist.Tck[0].Htdata.Ht.First(p => p.Name == "sichtmerkmal").Text, + UserId = int.Parse(HttpContext.Session.GetString("uid")), + TicketPkPass = + parsed.Rporderdetails.Order.Tcklist.Tck[0] + .Htdata.Ht.First(p => p.Name == "pass") + .Text, // application/vnd.apple.pkpass;base64 + Traveller = parsed.Rporderdetails.Order.Tcklist.Tck[0].Mtk.ReisenderVorname + + " " + + parsed.Rporderdetails.Order.Tcklist.Tck[0].Mtk.ReisenderNachname + }); - foreach (var leg in parsed.Rporderdetails.Order.Schedulelist.Out.Trainlist.Train) { + ticketId2 = db.InsertWithInt32Identity(new Ticket { + OrderId = Request.Query["order"] + "_2", + TicketInfo = parsed.Rporderdetails.Order.Tcklist.Tck[1].Mtk.Txt, + TicketQr = parsed.Rporderdetails.Order.Tcklist.Tck[1].Htdata.Ht.First(p => p.Name == "barcode").Text, + TicketSecCode = parsed.Rporderdetails.Order.Tcklist.Tck[1].Htdata.Ht.First(p => p.Name == "sichtmerkmal").Text, + UserId = int.Parse(HttpContext.Session.GetString("uid")), + TicketPkPass = + parsed.Rporderdetails.Order.Tcklist.Tck[1] + .Htdata.Ht.First(p => p.Name == "pass") + .Text, // application/vnd.apple.pkpass;base64 + Traveller = parsed.Rporderdetails.Order.Tcklist.Tck[1].Mtk.ReisenderVorname + + " " + + parsed.Rporderdetails.Order.Tcklist.Tck[1].Mtk.ReisenderNachname + }); + + break; + } + default: { + throw new Exception("Order contains zero or more than two tickets"); + } + } + + var lastleg = 0; + var lastticketleg = 0; + + foreach (var leg in parsed.Rporderdetails.Order.Schedulelist.Out.Trainlist.Train) { + lastleg = db.InsertWithInt32Identity(new Leg { + TripId = tripId, + UserId = int.Parse(HttpContext.Session.GetString("uid")), + TrainType = leg.Gattung, + TrainNr = int.Parse(leg.Zugnummer), + ArrStation = leg.Arr.Name, + ArrStationId = int.Parse(leg.Arr.BhfNr), + ArrTime = leg.Arr.Date.Replace("00:00:00", leg.Arr.Time), + DepStation = leg.Dep.Name, + DepStationId = int.Parse(leg.Dep.BhfNr), + DepTime = leg.Dep.Date.Replace("00:00:00", leg.Dep.Time), + TicketId = ticketId + }); + + lastticketleg = db.InsertWithInt32Identity(new TicketLeg { + TicketId = ticketId, + TrainType = leg.Gattung, + TrainNr = int.Parse(leg.Zugnummer), + ArrStation = leg.Arr.Name, + ArrStationId = int.Parse(leg.Arr.BhfNr), + ArrTime = leg.Arr.Date.Replace("00:00:00", leg.Arr.Time), + DepStation = leg.Dep.Name, + DepStationId = int.Parse(leg.Dep.BhfNr), + DepTime = leg.Dep.Date.Replace("00:00:00", leg.Dep.Time) + }); + } + + if (parsed.Rporderdetails.Order.Schedulelist.Ret != null) { + db.Insert(new Leg { + TripId = tripId, + UserId = int.Parse(HttpContext.Session.GetString("uid")), + TrainType = "placeholder", + TrainNr = lastleg, + ArrStation = "_", + ArrStationId = 0, + ArrTime = "_", + DepStation = "_", + DepStationId = 0, + DepTime = db.Legs.First(p => p.LegId == lastleg).DepTime + "_placeholder" + }); + + db.Insert(new TicketLeg { + TicketId = ticketId2 ?? ticketId, + TrainType = "placeholder", + TrainNr = lastticketleg, + ArrStation = "_", + ArrStationId = 0, + ArrTime = "_", + DepStation = "_", + DepStationId = 0, + DepTime = db.TicketLegs.First(p => p.TicketLegId == lastticketleg).DepTime + "_placeholder" + }); + + foreach (var leg in parsed.Rporderdetails.Order.Schedulelist.Ret.Trainlist.Train) { db.InsertWithInt32Identity(new Leg { TripId = tripId, UserId = int.Parse(HttpContext.Session.GetString("uid")), @@ -153,53 +232,24 @@ namespace bahnplan.web.Pages { DepStation = leg.Dep.Name, DepStationId = int.Parse(leg.Dep.BhfNr), DepTime = leg.Dep.Date.Replace("00:00:00", leg.Dep.Time), - TicketId = ticketId + TicketId = ticketId2 ?? ticketId }); db.InsertWithInt32Identity(new TicketLeg { - TicketId = ticketId, - TrainType = leg.Gattung, - TrainNr = int.Parse(leg.Zugnummer), - ArrStation = leg.Arr.Name, - ArrStationId = int.Parse(leg.Arr.BhfNr), - ArrTime = leg.Arr.Date.Replace("00:00:00", leg.Arr.Time), - DepStation = leg.Dep.Name, - DepStationId = int.Parse(leg.Dep.BhfNr), - DepTime = leg.Dep.Date.Replace("00:00:00", leg.Dep.Time) - }); + TicketId = ticketId2 ?? ticketId, + TrainType = leg.Gattung, + TrainNr = int.Parse(leg.Zugnummer), + ArrStation = leg.Arr.Name, + ArrStationId = int.Parse(leg.Arr.BhfNr), + ArrTime = leg.Arr.Date.Replace("00:00:00", leg.Arr.Time), + DepStation = leg.Dep.Name, + DepStationId = int.Parse(leg.Dep.BhfNr), + DepTime = leg.Dep.Date.Replace("00:00:00", leg.Dep.Time) + }); } - - if (parsed.Rporderdetails.Order.Schedulelist.Ret != null) - foreach (var leg in parsed.Rporderdetails.Order.Schedulelist.Ret.Trainlist.Train) { - db.InsertWithInt32Identity(new Leg { - TripId = tripId, - UserId = int.Parse(HttpContext.Session.GetString("uid")), - TrainType = leg.Gattung, - TrainNr = int.Parse(leg.Zugnummer), - ArrStation = leg.Arr.Name, - ArrStationId = int.Parse(leg.Arr.BhfNr), - ArrTime = leg.Arr.Date.Replace("00:00:00", leg.Arr.Time), - DepStation = leg.Dep.Name, - DepStationId = int.Parse(leg.Dep.BhfNr), - DepTime = leg.Dep.Date.Replace("00:00:00", leg.Dep.Time), - TicketId = ticketId2 ?? ticketId - }); - - db.InsertWithInt32Identity(new TicketLeg { - TicketId = ticketId2 ?? ticketId, - TrainType = leg.Gattung, - TrainNr = int.Parse(leg.Zugnummer), - ArrStation = leg.Arr.Name, - ArrStationId = int.Parse(leg.Arr.BhfNr), - ArrTime = leg.Arr.Date.Replace("00:00:00", leg.Arr.Time), - DepStation = leg.Dep.Name, - DepStationId = int.Parse(leg.Dep.BhfNr), - DepTime = leg.Dep.Date.Replace("00:00:00", leg.Dep.Time) - }); - } - - TripId = tripId; } + + TripId = tripId; } } -} \ No newline at end of file +}