diff --git a/Jugenddienst Stunden/Infrastructure/ApiClient.cs b/Jugenddienst Stunden/Infrastructure/ApiClient.cs index 4d3c73f..e5d2ca4 100644 --- a/Jugenddienst Stunden/Infrastructure/ApiClient.cs +++ b/Jugenddienst Stunden/Infrastructure/ApiClient.cs @@ -73,10 +73,17 @@ internal sealed class ApiClient : IApiClient { using var res = await _http.SendAsync(req, HttpCompletionOption.ResponseHeadersRead, ct).ConfigureAwait(false); var text = await res.Content.ReadAsStringAsync(ct).ConfigureAwait(false); + if (res.StatusCode == System.Net.HttpStatusCode.NotFound) { + var message = req.Method + ": " + req.RequestUri + " nicht gefunden"; + throw ApiException.From(res.StatusCode, message); + } + if (!res.IsSuccessStatusCode) throw ApiException.From(res.StatusCode, TryGetMessage(text), text); + if (res.StatusCode != System.Net.HttpStatusCode.OK) { + // Verhalten wie in BaseFunc: bei Fehlerstatus -> "message" aus Body lesen und mit dessen Inhalt eine Exception werfen. try { var options = new JsonDocumentOptions { AllowTrailingCommas = true }; @@ -142,8 +149,27 @@ internal sealed class ApiClient : IApiClient { } // Wenn path bereits absolut ist, direkt verwenden - if (Uri.TryCreate(relativePath, UriKind.Absolute, out var absoluteFromPath)) - return absoluteFromPath; + //if (Uri.TryCreate(relativePath, UriKind.Absolute, out var absoluteFromPath)) + // return absoluteFromPath; + + // Sonderfall: Wenn path ein absoluter file:// URI ist, diesen relativ zur Basis behandeln + // Weiß nicht wie file:// zustande kommt, vermutlich wäre das zu verhindern + if (Uri.TryCreate(relativePath, UriKind.Absolute, out var uri)) { + if (uri.Scheme == Uri.UriSchemeFile) { + + var normalizedBase = baseUrl.Trim(); + if (!normalizedBase.EndsWith('/')) + normalizedBase += "/"; + + if (relativePath.StartsWith('/')) + relativePath = relativePath.TrimStart('/'); + + var baseUriNormalized = new Uri(normalizedBase, UriKind.Absolute); + return new Uri(baseUriNormalized, relativePath); + } + return uri; + } + return new Uri(baseUri, relativePath); } diff --git a/Jugenddienst Stunden/MauiProgram.cs b/Jugenddienst Stunden/MauiProgram.cs index 875cb50..6cd4347 100644 --- a/Jugenddienst Stunden/MauiProgram.cs +++ b/Jugenddienst Stunden/MauiProgram.cs @@ -44,8 +44,8 @@ public static class MauiProgram { //#endif // ApiClient registrieren: SocketsHttpHandler als Primary Handler (vermeidet AndroidMessageHandler-Castfehler) - var apiOptions = new Infrastructure.ApiOptions { BaseUrl = GlobalVar.ApiUrl, Timeout = TimeSpan.FromSeconds(15) }; - builder.Services.AddApiHttpClient(apiOptions); + //var apiOptions = new Infrastructure.ApiOptions { BaseUrl = GlobalVar.ApiUrl, Timeout = TimeSpan.FromSeconds(15) }; + //builder.Services.AddApiHttpClient(apiOptions); // DI: AlertService für globale Alerts (z. B. leere ApiUrl) builder.Services.AddSingleton(); diff --git a/Jugenddienst Stunden/ViewModels/StundeViewModel.cs b/Jugenddienst Stunden/ViewModels/StundeViewModel.cs index c99e1f4..1ceeb4b 100644 --- a/Jugenddienst Stunden/ViewModels/StundeViewModel.cs +++ b/Jugenddienst Stunden/ViewModels/StundeViewModel.cs @@ -178,8 +178,12 @@ public partial class StundeViewModel : ObservableObject, IQueryAttributable { await ConfirmEvent.Invoke("Achtung", "Löschen kann nicht ungeschehen gemacht werden. Fortfahren?"); if (answer) { //Löschen - await _hoursService.DeleteEntryAsync(DayTime); - await Shell.Current.GoToAsync($"..?date={DayTime.Day.ToString("yyyy-MM-dd")}"); + try { + await _hoursService.DeleteEntryAsync(DayTime); + await Shell.Current.GoToAsync($"..?date={DayTime.Day.ToString("yyyy-MM-dd")}"); + } catch (Exception e) { + AlertEvent?.Invoke(this, e.Message); + } } else { //nicht Löschen } @@ -244,7 +248,7 @@ public partial class StundeViewModel : ObservableObject, IQueryAttributable { var (list, settings) = await _hoursService.GetDayWithSettingsAsync(_date); UpdateSettingsAsync(settings); DayTimes = list; - + OnPropertyChanged(nameof(DayTimes)); } catch (Exception) { //Ein Tag ohne Einträge gibt eine Fehlermeldung, //die soll aber ignoriert werden, weil beim Neueintrag ist das ja Wurscht