Error fixing with input validation

This commit is contained in:
Luis Sander 2025-04-10 15:20:57 +02:00
parent 9445cec743
commit a6654ef708

View File

@ -90,60 +90,22 @@ namespace PrototypWPFHAG
try try
{ {
var response = await _httpClient.GetAsync($"/documents/by-id/{documentId}"); var response = await _httpClient.GetAsync($"/documents/{documentId}");
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync(); var json = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<JsonElement>(json); var result = JsonSerializer.Deserialize<DocumentDetail>(json);
var documents = result.GetProperty("documents");
if (documents.GetArrayLength() == 0)
{
MessageBox.Show("Dokument nicht gefunden");
return;
}
var document = documents[0];
// Korrigierte UI-Aktualisierung
await Dispatcher.InvokeAsync(() => await Dispatcher.InvokeAsync(() =>
{ {
SearchResultsListBox.ItemsSource = new List<DocumentDetail> // Änderung von SearchResult zu DocumentDetail SearchResultsListBox.ItemsSource = new List<DocumentDetail> { result };
{ ContentTextBox.Text = result.Content;
new DocumentDetail
{
Id = document.GetProperty("id").GetInt32(),
DocumentName = document.GetProperty("document_name").GetString(), // Korrekter Property-Name
Content = document.GetProperty("content").GetString()
}
};
ContentTextBox.Text = document.GetProperty("content").GetString();
// Wichtig: DisplayMemberPath korrekt setzen
SearchResultsListBox.DisplayMemberPath = "DocumentName"; SearchResultsListBox.DisplayMemberPath = "DocumentName";
}); });
} }
catch (Exception ex) catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.NotFound)
{ {
MessageBox.Show($"Fehler: {ex.Message}"); MessageBox.Show("Dokument nicht gefunden");
}
}
private async Task SearchByTextAsync()
{
try
{
var encodedQuery = Uri.EscapeDataString(SearchTextBox.Text);
var response = await _httpClient.GetAsync($"/documents/search?query={encodedQuery}");
var json = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<JsonElement>(json);
var documents = JsonSerializer.Deserialize<List<SearchResult>>(
result.GetProperty("documents").GetRawText());
MessageBox.Show($"Gefundene Dokumente: {documents?.Count}", "Debug");
SearchResultsListBox.ItemsSource = documents;
SearchResultsListBox.DisplayMemberPath = "name";
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -151,22 +113,21 @@ namespace PrototypWPFHAG
} }
} }
private async Task SearchBySimilarityAsync() private async Task SearchBySimilarityAsync()
{ {
try try
{ {
var encodedQuery = Uri.EscapeDataString(SearchTextBox.Text); var encodedQuery = HttpUtility.UrlEncode(SearchTextBox.Text);
var response = await _httpClient.GetAsync($"/documents/similarity?query={encodedQuery}"); var response = await _httpClient.GetAsync($"/documents/search/similarity?query={encodedQuery}");
var json = await response.Content.ReadAsStringAsync(); var json = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ApiResponse>(json, new JsonSerializerOptions var result = JsonSerializer.Deserialize<ApiResponse>(json);
{
PropertyNameCaseInsensitive = true
});
await Dispatcher.InvokeAsync(() =>
{
SearchResultsListBox.ItemsSource = result?.Documents; SearchResultsListBox.ItemsSource = result?.Documents;
SearchResultsListBox.DisplayMemberPath = "DocumentName"; SearchResultsListBox.DisplayMemberPath = "DocumentName";
});
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -245,7 +206,7 @@ namespace PrototypWPFHAG
public List<DocumentDetail> Documents { get; set; } public List<DocumentDetail> Documents { get; set; }
} }
public class DocumentDetail public class DocumentDetail : INotifyPropertyChanged
{ {
[JsonPropertyName("id")] [JsonPropertyName("id")]
public int Id { get; set; } public int Id { get; set; }
@ -259,17 +220,19 @@ namespace PrototypWPFHAG
[JsonPropertyName("distance")] [JsonPropertyName("distance")]
public double Distance { get; set; } public double Distance { get; set; }
// Für die TextBox-Bindung
private bool _isSelected; private bool _isSelected;
public bool IsSelected public bool IsSelected
{ {
get => _isSelected; get => _isSelected;
set set
{
if (_isSelected != value)
{ {
_isSelected = value; _isSelected = value;
OnPropertyChanged(); OnPropertyChanged();
} }
} }
}
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;
@ -278,6 +241,7 @@ namespace PrototypWPFHAG
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
} }
} }
public class ApiError public class ApiError
{ {
public string Detail { get; set; } public string Detail { get; set; }
@ -290,54 +254,31 @@ namespace PrototypWPFHAG
MessageBox.Show("Keine PDF ausgewählt!"); MessageBox.Show("Keine PDF ausgewählt!");
return; return;
} }
// luis
// UI zurücksetzen
UploadProgressBar.Visibility = Visibility.Visible; UploadProgressBar.Visibility = Visibility.Visible;
UploadProgressBar.Value = 0; UploadProgressBar.Value = 0;
UploadStatusText.Text = "Upload läuft..."; UploadStatusText.Text = "Upload läuft...";
try try
{ {
int totalFiles = _selectedPdfPaths.Count; using var formData = new MultipartFormDataContent();
int currentFile = 0;
foreach (var pdfPath in _selectedPdfPaths) foreach (var pdfPath in _selectedPdfPaths)
{ {
currentFile++; var fileContent = new StreamContent(File.OpenRead(pdfPath));
UploadStatusText.Text = $"Upload {currentFile}/{totalFiles}: {System.IO.Path.GetFileName(pdfPath)}"; formData.Add(fileContent, "files", Path.GetFileName(pdfPath));
using (var httpClient = new HttpClient())
using (var fileStream = File.OpenRead(pdfPath))
{
var content = new StreamContent(fileStream);
var formData = new MultipartFormDataContent();
formData.Add(content, "file", System.IO.Path.GetFileName(pdfPath));
var response = await httpClient.PostAsync($"{BaseUrl}/upload-pdf", formData);
if (response.IsSuccessStatusCode)
{
UploadStatusText.Text = $"Erfolgreich hochgeladen: {System.IO.Path.GetFileName(pdfPath)}";
}
else
{
UploadStatusText.Text = $"Fehler beim Upload von {System.IO.Path.GetFileName(pdfPath)}";
}
}
} }
// Canvas zurücksetzen var response = await _httpClient.PostAsync("/upload-pdfs/", formData);
Dispatcher.Invoke(() => response.EnsureSuccessStatusCode();
{
PdfIcon.Visibility = Visibility.Collapsed;
PdfFileNameText.Visibility = Visibility.Collapsed;
DropHintText.Visibility = Visibility.Visible;
_selectedPdfPaths.Clear();
});
// Erfolgsmeldung nach 3 Sekunden ausblenden var json = await response.Content.ReadAsStringAsync();
await Task.Delay(3000); var result = JsonSerializer.Deserialize<ApiResponse>(json);
UploadStatusText.Text = string.Empty;
if (result?.Success == true)
{
UploadStatusText.Text = "Upload erfolgreich!";
}
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -346,6 +287,10 @@ namespace PrototypWPFHAG
finally finally
{ {
UploadProgressBar.Visibility = Visibility.Collapsed; UploadProgressBar.Visibility = Visibility.Collapsed;
_selectedPdfPaths.Clear();
PdfIcon.Visibility = Visibility.Collapsed;
PdfFileNameText.Visibility = Visibility.Collapsed;
DropHintText.Visibility = Visibility.Visible;
} }
} }
private async void DeleteButton_Click(object sender, RoutedEventArgs e) private async void DeleteButton_Click(object sender, RoutedEventArgs e)
@ -372,46 +317,37 @@ namespace PrototypWPFHAG
{ {
try try
{ {
var response = await _httpClient.DeleteAsync($"/documents/by-id/{item.Id}/delete"); var response = await _httpClient.DeleteAsync($"/documents/{item.Id}");
if (response.IsSuccessStatusCode) if (response.IsSuccessStatusCode)
{ {
deletedIds.Add(item.Id); deletedIds.Add(item.Id);
Debug.WriteLine($"Gelöscht: {item.Id}");
} }
else else
{ {
errorIds.Add(item.Id); errorIds.Add(item.Id);
var errorContent = await response.Content.ReadAsStringAsync();
Debug.WriteLine($"Fehler bei {item.Id}: {errorContent}");
} }
} }
catch (Exception ex) catch
{ {
errorIds.Add(item.Id); errorIds.Add(item.Id);
Debug.WriteLine($"Ausnahme: {ex.Message}");
} }
} }
// Aktualisiere die Liste unabhängig vom Suchmodus // Aktualisiere die Liste
if (SearchByIdRadio.IsChecked == true) if (SearchByIdRadio.IsChecked == true)
{ {
await SearchByIdAsync(); // Neu laden der ID-Suche await SearchByIdAsync();
} }
else else
{ {
await SearchBySimilarityAsync(); // Neu laden der Textsuche await SearchBySimilarityAsync();
} }
// Feedback an Benutzer // Feedback
var message = new StringBuilder(); var message = new StringBuilder();
if (deletedIds.Count > 0) if (deletedIds.Count > 0) message.AppendLine($"{deletedIds.Count} Dokument(e) gelöscht.");
{ if (errorIds.Count > 0) message.AppendLine($"{errorIds.Count} Dokument(e) konnten nicht gelöscht werden.");
message.AppendLine($"{deletedIds.Count} Dokument(e) gelöscht.");
}
if (errorIds.Count > 0)
{
message.AppendLine($"{errorIds.Count} Dokument(e) konnten nicht gelöscht werden.");
}
MessageBox.Show(message.ToString()); MessageBox.Show(message.ToString());
} }