Start der Backend Implementierung

Projekt für die Implementierung des Backends hinzugefügt. Klasse Logger --> Dient zum Loggen in die Datenbank. Klasse Ticket_System --> Hauptklasse für das die Backendanwendung. Auth Client hinzugefügt. Token stuff hinzugefügt.
This commit is contained in:
2026-01-28 12:48:40 +01:00
parent 1f38e7264b
commit 07b2a8ae0f
20 changed files with 354 additions and 0 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,71 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|c:\\users\\tweee\\source\\repos\\projekt-dev-env\\src\\project-cbackend\\ticket_system\\ticket_system.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
"RelativeMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|solutionrelative:ticket_system.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
},
{
"AbsoluteMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|c:\\users\\tweee\\source\\repos\\projekt-dev-env\\src\\project-cbackend\\ticket_system\\logger.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|solutionrelative:logger.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|c:\\users\\tweee\\source\\repos\\projekt-dev-env\\src\\project-cbackend\\ticket_system\\ticket_system.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|solutionrelative:ticket_system.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 2,
"Children": [
{
"$type": "Document",
"DocumentIndex": 2,
"Title": "Ticket_System.cs",
"DocumentMoniker": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\Ticket_System.cs",
"RelativeDocumentMoniker": "Ticket_System.cs",
"ToolTip": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\Ticket_System.cs",
"RelativeToolTip": "Ticket_System.cs",
"ViewState": "AgIAACQAAAAAAAAAAAAYwBAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-28T11:24:03.402Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "Logger.cs",
"DocumentMoniker": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\Logger.cs",
"RelativeDocumentMoniker": "Logger.cs",
"ToolTip": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\Logger.cs",
"RelativeToolTip": "Logger.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAABAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-28T11:43:25.803Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "Ticket_System.csproj",
"DocumentMoniker": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\Ticket_System.csproj",
"RelativeDocumentMoniker": "Ticket_System.csproj",
"ToolTip": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\Ticket_System.csproj",
"RelativeToolTip": "Ticket_System.csproj",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
"WhenOpened": "2026-01-28T11:24:17.672Z",
"EditorCaption": ""
}
]
}
]
}
]
}

View File

@@ -0,0 +1,105 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|c:\\users\\tweee\\source\\repos\\projekt-dev-env\\src\\project-cbackend\\ticket_system\\ticket_system.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|solutionrelative:ticket_system.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|c:\\users\\tweee\\source\\repos\\projekt-dev-env\\src\\project-cbackend\\ticket_system\\logger.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|solutionrelative:logger.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|c:\\users\\tweee\\source\\repos\\projekt-dev-env\\src\\project-cbackend\\ticket_system\\ticket_system.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
"RelativeMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|solutionrelative:ticket_system.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
},
{
"AbsoluteMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|c:\\users\\tweee\\source\\repos\\projekt-dev-env\\src\\project-cbackend\\ticket_system\\authclient.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|solutionrelative:authclient.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|c:\\users\\tweee\\source\\repos\\projekt-dev-env\\src\\project-cbackend\\ticket_system\\token.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{106D2CB4-0886-FC41-C71A-2C92C20303DC}|Ticket_System.csproj|solutionrelative:token.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 2,
"Children": [
{
"$type": "Document",
"DocumentIndex": 3,
"Title": "AuthClient.cs",
"DocumentMoniker": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\AuthClient.cs",
"RelativeDocumentMoniker": "AuthClient.cs",
"ToolTip": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\AuthClient.cs",
"RelativeToolTip": "AuthClient.cs",
"ViewState": "AgIAACMAAAAAAAAAAAAuwCcAAAAwAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-28T12:18:08.321Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 4,
"Title": "Token.cs",
"DocumentMoniker": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\Token.cs",
"RelativeDocumentMoniker": "Token.cs",
"ToolTip": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\Token.cs",
"RelativeToolTip": "Token.cs",
"ViewState": "AgIAAAoAAAAAAAAAAAAQwA4AAAAFAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-28T12:16:13.411Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "Ticket_System.cs",
"DocumentMoniker": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\Ticket_System.cs",
"RelativeDocumentMoniker": "Ticket_System.cs",
"ToolTip": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\Ticket_System.cs",
"RelativeToolTip": "Ticket_System.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAUAAAABAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-28T11:24:03.402Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "Logger.cs",
"DocumentMoniker": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\Logger.cs",
"RelativeDocumentMoniker": "Logger.cs",
"ToolTip": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\Logger.cs",
"RelativeToolTip": "Logger.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAABAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-28T11:43:25.803Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 2,
"Title": "Ticket_System.csproj",
"DocumentMoniker": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\Ticket_System.csproj",
"RelativeDocumentMoniker": "Ticket_System.csproj",
"ToolTip": "C:\\Users\\tweee\\source\\repos\\Projekt-dev-env\\src\\Project-CBackend\\Ticket_System\\Ticket_System.csproj",
"RelativeToolTip": "Ticket_System.csproj",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
"WhenOpened": "2026-01-28T11:24:17.672Z",
"EditorCaption": ""
}
]
}
]
}
]
}

View File

@@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
namespace Ticket_System
{
public sealed class AuthApiClient
{
private readonly HttpClient _http;
private readonly JsonSerializerOptions _json = new() { PropertyNameCaseInsensitive = true };
public AuthApiClient(string baseUrl)
{
_http = new HttpClient { BaseAddress = new Uri(baseUrl.TrimEnd('/') + "/") };
}
public async Task<ResponseToken?> SignInAsync(string name, string password)
{
var req = new SignInRequest { name = name, password = password };
var content = new StringContent(
JsonSerializer.Serialize(req),
Encoding.UTF8,
"application/json"
);
using var resp = await _http.PostAsync("signin", content);
var body = await resp.Content.ReadAsStringAsync();
if (resp.IsSuccessStatusCode)
{
return JsonSerializer.Deserialize<ResponseToken>(body, _json);
}
// optional: Fehler-Body auswerten
// var err = JsonSerializer.Deserialize<SignInErrorResponse>(body, _json);
return null;
}
public async Task<bool> ValidateTokenAsync(string token)
{
using var req = new HttpRequestMessage(HttpMethod.Get, "token/validate");
req.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
using var resp = await _http.SendAsync(req);
var body = await resp.Content.ReadAsStringAsync();
if (!resp.IsSuccessStatusCode) return false;
var result = JsonSerializer.Deserialize<TokenIsValid>(body, _json);
return result?.is_valid == true;
}
}
}

18
Ticket_System/Logger.cs Normal file
View File

@@ -0,0 +1,18 @@
using System;
using MySqlConnector;
namespace Ticket_System
{
public class Logger
{
public void Log(string message, string userID)
{
string sql = $"insert into Log (LogID, ErrorMessage, datetime, User) values ((select max LogID from Log) + 1), {message}, {DateTime.Now},{userID})";
MySqlCommand cmd = new MySqlCommand(sql);
cmd.ExecuteNonQuery();
}
}
}

View File

@@ -0,0 +1,51 @@
using MySqlConnector;
using BCrypt;
using System.ComponentModel.DataAnnotations;
namespace Ticket_System
{
public class Ticket_System
{
Logger logger = new Logger();
public string userID = "-";
private string? _token;
public async Task MainAsync(string[] args)
{
if (!await LoginAsync())
return;
await LoadTicketsAsync();
}
public async Task<bool> LoginAsync()
{
var auth = new AuthApiClient("http://localhost:3000");
string inputuser = "Carl";
string inputpw = "Deine Fette Mutter";
var tokenResp = await auth.SignInAsync(inputuser, inputpw);
if (tokenResp == null || string.IsNullOrWhiteSpace(tokenResp.token))
{
logger.Log("Login fehlgeschlagen (API)", userID);
return false;
}
_token = tokenResp.token;
bool ok = await auth.ValidateTokenAsync(_token);
logger.Log(ok ? "Token gültig" : "Token ungültig", userID);
return ok;
}
public async Task LoadTicketsAsync()
{
// hier würdest du bei weiteren API-Calls einfach den Token mitsenden:
// Authorization: Bearer <_token>
await Task.CompletedTask;
}
}
}

View File

@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
<PackageReference Include="MySqlConnector" Version="2.5.0" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,3 @@
<Solution>
<Project Path="Ticket_System.csproj" />
</Solution>

29
Ticket_System/Token.cs Normal file
View File

@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Ticket_System
{
public sealed class ResponseToken
{
public string token { get; set; } = "";
}
public sealed class TokenIsValid
{
public bool is_valid { get; set; }
}
public sealed class SignInRequest
{
public string name { get; set; } = "";
public string password { get; set; } = "";
}
public sealed class SignInErrorResponse
{
public Dictionary<string, string[]>? errors { get; set; }
public ResponseToken? message { get; set; }
}
}