From 57e8f640957a7e9d6cde86479a80054b2e8ed6d8 Mon Sep 17 00:00:00 2001 From: "Tim G. | SnapixLP" Date: Fri, 6 Jun 2025 01:11:26 +0200 Subject: [PATCH] added mysql connection --- Server/DbConfig.cs | 37 +++++++++ Server/MySQL.cs | 25 ++++++- Server/Program.cs | 181 +++++++++++++++++++++++++++++++++++---------- 3 files changed, 201 insertions(+), 42 deletions(-) create mode 100644 Server/DbConfig.cs diff --git a/Server/DbConfig.cs b/Server/DbConfig.cs new file mode 100644 index 0000000..0b4b784 --- /dev/null +++ b/Server/DbConfig.cs @@ -0,0 +1,37 @@ +using System.Text.Json; + +namespace Server; + +public class DbConfig +{ + private const string CONFIG_PATH = "config.json"; + + public string Username { get; set; } = ""; + public string Password { get; set; } = ""; + public string Server { get; set; } = ""; + public string Port { get; set; } = ""; // new + public string Database { get; set; } = ""; + + public void Save() + { + var options = new JsonSerializerOptions { WriteIndented = true }; + string json = JsonSerializer.Serialize(this, options); + File.WriteAllText(CONFIG_PATH, json); + } + + public static DbConfig? Load() + { + if (!File.Exists(CONFIG_PATH)) + return null; + + try + { + string json = File.ReadAllText(CONFIG_PATH); + return JsonSerializer.Deserialize(json); + } + catch + { + return null; + } + } +} \ No newline at end of file diff --git a/Server/MySQL.cs b/Server/MySQL.cs index 148b216..c562701 100644 --- a/Server/MySQL.cs +++ b/Server/MySQL.cs @@ -12,11 +12,13 @@ namespace Server private MySqlConnection _connection; private MessageSender ms; - public MySQL(string username, string password, string server, string database, MessageSender ms) + + public MySQL(string username, string password, string server, string port, string database, MessageSender ms) { this.ms = ms; ms.Log("[MySQL] Initializing connection..."); - string connectionString = $"Server={server};Database={database};User ID={username};Password={password};"; + // include port in the connection string: + string connectionString = $"Server={server};Port={port};Database={database};User ID={username};Password={password};"; _connection = new MySqlConnection(connectionString); ms.Log("[MySQL] Connection to database..."); @@ -51,7 +53,24 @@ namespace Server _ => "b" }; } - + /// + /// Executes a non‐query SQL statement (e.g. CREATE TABLE, ALTER, etc.). + /// Returns null on success, or an error JSON if it fails. + /// + public string ExecuteNonQuery(string sql) + { + using var cmd = new MySqlCommand(sql, _connection); + try + { + cmd.ExecuteNonQuery(); + return JsonResponse(new { success = true }); + } + catch (Exception ex) + { + return JsonResponse($"Execute failed: {ex.Message}", true); + } + } + public string Insert(string table, Dictionary data) { string columns = string.Join(", ", data.Keys); diff --git a/Server/Program.cs b/Server/Program.cs index 8f2482f..206bebd 100644 --- a/Server/Program.cs +++ b/Server/Program.cs @@ -1,48 +1,151 @@ -using DX86; +using System.Text.Json; +using DX86; using DX86.Modules; using Library; namespace Server; -class Program -{ - public static MessageSender messageSender; - public static MessageBox messageBox; - public static InputBox inputBox; - public static ItemSelector itemSelector; - public static MySQL mySql; - private static List servers; + class Program + { + public static MessageSender messageSender; + public static MessageBox messageBox; + public static InputBox inputBox; + public static ItemSelector itemSelector; + public static MySQL mySql; + private static List servers; - static void Main(string[] args) - { - Console.WriteLine("Initializing server..."); - // Initialize the server components - messageSender = new MessageSender("log.txt"); - messageBox = new MessageBox(messageSender); - inputBox = new InputBox(messageSender); - itemSelector = new ItemSelector(messageSender); - servers = new List(); - - // Connect to the database - //mySql = new MySQL("username", "password", "localhost", "database", messageSender); - - // Start the server - ServerLoop(); - - } - - private static void ServerLoop() - { - bool running = true; - string[] menuItems; - string selectedItem; - servers.Add(new BackendServer("0.0.0.0", 3767, messageSender)); - // Main server loop - while (running) + static void Main(string[] args) { - menuItems = [ "Benutzerverwaltung", "Einstellungen", "Beenden" ]; - itemSelector.SetTitle("Hauptmenü"); - //selectedItem = itemSelector.SelectItemFromList(menuItems); + Console.WriteLine("Initializing server..."); + // Initialize UI and logging components + messageSender = new MessageSender("log.txt"); + messageBox = new MessageBox(messageSender); + inputBox = new InputBox(messageSender); + itemSelector = new ItemSelector(messageSender); + servers = new List(); + + // 1) Load existing DB config or prompt user + initialize + mySql = LoadOrInitDatabase(); + + // 2) Start the rest of your server loop + ServerLoop(); + } + + private static MySQL LoadOrInitDatabase() + { + var cfg = DbConfig.Load(); + if (cfg != null) + { + messageSender.Log("[Program] Loaded existing database configuration."); + // Use existing credentials to connect (including cfg.Port) + return new MySQL(cfg.Username, cfg.Password, cfg.Server, cfg.Port, cfg.Database, messageSender); + } + else + { + messageSender.Warn("[Program] No existing DB configuration found. Starting init…"); + + // REPLACE THE FOUR PROMPTS WITH YOUR FIVE ShowAsync(...) CALLS: + string username = inputBox.ShowAsync("MySQL Configuration [1/5]", ["Username for MySQL Connections"]); + string password = inputBox.ShowAsync("MySQL Configuration [2/5]", ["Password for MySQL Connections"]); + string server = inputBox.ShowAsync("MySQL Configuration [3/5]", ["Server Address for MySQL Connections"]); + string port = inputBox.ShowAsync("MySQL Configuration [4/5]", ["Port for MySQL Connections"]); + string database = inputBox.ShowAsync("MySQL Configuration [5/5]", ["Database Name for Database Connections"]); + + return InitializeDatabase(username, password, server, port, database); + } + } + + /// + /// Creates a new MySQL connection, runs the CREATE TABLE DDL, + /// saves credentials in config.json, and returns the MySQL instance. + /// +private static MySQL InitializeDatabase( + string username, + string password, + string server, + string port, + string database +) +{ + // 1) Instantiate MySQL (will exit on failure) + var db = new MySQL(username, password, server, port, database, messageSender); + + // 2) Create the 'employees' table if it does not exist: + string createEmployeesTable = @" + CREATE TABLE IF NOT EXISTS `employees` ( + `Id` VARCHAR(36) NOT NULL PRIMARY KEY, + `Code` VARCHAR(50) NOT NULL, + `Surname` VARCHAR(100) NOT NULL, + `Forename` VARCHAR(100) NOT NULL, + `Email` VARCHAR(150) NOT NULL, + `Phone` VARCHAR(50), + `Street` VARCHAR(200), + `City` VARCHAR(100), + `Postcode` VARCHAR(20), + `Country` VARCHAR(100), + `Department` VARCHAR(100), + `Position` VARCHAR(100), + `EmployeeState` INT NOT NULL + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + "; + + messageSender.Log("[Program] Creating 'employees' table if not present…"); + var resultJson = db.ExecuteNonQuery(createEmployeesTable); + + // Parse resultJson safely using JsonDocument + try + { + using var doc = JsonDocument.Parse(resultJson); + var root = doc.RootElement; + + // Expecting { "error": bool, "data": ... } + bool isError = root.GetProperty("error").GetBoolean(); + if (isError) + { + // You can inspect root.GetProperty("data").GetString() if needed + messageSender.Error("[Program] Failed to create 'employees' table: " + resultJson); + Environment.Exit(1); } } -} \ No newline at end of file + catch (Exception ex) + { + // If something went wrong parsing JSON, treat it as a fatal error + messageSender.Error($"[Program] Could not parse CREATE TABLE response: {ex.Message}"); + messageSender.Error("[Program] Raw response: " + resultJson); + Environment.Exit(1); + } + + messageSender.Log("[Program] 'employees' table is ready."); + + // TODO: repeat db.ExecuteNonQuery(...) for any other tables you need + + // 3) Save the new credentials (including port) into config.json: + var newCfg = new DbConfig + { + Username = username, + Password = password, + Server = server, + Port = port, + Database = database + }; + newCfg.Save(); + messageSender.Log("[Program] Saved DB configuration to config.json."); + + return db; +} + + private static void ServerLoop() + { + bool running = true; + string[] menuItems; + string selectedItem; + servers.Add(new BackendServer("0.0.0.0", 3767, messageSender)); + // Main server loop + while (running) + { + menuItems = new[] { "Benutzerverwaltung", "Einstellungen", "Beenden" }; + itemSelector.SetTitle("Hauptmenü"); + //selectedItem = itemSelector.SelectItemFromList(menuItems); + } + } + } \ No newline at end of file