{
diff --git a/AfRApay.Web/Controllers/Schema/ErrorResponse.cs b/AfRApay.Web/Controllers/Schema/ErrorResponse.cs
index ae5dd44..26359db 100644
--- a/AfRApay.Web/Controllers/Schema/ErrorResponse.cs
+++ b/AfRApay.Web/Controllers/Schema/ErrorResponse.cs
@@ -1,5 +1,4 @@
using System.ComponentModel;
-using AfRApay.Web.Backend.Tables;
using J = System.Text.Json.Serialization.JsonPropertyNameAttribute;
namespace AfRApay.Web.Controllers.Schema;
diff --git a/AfRApay.Web/Controllers/Schema/UserResponse.cs b/AfRApay.Web/Controllers/Schema/UserResponse.cs
index 51b3a15..b1ee8ea 100644
--- a/AfRApay.Web/Controllers/Schema/UserResponse.cs
+++ b/AfRApay.Web/Controllers/Schema/UserResponse.cs
@@ -1,5 +1,5 @@
using System.ComponentModel;
-using AfRApay.Web.Backend.Tables;
+using AfRApay.Web.Backend.Database.Tables;
using J = System.Text.Json.Serialization.JsonPropertyNameAttribute;
namespace AfRApay.Web.Controllers.Schema;
diff --git a/AfRApay.Web/Pages/AddUser.cshtml.cs b/AfRApay.Web/Pages/AddUser.cshtml.cs
index 7ea531a..b65de2f 100644
--- a/AfRApay.Web/Pages/AddUser.cshtml.cs
+++ b/AfRApay.Web/Pages/AddUser.cshtml.cs
@@ -1,8 +1,6 @@
-using System.Data;
-using System.Net;
-using AfRApay.Web.Backend;
-using AfRApay.Web.Backend.Tables;
-using LinqToDB;
+using System.Net;
+using AfRApay.Web.Backend.Database;
+using AfRApay.Web.Backend.Database.Tables;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace AfRApay.Web.Pages;
@@ -10,17 +8,18 @@ namespace AfRApay.Web.Pages;
public class AddUserModel : PageModel {
public void OnGet() { }
- public void OnPost() {
- using var db = new Database.DbConn();
+ public async void OnPost() {
+ await using var db = new DatabaseContext();
if (Request.Form.ContainsKey("nickname") && !string.IsNullOrWhiteSpace(Request.Form["nickname"])) {
var nick = Request.Form["nickname"];
- if (db.Users.Any(p => p.Nickname == nick)) {
+ if (db.Users.Any(p => p.Nickname == nick.ToString())) {
Response.Redirect("/ErrorRedirect?redir=/AddUser&message=" + WebUtility.UrlEncode("User with nick already exists."));
return;
}
- var user = new User { Nickname = nick!, Balance = 0 };
- db.InsertWithIdentity(user);
+ var user = new User { Nickname = nick.ToString(), Balance = 0 };
+ db.Add(user);
+ await db.SaveChangesAsync();
Response.Redirect($"/#{user.Nickname}");
return;
}
diff --git a/AfRApay.Web/Pages/EditUser.cshtml b/AfRApay.Web/Pages/EditUser.cshtml
index 5f9fb47..e2ee3a3 100644
--- a/AfRApay.Web/Pages/EditUser.cshtml
+++ b/AfRApay.Web/Pages/EditUser.cshtml
@@ -1,15 +1,16 @@
@page "{id:int}"
-@using AfRApay.Web.Backend
+@using AfRApay.Web.Backend.Database
@using Microsoft.AspNetCore.Mvc.TagHelpers
+@using Microsoft.EntityFrameworkCore
@model EditUserModel
@{
ViewData["Title"] = "Edit User";
if (Request.Method == "POST" && Request.Form["action"] == "delete") {
return;
}
- var db = new Database.DbConn();
+ var db = new DatabaseContext();
var user = db.Users.First(p => p.Id == int.Parse(RouteData.Values["id"]!.ToString()!));
- var cards = db.Cards.Where(p => p.UserId == user.Id);
+ var cards = db.Cards.Include(p => p.User).Where(p => p.User == user);
var linkFlag = db.Config.FirstOrDefault(p => p.Name == "link");
var lTimeFlag = db.Config.FirstOrDefault(p => p.Name == "lTime");
@@ -142,8 +143,8 @@
@{
foreach (var card in cards) {
- await RenderCard(user.Nickname, card.CardId);
- await RenderCardModal(user.Nickname, card.CardId);
+ await RenderCard(user.Nickname, card.Id);
+ await RenderCardModal(user.Nickname, card.Id);
}
await RenderCard(user.Nickname, type: EditUserModel.CardType.LinkPlaceholder);
}
diff --git a/AfRApay.Web/Pages/EditUser.cshtml.cs b/AfRApay.Web/Pages/EditUser.cshtml.cs
index 81d63a3..ca02a1f 100644
--- a/AfRApay.Web/Pages/EditUser.cshtml.cs
+++ b/AfRApay.Web/Pages/EditUser.cshtml.cs
@@ -1,8 +1,6 @@
-using System.Data;
-using System.Net;
-using AfRApay.Web.Backend;
-using AfRApay.Web.Backend.Tables;
-using LinqToDB;
+using System.Net;
+using AfRApay.Web.Backend.Database;
+using AfRApay.Web.Backend.Database.Tables;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace AfRApay.Web.Pages;
@@ -10,21 +8,22 @@ namespace AfRApay.Web.Pages;
public class EditUserModel : PageModel {
public void OnGet() { }
- public void OnPost() {
- using var db = new Database.DbConn();
- var userId = int.Parse(RouteData.Values["id"]!.ToString()!);
- var user = db.Users.First(p => p.Id == userId);
+ public async void OnPost() {
+ await using var db = new DatabaseContext();
+ var userId = long.Parse(RouteData.Values["id"]!.ToString()!);
+ var user = db.Users.First(p => p.Id == userId);
if (Request.Form["action"] == "delete") {
- db.Cards.Delete(p => p.UserId == userId);
- db.Delete(user);
+ db.Remove(user);
+ await db.SaveChangesAsync();
Response.Redirect("/");
return;
}
if (Request.Form["action"] == "deleteCard" && Request.Form.ContainsKey("cardId")) {
- var card = db.Cards.First(p => p.CardId == Request.Form["cardId"]);
- db.Delete(card);
+ var card = db.Cards.First(p => p.Id == Request.Form["cardId"].ToString());
+ db.Remove(card);
+ await db.SaveChangesAsync();
Response.Redirect($"/EditUser/{userId}");
return;
}
@@ -37,16 +36,18 @@ public class EditUserModel : PageModel {
if (lTimeFlag == null) {
lTimeFlag = new Config { Name = "lTime", Value = DateTime.UtcNow.ToString("s") };
- db.Insert(lTimeFlag);
+ db.Add(lTimeFlag);
+ await db.SaveChangesAsync();
}
else {
lTimeFlag.Value = DateTime.UtcNow.ToString("s");
- db.Update(lTimeFlag);
+ await db.SaveChangesAsync();
}
if (linkFlag == null) {
linkFlag = new Config { Name = "link", Value = user.Id.ToString() };
- db.Insert(linkFlag);
+ db.Add(linkFlag);
+ await db.SaveChangesAsync();
return;
}
@@ -55,27 +56,27 @@ public class EditUserModel : PageModel {
}
linkFlag.Value = user.Id.ToString();
- db.Update(linkFlag);
+ await db.SaveChangesAsync();
return;
}
if (Request.Form["action"] == "save" && Request.Form.ContainsKey("nickname") && !string.IsNullOrWhiteSpace(Request.Form["nickname"])) {
- var nick = Request.Form["nickname"];
+ var nick = Request.Form["nickname"].ToString();
if (db.Users.Any(p => p.Nickname == nick && p.Id != userId)) {
Response.Redirect($"/ErrorRedirect?redir=/EditUser/{userId}&message=" + WebUtility.UrlEncode("User with nick already exists."));
return;
}
- user.Nickname = nick!;
- db.Update(user);
+ user.Nickname = nick;
+ await db.SaveChangesAsync();
}
Response.Redirect($"/#{user.Nickname}");
}
public enum CardType {
- Normal = 1,
- LinkPlaceholder = 2,
+ Normal = 1,
+ LinkPlaceholder = 2,
DeletionConfirmation = 3
}
}
diff --git a/AfRApay.Web/Pages/Index.cshtml b/AfRApay.Web/Pages/Index.cshtml
index d8d5d37..d9a8a0c 100644
--- a/AfRApay.Web/Pages/Index.cshtml
+++ b/AfRApay.Web/Pages/Index.cshtml
@@ -1,9 +1,9 @@
@page
-@using AfRApay.Web.Backend
+@using AfRApay.Web.Backend.Database
@model IndexModel
@{
ViewData["Title"] = "Index";
- var db = new Database.DbConn();
+ var db = new DatabaseContext();
}
@section Header {
@@ -62,7 +62,7 @@
@($"{user.Balance / 100M:C}")
- @db.Cards.Count(p => p.UserId == user.Id) cards linked.
+ @db.Cards.Count(p => p.User.Id == user.Id) cards linked.
|
diff --git a/AfRApay.Web/Pages/Index.cshtml.cs b/AfRApay.Web/Pages/Index.cshtml.cs
index 5135ac3..8ab7456 100644
--- a/AfRApay.Web/Pages/Index.cshtml.cs
+++ b/AfRApay.Web/Pages/Index.cshtml.cs
@@ -1,7 +1,5 @@
-using System.Data;
-using System.Net;
-using AfRApay.Web.Backend;
-using LinqToDB;
+using System.Net;
+using AfRApay.Web.Backend.Database;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace AfRApay.Web.Pages;
@@ -9,8 +7,8 @@ namespace AfRApay.Web.Pages;
public class IndexModel : PageModel {
public void OnGet() { }
- public void OnPost() {
- using var db = new Database.DbConn();
+ public async void OnPost() {
+ await using var db = new DatabaseContext();
if (Request.Form["action"] == "transaction" && Request.Form.ContainsKey("userId") && Request.Form.ContainsKey("amount")) {
var userId = int.Parse(Request.Form["userId"].ToString());
var amount = int.Parse(Request.Form["amount"].ToString());
@@ -25,7 +23,7 @@ public class IndexModel : PageModel {
}
user.Balance += amount;
- db.Update(user);
+ await db.SaveChangesAsync();
Response.Redirect($"/#{user.Nickname}");
}
diff --git a/AfRApay.Web/README.md b/AfRApay.Web/README.md
index f85e794..203b91f 100644
--- a/AfRApay.Web/README.md
+++ b/AfRApay.Web/README.md
@@ -4,6 +4,10 @@ This is the software that runs on the MateCard terminal, powered by an ESP32.
## Setting up dev environment
This project uses PlatformIO. Quick setup guide:
- Install dotnet-sdk (macOS: `brew install dotnet-sdk` / Arch Linux: `pacman -S dotnet-host dotnet-runtime dotnet-sdk dotnet-targeting-pack aspnet-runtime aspnet-targeting-pack`)
-- To start the webserver, execute `dotnet run` in this directory.
+- Install the EF.Core tool for database management: `dotnet tool install --global dotnet-ef`
+- To start the webserver, execute `dotnet run` in this directory. If the database does not exist, it will be created. Migrations are applied automatically.
- Swagger / OpenAPI docs will automatically generate at `/swagger`.
- To test with the MateCard ESP32 code, get your computer's IP and configure the ESP to use `http://:5296` as the API base url.
+
+## Creating migrations
+- To create a migration, change the respective code in `Backend/Database/Tables/TableName.cs` and then run `dotnet ef migrations add DescriptiveNameOfChanges`. The migration will be generated automatically.
|