Code cleanup

This commit is contained in:
Laura Hausmann 2022-05-03 00:20:02 +02:00
parent ec16ec5def
commit 6ab3774228
Signed by: zotan
GPG key ID: D044E84C5BE01605
28 changed files with 699 additions and 721 deletions

View file

@ -1,21 +1,21 @@
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace trainav.web.Controllers { namespace trainav.web.Controllers;
[ApiController, Route("api/[controller]")]
public class TestController : ControllerBase { [ApiController, Route("api/[controller]")]
[HttpGet] public class TestController : ControllerBase {
public ApiResponse Get() => new ApiResponse("test", 4); [HttpGet]
public ApiResponse Get() => new("test", 4);
}
[SuppressMessage("ReSharper", "UnusedAutoPropertyAccessor.Global")]
public class ApiResponse {
public ApiResponse(string string1, int int1) {
String1 = string1;
Int1 = int1;
} }
[SuppressMessage("ReSharper", "UnusedAutoPropertyAccessor.Global")] public string String1 { get; }
public class ApiResponse { public int Int1 { get; }
public ApiResponse(string string1, int int1) {
String1 = string1;
Int1 = int1;
}
public string String1 { get; }
public int Int1 { get; }
}
} }

View file

@ -6,100 +6,100 @@ using LinqToDB.Data;
using trainav.web.database; using trainav.web.database;
using trainav.web.database.Tables; using trainav.web.database.Tables;
namespace trainav.web { namespace trainav.web;
public static class Migrations {
private const int DbVer = 1;
private static readonly List<Migration> _migrations = new() { public static class Migrations {
new Migration(1, private const int DbVer = 1;
"CREATE TEMPORARY TABLE Tickets_backup(\"TicketID\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, \"UserID\" INTEGER NOT NULL, \"OrderID\" TEXT NOT NULL UNIQUE, \"TicketInfo\" TEXT NOT NULL, \"TicketQR\" BLOB NOT NULL, \"TicketPkPass\" BLOB NOT NULL, \"TicketSecCode\" BLOB NOT NULL, \"Traveller\" TEXT)"),
new Migration(1, "INSERT INTO Tickets_backup SELECT TicketID, UserID, OrderID, TicketInfo, TicketQR, TicketPkPass, TicketSecCode, Traveller FROM Tickets"),
new Migration(1, "DROP Table Tickets"),
new Migration(1,
"CREATE TABLE Tickets(\"TicketID\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, \"UserID\" INTEGER NOT NULL, \"OrderID\" TEXT NOT NULL UNIQUE, \"TicketInfo\" TEXT NOT NULL, \"TicketQR\" BLOB NOT NULL, \"TicketPkPass\" BLOB, \"TicketSecCode\" BLOB NOT NULL, \"Traveller\" TEXT)"),
new Migration(1, "INSERT INTO Tickets SELECT TicketID, UserID, OrderID, TicketInfo, TicketQR, TicketPkPass, TicketSecCode, Traveller FROM Tickets_backup"),
new Migration(1, "DROP TABLE Tickets_backup")
};
public static void RunMigrations() { private static readonly List<Migration> _migrations = new() {
using var db = new Database.DbConn(); new Migration(1,
var ccolor = Console.ForegroundColor; "CREATE TEMPORARY TABLE Tickets_backup(\"TicketID\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, \"UserID\" INTEGER NOT NULL, \"OrderID\" TEXT NOT NULL UNIQUE, \"TicketInfo\" TEXT NOT NULL, \"TicketQR\" BLOB NOT NULL, \"TicketPkPass\" BLOB NOT NULL, \"TicketSecCode\" BLOB NOT NULL, \"Traveller\" TEXT)"),
new Migration(1, "INSERT INTO Tickets_backup SELECT TicketID, UserID, OrderID, TicketInfo, TicketQR, TicketPkPass, TicketSecCode, Traveller FROM Tickets"),
new Migration(1, "DROP Table Tickets"),
new Migration(1,
"CREATE TABLE Tickets(\"TicketID\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, \"UserID\" INTEGER NOT NULL, \"OrderID\" TEXT NOT NULL UNIQUE, \"TicketInfo\" TEXT NOT NULL, \"TicketQR\" BLOB NOT NULL, \"TicketPkPass\" BLOB, \"TicketSecCode\" BLOB NOT NULL, \"Traveller\" TEXT)"),
new Migration(1, "INSERT INTO Tickets SELECT TicketID, UserID, OrderID, TicketInfo, TicketQR, TicketPkPass, TicketSecCode, Traveller FROM Tickets_backup"),
new Migration(1, "DROP TABLE Tickets_backup")
};
if (!db.DataProvider.GetSchemaProvider().GetSchema(db).Tables.Any()) { public static void RunMigrations() {
Console.ForegroundColor = ConsoleColor.DarkCyan; using var db = new Database.DbConn();
Console.Write("Running migration: "); var ccolor = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Initialize Database");
db.CreateTable<DbInfo>();
db.CreateTable<Card>();
db.CreateTable<Leg>();
db.CreateTable<Ticket>();
db.CreateTable<TicketLeg>();
db.CreateTable<Trip>();
db.CreateTable<User>();
db.InsertWithIdentity(new DbInfo { DbVer = DbVer });
}
else if (db.DataProvider.GetSchemaProvider().GetSchema(db).Tables.All(t => t.TableName != "DbInfo")) {
db.CreateTable<DbInfo>();
db.InsertWithIdentity(new DbInfo { DbVer = 0 });
}
if (!db.DataProvider.GetSchemaProvider().GetSchema(db).Tables.Any()) {
Console.ForegroundColor = ConsoleColor.DarkCyan;
Console.Write("Running migration: ");
Console.ForegroundColor = ConsoleColor.Yellow; Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine($"Database version: {db.DbInfo.ToList().First().DbVer}"); Console.WriteLine("Initialize Database");
var migrationsToRun = _migrations.FindAll(p => p.IntroducedWithDbVer > db.DbInfo.First().DbVer); db.CreateTable<DbInfo>();
if (migrationsToRun.Count == 0) { db.CreateTable<Card>();
Console.ForegroundColor = ConsoleColor.Green; db.CreateTable<Leg>();
Console.WriteLine("No migrations to run."); db.CreateTable<Ticket>();
} db.CreateTable<TicketLeg>();
else { db.CreateTable<Trip>();
new Migration(0, "BEGIN TRANSACTION").Run(db); db.CreateTable<User>();
try {
migrationsToRun.ForEach(p => p.Run(db));
}
catch {
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.WriteLine($"Migrating to database version {DbVer} failed.");
new Migration(0, "ROLLBACK TRANSACTION").Run(db);
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine("Rolled back migrations.");
Environment.Exit(1);
}
new Migration(0, "COMMIT TRANSACTION").Run(db); db.InsertWithIdentity(new DbInfo { DbVer = DbVer });
}
var newdb = new Database.DbConn(); else if (db.DataProvider.GetSchemaProvider().GetSchema(db).Tables.All(t => t.TableName != "DbInfo")) {
var dbinfo = newdb.DbInfo.First(); db.CreateTable<DbInfo>();
dbinfo.DbVer = DbVer; db.InsertWithIdentity(new DbInfo { DbVer = 0 });
newdb.Update(dbinfo);
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.WriteLine($"Database version is now: {DbVer}");
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Finished running migrations.");
}
Console.ForegroundColor = ccolor;
} }
private class Migration { Console.ForegroundColor = ConsoleColor.Yellow;
private readonly string _sql; Console.WriteLine($"Database version: {db.DbInfo.ToList().First().DbVer}");
public readonly int IntroducedWithDbVer;
public Migration(int introducedWithDbVer, string sql) { var migrationsToRun = _migrations.FindAll(p => p.IntroducedWithDbVer > db.DbInfo.First().DbVer);
IntroducedWithDbVer = introducedWithDbVer; if (migrationsToRun.Count == 0) {
_sql = sql; Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("No migrations to run.");
}
else {
new Migration(0, "BEGIN TRANSACTION").Run(db);
try {
migrationsToRun.ForEach(p => p.Run(db));
}
catch {
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.WriteLine($"Migrating to database version {DbVer} failed.");
new Migration(0, "ROLLBACK TRANSACTION").Run(db);
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine("Rolled back migrations.");
Environment.Exit(1);
} }
public void Run(DataConnection db) { new Migration(0, "COMMIT TRANSACTION").Run(db);
Console.ForegroundColor = ConsoleColor.DarkCyan;
Console.Write("Running migration: "); var newdb = new Database.DbConn();
Console.ForegroundColor = ConsoleColor.Yellow; var dbinfo = newdb.DbInfo.First();
Console.WriteLine(_sql); dbinfo.DbVer = DbVer;
db.Execute(_sql); newdb.Update(dbinfo);
}
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.WriteLine($"Database version is now: {DbVer}");
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Finished running migrations.");
}
Console.ForegroundColor = ccolor;
}
private class Migration {
private readonly string _sql;
public readonly int IntroducedWithDbVer;
public Migration(int introducedWithDbVer, string sql) {
IntroducedWithDbVer = introducedWithDbVer;
_sql = sql;
}
public void Run(DataConnection db) {
Console.ForegroundColor = ConsoleColor.DarkCyan;
Console.Write("Running migration: ");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine(_sql);
db.Execute(_sql);
} }
} }
} }

View file

@ -11,58 +11,55 @@ using trainav.web.database.Tables;
using trainav.web.JSON.CardResponse; using trainav.web.JSON.CardResponse;
using trainav.web.JSON.ListOrdersResponse; using trainav.web.JSON.ListOrdersResponse;
namespace trainav.web.Pages { namespace trainav.web.Pages;
public class CardModel : PageModel {
public void OnPost() {
if (HttpContext.Session.GetString("authorized") != "true")
return;
using var db = new Database.DbConn(); public class CardModel : PageModel {
var request = new XDocument(new XElement("rqorderheadlist", public void OnPost() {
new XElement("rqheader", new XAttribute("ts", "2020-02-19T15:59:00"), new XAttribute("l", "de"), if (HttpContext.Session.GetString("authorized") != "true")
new XAttribute("v", "19120000"), new XAttribute("d", "iPad7,5"), return;
new XAttribute("os", "iOS_13.3.1"), new XAttribute("app", "NAVIGATOR")),
new XElement("authlogin", new XAttribute("user", Request.Form["user"]), using var db = new Database.DbConn();
new XAttribute("pw", Request.Form["pass"]), var request = new XDocument(new XElement("rqorderheadlist",
new XElement("sso", new XAttribute("genToken", "FALSE"))), new XElement("rqheader", new XAttribute("ts", "2020-02-19T15:59:00"), new XAttribute("l", "de"), new XAttribute("v", "19120000"),
new XElement("criteria", new XAttribute("validonly", "0")))).ToString(); new XAttribute("d", "iPad7,5"), new XAttribute("os", "iOS_13.3.1"), new XAttribute("app", "NAVIGATOR")),
var response = new WebClient().UploadString("https://fahrkarten.bahn.de/mobile/dbc/xs.go", "POST", request); new XElement("authlogin", new XAttribute("user", Request.Form["user"]), new XAttribute("pw", Request.Form["pass"]),
var xmlobj = new XmlDocument(); new XElement("sso", new XAttribute("genToken", "FALSE"))),
new XElement("criteria", new XAttribute("validonly", "0")))).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 = ListOrdersResponse.FromJson(json);
foreach (var order in parsed.Rporderheadlist.Orderheadlist.Orderhead.Where(order => order.On.StartsWith("EBC_"))) {
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", order.On)), new XElement("authname", new XAttribute("tln", Request.Form["name"]))))
.ToString();
response = new WebClient().UploadString("https://fahrkarten.bahn.de/mobile/dbc/xs.go", "POST", request);
xmlobj = new XmlDocument();
xmlobj.LoadXml(response); xmlobj.LoadXml(response);
var json = JsonConvert.SerializeXmlNode(xmlobj); json = JsonConvert.SerializeXmlNode(xmlobj);
var parsed = ListOrdersResponse.FromJson(json); var parsedCard = CardResponse.FromJson(json);
foreach (var order in parsed.Rporderheadlist.Orderheadlist.Orderhead.Where(order => order.On.StartsWith("EBC_"))) { db.InsertWithInt32Identity(new Card {
request = new XDocument(new XElement("rqorderdetails", new XAttribute("version", "1.0"), OrderId = order.On,
new XElement("rqheader", new XAttribute("ts", "2019-10-31T23:20:48"), new XAttribute("l", "de"), UserId = int.Parse(HttpContext.Session.GetString("uid")),
new XAttribute("v", "19100000"), new XAttribute("d", "iPad7,5"), Class = int.Parse(parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "klasse").Text),
new XAttribute("os", "iOS_13.1.3"), new XAttribute("app", "NAVIGATOR")), Value = int.Parse(parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "rbs").Text),
new XElement("rqorder", new XAttribute("on", order.On)), CardNumber = parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "bcnummer").Text,
new XElement("authname", new XAttribute("tln", Request.Form["name"])))).ToString(); CardInfo = parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Txt,
CardQr = parsedCard.Rporderdetails.Order.Tcklist.Tck.Htdata.Ht.First(p => p.Name == "barcode").Text,
response = new WebClient().UploadString("https://fahrkarten.bahn.de/mobile/dbc/xs.go", "POST", request); CardSecCode = parsedCard.Rporderdetails.Order.Tcklist.Tck.Htdata.Ht.First(p => p.Name == "sichtmerkmal").Text,
xmlobj = new XmlDocument(); CardImage = parsedCard.Rporderdetails.Order.Tcklist.Tck.Bahncardimage.CdataSection,
xmlobj.LoadXml(response); Traveller = parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "inhaber").Text,
json = JsonConvert.SerializeXmlNode(xmlobj); ValidFrom = parsedCard.Rporderdetails.Order.Vfrom,
var parsedCard = CardResponse.FromJson(json); ValidTo = parsedCard.Rporderdetails.Order.Vto,
QrValidFrom = parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "ebcbarcodegueltigab").Text,
db.InsertWithInt32Identity(new Card { QrValidTo = parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "ebcbarcodegueltigbis").Text
OrderId = order.On, });
UserId = int.Parse(HttpContext.Session.GetString("uid")),
Class = int.Parse(parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "klasse").Text),
Value = int.Parse(parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "rbs").Text),
CardNumber = parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "bcnummer").Text,
CardInfo = parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Txt,
CardQr = parsedCard.Rporderdetails.Order.Tcklist.Tck.Htdata.Ht.First(p => p.Name == "barcode").Text,
CardSecCode = parsedCard.Rporderdetails.Order.Tcklist.Tck.Htdata.Ht.First(p => p.Name == "sichtmerkmal").Text,
CardImage = parsedCard.Rporderdetails.Order.Tcklist.Tck.Bahncardimage.CdataSection,
Traveller = parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "inhaber").Text,
ValidFrom = parsedCard.Rporderdetails.Order.Vfrom,
ValidTo = parsedCard.Rporderdetails.Order.Vto,
QrValidFrom = parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "ebcbarcodegueltigab").Text,
QrValidTo = parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "ebcbarcodegueltigbis").Text
});
}
} }
} }
} }

View file

@ -11,45 +11,44 @@ using trainav.web.database;
using trainav.web.database.Tables; using trainav.web.database.Tables;
using trainav.web.JSON.CardResponse; using trainav.web.JSON.CardResponse;
namespace trainav.web.Pages { namespace trainav.web.Pages;
public class CardsModel : PageModel {
public List<Card> Cards;
public void OnGet() { public class CardsModel : PageModel {
if (HttpContext.Session.GetString("authorized") != "true") public List<Card> Cards;
public void OnGet() {
if (HttpContext.Session.GetString("authorized") != "true")
return;
using var db = new Database.DbConn();
if (Request.Query.ContainsKey("refresh")) {
var card = db.Cards.First(p => p.CardId == int.Parse(Request.Query["refresh"]));
if (card.UserId != int.Parse(HttpContext.Session.GetString("uid")))
return; return;
using var db = new Database.DbConn(); 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", card.OrderId)),
new XElement("authname", new XAttribute("tln", card.Traveller.Split(" ").Last())))).ToString();
if (Request.Query.ContainsKey("refresh")) { var response = new WebClient().UploadString("https://fahrkarten.bahn.de/mobile/dbc/xs.go", "POST", request);
var card = db.Cards.First(p => p.CardId == int.Parse(Request.Query["refresh"])); var xmlobj = new XmlDocument();
if (card.UserId != int.Parse(HttpContext.Session.GetString("uid"))) xmlobj.LoadXml(response);
return; var json = JsonConvert.SerializeXmlNode(xmlobj);
var parsedCard = CardResponse.FromJson(json);
var request = new XDocument(new XElement("rqorderdetails", new XAttribute("version", "1.0"), card.CardQr = parsedCard.Rporderdetails.Order.Tcklist.Tck.Htdata.Ht.First(p => p.Name == "barcode").Text;
new XElement("rqheader", new XAttribute("ts", "2019-10-31T23:20:48"), new XAttribute("l", "de"), card.CardSecCode = parsedCard.Rporderdetails.Order.Tcklist.Tck.Htdata.Ht.First(p => p.Name == "sichtmerkmal").Text;
new XAttribute("v", "19100000"), new XAttribute("d", "iPad7,5"), card.CardImage = parsedCard.Rporderdetails.Order.Tcklist.Tck.Bahncardimage.CdataSection;
new XAttribute("os", "iOS_13.1.3"), new XAttribute("app", "NAVIGATOR")), card.QrValidFrom = parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "ebcbarcodegueltigab").Text;
new XElement("rqorder", new XAttribute("on", card.OrderId)), card.QrValidTo = parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "ebcbarcodegueltigbis").Text;
new XElement("authname", new XAttribute("tln", card.Traveller.Split(" ").Last())))).ToString();
var response = new WebClient().UploadString("https://fahrkarten.bahn.de/mobile/dbc/xs.go", "POST", request); db.Update(card);
var xmlobj = new XmlDocument(); return;
xmlobj.LoadXml(response);
var json = JsonConvert.SerializeXmlNode(xmlobj);
var parsedCard = CardResponse.FromJson(json);
card.CardQr = parsedCard.Rporderdetails.Order.Tcklist.Tck.Htdata.Ht.First(p => p.Name == "barcode").Text;
card.CardSecCode = parsedCard.Rporderdetails.Order.Tcklist.Tck.Htdata.Ht.First(p => p.Name == "sichtmerkmal").Text;
card.CardImage = parsedCard.Rporderdetails.Order.Tcklist.Tck.Bahncardimage.CdataSection;
card.QrValidFrom = parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "ebcbarcodegueltigab").Text;
card.QrValidTo = parsedCard.Rporderdetails.Order.Tcklist.Tck.Mtk.Nvplist.Nvp.First(p => p.Name == "ebcbarcodegueltigbis").Text;
db.Update(card);
return;
}
Cards = db.Cards.Where(p => p.UserId == int.Parse(HttpContext.Session.GetString("uid"))).ToList();
} }
Cards = db.Cards.Where(p => p.UserId == int.Parse(HttpContext.Session.GetString("uid"))).ToList();
} }
} }

View file

@ -5,81 +5,78 @@ using Microsoft.AspNetCore.Mvc.RazorPages;
using trainav.web.database; using trainav.web.database;
using trainav.web.database.Tables; using trainav.web.database.Tables;
namespace trainav.web.Pages { namespace trainav.web.Pages;
public class DeleteModel : PageModel {
public User AuthorizedUser;
public void OnGet() { public class DeleteModel : PageModel {
if (HttpContext.Session.GetString("authorized") != "true") public User AuthorizedUser;
return;
if (!Request.Query.ContainsKey("confirm") || Request.Query["confirm"] != "true") public void OnGet() {
return; if (HttpContext.Session.GetString("authorized") != "true")
return;
var uid = int.Parse(HttpContext.Session.GetString("uid")); if (!Request.Query.ContainsKey("confirm") || Request.Query["confirm"] != "true")
using var db = new Database.DbConn(); return;
AuthorizedUser = db.Users.FirstOrDefault(p => p.UserId == uid);
var id = int.Parse(Request.Query["id"]);
switch (Request.Query["item"]) { var uid = int.Parse(HttpContext.Session.GetString("uid"));
case "trip": { using var db = new Database.DbConn();
var trip = db.Trips.First(p => p.TripId == id); AuthorizedUser = db.Users.FirstOrDefault(p => p.UserId == uid);
if (trip.UserId != int.Parse(HttpContext.Session.GetString("uid"))) var id = int.Parse(Request.Query["id"]);
return;
db.Trips.Delete(p => p.TripId == id); switch (Request.Query["item"]) {
db.Legs.Delete(p => p.TripId == id); case "trip": {
break; var trip = db.Trips.First(p => p.TripId == id);
} if (trip.UserId != int.Parse(HttpContext.Session.GetString("uid")))
case "leg": { return;
var leg = db.Legs.First(p => p.LegId == id);
if (leg.UserId != int.Parse(HttpContext.Session.GetString("uid")))
return;
var tripid = db.Legs.First(p => p.LegId == id).TripId; db.Trips.Delete(p => p.TripId == id);
db.Legs.Delete(p => p.TripId == id);
break;
}
case "leg": {
var leg = db.Legs.First(p => p.LegId == id);
if (leg.UserId != int.Parse(HttpContext.Session.GetString("uid")))
return;
db.Legs.Delete(p => p.LegId == id); var tripid = db.Legs.First(p => p.LegId == id).TripId;
if (!db.Legs.Any(p => p.TripId == tripid)) db.Legs.Delete(p => p.LegId == id);
db.Trips.Delete(p => p.TripId == tripid);
else if (db.Legs.Where(p => p.TripId == tripid).OrderBy(p => p.DepTime).First().DepTime.EndsWith("placeholder"))
db.Delete(db.Legs.Where(p => p.TripId == tripid).OrderBy(p => p.DepTime).First());
else if (db.Legs.Where(p => p.TripId == tripid).OrderByDescending(p => p.DepTime).First().DepTime.EndsWith("placeholder"))
db.Delete(db.Legs.Where(p => p.TripId == tripid).OrderByDescending(p => p.DepTime).First());
var failsafe = false; if (!db.Legs.Any(p => p.TripId == tripid))
foreach (var failsafeleg in db.Legs.Where(p => p.TripId == tripid).OrderBy(p => p.DepTime).ToList()) { db.Trips.Delete(p => p.TripId == tripid);
if (failsafeleg.DepTime.EndsWith("placeholder")) { else if (db.Legs.Where(p => p.TripId == tripid).OrderBy(p => p.DepTime).First().DepTime.EndsWith("placeholder"))
if (failsafe == false) { db.Delete(db.Legs.Where(p => p.TripId == tripid).OrderBy(p => p.DepTime).First());
failsafe = true; else if (db.Legs.Where(p => p.TripId == tripid).OrderByDescending(p => p.DepTime).First().DepTime.EndsWith("placeholder"))
} db.Delete(db.Legs.Where(p => p.TripId == tripid).OrderByDescending(p => p.DepTime).First());
else {
db.Legs.Delete(p => p.LegId == failsafeleg.LegId); var failsafe = false;
} foreach (var failsafeleg in db.Legs.Where(p => p.TripId == tripid).OrderBy(p => p.DepTime).ToList())
} if (failsafeleg.DepTime.EndsWith("placeholder")) {
else { if (failsafe == false)
failsafe = false; failsafe = true;
} else
db.Legs.Delete(p => p.LegId == failsafeleg.LegId);
}
else {
failsafe = false;
} }
break; break;
} }
case "ticket": { case "ticket": {
var leg = db.Legs.First(p => p.LegId == id); var leg = db.Legs.First(p => p.LegId == id);
if (leg.UserId != int.Parse(HttpContext.Session.GetString("uid"))) if (leg.UserId != int.Parse(HttpContext.Session.GetString("uid")))
return; return;
db.Legs.Where(p => p.LegId == id).Set(p => p.TicketId, 0).Update(); db.Legs.Where(p => p.LegId == id).Set(p => p.TicketId, 0).Update();
break; break;
} }
case "card": { case "card": {
var card = db.Cards.First(p => p.CardId == id); var card = db.Cards.First(p => p.CardId == id);
if (card.UserId != int.Parse(HttpContext.Session.GetString("uid"))) if (card.UserId != int.Parse(HttpContext.Session.GetString("uid")))
return; return;
db.Cards.Delete(p => p.CardId == id); db.Cards.Delete(p => p.CardId == id);
break; break;
}
} }
} }
} }

View file

@ -3,19 +3,19 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace trainav.web.Pages { namespace trainav.web.Pages;
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public class ErrorModel : PageModel {
private readonly ILogger<ErrorModel> _logger;
public ErrorModel(ILogger<ErrorModel> logger) => _logger = logger; [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public class ErrorModel : PageModel {
private readonly ILogger<ErrorModel> _logger;
public string RequestId { get; set; } public ErrorModel(ILogger<ErrorModel> logger) => _logger = logger;
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); public string RequestId { get; set; }
public void OnGet() { public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
} public void OnGet() {
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
} }
} }

View file

@ -14,30 +14,31 @@ using trainav.web.database;
using trainav.web.database.Tables; using trainav.web.database.Tables;
using Calendar = Ical.Net.Calendar; using Calendar = Ical.Net.Calendar;
namespace trainav.web.Pages { namespace trainav.web.Pages;
public class GenIcs : PageModel {
public string IcsOutput;
public List<Leg> Legs;
public new string User;
public void OnGet() { public class GenIcs : PageModel {
using var db = new Database.DbConn(); public string IcsOutput;
public List<Leg> Legs;
public new string User;
if (!db.Legs.Any(p => p.TripId == int.Parse(Request.Query["id"]))) { public void OnGet() {
IcsOutput = ""; using var db = new Database.DbConn();
return;
}
Legs = db.Legs.Where(p => p.TripId == int.Parse(Request.Query["id"])).OrderBy(p => p.DepTime).ToList(); if (!db.Legs.Any(p => p.TripId == int.Parse(Request.Query["id"]))) {
User = db.Users.First(p => p.UserId == Legs.First().UserId).Username; IcsOutput = "";
if (Request.Query["user"] != User) { return;
IcsOutput = ""; }
return;
}
List<Ds100object> ds100Mapping; Legs = db.Legs.Where(p => p.TripId == int.Parse(Request.Query["id"])).OrderBy(p => p.DepTime).ToList();
User = db.Users.First(p => p.UserId == Legs.First().UserId).Username;
if (Request.Query["user"] != User) {
IcsOutput = "";
return;
}
using (var reader = new StreamReader("ds100.csv")) List<Ds100object> ds100Mapping;
using (var reader = new StreamReader("ds100.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) { using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) {
csv.Configuration.Delimiter = ";"; csv.Configuration.Delimiter = ";";
csv.Configuration.Encoding = Encoding.UTF8; csv.Configuration.Encoding = Encoding.UTF8;
@ -45,60 +46,51 @@ namespace trainav.web.Pages {
ds100Mapping = csv.GetRecords<Ds100object>().ToList(); ds100Mapping = csv.GetRecords<Ds100object>().ToList();
} }
var calendar = new Calendar(); var calendar = new Calendar();
foreach (var leg in Legs.Where(p => p.TrainType != "placeholder")) { foreach (var leg in Legs.Where(p => p.TrainType != "placeholder")) {
var depst = ds100Mapping.Where(p => p.Station == leg.DepStation) var depst = ds100Mapping.Where(p => p.Station == leg.DepStation).DefaultIfEmpty(new Ds100object { Station = leg.DepStation, Ds100 = leg.DepStation }).First().Ds100;
.DefaultIfEmpty(new Ds100object {Station = leg.DepStation, Ds100 = leg.DepStation}) var arrst = ds100Mapping.Where(p => p.Station == leg.ArrStation).DefaultIfEmpty(new Ds100object { Station = leg.ArrStation, Ds100 = leg.ArrStation }).First().Ds100;
.First() var title = $"{depst} -> {arrst} ({leg.TrainType} {leg.TrainNr})";
.Ds100; var e = new CalendarEvent { Summary = title, Start = new CalDateTime(DateTime.Parse(leg.DepTime)), End = new CalDateTime(DateTime.Parse(leg.ArrTime)) };
var arrst = ds100Mapping.Where(p => p.Station == leg.ArrStation)
.DefaultIfEmpty(new Ds100object {Station = leg.ArrStation, Ds100 = leg.ArrStation})
.First()
.Ds100;
var title = $"{depst} -> {arrst} ({leg.TrainType} {leg.TrainNr})";
var e = new CalendarEvent {
Summary = title, Start = new CalDateTime(DateTime.Parse(leg.DepTime)), End = new CalDateTime(DateTime.Parse(leg.ArrTime))
};
if (!string.IsNullOrWhiteSpace(leg.Comment)) if (!string.IsNullOrWhiteSpace(leg.Comment))
e.Description = e.Description = leg.Comment
leg.Comment + "\n"
+ "\n" + "\n"
+ "\n" + $"https://marudor.de/details/{leg.TrainType}{leg.TrainNr}/{DateTime.Parse(leg.DepTime).ToUniversalTime().Subtract(new DateTime(1970, 1, 1)).TotalSeconds}000/?station={leg.DepStationId}";
+ $"https://marudor.de/details/{leg.TrainType}{leg.TrainNr}/{DateTime.Parse(leg.DepTime).ToUniversalTime().Subtract(new DateTime(1970, 1, 1)).TotalSeconds}000/?station={leg.DepStationId}";
else else
e.Description = $"https://marudor.de/details/{leg.TrainType}{leg.TrainNr}/{DateTime.Parse(leg.DepTime).ToUniversalTime().Subtract(new DateTime(1970, 1, 1)).TotalSeconds}000/?station={leg.DepStationId}"; e.Description =
$"https://marudor.de/details/{leg.TrainType}{leg.TrainNr}/{DateTime.Parse(leg.DepTime).ToUniversalTime().Subtract(new DateTime(1970, 1, 1)).TotalSeconds}000/?station={leg.DepStationId}";
calendar.Events.Add(e); calendar.Events.Add(e);
}
var serializer = new CalendarSerializer();
IcsOutput = serializer.SerializeToString(calendar);
} }
private class Ds100object { var serializer = new CalendarSerializer();
[Name("Bundesland")] public string Bundesland { get; set; } IcsOutput = serializer.SerializeToString(calendar);
}
[Name("RB")] public string Regionalbereich { get; set; } private class Ds100object {
[Name("Bundesland")] public string Bundesland { get; set; }
[Name("BM")] public string Bahnhofsmanagement { get; set; } [Name("RB")] public string Regionalbereich { get; set; }
[Name("Bf. Nr.")] public string BfNr { get; set; } [Name("BM")] public string Bahnhofsmanagement { get; set; }
[Name("Station")] public string Station { get; set; } [Name("Bf. Nr.")] public string BfNr { get; set; }
[Name("Bf DS 100Abk.")] public string Ds100 { get; set; } [Name("Station")] public string Station { get; set; }
[Name("Kat. Vst")] public string Kategorie { get; set; } [Name("Bf DS 100Abk.")] public string Ds100 { get; set; }
[Name("Straße")] public string Strasse { get; set; } [Name("Kat. Vst")] public string Kategorie { get; set; }
[Name("PLZ")] public string Plz { get; set; } [Name("Straße")] public string Strasse { get; set; }
[Name("Ort")] public string Ort { get; set; } [Name("PLZ")] public string Plz { get; set; }
[Name("Aufgabenträger")] public string Verkehrsverbund { get; set; } [Name("Ort")] public string Ort { get; set; }
}
[Name("Aufgabenträger")] public string Verkehrsverbund { get; set; }
} }
} }

View file

@ -4,17 +4,17 @@ using Microsoft.AspNetCore.Mvc.RazorPages;
using trainav.web.database; using trainav.web.database;
using trainav.web.database.Tables; using trainav.web.database.Tables;
namespace trainav.web.Pages { namespace trainav.web.Pages;
public class IndexModel : PageModel {
public User AuthorizedUser;
public void OnGet() { public class IndexModel : PageModel {
if (HttpContext.Session.GetString("authorized") != "true") public User AuthorizedUser;
return;
var uid = int.Parse(HttpContext.Session.GetString("uid")); public void OnGet() {
using var db = new Database.DbConn(); if (HttpContext.Session.GetString("authorized") != "true")
AuthorizedUser = db.Users.FirstOrDefault(p => p.UserId == uid); return;
}
var uid = int.Parse(HttpContext.Session.GetString("uid"));
using var db = new Database.DbConn();
AuthorizedUser = db.Users.FirstOrDefault(p => p.UserId == uid);
} }
} }

View file

@ -6,24 +6,24 @@ using Microsoft.AspNetCore.Mvc.RazorPages;
using trainav.web.database; using trainav.web.database;
using trainav.web.database.Tables; using trainav.web.database.Tables;
namespace trainav.web.Pages { namespace trainav.web.Pages;
public class InspectionModel : PageModel {
public Leg Leg;
public Ticket Ticket;
public void OnGet() { public class InspectionModel : PageModel {
if (HttpContext.Session.GetString("authorized") != "true") public Leg Leg;
return; public Ticket Ticket;
using var db = new Database.DbConn(); public void OnGet() {
Leg = db.Legs.First(p => p.LegId == int.Parse(Request.Query["leg"])); if (HttpContext.Session.GetString("authorized") != "true")
Ticket = db.Tickets.First(p => p.TicketId == Leg.TicketId); return;
if (!Ticket.TicketQr.StartsWith("data:image/png")) using var db = new Database.DbConn();
Ticket.TicketQr = Encoding.UTF8.GetString(Convert.FromBase64String(Ticket.TicketQr)); Leg = db.Legs.First(p => p.LegId == int.Parse(Request.Query["leg"]));
Ticket = db.Tickets.First(p => p.TicketId == Leg.TicketId);
if (!Ticket.TicketSecCode.StartsWith("data:image/png")) if (!Ticket.TicketQr.StartsWith("data:image/png"))
Ticket.TicketSecCode = Encoding.UTF8.GetString(Convert.FromBase64String(Ticket.TicketSecCode)); Ticket.TicketQr = Encoding.UTF8.GetString(Convert.FromBase64String(Ticket.TicketQr));
}
if (!Ticket.TicketSecCode.StartsWith("data:image/png"))
Ticket.TicketSecCode = Encoding.UTF8.GetString(Convert.FromBase64String(Ticket.TicketSecCode));
} }
} }

View file

@ -7,47 +7,47 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
using trainav.web.database; using trainav.web.database;
namespace trainav.web.Pages { namespace trainav.web.Pages;
public class LoginModel : PageModel {
public void OnPost() {
if (!Request.HasFormContentType || string.IsNullOrWhiteSpace(Request.Form["user"]) || string.IsNullOrWhiteSpace(Request.Form["pass"]))
return;
using var db = new Database.DbConn(); public class LoginModel : PageModel {
var user = db.Users.FirstOrDefault(p => p.Username == Request.Form["user"].ToString() && p.Password == Request.Form["pass"].ToString().Sha256()); public void OnPost() {
if (user == null) if (!Request.HasFormContentType || string.IsNullOrWhiteSpace(Request.Form["user"]) || string.IsNullOrWhiteSpace(Request.Form["pass"]))
return; return;
var uid = user.UserId; using var db = new Database.DbConn();
HttpContext.Session.SetString("uid", uid.ToString()); var user = db.Users.FirstOrDefault(p => p.Username == Request.Form["user"].ToString() && p.Password == Request.Form["pass"].ToString().Sha256());
HttpContext.Session.SetString("authorized", "true"); if (user == null)
return;
//TODO var uid = user.UserId;
} HttpContext.Session.SetString("uid", uid.ToString());
HttpContext.Session.SetString("authorized", "true");
//TODO
}
}
public static class StringExtensions {
public static string Sha256(this string rawData) {
// Create a SHA256
using var sha256Hash = SHA256.Create();
// ComputeHash - returns byte array
var bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));
// Convert byte array to a string
var builder = new StringBuilder();
for (var i = 0; i < bytes.Length; i++)
builder.Append(bytes[i].ToString("x2"));
return builder.ToString();
} }
public static class StringExtensions { public static string Base64Encode(this string plainText) {
public static string Sha256(this string rawData) { var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
// Create a SHA256 return Convert.ToBase64String(plainTextBytes);
using var sha256Hash = SHA256.Create();
// ComputeHash - returns byte array
var bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));
// Convert byte array to a string
var builder = new StringBuilder();
for (var i = 0; i < bytes.Length; i++)
builder.Append(bytes[i].ToString("x2"));
return builder.ToString();
}
public static string Base64Encode(this string plainText) {
var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
return Convert.ToBase64String(plainTextBytes);
}
public static string UrlEncode(this string plainText) => HttpUtility.UrlEncode(plainText);
public static string Delimit(this string input, int max) => input.PadRight(max, ' ').Substring(0, max).TrimEnd();
} }
public static string UrlEncode(this string plainText) => HttpUtility.UrlEncode(plainText);
public static string Delimit(this string input, int max) => input.PadRight(max, ' ').Substring(0, max).TrimEnd();
} }

View file

@ -1,9 +1,9 @@
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
namespace trainav.web.Pages { namespace trainav.web.Pages;
public class LogoutModel : PageModel {
public void OnGet() { public class LogoutModel : PageModel {
HttpContext.Session.Clear(); public void OnGet() {
} HttpContext.Session.Clear();
} }
} }

View file

@ -12,65 +12,68 @@ using Leg = trainav.web.database.Tables.Leg;
// ReSharper disable PossibleInvalidOperationException // ReSharper disable PossibleInvalidOperationException
namespace trainav.web.Pages { namespace trainav.web.Pages;
public class OEAPIModel : PageModel {
public int TripId;
public void OnGet() { public class OEAPIModel : PageModel {
if (HttpContext.Session.GetString("authorized") != "true") public int TripId;
public void OnGet() {
if (HttpContext.Session.GetString("authorized") != "true")
return;
var link = Request.Query["link"].ToString();
var shortcode = link;
var oepage = "oeffisear.ch";
if (link.Contains("oeffisear.ch")) {
shortcode = link.Split("/#/").Last();
}
else if (link.Contains("transit.ztn.sh")) {
shortcode = link.Split("/#/").Last();
oepage = "transit.ztn.sh";
}
var jid = shortcode.Split("/").Last();
shortcode = shortcode.Split("/").First();
using var db = new Database.DbConn();
var response = new WebClient().DownloadString($"https://{oepage}/journeys?{{\"reqId\":\"{shortcode}\"}}");
var parsed = OeapiResponse.FromJson(response);
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; return;
var link = Request.Query["link"].ToString(); var tripId = Request.Query["action"] == "addleg"
var shortcode = link; ? int.Parse(Request.Query["tripid"])
var oepage = "oeffisear.ch"; : db.InsertWithInt32Identity(new Trip { UserId = int.Parse(HttpContext.Session.GetString("uid")) });
if (link.Contains("oeffisear.ch"))
shortcode = link.Split("/#/").Last();
else if (link.Contains("transit.ztn.sh")) {
shortcode = link.Split("/#/").Last();
oepage = "transit.ztn.sh";
}
var jid = shortcode.Split("/").Last();
shortcode = shortcode.Split("/").First();
using var db = new Database.DbConn(); foreach (var journey in parsed.Data.Journeys[jid].Legs.Where(p => p.IsTransfer != true && p.IsWalking != true)) {
var response = new WebClient().DownloadString($"https://{oepage}/journeys?{{\"reqId\":\"{shortcode}\"}}"); var arrtime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
var deptime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
var parsed = OeapiResponse.FromJson(response); arrtime = arrtime.AddSeconds((long)journey.Arrival.PlannedTime).ToLocalTime();
deptime = deptime.AddSeconds((long)journey.Departure.PlannedTime).ToLocalTime();
if (!string.IsNullOrWhiteSpace(Request.Query["tripid"].ToString())) var trainNo = int.Parse(journey.Line.TripNum);
if (db.Trips.First(p => p.TripId == int.Parse(Request.Query["tripid"].ToString())).UserId != int.Parse(HttpContext.Session.GetString("uid"))) if (trainNo == 0) {
return; var extractedTrainNo = Regex.Match(journey.Line.Name, @"\d+").Value;
if (extractedTrainNo.Length > 0)
var tripId = Request.Query["action"] == "addleg" trainNo = int.Parse(extractedTrainNo);
? int.Parse(Request.Query["tripid"])
: db.InsertWithInt32Identity(new Trip {UserId = int.Parse(HttpContext.Session.GetString("uid"))});
foreach (var journey in parsed.Data.Journeys[jid].Legs.Where(p => p.IsTransfer != true && p.IsWalking != true)) {
var arrtime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
var deptime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
arrtime = arrtime.AddSeconds((long) journey.Arrival.PlannedTime).ToLocalTime();
deptime = deptime.AddSeconds((long) journey.Departure.PlannedTime).ToLocalTime();
var trainNo = int.Parse(journey.Line.TripNum);
if (trainNo == 0) {
var extractedTrainNo = Regex.Match(journey.Line.Name, @"\d+").Value;
if (extractedTrainNo.Length > 0)
trainNo = int.Parse(extractedTrainNo);
}
db.InsertWithInt32Identity(new database.Tables.Leg {
TripId = tripId,
UserId = int.Parse(HttpContext.Session.GetString("uid")),
TrainType = journey.Line.ProductName,
TrainNr = trainNo,
ArrStation = journey.Arrival.Point.Stop.Name,
ArrStationId = int.Parse(journey.Arrival.Point.Stop.Id),
ArrTime = arrtime.ToString("yyyy-MM-ddTHH:mm:ss"),
DepStation = journey.Departure.Point.Stop.Name,
DepStationId = int.Parse(journey.Departure.Point.Stop.Id),
DepTime = deptime.ToString("yyyy-MM-ddTHH:mm:ss")
});
} }
TripId = tripId; db.InsertWithInt32Identity(new Leg {
TripId = tripId,
UserId = int.Parse(HttpContext.Session.GetString("uid")),
TrainType = journey.Line.ProductName,
TrainNr = trainNo,
ArrStation = journey.Arrival.Point.Stop.Name,
ArrStationId = int.Parse(journey.Arrival.Point.Stop.Id),
ArrTime = arrtime.ToString("yyyy-MM-ddTHH:mm:ss"),
DepStation = journey.Departure.Point.Stop.Name,
DepStationId = int.Parse(journey.Departure.Point.Stop.Id),
DepTime = deptime.ToString("yyyy-MM-ddTHH:mm:ss")
});
} }
TripId = tripId;
} }
} }

View file

@ -4,17 +4,17 @@ using Microsoft.AspNetCore.Mvc.RazorPages;
using trainav.web.database; using trainav.web.database;
using trainav.web.database.Tables; using trainav.web.database.Tables;
namespace trainav.web.Pages { namespace trainav.web.Pages;
public class PlainModel : PageModel {
public User AuthorizedUser;
public void OnGet() { public class PlainModel : PageModel {
if (HttpContext.Session.GetString("authorized") != "true") public User AuthorizedUser;
return;
var uid = int.Parse(HttpContext.Session.GetString("uid")); public void OnGet() {
using var db = new Database.DbConn(); if (HttpContext.Session.GetString("authorized") != "true")
AuthorizedUser = db.Users.FirstOrDefault(p => p.UserId == uid); return;
}
var uid = int.Parse(HttpContext.Session.GetString("uid"));
using var db = new Database.DbConn();
AuthorizedUser = db.Users.FirstOrDefault(p => p.UserId == uid);
} }
} }

View file

@ -1,12 +1,12 @@
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace trainav.web.Pages { namespace trainav.web.Pages;
public class PrivacyModel : PageModel {
private readonly ILogger<PrivacyModel> _logger;
public PrivacyModel(ILogger<PrivacyModel> logger) => _logger = logger; public class PrivacyModel : PageModel {
private readonly ILogger<PrivacyModel> _logger;
public void OnGet() { } public PrivacyModel(ILogger<PrivacyModel> logger) => _logger = logger;
}
public void OnGet() { }
} }

View file

@ -5,27 +5,27 @@ using Microsoft.AspNetCore.Mvc.RazorPages;
using trainav.web.database; using trainav.web.database;
using trainav.web.database.Tables; using trainav.web.database.Tables;
namespace trainav.web.Pages { namespace trainav.web.Pages;
public class RegisterModel : PageModel {
public void OnPost() {
if (!Request.HasFormContentType
|| string.IsNullOrWhiteSpace(Request.Form["user"])
|| string.IsNullOrWhiteSpace(Request.Form["pass"])
|| string.IsNullOrWhiteSpace(Request.Form["code"]))
return;
if (Request.Form["code"] != System.IO.File.ReadAllLines("regkey.txt")[0]) public class RegisterModel : PageModel {
return; public void OnPost() {
if (!Request.HasFormContentType
|| string.IsNullOrWhiteSpace(Request.Form["user"])
|| string.IsNullOrWhiteSpace(Request.Form["pass"])
|| string.IsNullOrWhiteSpace(Request.Form["code"]))
return;
using var db = new Database.DbConn(); if (Request.Form["code"] != System.IO.File.ReadAllLines("regkey.txt")[0])
var user = db.Users.FirstOrDefault(p => p.Username == Request.Form["user"].ToString()); return;
if (user != null)
return; //user already exists
var uid = db.InsertWithInt32Identity(new User {Username = Request.Form["user"].ToString(), Password = Request.Form["pass"].ToString().Sha256()}); using var db = new Database.DbConn();
var user = db.Users.FirstOrDefault(p => p.Username == Request.Form["user"].ToString());
if (user != null)
return; //user already exists
HttpContext.Session.SetString("uid", uid.ToString()); var uid = db.InsertWithInt32Identity(new User { Username = Request.Form["user"].ToString(), Password = Request.Form["pass"].ToString().Sha256() });
HttpContext.Session.SetString("authorized", "true");
} HttpContext.Session.SetString("uid", uid.ToString());
HttpContext.Session.SetString("authorized", "true");
} }
} }

View file

@ -4,24 +4,24 @@ using Microsoft.AspNetCore.Mvc.RazorPages;
using trainav.web.database; using trainav.web.database;
using trainav.web.database.Tables; using trainav.web.database.Tables;
namespace trainav.web.Pages { namespace trainav.web.Pages;
public class SharedTripModel : PageModel {
public List<Leg> Legs;
public bool RedirToIndex;
public new string User;
public void OnGet() { public class SharedTripModel : PageModel {
using var db = new Database.DbConn(); public List<Leg> Legs;
public bool RedirToIndex;
public new string User;
if (!db.Legs.Any(p => p.TripId == int.Parse(Request.Query["id"]))) { public void OnGet() {
RedirToIndex = true; using var db = new Database.DbConn();
return;
}
Legs = db.Legs.Where(p => p.TripId == int.Parse(Request.Query["id"])).OrderBy(p => p.DepTime).ToList(); if (!db.Legs.Any(p => p.TripId == int.Parse(Request.Query["id"]))) {
User = db.Users.First(p => p.UserId == Legs.First().UserId).Username; RedirToIndex = true;
if (Request.Query["user"] != User) return;
RedirToIndex = true;
} }
Legs = db.Legs.Where(p => p.TripId == int.Parse(Request.Query["id"])).OrderBy(p => p.DepTime).ToList();
User = db.Users.First(p => p.UserId == Legs.First().UserId).Username;
if (Request.Query["user"] != User)
RedirToIndex = true;
} }
} }

View file

@ -6,62 +6,62 @@ using Microsoft.AspNetCore.Mvc.RazorPages;
using trainav.web.database; using trainav.web.database;
using trainav.web.database.Tables; using trainav.web.database.Tables;
namespace trainav.web.Pages { namespace trainav.web.Pages;
public class TripModel : PageModel {
public List<Leg> Legs;
public bool RedirToIndex;
public new string User;
public void OnGet() { public class TripModel : PageModel {
if (HttpContext.Session.GetString("authorized") != "true") public List<Leg> Legs;
return; public bool RedirToIndex;
public new string User;
using var db = new Database.DbConn(); public void OnGet() {
if (Request.Query.ContainsKey("separator")) { if (HttpContext.Session.GetString("authorized") != "true")
var leg = db.Legs.First(p => p.LegId == int.Parse(Request.Query["legid"])); return;
if (leg.UserId != int.Parse(HttpContext.Session.GetString("uid")))
return;
db.Insert(new Leg { using var db = new Database.DbConn();
TripId = int.Parse(Request.Query["id"]), if (Request.Query.ContainsKey("separator")) {
UserId = int.Parse(HttpContext.Session.GetString("uid")), var leg = db.Legs.First(p => p.LegId == int.Parse(Request.Query["legid"]));
TrainType = "placeholder",
TrainNr = int.Parse(Request.Query["legid"]),
ArrStation = "_",
ArrStationId = 0,
ArrTime = "_",
DepStation = "_",
DepStationId = 0,
DepTime = leg.DepTime + "_placeholder"
});
return;
}
Legs = db.Legs.Where(p => p.TripId == int.Parse(Request.Query["id"])).OrderBy(p => p.DepTime).ToList();
if (!db.Legs.Any(p => p.TripId == int.Parse(Request.Query["id"]))) {
RedirToIndex = true;
return;
}
User = db.Users.First(p => p.UserId == Legs.First().UserId).Username;
}
public void OnPost() {
if (HttpContext.Session.GetString("authorized") != "true")
return;
using var db = new Database.DbConn();
if (!Request.Form.ContainsKey("comment"))
return;
var leg = db.Legs.First(p => p.LegId == int.Parse(Request.Form["id"]));
if (leg.UserId != int.Parse(HttpContext.Session.GetString("uid"))) if (leg.UserId != int.Parse(HttpContext.Session.GetString("uid")))
return; return;
leg.Comment = Request.Form["comment"]; db.Insert(new Leg {
TripId = int.Parse(Request.Query["id"]),
db.Update(leg); UserId = int.Parse(HttpContext.Session.GetString("uid")),
TrainType = "placeholder",
TrainNr = int.Parse(Request.Query["legid"]),
ArrStation = "_",
ArrStationId = 0,
ArrTime = "_",
DepStation = "_",
DepStationId = 0,
DepTime = leg.DepTime + "_placeholder"
});
return;
} }
Legs = db.Legs.Where(p => p.TripId == int.Parse(Request.Query["id"])).OrderBy(p => p.DepTime).ToList();
if (!db.Legs.Any(p => p.TripId == int.Parse(Request.Query["id"]))) {
RedirToIndex = true;
return;
}
User = db.Users.First(p => p.UserId == Legs.First().UserId).Username;
}
public void OnPost() {
if (HttpContext.Session.GetString("authorized") != "true")
return;
using var db = new Database.DbConn();
if (!Request.Form.ContainsKey("comment"))
return;
var leg = db.Legs.First(p => p.LegId == int.Parse(Request.Form["id"]));
if (leg.UserId != int.Parse(HttpContext.Session.GetString("uid")))
return;
leg.Comment = Request.Form["comment"];
db.Update(leg);
} }
} }

View file

@ -6,20 +6,19 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using trainav.web.database; using trainav.web.database;
namespace trainav.web { namespace trainav.web;
public class Program {
public static void Main(string[] args) {
DataConnection.DefaultSettings = new Database.Settings();
Configuration.Linq.AllowMultipleQuery = true;
Directory.CreateDirectory(Variables.TicketDir);
ThreadPool.SetMinThreads(100, 100);
Migrations.RunMigrations(); public class Program {
public static void Main(string[] args) {
DataConnection.DefaultSettings = new Database.Settings();
Configuration.Linq.AllowMultipleQuery = true;
Directory.CreateDirectory(Variables.TicketDir);
ThreadPool.SetMinThreads(100, 100);
CreateHostBuilder(args).Build().Run(); Migrations.RunMigrations();
}
public static IHostBuilder CreateHostBuilder(string[] args) => CreateHostBuilder(args).Build().Run();
Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
} }
}
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
}

View file

@ -5,62 +5,62 @@ using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
namespace trainav.web { namespace trainav.web;
public class Startup {
public Startup(IConfiguration configuration) => Configuration = configuration;
public IConfiguration Configuration { get; } public class Startup {
public Startup(IConfiguration configuration) => Configuration = configuration;
// This method gets called by the runtime. Use this method to add services to the container. public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services) {
services.AddRazorPages(); // This method gets called by the runtime. Use this method to add services to the container.
services.AddSession(options => { public void ConfigureServices(IServiceCollection services) {
options.IdleTimeout = TimeSpan.MaxValue; services.AddRazorPages();
options.Cookie.HttpOnly = true; services.AddSession(options => {
options.Cookie.IsEssential = true; options.IdleTimeout = TimeSpan.MaxValue;
}); options.Cookie.HttpOnly = true;
#if (DEBUG) options.Cookie.IsEssential = true;
services.AddControllers().AddRazorRuntimeCompilation(); });
services.AddControllers(); #if (DEBUG)
services.AddStackExchangeRedisCache(options => { services.AddControllers().AddRazorRuntimeCompilation();
options.Configuration = "localhost"; services.AddControllers();
options.InstanceName = "trainav_development"; services.AddStackExchangeRedisCache(options => {
}); options.Configuration = "localhost";
#else options.InstanceName = "trainav_development";
});
#else
services.AddControllers(); services.AddControllers();
services.AddStackExchangeRedisCache(options => services.AddStackExchangeRedisCache(options =>
{ {
options.Configuration = "localhost"; options.Configuration = "localhost";
options.InstanceName = "trainav_production"; options.InstanceName = "trainav_production";
}); });
#endif #endif
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
}
else {
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseSession();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints => {
endpoints.MapRazorPages();
endpoints.MapControllers();
});
}
} }
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
}
else {
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseSession();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints => {
endpoints.MapRazorPages();
endpoints.MapControllers();
});
}
}

View file

@ -1,8 +1,8 @@
using System.IO; using System.IO;
namespace trainav.web { namespace trainav.web;
public class Variables {
public const string DataDir = "data"; public class Variables {
public static readonly string TicketDir = Path.Combine(DataDir, "tickets"); public const string DataDir = "data";
} public static readonly string TicketDir = Path.Combine(DataDir, "tickets");
} }

View file

@ -5,36 +5,36 @@ using LinqToDB.Configuration;
using LinqToDB.Data; using LinqToDB.Data;
using trainav.web.database.Tables; using trainav.web.database.Tables;
namespace trainav.web.database { namespace trainav.web.database;
public class Database {
public class ConnectionStringSettings : IConnectionStringSettings {
public string ConnectionString { get; set; }
public string Name { get; set; }
public string ProviderName { get; set; }
public bool IsGlobal => false;
}
public class Settings : ILinqToDBSettings { public class Database {
public IEnumerable<IDataProviderSettings> DataProviders => Enumerable.Empty<IDataProviderSettings>(); public class ConnectionStringSettings : IConnectionStringSettings {
public string ConnectionString { get; set; }
public string Name { get; set; }
public string ProviderName { get; set; }
public bool IsGlobal => false;
}
public string DefaultConfiguration => "SQLite"; public class Settings : ILinqToDBSettings {
public string DefaultDataProvider => "SQLite"; public IEnumerable<IDataProviderSettings> DataProviders => Enumerable.Empty<IDataProviderSettings>();
public IEnumerable<IConnectionStringSettings> ConnectionStrings { public string DefaultConfiguration => "SQLite";
get { yield return new ConnectionStringSettings { Name = "db", ProviderName = "SQLite", ConnectionString = @"Data Source=database.db;" }; } public string DefaultDataProvider => "SQLite";
}
}
public class DbConn : DataConnection { public IEnumerable<IConnectionStringSettings> ConnectionStrings {
public DbConn() : base("db") { } get { yield return new ConnectionStringSettings { Name = "db", ProviderName = "SQLite", ConnectionString = @"Data Source=database.db;" }; }
public ITable<DbInfo> DbInfo => GetTable<DbInfo>();
public ITable<User> Users => GetTable<User>();
public ITable<Leg> Legs => GetTable<Leg>();
public ITable<Ticket> Tickets => GetTable<Ticket>();
public ITable<TicketLeg> TicketLegs => GetTable<TicketLeg>();
public ITable<Trip> Trips => GetTable<Trip>();
public ITable<Card> Cards => GetTable<Card>();
} }
} }
}
public class DbConn : DataConnection {
public DbConn() : base("db") { }
public ITable<DbInfo> DbInfo => GetTable<DbInfo>();
public ITable<User> Users => GetTable<User>();
public ITable<Leg> Legs => GetTable<Leg>();
public ITable<Ticket> Tickets => GetTable<Ticket>();
public ITable<TicketLeg> TicketLegs => GetTable<TicketLeg>();
public ITable<Trip> Trips => GetTable<Trip>();
public ITable<Card> Cards => GetTable<Card>();
}
}

View file

@ -1,37 +1,36 @@
using LinqToDB.Mapping; using LinqToDB.Mapping;
namespace trainav.web.database.Tables { namespace trainav.web.database.Tables;
[Table(Name = "Cards")]
public class Card {
[Column(Name = "CardID"), PrimaryKey, Identity, NotNull]
public int CardId { get; set; }
[Column(Name = "OrderID"), NotNull] public string OrderId { get; set; } [Table(Name = "Cards")]
public class Card {
[Column(Name = "CardID"), PrimaryKey, Identity, NotNull] public int CardId { get; set; }
[Column(Name = "UserID"), NotNull] public int UserId { get; set; } [Column(Name = "OrderID"), NotNull] public string OrderId { get; set; }
[Column(Name = "CardNumber"), NotNull] public string CardNumber { get; set; } [Column(Name = "UserID"), NotNull] public int UserId { get; set; }
[Column(Name = "Class"), NotNull] public int Class { get; set; } [Column(Name = "CardNumber"), NotNull] public string CardNumber { get; set; }
[Column(Name = "Value"), NotNull] public int Value { get; set; } [Column(Name = "Class"), NotNull] public int Class { get; set; }
[Column(Name = "Traveller")] public string Traveller { get; set; } [Column(Name = "Value"), NotNull] public int Value { get; set; }
[Column(Name = "CardQR")] public string CardQr { get; set; } [Column(Name = "Traveller")] public string Traveller { get; set; }
[Column(Name = "CardSecCode")] public string CardSecCode { get; set; } [Column(Name = "CardQR")] public string CardQr { get; set; }
[Column(Name = "CardImage")] public string CardImage { get; set; } [Column(Name = "CardSecCode")] public string CardSecCode { get; set; }
[Column(Name = "CardInfo")] public string CardInfo { get; set; } [Column(Name = "CardImage")] public string CardImage { get; set; }
[Column(Name = "ValidFrom")] public string ValidFrom { get; set; } [Column(Name = "CardInfo")] public string CardInfo { get; set; }
[Column(Name = "ValidTo")] public string ValidTo { get; set; } [Column(Name = "ValidFrom")] public string ValidFrom { get; set; }
[Column(Name = "QRValidFrom")] public string QrValidFrom { get; set; } [Column(Name = "ValidTo")] public string ValidTo { get; set; }
[Column(Name = "QRValidTo")] public string QrValidTo { get; set; } [Column(Name = "QRValidFrom")] public string QrValidFrom { get; set; }
}
[Column(Name = "QRValidTo")] public string QrValidTo { get; set; }
} }

View file

@ -1,9 +1,9 @@
using LinqToDB.Mapping; using LinqToDB.Mapping;
namespace trainav.web.database.Tables { namespace trainav.web.database.Tables;
[Table(Name = "DbInfo")]
public class DbInfo { [Table(Name = "DbInfo")]
[Column(Name = "ID"), PrimaryKey, Identity, NotNull] public int Id { get; set; } public class DbInfo {
[Column(Name = "DbVer"), NotNull] public int DbVer { get; set; } [Column(Name = "ID"), PrimaryKey, Identity, NotNull] public int Id { get; set; }
} [Column(Name = "DbVer"), NotNull] public int DbVer { get; set; }
} }

View file

@ -1,35 +1,32 @@
using LinqToDB.Mapping; using LinqToDB.Mapping;
namespace trainav.web.database.Tables { namespace trainav.web.database.Tables;
[Table(Name = "Legs")]
public class Leg {
[Column(Name = "LegID"), PrimaryKey, Identity, NotNull]
public int LegId { get; set; }
[Column(Name = "TripID"), NotNull] public int TripId { get; set; } [Table(Name = "Legs")]
public class Leg {
[Column(Name = "LegID"), PrimaryKey, Identity, NotNull] public int LegId { get; set; }
[Column(Name = "UserID"), NotNull] public int UserId { get; set; } [Column(Name = "TripID"), NotNull] public int TripId { get; set; }
[Column(Name = "TrainType"), NotNull] public string TrainType { get; set; } [Column(Name = "UserID"), NotNull] public int UserId { get; set; }
[Column(Name = "TrainNr"), NotNull] public int TrainNr { get; set; } [Column(Name = "TrainType"), NotNull] public string TrainType { get; set; }
[Column(Name = "DepStationID"), NotNull] [Column(Name = "TrainNr"), NotNull] public int TrainNr { get; set; }
public int DepStationId { get; set; }
[Column(Name = "DepStation"), NotNull] public string DepStation { get; set; } [Column(Name = "DepStationID"), NotNull] public int DepStationId { get; set; }
[Column(Name = "DepTime"), NotNull] public string DepTime { get; set; } [Column(Name = "DepStation"), NotNull] public string DepStation { get; set; }
[Column(Name = "ArrStationID"), NotNull] [Column(Name = "DepTime"), NotNull] public string DepTime { get; set; }
public int ArrStationId { get; set; }
[Column(Name = "ArrStation"), NotNull] public string ArrStation { get; set; } [Column(Name = "ArrStationID"), NotNull] public int ArrStationId { get; set; }
[Column(Name = "ArrTime"), NotNull] public string ArrTime { get; set; } [Column(Name = "ArrStation"), NotNull] public string ArrStation { get; set; }
[Column(Name = "TicketID")] public int TicketId { get; set; } [Column(Name = "ArrTime"), NotNull] public string ArrTime { get; set; }
[Column(Name = "Comment")] public string Comment { get; set; } [Column(Name = "TicketID")] public int TicketId { get; set; }
}
} [Column(Name = "Comment")] public string Comment { get; set; }
}

View file

@ -1,22 +1,22 @@
using LinqToDB.Mapping; using LinqToDB.Mapping;
namespace trainav.web.database.Tables { namespace trainav.web.database.Tables;
[Table(Name = "Tickets")]
public class Ticket {
[Column(Name = "TicketID"), PrimaryKey, Identity, NotNull] public int TicketId { get; set; }
[Column(Name = "OrderID"), NotNull] public string OrderId { get; set; } [Table(Name = "Tickets")]
public class Ticket {
[Column(Name = "TicketID"), PrimaryKey, Identity, NotNull] public int TicketId { get; set; }
[Column(Name = "UserID"), NotNull] public int UserId { get; set; } [Column(Name = "OrderID"), NotNull] public string OrderId { get; set; }
[Column(Name = "TicketInfo"), NotNull] public string TicketInfo { get; set; } [Column(Name = "UserID"), NotNull] public int UserId { get; set; }
[Column(Name = "TicketQR"), NotNull] public string TicketQr { get; set; } [Column(Name = "TicketInfo"), NotNull] public string TicketInfo { get; set; }
[Column(Name = "TicketSecCode"), NotNull] public string TicketSecCode { get; set; } [Column(Name = "TicketQR"), NotNull] public string TicketQr { get; set; }
[Column(Name = "TicketPkPass")] public string TicketPkPass { get; set; } [Column(Name = "TicketSecCode"), NotNull] public string TicketSecCode { get; set; }
[Column(Name = "Traveller")] public string Traveller { get; set; } [Column(Name = "TicketPkPass")] public string TicketPkPass { get; set; }
}
} [Column(Name = "Traveller")] public string Traveller { get; set; }
}

View file

@ -1,29 +1,27 @@
using LinqToDB.Mapping; using LinqToDB.Mapping;
namespace trainav.web.database.Tables { namespace trainav.web.database.Tables;
[Table(Name = "TicketLegs")]
public class TicketLeg {
[Column(Name = "TicketLegID"), PrimaryKey, Identity, NotNull]
public int TicketLegId { get; set; }
[Column(Name = "TicketID"), NotNull] public int TicketId { get; set; } [Table(Name = "TicketLegs")]
public class TicketLeg {
[Column(Name = "TicketLegID"), PrimaryKey, Identity, NotNull]
public int TicketLegId { get; set; }
[Column(Name = "TrainType"), NotNull] public string TrainType { get; set; } [Column(Name = "TicketID"), NotNull] public int TicketId { get; set; }
[Column(Name = "TrainNr"), NotNull] public int TrainNr { get; set; } [Column(Name = "TrainType"), NotNull] public string TrainType { get; set; }
[Column(Name = "DepStationID"), NotNull] [Column(Name = "TrainNr"), NotNull] public int TrainNr { get; set; }
public int DepStationId { get; set; }
[Column(Name = "DepStation"), NotNull] public string DepStation { get; set; } [Column(Name = "DepStationID"), NotNull] public int DepStationId { get; set; }
[Column(Name = "DepTime"), NotNull] public string DepTime { get; set; } [Column(Name = "DepStation"), NotNull] public string DepStation { get; set; }
[Column(Name = "ArrStationID"), NotNull] [Column(Name = "DepTime"), NotNull] public string DepTime { get; set; }
public int ArrStationId { get; set; }
[Column(Name = "ArrStation"), NotNull] public string ArrStation { get; set; } [Column(Name = "ArrStationID"), NotNull] public int ArrStationId { get; set; }
[Column(Name = "ArrTime"), NotNull] public string ArrTime { get; set; } [Column(Name = "ArrStation"), NotNull] public string ArrStation { get; set; }
}
[Column(Name = "ArrTime"), NotNull] public string ArrTime { get; set; }
} }

View file

@ -1,12 +1,10 @@
using LinqToDB.Mapping; using LinqToDB.Mapping;
namespace trainav.web.database.Tables { namespace trainav.web.database.Tables;
[Table(Name = "Trips")]
public class Trip {
[Column(Name = "TripID"), PrimaryKey, Identity, NotNull]
public int TripId { get; set; }
[Column(Name = "UserID"), PrimaryKey, NotNull] [Table(Name = "Trips")]
public int UserId { get; set; } public class Trip {
} [Column(Name = "TripID"), PrimaryKey, Identity, NotNull] public int TripId { get; set; }
[Column(Name = "UserID"), PrimaryKey, NotNull] public int UserId { get; set; }
} }

View file

@ -1,13 +1,12 @@
using LinqToDB.Mapping; using LinqToDB.Mapping;
namespace trainav.web.database.Tables { namespace trainav.web.database.Tables;
[Table(Name = "Users")]
public class User {
[Column(Name = "UserID"), PrimaryKey, Identity, NotNull]
public int UserId { get; set; }
[Column(Name = "Username"), NotNull] public string Username { get; set; } [Table(Name = "Users")]
public class User {
[Column(Name = "UserID"), PrimaryKey, Identity, NotNull] public int UserId { get; set; }
[Column(Name = "Password"), NotNull] public string Password { get; set; } [Column(Name = "Username"), NotNull] public string Username { get; set; }
}
[Column(Name = "Password"), NotNull] public string Password { get; set; }
} }