Untis API Integration
This commit is contained in:
@@ -210,6 +210,13 @@ public partial class SettingsViewModel : ObservableObject
|
||||
[ObservableProperty] private string _untisUrlError = "";
|
||||
[ObservableProperty] private string _untisStatusDisplay = "";
|
||||
[ObservableProperty] private bool _untisFetchBusy;
|
||||
[ObservableProperty] private bool _untisApiIsConfigured;
|
||||
[ObservableProperty] private string _untisSchool = "";
|
||||
[ObservableProperty] private string _untisHost = "";
|
||||
[ObservableProperty] private string _untisUsername = "";
|
||||
[ObservableProperty] private string _untisPassword = "";
|
||||
[ObservableProperty] private string _untisApiStatus = "";
|
||||
[ObservableProperty] private bool _untisApiBusy;
|
||||
public Func<Task>? OnReviewUntisMapping { get; set; }
|
||||
|
||||
// ── Schulweiter Jahresplan (ClassyPlan-iCal) ─────────────────────────────
|
||||
@@ -299,6 +306,7 @@ public partial class SettingsViewModel : ObservableObject
|
||||
private readonly AiSettingsService _aiSettings;
|
||||
private readonly AiPlanningService _aiPlanning;
|
||||
private readonly WebUntisSettingsService _untisSettings;
|
||||
private readonly WebUntisIntegrationService? _untisIntegration;
|
||||
private readonly UntisSyncService? _untisSync;
|
||||
private readonly AnnualPlanSettingsService _annualPlanSettings;
|
||||
private readonly AnnualPlanSyncService? _annualPlanSync;
|
||||
@@ -330,7 +338,7 @@ public partial class SettingsViewModel : ObservableObject
|
||||
AppearanceSettingsService appearance, TrashViewModel trashTab,
|
||||
SnapshotService? snapshotService = null, SyncEngine? syncEngine = null,
|
||||
UntisSyncService? untisSync = null, AnnualPlanSyncService? annualPlanSync = null,
|
||||
SchoolWeatherService? schoolWeather = null)
|
||||
SchoolWeatherService? schoolWeather = null, WebUntisIntegrationService? untisIntegration = null)
|
||||
{
|
||||
_logger = logger;
|
||||
_syncKeyRecovery = syncKeyRecovery;
|
||||
@@ -360,6 +368,7 @@ public partial class SettingsViewModel : ObservableObject
|
||||
_aiSettings = aiSettings;
|
||||
_aiPlanning = aiPlanning;
|
||||
_untisSettings = untisSettings;
|
||||
_untisIntegration = untisIntegration;
|
||||
_untisSync = untisSync;
|
||||
_annualPlanSettings = annualPlanSettings;
|
||||
_annualPlanSync = annualPlanSync;
|
||||
@@ -542,6 +551,60 @@ public partial class SettingsViewModel : ObservableObject
|
||||
UntisStatusDisplay = _untisSettings.LastSyncAt is { } at
|
||||
? $"Letzter Abgleich: {at.ToLocalTime():dd.MM.yyyy HH:mm} — {_untisSettings.LastSyncStatus}"
|
||||
: "Noch kein Abgleich durchgeführt.";
|
||||
UntisApiIsConfigured = _untisSettings.ApiIsConfigured;
|
||||
if (_untisSettings.GetApiCredentials() is { } credentials)
|
||||
{
|
||||
UntisSchool = credentials.School;
|
||||
UntisHost = credentials.Host;
|
||||
UntisUsername = credentials.Username;
|
||||
UntisApiStatus = $"API-Zugang für {credentials.Username} ist lokal verschlüsselt gespeichert.";
|
||||
}
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private async Task UntisSaveApi()
|
||||
{
|
||||
UntisApiStatus = "";
|
||||
if (_untisIntegration is null)
|
||||
{
|
||||
UntisApiStatus = "Die WebUntis-Integration ist nicht verfügbar.";
|
||||
return;
|
||||
}
|
||||
if (string.IsNullOrWhiteSpace(UntisSchool) || string.IsNullOrWhiteSpace(UntisUsername) ||
|
||||
string.IsNullOrWhiteSpace(UntisPassword))
|
||||
{
|
||||
UntisApiStatus = "Schule, Benutzername und Passwort sind erforderlich.";
|
||||
return;
|
||||
}
|
||||
UntisApiBusy = true;
|
||||
try
|
||||
{
|
||||
var credentials = new WebUntisCredentials(UntisSchool.Trim(), UntisHost.Trim(),
|
||||
UntisUsername.Trim(), UntisPassword);
|
||||
await _untisIntegration.ConnectAsync(credentials);
|
||||
_untisSettings.SetApiCredentials(credentials);
|
||||
UntisPassword = "";
|
||||
UntisApiIsConfigured = true;
|
||||
UntisApiStatus = "Anmeldung erfolgreich. Die WebUntis-Session bleibt bei Nutzung bis zu 10 Minuten offen.";
|
||||
}
|
||||
catch (WebUntisIntegrationException ex) { UntisApiStatus = ex.Message; }
|
||||
finally { UntisApiBusy = false; }
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private async Task UntisRemoveApi()
|
||||
{
|
||||
UntisApiBusy = true;
|
||||
try { if (_untisIntegration is not null) await _untisIntegration.DisconnectAsync(); }
|
||||
catch (WebUntisIntegrationException) { /* lokale Zugangsdaten trotzdem sicher entfernen */ }
|
||||
finally
|
||||
{
|
||||
_untisSettings.ClearApiCredentials();
|
||||
UntisPassword = "";
|
||||
UntisApiIsConfigured = false;
|
||||
UntisApiStatus = "WebUntis-API-Zugang entfernt.";
|
||||
UntisApiBusy = false;
|
||||
}
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
|
||||
Reference in New Issue
Block a user