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