This repository has been archived on 2023-04-02. You can view files and clone it, but cannot push or open issues or pull requests.
trainav/bahnplan.web/Pages/Ticket.cshtml.cs
2020-06-12 18:19:28 +02:00

117 lines
4.6 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using bahnplan.web.database;
using bahnplan.web.database.Tables;
using bahnplan.web.JSON;
using LinqToDB;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Leg = bahnplan.web.database.Tables.Leg;
namespace bahnplan.web.Pages {
public class TicketModel : PageModel {
public int TripId;
public void OnGet() {
if (HttpContext.Session.GetString("authorized") != "true") {
return;
}
using var db = new Database.DbConn();
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;
foreach (var leg in db.TicketLegs.Where(p => p.TicketId == ticketId).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 = 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);
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.InsertWithInt32Identity(new Ticket {
OrderId = Request.Query["order"],
TicketInfo = parsed.Rporderdetails.Order.Tcklist.Tck.Mtk.Txt,
TicketQr = parsed.Rporderdetails.Order.Tcklist.Tck.Htdata.Ht.First(p => p.Name == "barcode").Text,
TicketSecCode = parsed.Rporderdetails.Order.Tcklist.Tck.Htdata.Ht.First(p => p.Name == "sichtmerkmal").Text,
UserId = int.Parse(HttpContext.Session.GetString("uid")),
TicketPkPass = parsed.Rporderdetails.Order.Tcklist.Tck.Htdata.Ht.First(p => p.Name == "pass").Text, // application/vnd.apple.pkpass;base64
Traveller = parsed.Rporderdetails.Order.Tcklist.Tck.Mtk.ReisenderVorname
+ " "
+ parsed.Rporderdetails.Order.Tcklist.Tck.Mtk.ReisenderNachname,
});
foreach (var leg in parsed.Rporderdetails.Order.Schedulelist.Out.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 = 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),
});
}
TripId = tripId;
}
}
}
}