From 550c131771ba6d27c6c5e5aab0ed9f08e6c8602b Mon Sep 17 00:00:00 2001 From: DaPi Date: Mon, 21 Oct 2024 18:55:40 +0200 Subject: [PATCH] Various MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Login auch im Testmodus Bei falschem Token nur eine Meldung Exception bei falschem Token während Loadsettings abfangen --- Jugenddienst Stunden/MauiProgram.cs | 40 ++++----- Jugenddienst Stunden/Models/BaseFunc.cs | 1 - Jugenddienst Stunden/Models/HoursBase.cs | 4 +- Jugenddienst Stunden/Models/TokenData.cs | 13 ++- .../ViewModels/StundeViewModel.cs | 35 +++++--- .../ViewModels/StundenViewModel.cs | 85 ++++++++++--------- Jugenddienst Stunden/Views/LoginPage.xaml.cs | 42 ++++----- 7 files changed, 117 insertions(+), 103 deletions(-) diff --git a/Jugenddienst Stunden/MauiProgram.cs b/Jugenddienst Stunden/MauiProgram.cs index ce56a8f..d9815f2 100644 --- a/Jugenddienst Stunden/MauiProgram.cs +++ b/Jugenddienst Stunden/MauiProgram.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.Logging; +using Jugenddienst_Stunden.Models; +using Microsoft.Extensions.Logging; using ZXing.Net.Maui.Controls; namespace Jugenddienst_Stunden; @@ -7,15 +8,16 @@ namespace Jugenddienst_Stunden; /// Das Hauptprogramm. /// public static class MauiProgram { - public static MauiApp CreateMauiApp() { - var builder = MauiApp.CreateBuilder(); - builder - .UseMauiApp() - .ConfigureFonts(fonts => { - fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); - fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); - }) - .UseBarcodeReader(); + + public static MauiApp CreateMauiApp() { + var builder = MauiApp.CreateBuilder(); + builder + .UseMauiApp() + .ConfigureFonts(fonts => { + fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); + fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); + }) + .UseBarcodeReader(); #if DEBUG //Preferences.Default.Set("apiKey", "M3xneWlWNG85TmNIcmo1NnpxWkxVYS9JMDBFRlV8aHR0cDovL2hvdXJzLmRhdW5pLm1pbmUubnU6ODEvYXBwYXBp"); @@ -23,18 +25,18 @@ public static class MauiProgram { //Preferences.Default.Set("surname", "Mair"); //Preferences.Default.Set("EmployeeId", 3); //Preferences.Default.Set("apiUrl", "http://hours.dauni.mine.nu:81/appapi"); - - Preferences.Default.Set("apiKey", "MTQxfHNkdFptQkNZTXlPT3ZyMHNBZDl0UnVxNExMRXxodHRwOi8vaG91cnMuZGF1bmkubWluZS5udTo4MS9hcHBhcGk="); - Preferences.Default.Set("name", "Testserver: Isabell"); - Preferences.Default.Set("surname", "Biasi"); - Preferences.Default.Set("EmployeeId", 141); - Preferences.Default.Set("apiUrl", "http://hours.dauni.mine.nu:81/appapi"); + HoursBase HoursBase = new HoursBase(); + HoursBase.apiKey = Preferences.Default.Get("apiKey", "MTQxfHNkdFptQkNZTXlPT3ZyMHNBZDl0UnVxNExMRXxodHRwOi8vaG91cnMuZGF1bmkubWluZS5udTo4MS9hcHBhcGk="); + HoursBase.name = Preferences.Default.Get("name", "Testserver: Isabell"); + HoursBase.surname = Preferences.Default.Get("surname", "Biasi"); + HoursBase.EmployeeId = Preferences.Default.Get("EmployeeId", 141); + HoursBase.apiUrl = Preferences.Default.Get("apiUrl", "http://hours.dauni.mine.nu:81/appapi"); builder.Logging.AddDebug(); #endif - return builder.Build(); - } + return builder.Build(); + } + - } diff --git a/Jugenddienst Stunden/Models/BaseFunc.cs b/Jugenddienst Stunden/Models/BaseFunc.cs index a949789..e047301 100644 --- a/Jugenddienst Stunden/Models/BaseFunc.cs +++ b/Jugenddienst Stunden/Models/BaseFunc.cs @@ -43,7 +43,6 @@ internal static class BaseFunc { using (JsonDocument doc = JsonDocument.Parse(responseData, options)) { JsonElement root = doc.RootElement; string message = root.GetProperty("message").GetString() ?? throw new Exception("Fehler: 'message' ist null."); - throw new Exception(message); } } diff --git a/Jugenddienst Stunden/Models/HoursBase.cs b/Jugenddienst Stunden/Models/HoursBase.cs index 9f62a71..3a72992 100644 --- a/Jugenddienst Stunden/Models/HoursBase.cs +++ b/Jugenddienst Stunden/Models/HoursBase.cs @@ -14,7 +14,7 @@ internal class HoursBase { public static string surname = Preferences.Default.Get("surname", ""); public static string apiUrl = Preferences.Default.Get("apiUrl", ""); - internal static TokenData tokendata = new TokenData(apiKey); + internal static TokenData tokendata; /// @@ -24,7 +24,7 @@ internal class HoursBase { string data = await BaseFunc.GetApiDataWithAuthAsync(tokendata.Url + "?settings", tokendata.ApiKey); - Settings _settings = JsonConvert.DeserializeObject(data) ?? throw new Exception("Fehler beim Deserialisieren der Daten"); + Settings _settings = JsonConvert.DeserializeObject(data); return _settings; } diff --git a/Jugenddienst Stunden/Models/TokenData.cs b/Jugenddienst Stunden/Models/TokenData.cs index dfda9d0..887ce0d 100644 --- a/Jugenddienst Stunden/Models/TokenData.cs +++ b/Jugenddienst Stunden/Models/TokenData.cs @@ -10,8 +10,17 @@ internal class TokenData { public string Operator_id { get; set; } public TokenData(string ak) { - string dat = Encoding.UTF8.GetString(Convert.FromBase64String(ak)); - Token = dat.Split('|')[1]; ; + if (string.IsNullOrEmpty(ak)) { + throw new ArgumentException("API key cannot be null or empty", nameof(ak)); + } + string dat = Encoding.UTF8.GetString(Convert.FromBase64String(ak)); + + string[] parts = dat.Split('|'); + if (parts.Length < 3) { + throw new FormatException("API key format is invalid"); + } + + Token = dat.Split('|')[1]; ; Url = dat.Split('|')[2]; ; Operator_id = dat.Split('|')[0]; ; ApiKey = ak; diff --git a/Jugenddienst Stunden/ViewModels/StundeViewModel.cs b/Jugenddienst Stunden/ViewModels/StundeViewModel.cs index 7523b17..02cfe11 100644 --- a/Jugenddienst Stunden/ViewModels/StundeViewModel.cs +++ b/Jugenddienst Stunden/ViewModels/StundeViewModel.cs @@ -95,21 +95,28 @@ public class StundeViewModel : ObservableObject, IQueryAttributable { } private async void LoadSettingsAsync() { - Settings = await HoursBase.LoadSettings(); + + try { + Settings = await HoursBase.LoadSettings(); + + OptionsGemeinde = Settings.Gemeinden; + OptionsProjekt = Settings.Projekte; + OptionsFreistellung = Settings.Freistellungen; + + GemeindeAktivSet = Settings.GemeindeAktivSet; + ProjektAktivSet = Settings.ProjektAktivSet; + + OnPropertyChanged(nameof(OptionsGemeinde)); + OnPropertyChanged(nameof(OptionsFreistellung)); + OnPropertyChanged(nameof(OptionsProjekt)); + + OnPropertyChanged(nameof(GemeindeAktivSet)); + OnPropertyChanged(nameof(ProjektAktivSet)); + } catch (Exception e) { + AlertEvent?.Invoke(this, e.Message); + } + - OptionsGemeinde = Settings.Gemeinden; - OptionsProjekt = Settings.Projekte; - OptionsFreistellung = Settings.Freistellungen; - - GemeindeAktivSet = Settings.GemeindeAktivSet; - ProjektAktivSet = Settings.ProjektAktivSet; - - OnPropertyChanged(nameof(OptionsGemeinde)); - OnPropertyChanged(nameof(OptionsFreistellung)); - OnPropertyChanged(nameof(OptionsProjekt)); - - OnPropertyChanged(nameof(GemeindeAktivSet)); - OnPropertyChanged(nameof(ProjektAktivSet)); } diff --git a/Jugenddienst Stunden/ViewModels/StundenViewModel.cs b/Jugenddienst Stunden/ViewModels/StundenViewModel.cs index a7a8f32..cadeb55 100644 --- a/Jugenddienst Stunden/ViewModels/StundenViewModel.cs +++ b/Jugenddienst Stunden/ViewModels/StundenViewModel.cs @@ -2,11 +2,8 @@ using CommunityToolkit.Mvvm.Input; using Jugenddienst_Stunden.Models; using Jugenddienst_Stunden.Types; -using Newtonsoft.Json.Linq; -using System.Collections.ObjectModel; using System.ComponentModel; using System.Runtime.CompilerServices; -using System.Threading.Tasks; using System.Windows.Input; @@ -151,13 +148,14 @@ internal class StundenViewModel : ObservableObject, IQueryAttributable, INotifyP /// public bool ProjektAktivSet { get; set; } - + private bool doContinue = true; /// /// CTOR /// public StundenViewModel() { _hour = new Hours(); + //LoadSettingsAsync(); LoadDataCommand = new AsyncRelayCommand(LoadData); NewEntryCommand = new AsyncRelayCommand(NewEntryAsync); @@ -166,17 +164,23 @@ internal class StundenViewModel : ObservableObject, IQueryAttributable, INotifyP RefreshCommand = new Command(async () => await RefreshItemsAsync()); Task task = LoadDay(DateTime.Today); - LoadSettingsAsync(); + } - private async void LoadSettingsAsync() { - Settings = await HoursBase.LoadSettings(); + private async Task LoadSettingsAsync() { + try { + Settings = await HoursBase.LoadSettings(); - GemeindeAktivSet = Settings.GemeindeAktivSet; - ProjektAktivSet = Settings.ProjektAktivSet; + GemeindeAktivSet = Settings.GemeindeAktivSet; + ProjektAktivSet = Settings.ProjektAktivSet; - OnPropertyChanged(nameof(GemeindeAktivSet)); - OnPropertyChanged(nameof(ProjektAktivSet)); + OnPropertyChanged(nameof(GemeindeAktivSet)); + OnPropertyChanged(nameof(ProjektAktivSet)); + doContinue = true; + } catch (Exception e) { + doContinue = false; + AlertEvent?.Invoke(this, e.Message); + } } @@ -222,43 +226,42 @@ internal class StundenViewModel : ObservableObject, IQueryAttributable, INotifyP /// public async Task LoadDay(DateTime date) { DayTotal = new TimeOnly(0); - LoadSettingsAsync(); - try { - DayTimes = await HoursBase.LoadDay(date); + await LoadSettingsAsync(); + //if (doContinue) { + try { + DayTimes = await HoursBase.LoadDay(date); - - List _soll; - TimeSpan span = TimeSpan.Zero; - bool merker = false; - foreach (DayTime dt in DayTimes) { - span += dt.End - dt.Begin; - //Nachtstunden dazurechnen - if (dt.Night.Ticks > 0 && !merker) { - span += dt.Night.ToTimeSpan() * .5; - merker = true; + List _soll; + TimeSpan span = TimeSpan.Zero; + bool merker = false; + foreach (DayTime dt in DayTimes) { + span += dt.End - dt.Begin; + //Nachtstunden dazurechnen + if (dt.Night.Ticks > 0 && !merker) { + span += dt.Night.ToTimeSpan() * .5; + merker = true; + } + _soll = Settings.Nominal.Where(w => w.Timetable == dt.TimeTable && w.Wochentag == dt.Wday).ToList(); + if (_soll.Count > 0) + Sollstunden = TimeOnly.FromTimeSpan(TimeSpan.FromHours(_soll[0].Zeit)); } - _soll = Settings.Nominal.Where(w => w.Timetable == dt.TimeTable && w.Wochentag == dt.Wday).ToList(); - if (_soll.Count > 0) - Sollstunden = TimeOnly.FromTimeSpan(TimeSpan.FromHours(_soll[0].Zeit)); + DayTotal = TimeOnly.FromTimeSpan(span); + + + } catch (Exception e) { + DayTimes = new List(); + //TODO: hier könnte auch ein Fehler kommen, dann wäre InfoEvent falsch. + InfoEvent?.Invoke(this, e.Message); + } finally { + OnPropertyChanged(nameof(DayTotal)); + OnPropertyChanged(nameof(Sollstunden)); + //OnPropertyChanged(nameof(DayTimes)); } - DayTotal = TimeOnly.FromTimeSpan(span); - - - } catch (Exception e) { - DayTimes = new List(); - //TODO: hier könnte auch ein Fehler kommen, dann wäre InfoEvent falsch. - InfoEvent?.Invoke(this, e.Message); - } finally { - OnPropertyChanged(nameof(DayTotal)); - OnPropertyChanged(nameof(Sollstunden)); - //OnPropertyChanged(nameof(DayTimes)); - } + //} } - - async void IQueryAttributable.ApplyQueryAttributes(IDictionary query) { if (query.ContainsKey("date")) { await LoadDay(Convert.ToDateTime(query["date"])); diff --git a/Jugenddienst Stunden/Views/LoginPage.xaml.cs b/Jugenddienst Stunden/Views/LoginPage.xaml.cs index 0e0ad42..63467cf 100644 --- a/Jugenddienst Stunden/Views/LoginPage.xaml.cs +++ b/Jugenddienst Stunden/Views/LoginPage.xaml.cs @@ -1,14 +1,5 @@ -using System; using Jugenddienst_Stunden.Models; -using Jugenddienst_Stunden.ViewModels; -using Microsoft.Maui.Controls; -using System.Collections.Generic; using ZXing.Net.Maui; -using Microsoft.Maui.Devices; -using static Microsoft.Maui.ApplicationModel.Permissions; -using ZXing.Net.Maui.Controls; -using ZXing.QrCode.Internal; -using System.Linq; namespace Jugenddienst_Stunden.Views; @@ -19,12 +10,13 @@ public partial class LoginPage : ContentPage { private DateTime _lastDetectionTime; private readonly TimeSpan _detectionInterval = TimeSpan.FromSeconds(5); - private bool hasCamera = false; - /// - /// CTOR - /// - public LoginPage() { + internal HoursBase HoursBase = new HoursBase(); + + /// + /// CTOR + /// + public LoginPage() { InitializeComponent(); //if (BindingContext is LoginViewModel vm) { @@ -55,11 +47,13 @@ public partial class LoginPage : ContentPage { try { var tokendata = new TokenData(barcode.Value); - var op = await Models.HoursBase.LoadOperator(barcode.Value); - Models.HoursBase.apiKey = barcode.Value; - Models.HoursBase.name = op.name; - Models.HoursBase.surname = op.surname; - Models.HoursBase.EmployeeId = int.Parse(op.id); + HoursBase.tokendata = tokendata; + + var op = await HoursBase.LoadOperator(barcode.Value); + HoursBase.apiKey = barcode.Value; + HoursBase.name = op.name; + HoursBase.surname = op.surname; + HoursBase.EmployeeId = int.Parse(op.id); Title = op.name + " " + op.surname; ServerLabel.Text = "Server: " + tokendata.Url.Replace("/appapi", "").Replace("https://", "").Replace("http://", ""); @@ -125,11 +119,11 @@ public partial class LoginPage : ContentPage { Types.User response = await BaseFunc.AuthUserPass(username, password, server); var tokendata = new TokenData(response.Token); - var op = await Models.HoursBase.LoadOperator(response.Token); - Models.HoursBase.apiKey = response.Token; - Models.HoursBase.name = op.name; - Models.HoursBase.surname = op.surname; - Models.HoursBase.EmployeeId = int.Parse(op.id); + var op = await HoursBase.LoadOperator(response.Token); + HoursBase.apiKey = response.Token; + HoursBase.name = op.name; + HoursBase.surname = op.surname; + HoursBase.EmployeeId = int.Parse(op.id); Title = op.name + " " + op.surname; ServerLabel.Text = "Server: " + tokendata.Url.Replace("/appapi", "").Replace("https://", "").Replace("http://", "");