Reenabled deletion of Time-Entrys

This commit is contained in:
2025-12-25 19:10:36 +01:00
parent 656d39f43e
commit c6fd58a290
3 changed files with 37 additions and 7 deletions

View File

@@ -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);
}

View File

@@ -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<IAlertService, AlertService>();

View File

@@ -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
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